登陆/注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 2488

[MT4] EA交易时间的控制简介

[复制链接]

79

主题

320

回帖

1504

活跃度

回帖达人实盘认证实名认证发贴达人本站牛人

程序猿的仔仔实盘认证 发表于 2018-3-30 01:26:25 | 显示全部楼层 | 关注 | 私信
div_work 变量是用于突然价格波动的: 它限制了信号可以产生的范围。
div_signal 变量是用于信号扭转的,指标上下边界的交叉点不当成是信号,而是作为一定程度的反转。换句话说,当价格超过了边界超过了这个变量设置的距离,信号才被触发。这可以排除掉一些假信号。
work_alt 变量是一个标志,它可以设置在出现一个相反信号时关闭当前的仓位而建立一个新的仓位。
  1. #property copyright "24KRMB"
  2. #property link      "时间的控制简介"
  3. #property version   "1.01"
  4. #incLUde<Trade\Trade.mqh>
  5. //--- 输入参数
  6. input char     time_h_start=22;       // 交易开始时间
  7. input char     time_h_stop=3;         // 交易停止时间
  8. input int      bands_period=12;       // 布林带的周期数
  9. input int      bands_shift=0;         // 布林带的平移
  10. input double   bands_diviation=2;     // 布林带的偏移
  11. input double   div_work=3;            // 信号的偏移
  12. input double   div_signal=5;          // 主信号的减弱
  13. input bool     work_alt=true;         // 如果有相反信号对仓位的操作
  14. input int      take_profit=50;        // 获利
  15. input int      stop_loss=100;         // 止损
  16. //---
  17. input bool     mon=true;              // 星期一工作
  18. input bool     tue=false;             // 星期二工作
  19. input bool     wen=true;              // 星期三工作
  20. input bool     thu=true;              // 星期四工作
  21. input bool     fri=true;              // 星期五工作
  22. //---
  23. input long magic_number=65758473787389; // 幻数
  24. input double order_volume=0.01;         // 手数大小
  25. input int order_deviation=100;          // 仓位开启的偏移
  26. //--- 变量
  27. MqlDateTime time_now_str;
  28. datetime time_now_var;
  29. CTrade trade;
  30. int bb_handle;
  31. double bb_base_line[3];
  32. double bb_upper_line[3];
  33. double bb_lower_line[3];
  34. bool work_day=true;
复制代码
而对于全局变量,这里有:
1、为了更方便而使用的两个对等的时间变量 (time_now_str, time_now_var),
2、随后是用于操作订单的类对象,
3、指标的句柄,
4、三个用于读取在当前时间指标数据的小数组 (bb_base_line[], bb_upper_line[], bb_lower_line[]).
5work_day 变量是用于记录订单的星期几的,

下面,是一小段代码来初始化一些用于类操作的参数的:
  1. //+------------------------------------------------------------------+
  2. //| EA交易初始化函数                                                    |
  3. //+------------------------------------------------------------------+
  4. int OnInit()
  5.   {
  6. //---
  7.    trade.SetExpertMagicNumber(magic_number);
  8.    trade.SetDeviationInPoints(order_deviation);
  9.    trade.SetTypeFilling(ORDER_FILLING_FOK);
  10.    trade.SetAsyncMode(false);
  11. //---
  12.    return(INIT_SUCCEEDED);
  13.   }
复制代码
在开始探讨交互的主要代码和信号的接收。
首先,我们从服务器取得当前时间,然后使用 switch 操作符来检查今天是否允许建立订单,并且把数据输入给 work_day 变量。我假定 EA 会在所有的时间都工作 (不仅在亚洲市场)。另外,也有可能终端的时间在不同的服务器上也是不同的,所以,我们需要检查工作时间。这里有两个选项: 或者在某个时间段工作,或者在转换后在整个日期分隔之内工作。这要在 'work' 标志中输入数据。
如果工作时间和选择的日期匹配上了,就把计算所得的句柄和它的数据复制到之前声明的数组中。下面,我们就应该要知道买入和卖出价格,因为它们是用于计算买入和卖出信号的,如果没有开启的仓位,如果有信号出现,就设置相应的订单。
  1. //+------------------------------------------------------------------+
  2. //| EA交易订单分时函数                                                  |
  3. //+------------------------------------------------------------------+
  4. void OnTick()
  5.   {
  6. //---
  7.    time_now_var=TimeCurrent(time_now_str);// 当前时间
  8.    bool work=false;
  9.    
  10.       switch(time_now_str.day_of_week)
  11.      {
  12.       case 1: if(mon==false){work_day=false;}
  13.       else {work_day=true;}
  14.       break;
  15.       case 2: if(tue==false){work_day=false;}
  16.       else {work_day=true;}
  17.       break;
  18.       case 3: if(wen==false){work_day=false;}
  19.       else {work_day=true;}
  20.       break;
  21.       case 4: if(thu==false){work_day=false;}
  22.       else {work_day=true;}
  23.       break;
  24.       case 5: if(fri==false){work_day=false;}
  25.       else {work_day=true;}
  26.       break;
  27.      }

  28. //--- 检查工作时间     
  29.    if(time_h_start>time_h_stop)             // 工作直到第二天
  30.      {
  31.       if(time_now_str.hour>=time_h_start || time_now_str.hour<=time_h_stop)
  32.         {
  33.          work=true;
  34.         }                                   // 传入标志以启用工作
  35.      }
  36.    else                                     // 在一天之内工作
  37.      {
  38.       if(time_now_str.hour>=time_h_start && time_now_str.hour<=time_h_stop)
  39.         {
  40.          work=true;
  41.         }
  42.      }                                     // 传入标志以启用工作

  43.    int pos=PositionsTotal();

  44.    if(work==true && work_day==true)        // 工作已启用
  45.      {
  46.       bb_handle=iBands(_Symbol,_Period,bands_period,bands_shift,bands_diviation,PRICE_CLOSE);         // 得到布林带指标句柄
  47.       int i_bl=CopyBuffer(bb_handle,0,0,3,bb_base_line);
  48.       int i_ul=CopyBuffer(bb_handle,1,0,3,bb_upper_line);
  49.       int i_ll=CopyBuffer(bb_handle,2,0,3,bb_lower_line);
  50.       if(i_bl==-1 || i_ul==-1 || i_ll==-1)
  51.         {Alert("从 iBands 复制数据错误: base line=",i_bl,", upper band=",i_ul,", lower band=",i_ll);}   // 检查复制的数据

  52.       double price_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
  53.       double price_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

  54.       if(pos<1)
  55.         {
  56.          if((price_ask-(div_signal*_Point))>=bb_upper_line[2]-(div_work*_Point) && (price_ask-(div_signal*_Point))<=bb_upper_line[2]+(div_work*_Point))// 卖出信号
  57.            {
  58.             trade.Sell(order_volume,_Symbol,price_bid,(price_bid+(stop_loss*_Point)),(price_bid-(take_profit*_Point)),"pos<1_sell");
  59.            }
  60.          if((price_bid+(div_signal*_Point))<=bb_lower_line[2]+(div_work*_Point) && (price_bid+(div_signal*_Point))>=bb_lower_line[2]-(div_work*_Point))// 买入信号
  61.            {
  62.             trade.Buy(order_volume,_Symbol,price_ask,(price_ask-(stop_loss*_Point)),(price_ask+(take_profit*_Point)),"pos<1_buy");
  63.            }
  64.         }
  65.       if(pos>0 && work_alt==true)
  66.         {
  67.          if(trade.RequestType()==ORDER_TYPE_BUY)                     // 如果在那之前有买入订单
  68.             if((price_ask-(div_signal*_Point))>=bb_upper_line[2]-(div_work*_Point) && (price_ask-(div_signal*_Point))<=bb_upper_line[2]+(div_work*_Point))// 卖出信号
  69.               {
  70.                trade.PositionClose(_Symbol,order_deviation);
  71.                trade.Sell(order_volume,_Symbol,price_bid,(price_bid+(stop_loss*_Point)),(price_bid-(take_profit*_Point)),"pos>0_sell");
  72.               }
  73.          if(trade.RequestType()==ORDER_TYPE_SELL)                   // 如果在那之前有卖出订单
  74.             if((price_bid+(div_signal*_Point))<=bb_lower_line[2]+(div_work*_Point) && (price_bid+(div_signal*_Point))>=bb_lower_line[2]-(div_work*_Point))// 买入信号
  75.               {
  76.                trade.PositionClose(_Symbol,order_deviation);
  77.                trade.Buy(order_volume,_Symbol,price_ask,(price_ask-(stop_loss*_Point)),(price_ask+(take_profit*_Point)),"pos>0_buy");
  78.               }
  79.         }
  80.      }
  81.    else
  82.      {
  83.       if(pos>0)
  84.         {
  85.          trade.PositionClose(_Symbol,order_deviation);
  86.         }
  87.      }
  88.   }
  89. //+------------------------------------------------------------------+
复制代码
最后的代码片段: 如果夜间市场时段关闭,关闭所有订单。然后 EA 的代码就结束了。
基于剧烈市场波动策略的变化
这里一切都很简单: 订单只在某个 order_time 时间设置,订单设置的价格距离当前价格为 order_div,并且有对应的止损 (order_sl) 和获利 (order_tp)。如果没有触发任何一个挂单,这就表示是平盘的波动,而订单会根据 time_to_del 过期而被删除 (单位为秒数)。
其他的输入参数和之前的 EA 交易是一样的。
增加的全局变量为:
work — 启用只设置一次挂单,
work_del — 启用如果订单被触发,就删除反向的订单,
work_day — 启用只在当前日内工作.
另外,还有两个结果结构用于接收数据和删除挂单。
  1. //+------------------------------------------------------------------+
  2. //|                                                TimeBuyOrSell.mq5 |
  3. //|                                                          Aktiniy |
  4. //|                                                             TBOS |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Aktiniy"
  7. #property link      "TBOS"
  8. #property version   "1.01"
  9. #include<Trade\Trade.mqh>
  10. //--- 输入参数
  11. input int      order_time=0;                        // 订单开启时间
  12. input int      order_sl=200;                        // 止损
  13. input int      order_tp=180;                        // 获利
  14. input int      order_div=120;                       // 设置挂单时与当前价格的偏移
  15. input int      time_to_del=10800;                   // 删除挂单的时间
  16. //---
  17. input bool     mon=true;                            // 在星期一工作
  18. input bool     tue=false;                           // 在星期二工作
  19. input bool     wen=true;                            // 在星期三工作
  20. input bool     thu=true;                            // 在星期四工作
  21. input bool     fri=true;                            // 在星期五工作
  22. //---
  23. input long magic_number=65758473787389;             // 幻数
  24. input double order_volume=0.01;                     // 手数大小
  25. input int order_deviation=100;                      // 开启仓位的偏移
  26. //--- 变量
  27. CTrade trade;
  28. MqlDateTime time_now_str;
  29. datetime time_now_var;
  30. bool work=true;
  31. bool work_del=true;
  32. bool work_day=true;
  33. //---
  34. MqlTradeResult result_buy={0};
  35. MqlTradeResult result_sell={0};
复制代码
随后是一小段代码,用于初始化一些操作类的参数,和之前的一样。

OnTick 函数的开始和之前描述的 EA 类似,在取得了用于当天操作的标志后,再检查当前的小时数是否与它对应,如果都成功了,就计算用于建立订单的参数 (获利,止损,建仓价格以及没有触发而删除订单的时间). 把相应的交易请求发送到服务器,

在设置了挂单之后,EA 会监控它们中的一个被触发后再根据结果结构中的订单号来删除多余的一个。
  1. //+------------------------------------------------------------------+
  2. //| EA交易订单分时函数                                                  |
  3. //+------------------------------------------------------------------+
  4. void OnTick()
  5.   {
  6. //---
  7.    time_now_var=TimeCurrent(time_now_str);// 当前时间

  8.    switch(time_now_str.day_of_week)
  9.      {
  10.       case 1: if(mon==false){work_day=false;}
  11.       else {work_day=true;}
  12.       break;
  13.       case 2: if(tue==false){work_day=false;}
  14.       else {work_day=true;}
  15.       break;
  16.       case 3: if(wen==false){work_day=false;}
  17.       else {work_day=true;}
  18.       break;
  19.       case 4: if(thu==false){work_day=false;}
  20.       else {work_day=true;}
  21.       break;
  22.       case 5: if(fri==false){work_day=false;}
  23.       else {work_day=true;}
  24.       break;
  25.      }

  26.    if(time_now_str.hour==order_time && work==true && work_day==true)
  27.      {
  28.       double price_ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
  29.       double price_bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

  30.       double div=order_div*_Point;
  31.       double sl=order_sl*_Point;
  32.       double tp=order_tp*_Point;

  33.       double price_buy=price_ask+div;
  34.       double price_sell=price_bid-div;

  35.       double buy_sl=price_buy-sl;
  36.       double buy_tp=price_buy+tp;
  37.       double sell_sl=price_sell+sl;
  38.       double sell_tp=price_sell-tp;

  39.       datetime time_end=time_now_var+time_to_del;     //3600 秒, 一个小时

  40.       trade.BuyStop(order_volume,price_buy,_Symbol,buy_sl,buy_tp,ORDER_TIME_SPECIFIED,time_end,"BuyLimit");
  41.       trade.Result(result_buy);

  42.       trade.SellStop(order_volume,price_sell,_Symbol,sell_sl,sell_tp,ORDER_TIME_SPECIFIED,time_end,"SellLimit");
  43.       trade.Result(result_sell);

  44.       work=false;
  45.      }

  46.    if(PositionsTotal()>0 && work_del==true)
  47.      {
  48.       PositionSelect(_Symbol);
  49.       long position_type=PositionGetInteger(POSITION_TYPE);
  50.       if(position_type==POSITION_TYPE_SELL)
  51.          trade.OrderDelete(result_buy.order);
  52.       if(position_type==POSITION_TYPE_BUY)
  53.          trade.OrderDelete(result_sell.order);

  54.       work_del=false;
  55.      }
  56.    if(PositionsTotal()==0)
  57.       work_del=true;

  58.    if(time_now_str.hour!=order_time)
  59.      {
  60.       work=true;
  61.      }

  62.   }
  63. //+------------------------------------------------------------------+
复制代码
代码的最后是启用了挂单标志,因为超过了开启订单的时间。

0

主题

126

回帖

37

活跃度
华尔街之狼 发表于 2018-3-31 11:36:14 | 显示全部楼层 | 关注 | 私信
谢谢分享,厉害楼主

0

主题

336

回帖

2374

活跃度

实盘认证实名认证

侯晓阳实盘认证 发表于 2022-7-9 07:45:18 | 显示全部楼层 | 关注 | 私信
来挖矿了,谢谢分享

10

主题

537

回帖

6489

活跃度

回帖达人实盘认证实名认证

youbin9实盘认证 发表于 2022-9-24 18:31:03 | 显示全部楼层 | 关注 | 私信

挖矿学习,感谢分享
温馨提示
无充值,无付费,唯一微信公众号24KRMB,珍惜账号,理性讨论 知道啦

评论管理|实名认证|黑名单|手机版|倡议书|版权声明|24KRMB ( 鄂ICP备19016902号 )

GMT+8, 2024-10-18 16:49 , Processed in 1.044432 second(s), 41 queries , Gzip On.

Copyright © 2012-2024 24KRMB.COM

Powered by 阿里云提供驱动 UI: 240701

快速回复 返回列表