伦敦突围赛

 

亲爱的论坛成员。

几个星期以来,我一直在努力学习MQL4,但这是一个很大的挑战!!我希望我已经是一个专家了!但我不是。我希望我已经是一个专家了!但我不是,我希望能得到一点帮助。

我正试图为伦敦的开幕式建立一个突破性的专家顾问。我希望我的专家顾问能计算出伦敦开盘前5个柱子的高点和低点,然后计算出高点和低点。

对于这个功能,我想我必须使用iHigh函数的高点和iLow函数的低点来计算范围。但这个范围在一天中会发生变化。我希望这个范围的高点和低点是静态的,而不是可变的。

有没有人有什么想法?

谢谢你。

 
Nour:

亲爱的论坛成员。

几个星期以来,我一直在努力学习MQL4,但这是一个很大的挑战!!我希望我已经是一个专家了!但我不是。我希望我已经是一个专家了!但我不是,我希望能得到一点帮助。

我正试图为伦敦的开幕式建立一个突破性的专家顾问。我希望我的专家顾问能计算出伦敦开盘前5个柱子的高点和低点,然后计算出高点和低点。

对于这个功能,我想我必须使用iHigh函数的高点和iLow函数的低点来计算范围。但这个范围在一天中会发生变化。我希望这个范围的高点和低点是静态的,而不是可变的。

有没有人有什么想法?

谢谢。


你如何找到伦敦公开赛开始的酒吧...

显示你是如何做的

 

这是另一个问题deVries,我现在不知道如何找到伦敦开放的酒吧...。

我对MQL4还很陌生

 

......我是否遗漏了什么,或者MQL4内置的日期/时间函数 仍然 不足以处理这种事情?

有两个问题。

* 你不能可靠地获得经纪商服务器和GMT之间的偏移量,因为(a)它可以随着夏令时的变化而变化,(b)任何比较TimeCurrent()和TimeGMT()来计算偏移量的做法在周末都会失败。

* 即使你可以在市场开放时获得当前的偏移量,也没有内置的方法将GMT时间转换为另一个时区,如伦敦。

换句话说:没有内置的方法来确定(a)经纪人的服务器运行在欧洲中部,因此(b)每个栏的伦敦时间比MT4报告的时间晚1小时。

 

Nour:

这是另一个问题deVries,我现在不知道如何找到伦敦开放的酒吧...。

我对MQL4还很陌生

https://docs.mql4.com/series/ibarshift
 
gchrmt4:

......我是否遗漏了什么,或者MQL4内置的日期/时间函数仍然 不足以处理这种事情?

有两个问题。

* 你不能可靠地获得经纪商服务器和GMT之间的偏移量,因为(a)它可以随着夏令时的变化而变化,(b)任何比较TimeCurrent()和TimeGMT()来计算偏移量的做法在周末都会失败。

* 即使你可以在市场开放时获得当前的偏移量,也没有内置的方法将GMT时间转换为另一个时区,如伦敦。

换句话说:没有内置的方法来确定(a)经纪人的服务器运行在欧洲中部,因此(b)每个栏的伦敦时间比MT4报告的时间晚1小时。


似乎TimeGMT() 并不随夏令时而改变。 例如,我住在美国,所以目前我的本地时区是EDT。 我的经纪人的MT4服务器目前是EEST。 现在,考虑一下下面的代码和它的输出。

   Print ("1. GMT = ", TimeToString(TimeGMT()));
   Print ("2. Local Time (EDT) = ", TimeToString(TimeLocal()));
   Print ("3. Daylight Saving Adjustment: ", TimeDaylightSavings()/3600);
   Print ("4. GMTOffset for TimeLocal = ", TimeGMTOffset()/3600);
   Print ("5. Server Time (EEST) = ", TimeToString(TimeCurrent()));
   
   int local = (TimeLocal() - TimeGMT()) / 3600;
   int server = MathRound((TimeCurrent() - TimeGMT()) / 3600.0);
   string prt = "TimeLocal is ";
   if (local > 0)
      prt = StringConcatenate(prt, "GMT+", MathAbs(local));
   else if (local < 0)
      prt = StringConcatenate(prt, "GMT-", MathAbs(local));
   else
      prt = StringConcatenate(prt, "GMT");
      
   prt = StringConcatenate(prt, " and TimeCurrent is ");
   if (server > 0)
      prt = StringConcatenate(prt, "GMT+", MathAbs(server));
   else if (local < 0)
      prt = StringConcatenate(prt, "GMT-", MathAbs(server));
   else
      prt = StringConcatenate(prt, "GMT");
    
   Print (prt);

17:52:28 专家TestEA-1 EURUSD,H1:加载成功

17:52:28 TestEA-1 EURUSD,H1: 1. GMT = 2014.03.11 21:52

17:52:28 TestEA-1 EURUSD,H1: 2.当地时间(EDT)= 2014.03.11 17:52

17:52:28 TestEA-1 EURUSD,H1: 3.夏令时调整:-1

17:52:28 TestEA-1 EURUSD,H1: 4.TimeLocal的GMTOffset = 4

17:52:28 TestEA-1 EURUSD,H1: 5.服务器时间(EEST)= 2014.03.12 00:52

17:52:28 TestEA-1 EURUSD,H1:TimeLocal是GMT-4,TimeCurrent是GMT+3

我检查了上面的GMT时间和伦敦的时间,它们是一样的(伦敦直到3月底才改为BST)。 所以我相信TimeGMT()返回的是GMT,没有添加当地夏令时的调整。 EDT 被定义为UTC-4,EEST 被定义为UTC+3。

另外,如果你需要确定美国或欧盟的夏令时开始和结束的时间,请看这些函数

 
Thirteen:

我把上面的格林威治时间与伦敦的时间进行了核对[...] 。

你肯定知道......其中一个问题是,经纪人的时间和格林威治时间之间的偏移(a)可能会或可能不会根据夏令时而变化,(b)是否变化不能根据MT4提供的信息来确定。我没有详细研究过这些功能,但我想我们都同意,你不能仅根据MT4提供的信息进行任何此类计算。

据我所知,在四月初,上面的代码将开始说经纪人是在GMT+4。我的观点是,你无法从MT4告诉你的信息中知道,在前一周,经纪商是在GMT+3,如果你想计算特定GMT时间的价格活动,或者GMT时间的偏移,使用iBarShift()可能需要相应调整。

BTW,如果你今天运行了上述代码,那么你的经纪人几乎可以肯定不在EEST上。他们在3月30日之前应该是在欧洲东部时间。如果他们目前是GMT+3,那么他们在使用EEST以外的东西。(你链接的页面说 "在每年的这个时候,在EEST上的地点现在是在EET上")。

 

gchrmt4:

.. .

BTW,如果你今天运行了上述代码,那么你的经纪人几乎肯定不能在EEST上。他们在3月30日之前应该是EET。如果他们目前在GMT+3,那么他们在使用EEST以外的东西。(你链接的页面说 "在每年的这个时候,在EEST上的地点现在是在EET上")。

我的经纪商将其MT4服务器上的时区从GMT+2改为GMT+3,以对应纽约下午5点的收盘 时间,而且它在美国改变为夏令时的同时这样做,这发生在2014年3月9日。 在欧洲,标准时间的GMT+2大致对应于EET,因此夏令时的GMT+3对应于EEST。 例如,见欧洲时区。 因此,正如你所看到的,毫无疑问,我今天运行代码时,我的本地时区是EDT,而我的经纪人的时区对应的是EEST。

[1] 就我所见,在四月初,上面的代码将开始说经纪人是在GMT+4。

[2] 我的观点是,没有办法从MT4告诉你的信息中知道,在前一周,经纪人是在GMT+3,如果你想计算特定GMT时间的价格活动,或GMT时间的偏移,使用例如iBarShift()可能需要相应调整。

1.为什么会在4月返回GMT+4?我本地电脑的时间已经根据夏令时进行了调整,我的经纪人已经调整了其服务器以反映夏令时,那么在4月份会有什么变化?

2.经纪人可能会改变其时间以反映夏令时,这将改变其对GMT的偏移。 但是你可以预测这种变化。 例如,虽然夏令时开始和结束的日期/时间每年都在变化,但这种变化是可以预测的--因此是可以编程的。 只要编写规则就可以了。 但是TimeGMT()应该返回GMT,而不考虑本地时区、中介时区或夏令时的偏移。

你肯定知道......其中一个问题是,经纪人时间和GMT之间的偏移(a)可能是或不是基于夏令时的变化,(b)是否是变化的,不能根据MT4提供的信息确定。我没有详细研究过这些功能,但我想我们都同意,你不能仅根据MT4提供的信息进行任何此类计算。

如果经纪人根据夏令时进行调整,那么这种调整将改变其对格林威治标准时间的偏移量,但正如我上面所说,你可以预测这些变化并进行调整。 或者,如果一个地方(例如,伦敦)调整夏令时,你可以对当地的规则进行编码,从而预测这种变化并进行调整。

 
Thirteen:

如果一个经纪商根据夏令时进行调整,那么这种调整将改变其对格林尼治标准时间的偏移量,但正如我上面所说的,你可以预测这些变化并为其进行调整。 或者,如果一个地方(例如,伦敦)调整夏令时,你可以对当地的规则进行编码,从而预测这种变化,并为其进行调整。

我仍然从根本上同意你的观点,即这些变化是可以预测和编码的......但不是仅仅使用MT4本身提供的信息。你必须为伦敦格林尼治标准时间 "编码",而不是对MT4说 "给我伦敦的x的对应时间"。

您的服务器时间GMT+3可能对应于EEST,因为EEST是GMT+3,但根据维基百科和worldclock.com,现在还没有地方应该是EEST。这一变化应该在3月30日前发生。塞浦路斯、希腊、以色列等地的现行时间 是GMT+2。

因此,你所遇到的可能是一个经纪商以GMT+2运行其服务器,但在美国日期而非欧洲日期改变为夏令时。这与EET/EEST不一样。(在能够编写自动调整时间和日期的代码方面,它甚至更难预测,而不必要求用户输入关于经纪人使用什么时间设置的信息)。

因此,如果经纪商最近从GMT+2改为GMT+3,而不是即将从GMT+3改为GMT+4,这意味着如果你试图把它应用到上周美国时钟变化之前的条形图上,经纪商时间和GMT之间的当前 偏移是错误的。本周,经纪人的条形图比伦敦时间早3小时。上周他们是提前2小时。(如果你把目前的3个小时的偏移量用来计算上周某天伦敦时间上午8点的价格,你会得到错误的答案。

我想说的是,仅从MT4本身获得的信息--经纪人时间和格林尼治标准时间之间的当前偏移量--在实践中不足以做诸如 "计算出上周三伦敦的开盘价 "的事情。

 

怎样才能使MT4更适合做这个? 我不知道你是怎么想的,但我肯定不会喜欢创建一个区域性的历史GMT偏移计算器的任务。你能想象吗?如果我做了,我会把它放到市场上,你们最好都有一个大的支票簿;)

我只是在开玩笑,我不可能试图编写这个代码。不过,WHR可以做,我打赌他已经做了。