程序库: 控制_交易_会话 - 页 2

 
Forester #:
这只是按时间进行的比较。
代替 顺便说一句,你可以任意设定。

会话时间从经纪商处获取,也可以手动设置。

我指的是内部代码,而不是调用和传入参数。

datetime Sec = TimeSec(time); //当天当前秒数
...
if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] ) && ( Sec < this.TradeTimeTo[i][DayOfWeek] ))

这里 Sec 的取值范围限定在一天内,但没有 from-to 的边界。例如,如果查询的是凌晨3点,而交易时段是晚上9点到早上8点,那么本应返回 true,但该条件不会触发,结果将返回 false。

 
Stanislav Korotky #:

我指的是内部代码,而不是调用和传入的参数。

这里将Sec转换为24小时制,但没有from-to的范围限制。例如,如果查询的时间是凌晨3点,而该交易时段的交易时间为晚上9点至早上8点,那么本应返回true,但条件未满足,因此会返回false。

可以通过设置两个交易时段来解决这个问题:
21-24 和 0-8

这是个理论问题,还是交易中心实际上存在类似的from-to范围?

 
Forester #:

可以通过两个时段来设置:
21-24 和 0-8

这是个理论问题,还是数据中心确实有类似的“from-to”范围?

所谓“通过两个交易时段设置”是什么意思?——毕竟这些数据是来自MT5的设置,并非由我们手动设置的。而在MT5中,一个交易时段就对应一条记录。在某些交易中心(由于地理位置远离市场),可能会出现这种情况。 在这种情况下,SymbolInfoSessionTrade会返回包含额外一天时间的“to”时间(至少以前是这样——我目前尚未核实),也就是说“from < to”的条件始终成立。
 
Stanislav Korotky #:
“设置两个会话”是什么意思?

在 sunput 中可以为每一天单独设置会话。程序将根据这些设置运行。
调用
#define LoadSessionFromInputs // 从输入中读取会话

Stanislav Korotky#:
在这种情况下,SymbolInfoSessionTrade 返回的“to”时间会考虑额外的一天(至少以前是这样——我现在还没验证),也就是说“from < to”的 条件始终成立。

也就是说 20:00 - 32:00 吗?

如果交易中心能提供一个可供测试的实际示例,就可以根据该示例进行调整并验证。
目前有一个简单的解决方案——自行将会话在午夜时分拆分为两个部分。还可以指定具体是哪一天——例如周六8:00之前属于周五的剩余时间,或者周日20:00之后属于周一的开始时间。

 
Forester #:

也就是说 20:00 - 32:00 吗?

是的。目前还没有发现配备此类服务器的现成数据中心。得去新西兰找找看。
 
Stanislav Korotky #:
是的。目前还没有现成的数据中心配备这样的服务器。得在新西兰找找看。

我用自定义符号编辑器这样设置的:


 
Forester #:

我在自定义符号编辑器中这样设置:

编写了会话规则,使会话在次日按截图所示的时段(即20:00-08:00)进行切换。
修改了该函数:
      for (int i = 0; i < this.TradeSessions[DayOfWeek]; i++){//遍历本周该天的会话
         if(( Sec >= this.TradeTimeFrom[i][DayOfWeek] )){ //会话开始 - 查找结束
            if(Sec < this.TradeTimeTo[i][DayOfWeek]){//还没到尽头,记住
               this.NextTradeStop = (datetime)(day * 86400) + this.TradeTimeTo[i][DayOfWeek]; //当前会话的结束时间,在此之前无需检查下一个会话 = (当天开始时间 + 会话时间) 
               //Print("new Stop ",this.NextTradeStop);
               return true; 
            }else if (this.TradeTimeTo[i][DayOfWeek] < this.TradeTimeFrom[i][DayOfWeek]){// 结束 < 开始,例如 20:00-04:00 — 跨入次日 + 时间增加 1 天
               this.NextTradeStop = (datetime)((day+1) * 86400) + this.TradeTimeTo[i][DayOfWeek]; //当前会话的结束时间,在此之前无需检查下一个会话 = (当天开始时间 + 会话时间) 
               //Print("new Stop ",this.NextTradeStop);
               return true;
            }
         }
      }

新增的代码 会检查结束时间是否早于会话开始时间,然后直接在结束时间上 加1天

已通过以下会话 进行验证:

第1天 交易时段:1:23:55-00:05
第2天 交易时段:1:00:15-00:17


首个交易时段延续至次日:

2020.06.29 23:55:03 2020.06.29 23:55:03
2020.06.29 23:55:09 2020.06.29 23:55:09
2020.06.29 23:56:39 2020.06.29 23:56:39
2020.06.29 23:57:01 2020.06.29 23:57:01
2020.06.29 23:59:59 2020.06.29 23:59:59
2020.06.30 00:00:00 2020.06.30 00:00:00
2020.06.30 00:00:08 2020.06.30 00:00:08
2020.06.30 00:01:52 2020.06.30 00:01:52
2020.06.30 00:02:02 2020.06.30 00:02:02
2020.06.30 00:02:30 2020.06.30 00:02:30
2020.06.30 00:03:25 2020.06.30 00:03:25
2020.06.30 00:03:31 2020.06.30 00:03:31

第二场会议,按惯例在一天内举行:
2020.06.30 00:15:29 2020.06.30 00:15:29
2020.06.30 00:16:01 2020.06.30 00:16:01
2020.06.30 00:16:09 2020.06.30 00:16:09

一周后将举行第一场会议:
2020.07.06 23:55:01 2020.07.06 23:55:01
2020.07.06 23:55:09 2020.07.06 23:55:09