设为首页 收藏本站 切换语言

MT4自带的EA,高手做的详细注解

| 发表于 2022-11-9 13:15:34 | 显示全部楼层 |复制链接
  1. //+------------------------------------------------------------------+
  2. //|                                      Moving Average.mq4 |                     
  3. //|                                       http://www.izzzz.com |
  4. //+------------------------------------------------------------------+
  5. #define MAGICMA  20050610 //定义本EA操作的订单的唯一标识号码
  6. extern double Lots               = 0.1;//每单的交易量
  7. extern double MaximumRisk        = 0.02;//作者定义的最大风险参数
  8. extern double DecreaseFactor     = 3;//作者定义的参数,作用要看程序中的用法
  9. extern double MovingPeriod       = 10;//EA中使用的均线的周期
  10. extern double MovingShift        =3;//EA中使用的均线向左的K线偏移量
  11. //+------------------------------------------------------------------+
  12. //| Calculate open positions                                         |
  13. //+------------------------------------------------------------------+
  14. int CalculateCurrentOrders(string symbol)//函数作用,计算当前持仓订单的数量
  15.   {
  16.    int buys=0,sells=0;//定义两个临时变量,准备用于后面的多空订单的个数计算
  17. //----
  18.    for(int i=0;i<OrdersTotal();i++)//循环检测当前的订单队列
  19.      {
  20.       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;//挑出持仓单的每一个订单位置
  21.       if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//根据订单位置,比较是否是当前K线商品 以及订单唯一标识号是否和本程序设置的一致(用于避免EA误操作其他程序控制的持仓单)
  22.         {
  23.          if(OrderType()==OP_BUY)  buys++;//找到符合条件的持仓单后,如果是多单,则临时变量buys增加1
  24.          if(OrderType()==OP_SELL) sells++;//找到符合条件的持仓单后,如果是空单,则临时变量sells增加1
  25.         }
  26.      }
  27. //---- return orders volume
  28.    if(buys>0) return(buys);
  29.    else       return(-sells);//本函数返回查询计算结束时的持仓单的个数。
  30.   }
  31. //+------------------------------------------------------------------+
  32. //| Calculate optimal lot size                                       |
  33. //+------------------------------------------------------------------+
  34. double LotsOptimized()//函数目的,根据要求 计算出订单交易量
  35.   {
  36.    double lot=Lots;
  37.    int    orders=HistoryTotal();     // history orders total 历史出场订单的个数
  38.    int    losses=0;                  // number of losses orders without a break
  39. //---- select lot size
  40.    lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);//通过风险系数的计算获得当前入场单应该采用的交易量
  41. //---- calcuulate number of losses orders without a break
  42.    if(DecreaseFactor>0)
  43.      {
  44.       for(int i=orders-1;i>=0;i--)
  45.         {
  46.          if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }//循环查询出场单队列
  47.          if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;//
  48.          //----
  49.          if(OrderProfit()>0) break;
  50.          if(OrderProfit()<0) losses++;//循环计算所有出场亏损单的亏损总和
  51.         }
  52.       if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);//如果亏损额大于1,则下一入场单的交易量修正为新的计算结果。
  53.      }
  54. //---- return lot size
  55.    if(lot<0.1) lot=0.1;//如果计算出的交易量小于帐户最小手数0.1,则下一入场单的交易手数使用0.1作为交易量
  56.    return(lot);
  57.   }
  58. //+------------------------------------------------------------------+
  59. //| Check for open order conditions                                  |
  60. //+------------------------------------------------------------------+
  61. void CheckForOpen()//检查入场条件的情况并作处理
  62.   {
  63.    double ma;
  64.    int    res;
  65. //---- go trading only for first tiks of new bar
  66.    if(Volume[0]>1) return;//如果当前K线持仓量大于1,说明不是K线的开盘时间点,则直接返回 否则是K线第一个价格,则继续下面的过程
  67. //---- get Moving Average
  68.    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);//获得当前的均线数值
  69. //---- sell conditions
  70.    if(Open[1]>ma && Close[1]<ma)  //如当前K开盘价大于均线,而前一K收盘价小于均线,则发出入场多单
  71.      {
  72.       res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
  73.       return;
  74.      }
  75. //---- buy conditions
  76.    if(Open[1]<ma && Close[1]>ma)  //如当前K开盘价小于均线,而前一K收盘价大于均线,则发出入场空单
  77.      {
  78.       res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
  79.       return;
  80.      }
  81. //----
  82.   }
  83. //+------------------------------------------------------------------+
  84. //| Check for close order conditions                                 |
  85. //+------------------------------------------------------------------+
  86. void CheckForClose()//检查出场条件的情况并作处理
  87.   {
  88.    double ma;
  89. //---- go trading only for first tiks of new bar
  90.    if(Volume[0]>1) return;
  91. //---- get Moving Average
  92.    ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
  93. //----
  94.    for(int i=0;i<OrdersTotal();i++)
  95.      {
  96.       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
  97.       if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
  98.       //---- check order type
  99.       if(OrderType()==OP_BUY)
  100.         {
  101.          if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);//如果持仓是多单,则当当前K开盘价小于均线,而前一K收盘价大于均线,则发出平仓指令
  102.          break;
  103.         }
  104.       if(OrderType()==OP_SELL)
  105.         {
  106.          if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White););//如果持仓是空单,则当当前K开盘价大于均线,而前一K收盘价小于均线,则发出平仓指令
  107.          break;
  108.         }
  109.      }
  110. //----
  111.   }
  112. //+------------------------------------------------------------------+
  113. //| Start function                                                   |
  114. //+------------------------------------------------------------------+
  115. void start()//主循环过程
  116.   {
  117. //---- check for history and trading
  118.    if(Bars<100 || IsTradeAllowed()==false) return;
  119. //---- calculate open orders by current symbol
  120.    if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
  121.    else                                    CheckForClose();
  122. //----
  123.   }
  124. //+------------------------------------------------------------------+
复制代码
如果有帮助,就支持一下我呗
举报

评论 使用道具

精彩评论5

daerwushen
DD
| 发表于 2022-11-9 18:12:40 | 显示全部楼层
还是系统学一下吧
举报

点赞 评论 使用道具

ken138888
B
| 发表于 2022-11-9 20:42:27 | 显示全部楼层
厉害了。。。
举报

点赞 评论 使用道具

qwe11
CCC
| 发表于 2022-11-10 08:48:26 | 显示全部楼层
系统学一下
举报

点赞 评论 使用道具

qwe963258
DDD
| 发表于 2022-11-14 09:43:31 | 显示全部楼层
是的 我记得自带的2个是 MACD 和均线的一个系统,这个 应该是那个均线的代码
举报

点赞 评论 使用道具

daerwushen
DD
| 发表于 2022-11-14 17:14:26 | 显示全部楼层
均线的代码
举报

点赞 评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册

简体中文
繁體中文
English(英语)
日本語(日语)
Deutsch(德语)
Русский язык(俄语)
بالعربية(阿拉伯语)
Türkçe(土耳其语)
Português(葡萄牙语)
ภาษาไทย(泰国语)
한어(朝鲜语/韩语)
Français(法语)