20评论

0收藏

MT4自带EA(MA)源码解析

 

avatar 东北大饼 | 9101 人阅读 | 20 人评论 | 2011-09-09

MT4自带EAMA)源码解析

一、均线穿越交易系统EA详解

MT4平台自带了一个自动交易的EA指标,那就是Moving Average ,下面我们详细解释该系统每条语句的功能说明,以便深入认识EA的编程内核。我想对初学者有一定的帮助。

//+------------------------------------------------------------------+

//|                          Moving Average.mq4  |

//|        Copyright ?2005, MetaQuotes Software Corp. |

//|     //+------------------------------------------------------------------+

#define MAGICMA   20050610

//定义本EA操作的订单的唯一标识号码,由此可以实现在同一账户上多系统操作,各操作EA的订单标识码不同,就不会互相误操作。凡是EA皆不可缺少,非常非常重要!

extern double Lots              = 0.1; //每单的交易量

extern double MaximumRisk      = 0.02;//本系统最大风险系数,即可以动用总资金的2%

extern double DecreaseFactor      = 3;   //下跌因素个数

extern double MovingPeriod       = 12;  //均线的计算周期=12根K线;

extern double MovingShift         = 6;   //均线在K线图中向右的偏移量=6根K线

//extern 确定从外部程序输入的变量, 会直接显现输入数据窗口。数列本身不能作为外部变量。

注意:iMA中的MovingShift(均线偏移量)是指均线指标在图上绘制时向左、右移动的K线个数,主要为了使图中结果更好看,并不会对MA的计算数值产生变化。其中,该参数为正时,代表向右移动;为负值,则代表向左移动。

//+------------------------------------------------------------------+

//| Calculate open positions

自定义函数(返回-整数型数据) 仓单查询与统计 |

//+------------------------------------------------------------------+

int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓单的数量

{

int buys=0,sells=0;

//定义两个局部变量,整数型,buys多单数,sells空单数,用于订单的统计

//----

for(int i=0;i0) return(buys);

//如果 多单>0,则返回(多单数)

else    return(-sells);

//否则,返回(-空单数)

//本函数返回查询计算结束时的持仓单的个数.这种模式返回是假设不存在锁单的。

}

//+------------------------------------------------------------------+

//| Calculate optimal lot size

自定义函数(返回-小数型数据)   资金管理     |

//+------------------------------------------------------------------+

double LotsOptimized()//开仓量计算函数(根据要求计算出订单交易量,小数型)

{

double lot=Lots=0.1; //定义局部变量los 小数型

int orders=HistoryTotal();  // history orders total 历史平仓单数(已平仓)

int losses=0;             // number of losses orders without a break-亏损单

//---- select lot size

lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//计算 开仓下单量=帐户可用资金*最大风险系数(=2%/1000.0,并将结果保留小数点1

(通过风险系数的计算获得当前入场单应该采用的交易量,除以1000是因为大多货币对汇价都在这个附近。)

//---- calcuulate number of losses orders without a break-计算亏损单数目

if(DecreaseFactor=3>0) //如果 下跌因素个数(=3>0

{

for(int i=orders-1;i>=0;i--)

//计次循环(i=历史平仓单数-1,i=0, 递减1)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print(\"Error in history!\");

break; }

//如果 没有本系统交易记录,输出“无交易历史!”

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

//如果 订单的货币对不是当前货币对,或者 订单类型为挂单时,继续运行

//订单类型为整数型,0-BUY1-SELL2-BUYLIMT3-BUYSTOP4-SELLLIMT5-SELLSTOP,其中“>OP_SELL”代表挂单

if(OrderProfit()>0) break;

如果 盈利单数目>0,跳出循环

<font face=\"Times New Roman\">if(OrderProfit()1</strong>时,则 重新计算下单量,并保留小数点后1位,其计算公式为:

下单量=lot-lot*losses/DecreaseFactor=3)。

}

//---- return lot size-返回下单量

if(lot1) return;

//如果当前K线的成交价次数大于1,返回

(不是K线的开盘时间点,即当前k线还没收盘确定,则直接返回;否则,如果是K线第一个成交价,则向下继续运行)

//---- get Moving Average 获取均线数值

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//获取当前以收盘价为基准计算出的均线数值

  iMA(NULL,0,12,6,MOD_SMA,PRICE_CLOSE,0)

//---- sell conditions-卖出条件

if(Open[1]>ma && Close[1]1) return;//如果当前K线的成交价次数>1,则返回

//---- get Moving Average //获取均线数值

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//获取当前以收盘价为基准计算出的均线数值

<div align=\"left\"><font size=\"3\"><font face=\"Times New Roman\"><font color=\"#000000\">for(int i=0;ima && Close[1]
""
还没有人打赏,支持一下

评论|共 20 个

落羽

发表于 2012-11-21 23:00:23 | 显示全部楼层

我有一个EA 好坏你自己定  免费的  需要的话 可以发给你玩玩  

iboomer

发表于 2012-11-21 23:00:23 | 显示全部楼层

刚刚接触EA ,楼主请发份给我…  

hate

发表于 2012-11-22 01:36:01 | 显示全部楼层

鉴定完毕.!  

love869

发表于 2012-11-22 01:36:01 | 显示全部楼层

小生对楼主之仰慕如滔滔江水连绵不绝,海枯石烂,天崩地裂,永不变心.  

你是否在笑

发表于 2012-11-22 01:36:01 | 显示全部楼层

我的啦嘿嘿  

amy328

发表于 2012-11-22 01:36:01 | 显示全部楼层

我帮你 喝喝  

搞笑

发表于 2012-11-22 01:36:01 | 显示全部楼层

现在越做月亏啊  

小飞鱼常春

发表于 2012-11-22 01:36:01 | 显示全部楼层

我在顶贴~!~  

一路飘红

发表于 2013-8-3 22:13:37 | 显示全部楼层

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//获取当前以收盘价为基准计算出的均线数值

骗人的 哦

123下一页
您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则