下载MetaTrader 5

请观看如何免费下载自动交易

有趣的脚本?
因此发布一个链接 -
让其他人评价

喜欢这个脚本? 在MetaTrader 5客户端尝试它

2016.02.11 13:25
程序库

TradeState - 依赖于时间的EA交易模式切换器 - MetaTrader 5程序库

| Chinese English Русский Español Deutsch 日本語 Português

显示:
439
等级:
投票: 29

你之前有没有根据时间来限制你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 Software Corp. 撰写的俄文原文
官方代码: https://www.mql5.com/ru/code/14335

情绪EA交易 情绪EA交易

利用市场开启时情绪变化进行交易的机器人.

CIsSession - 用于设置时间间隔的类 (时段) CIsSession - 用于设置时间间隔的类 (时段)

这个简单的类可以用于调整交易区间, 根据时间或星期来启用/禁用某些行为.

PA_Oscillator_HTF PA_Oscillator_HTF

在输入参数部分可以设置时段选项的 PA_Oscillator 指标.

LinearMomentum_HTF LinearMomentum_HTF

在输入参数部分可以选择时段选项的 LinearMomentum 指标.