TradeState - 依赖于时间的EA交易模式切换器 - MetaTrader 5程序库
- 显示:
- 2274
- 等级:
- 已发布:
- 2016.02.11 13:25
- 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
你之前有没有根据时间来限制你EA交易的运行呢?例如, 如何制作EA交易, 使它在夜间时段不进行任何交易活动?或者, 如果您在莫斯科交易市场进行交易, 您是否曾经在周末市场关闭之前平掉每个仓位呢?怎样作结构更加复杂的限制呢?例如, 怎样制作EA交易, 使之在晚上7点之前可以建仓和平仓, 而在晚7点之后不进行任何新的交易?实际上是可能作这样灵活的配置的. CTradeState 特别模块就将对此有所帮助.
CTradeState 是怎样工作的呢? 此模块返回六个状态中的一个, 状态是使用ENUM_TRADE_STATE 结构定义的:
//+------------------------------------------------------------------+ //| 决定EA的交易状态 | //+------------------------------------------------------------------+ enum ENUM_TRADE_STATE { TRADE_BUY_AND_SELL, // 允许买入和卖出. TRADE_BUY_ONLY, // 只允许买入. 不允许卖出. TRADE_SELL_ONLY, // 只允许卖出. 不允许买入. TRADE_STOP, // 不允许交易. 立即平掉所有仓位. 不接受新的进场信号. TRADE_WAIT, // 失去对已建仓位的控制. 忽略新的信号. 在新闻发布期间有用. TRADE_NO_NEW_ENTRY // 忽略进场信号. 尽管已建仓位会根据交易逻辑进行维护. };
在您的EA交易中, 您必须根据返回的CTradeState结构(此值是通过GetTradeState方法返回的)进行一系列的操作.
在使用交易模式之前, 它们必须被设置, 也就是必须调用SetTradeState方法. SetTradeState 方法的原型如下:
//+------------------------------------------------------------------+ //| 设置交易状态 TradeState | //| 输入: | //| time_begin - 从交易状态开始 | //| 工作的时间. | //| time_end - 直到交易状态工作的时间 | //| day_of_week - 星期中的某天 用于 | //| 应用设置交易状态. 根据要求修改 | //| ENUM_DAY_OF_WEEK 或者 ALL_DAYS_OF_WEEK | //| state - 交易状态. | //| 警告, time_begin 和 time_end 的日期部分被忽略. | //+------------------------------------------------------------------+ void CTradeState::SetTradeState(datetime time_begin,datetime time_end, int day_of_week, ENUM_TRADE_STATE state);
例如, 对于要在18:45到18:59期间返回 TRADE_WAIT 值的交易状态模块 (已建仓位的控制停止, 不再建立新仓位), 需要用以下参数调用 SetTradeState:
TradeState.SetTradeState(D'18:45', D'18:59', ALL_DAYS_OF_WEEK, TRADE_WAIT);
在这种模式为活动的情况下, 也可以不止设置起始和结束时间, 还可以设置星期中的某天(day of the week). 如果交易模式设置是星期中的每一天, 需要使用 ALL_DAYS_OF_WEEK 值. 如果交易模式只为星期中的某一天设置, 在 day_of_week变量中指定ENUM_DAY_OF_WEEK系统枚举中的某个值.
为了获得当前交易模式, 使用GetTradeState 方法.
例如, 考虑一些模式组合, 可能对莫斯科交易市场的交易有用:
时间 | 模式 | 描述 |
---|---|---|
10:00 - 10:01 | TRADE_WAIT | 市场开放时间. 市场开放时刻的特点是波动大, 价格跳空. 这些时刻的交易活动风险高, 所以在交易的开始阶段最好远离交易, 所以EA需要被设置成在这段时间内为等待模式. |
14:00 - 14:03 | TRADE_WAIT | 中间清场时间. 这个时间段市场还是不正常, 所以EA交易也需要被设置成TRADE_WAIT模式. |
18:45 - 18:49 | TRADE_WAIT | 主要清场时间. 市场关闭的时间, 交易被禁止. 激活TRADE_WAIT 模式. |
23:50 - 9:59 | TRADE_WAIT | 市场关闭, 交易被禁止. EA 模式是 TRADE_WAIT. |
星期五, 从 15:00 开始 | TRADE_NO_NEW_ENTRY | 星期五 — 一周中最后一个交易日. 为了不在周末留下开启的仓位, 它们需要在最后一个交易日关闭. 所以, 在最后一个交易日就不要建立新的仓位了, 因为几个小时后就会平仓. 因为这些原因, 使用 NO_NEW_ENTRY 模式. 每个星期五, 从15:00开始, 新的进场信号被忽略. 已经存在的仓位只能被关闭. |
星期五, 23:40-23:50 | TRADE_STOP | 市场关闭前的时间. 这个时间段全部仓位都必须关闭. EA 在 23:40 切换到 TRADE_STOP 模式, 平掉开启的仓位, 并切换到等待模式. |
星期六, 星期天 | TRADE_WAIT | 周末不进行交易因为节日转移, 有些星期六可能是工作日. 莫斯科交易市场在这样的日子也开放. 这样的情况比较少, 而且这样的"工作日"也要避免交易, 因为波动小而统计不稳定. 这些日子不论是否是工作日都不能进行交易. |
用法实例. 模式的组合可以使用以下一系列SetTradeState调用来实现 (例子是脚本程序):
//+------------------------------------------------------------------+ //| TestTradeState.mq5 | //| Copyright 2015, Vasiliy Sokolov. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Vasiliy Sokolov." #property link "http://www.mql5.com" #property version "1.00" #include <Strategy\TradeState.mqh> CTradeState TradeState(TRADE_BUY_AND_SELL); // 把默认模式设为可以买进和卖出 //+------------------------------------------------------------------+ //| 脚本程序开始函数 | //+------------------------------------------------------------------+ void OnStart() { TradeState.SetTradeState(D'15:00', D'23:39', FRIDAY, TRADE_NO_NEW_ENTRY); TradeState.SetTradeState(D'10:00', D'10:01', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'14:00', D'14:03', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'18:45', D'18:59', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'23:50', D'23:59', ALL_DAYS_OF_WEEK, TRADE_STOP); TradeState.SetTradeState(D'0:00', D'9:59', ALL_DAYS_OF_WEEK, TRADE_WAIT); TradeState.SetTradeState(D'23:40', D'23:49', FRIDAY, TRADE_STOP); TradeState.SetTradeState(D'00:00', D'23:59', SATURDAY, TRADE_WAIT); TradeState.SetTradeState(D'00:00', D'23:59', SUNDAY, TRADE_WAIT); printf("10:00 - " + EnumToString(TradeState.GetTradeState(D'10:00'))); printf("14:01 - " + EnumToString(TradeState.GetTradeState(D'14:01'))); printf("18:50 - " + EnumToString(TradeState.GetTradeState(D'18:50'))); printf("23:50 - " + EnumToString(TradeState.GetTradeState(D'23:51'))); printf("Friday, > 15:00 - " + EnumToString(TradeState.GetTradeState(D'2015.11.27 15:00'))); printf("Saturday - " + EnumToString(TradeState.GetTradeState(D'2015.11.28'))); printf("Sunday - " + EnumToString(TradeState.GetTradeState(D'2015.11.29'))); printf("Default State - " + EnumToString(TradeState.GetTradeState(D'11:40'))); } //+------------------------------------------------------------------+
为了作检测, 此脚本程序根据指定的交易时间打印出交易模式.
认识到提供的模块是个辅助工具是很重要的. 必须由EA交易本身来决定是否停止交易(并平掉全部仓位). 然而, 为使用此模块的任何EA交易创建时区和交易模式非常简单.
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/14335
在输入参数部分可以设置时段选项的 PA_Oscillator 指标.
LinearMomentum_HTF在输入参数部分可以选择时段选项的 LinearMomentum 指标.