新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1740

 
Maxim Kuznetsov #:

不要告诉人们该怎么做。

你必须记住你的数据并与之一起工作

马克西姆,在这种情况下,你不需要记住什么。只看之前的平仓位置要安全得多。

你不需要做任何关于记忆数据和在异常情况下恢复数据的事情。如果终端被关闭,位置数据就会丢失。因此,在记忆它们的时候,你应该立即考虑它们快速有效恢复的可能性。

(在评论中记住一个订单不会被说成是一个可靠的解决方案--它意味着依赖经纪人/交易商的意愿)。

有趣的是,无论如何,它都会从某个地方读取这些数据。因此,直接从源头上阅读不是更容易吗?

 
Sergey Zhukov #:

我如何强制编译器为MT4而不是MT5编译?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

马克西姆,在这种情况下,你不需要在任何地方背诵任何东西。只看过去的平仓情况要安全得多。

你不需要做任何记忆数据的事情,然后在紧急情况下恢复它。如果终端被关闭,位置数据就会丢失。因此,在记忆它们的时候,你应该立即考虑它们快速有效恢复的可能性。

(在评论中记住一个订单不会被说成是一个可靠的解决方案--这将意味着依赖经纪人/交易商的意愿)。

有趣的是,无论如何,它都会从某个地方读取这些数据。因此,直接从源头上阅读不是更容易吗?

然后是 "为什么OnTimer不适合几秒钟或OnTick疯狂地错过":-)

在初始化时恢复一次状态(通过从文件或浏览历史/环境中读取),仅此而已......最后一个订单连同其特征被存储在一个变量中,并且总是已知的。

 
Maxim Kuznetsov #:

然后,"为什么OnTimer在几秒钟内不适合,或者OnTick疯狂地错过 "的主题随之而来 :-)

初始化时,恢复一次状态(通过从文件中读取或通过历史/环境查看),仅此而已......最后的订单连同其特征被存储在一个变量中,并且总是已知的。

为了知道最后一个位置是如何关闭的,你需要找到它。毕竟,当它是开放的,没有办法记录和记住它是如何关闭的,因为它仍然是开放的。

可以存储最后一次开仓的票据,并利用它来确定如何平仓,但 ...当对一个头寸进行操作时,当它处于开放状态时,其票据会发生变化。因此,我们必须实现一个功能来重写改变的票据。所有这些都使代码复杂化。

我只建议寻找最后的平仓。而且它在重启EA时结合搜索所有头寸,在关闭新头寸时只读取一个头寸的数据。

毕竟,我希望每个人都明白,我们不需要在所有的历史位置上循环,而只需要在最后一个位置上循环。也就是说,我们只记住一个循环索引的变量--它的当前值,我们从这个变量的值开始新的循环(当历史订单的数量增加时),而不是从零开始。这个变量的值在专家顾问开始和重新启动时,以及在关闭一个新头寸时被写入OnInit()。即,这样我们就避免了写入和读取位置数据的必要性,并与驱动器一起工作。

我认为这种方法是最有利可图的,因为

1.你只需要记住循环索引的值
2。只在必要的时刻,使用其索引直接访问一个封闭的订单来获取数据。
3.你不需要创建一个读/写函数
4.它在工作和写作上都比较快。

而且,是的,我同意你需要了解你的所有数据--我自己就这样做。但了解他们对项目和自己都有好处,是可取的。

 
Ivan Butko #:

谢谢你提供的信息!

如果你有时间,请回答如何解决:

在N个蜡烛前的历史上,设置了两个不同方向的目标:Close[N]+50*Point 和 Close[N]-50*Point。
然后有一个条件,即价格应该达到其中一个目标(如果(High[i]>Close[N]+50*Point)或(如果(Low[i]<Close[N]-50*Point)
当条件得到满足时,从Close[N]
到High[i]的距离被写进x[high]=High[i]数组。
然后在任何时候都会随机抛给任何一个图形。

而当通过Print(x[high]) 检查时,10个值中有1-2个显示小于50!一个有12个,另一个有49个。虽然,严格说来是+50*点。8-9个是正确的(超过50),1-2个是不正常的。这不是通过测试器,而是用真实的图表,我放置了一个专家顾问(没有任何交易功能),但用上述的它与历史记录一起工作,显示不正确的结果。

,数值越大,这种错误就越少。我想这可能是传播的干扰,但是......。我认为在MT4中不存在历史价差

解决了。

 
我是否必须在OnTimer()中添加RefreshRates(),还是默认情况下计时器会自行更新?
 
Ivan Butko #:
我是否必须在OnTimer()中添加RefreshRates(),还是默认情况下计时器会自行更新?
它并不
 
Aliaksandr Hryshyn #:
不更新

谢谢你

 
Artyom Trishkin #:

要想知道最后一个位置是如何关闭的,你必须找到它。只要它是开放的,就没有办法记录和记住它是如何关闭的--它仍然是开放的。

可以存储最后一次开仓的票据,并使用它来确定如何关闭,但 ...当对一个头寸进行操作时,当它处于开放状态时,其票据会发生变化。因此,我们必须实现一个功能来重写改变的票据。所有这些都使代码复杂化。

我只建议寻找最后的平仓。而且它在重启EA时结合搜索所有头寸,在关闭新头寸时只读取一个头寸的数据。

毕竟,我希望每个人都明白,我们不需要在所有的历史位置上循环,而只需要在最后一个位置上循环。也就是说,我们只记住一个循环索引的变量--它的当前值,我们从这个变量的值开始新的循环(当历史订单的数量增加时),而不是从零开始。这个变量的值在专家顾问开始和重新启动时,以及在关闭一个新头寸时被写入OnInit()。即,这样我们就避免了写入和读取位置数据的必要性,并与驱动器一起工作。

我认为这种方法是最有利可图的,因为

1.你只需要记住循环索引的值
2。只在必要的时刻,使用其索引直接访问一个封闭的订单来获取数据。
3.你不需要创建一个读/写函数
4.它在工作和写作上都比较快。

而且,是的,我同意你需要了解你的所有数据--我自己就这样做。但了解它们最好是对项目和自己有利。

我没有注意到仓位的票据会改变,而它是开放的。它通常等于第一笔订单的票据,它打开了这个位置。

最后一个关闭--如果在该符号上有不止一个EA交易,再加上手动交易怎么办?
 
JRandomTrader #:

我没有注意到一个仓位的票据在开仓时发生了变化。它通常与建立头寸的第一笔订单的票据相同。

最后一次关闭--但如果在该符号上有不止一个EA交易,再加上手动交易怎么办?

补仓或部分平仓,票面就不一样了。我们必须确定哪张票源于哪张票,并重写记得的那张票。然而,不清楚我们说的是哪个平台--两者略有不同,但你仍然需要保持跟踪。

属于该EA的 "最后一个关闭的 "就是这个意思。