mql4语言的特点、微妙之处以及技巧 - 页 6 12345678910111213...36 新评论 fxsaber 2017.05.01 16:37 #51 fxsaber: 与MQL5不同,在MQL4中静态数组 可以改变大小。 并非总是如此 关于交易、自动交易系统和交易策略测试的论坛 新版MetaTrader 5 build 1595平台:获取价格历史记录 fxsaber, 2017.05.01 16:36#property strict template <typename T> struct ARRAY { T Simple[100]; }; void OnStart() { int ArraySimple[100]; ARRAY<int> Array; Print(ArrayResize(Array.Simple, 10)); // MQL4: -1 Print(ArrayResize(ArraySimple, 10)); // MQL4: 10 Print(ArraySize(ArraySimple)); // MQL4: 10 Print(ArraySize(Array.Simple)); // MQL4: 100 } Konstantin Erin 2017.05.22 12:17 #52 在MT4中,追踪止损一直存在着一个错误。如果你在价格强劲的上升和下降运动中观察。 你可以看到SL上下移动。这里抓到了一个小动作,发生了许多次大动作 2017.05.22 10:53:38.563 '9898616': 追踪止损#1465775202 -> 1.29765 2017.05.2210:53:38.483'9898616': 追踪止损#1465775202 ->1.29764 2017.05.2210:53:33.236'9898616': 追踪止损#1465775202 ->1.29763 2017.05.2210:53:33.130'9898616': 追踪止损#1465775202 ->1.29764 2017.05.22 10:53:32.813 '9898616': 追踪止损#1465775202 -> 1.29762 当SL=2(为简单起见,最后一位数字)时得到了它,在下一个嘀嗒声中,价格上涨,终端给出了一个命令,将SL提高到4。 在接下来的交易中,它下降了,但SL仍然在2。终端发出命令,将SL提高到3。 服务器像一只长颈鹿一样,处理了第一份订单,并将SL提高到4。服务器处理了第二个订单,并将SL降低到3。 因此,终端发送了额外的无意义的订单,它增加了服务器的负载。 此外,由于SL的反向运动,交易商有可能出现不必要的损失。 这也适用于由EA或脚本 跟踪的程序。 部分情况下,我们通过以3...5个点的步骤移动SL来纠正它。 该怎么做。保存SL的值,在最后一次OrderModify中发布。 然后根据这个值计算出下一个订单。 这将是这样的:少了两个到服务器的订单,只向前移动SL,减少计算机CPU的负荷 2017.05.22 10:53:38.563 '9898616': 追踪止损#1465775202 -> 1.29765 2017.05.22 10:53:33.130 '9898616': 追踪止损#1465775202 ->1.29764 2017.05.22 10:53:32.813 '9898616': 追踪止损#1465775202 -> 1.29762 Features of the mql4 Vasiliy Pushkaryov 2017.06.16 12:58 #53 在修改订单时,往往需要将之前的TP/SL与要修改的新值进行比较。如果我们试图用旧值来修改它,我们会得到错误#1。让我们以比较美元指数的旧SL(100.03)和新SL(100.02)为例(数字=2)。它写 在帮助中。第二种方法是将两个实数的归一化差值与一个零值进行比较。 将归一化数字的差值与零进行比较是没有用的,因为作为归一化数字的任何数学运算的结果,都是非归一化的。也就是说,必须以这种方式进行比较。if(NormalizeDouble(100.03 - 100.02, Digits) != 0) // можно модифицировать但有时经纪人可以给出非正常化的价格。例如,我们得到的价格是100.025,而不是100.02。根据上述方案进行比较后,我们将得到0.01的差异,即我们可以修改它。但是,在通过了对数字100.025的标准化修改后,我们实际上将通过100.03,因此我们将得到错误#1。总的来说,根据目前的经验,我得出的结论是,在修改的数字相同时,最好将归一化的数字之差与零进行比较(帮助中不建议这样做)。要检查的脚本。void OnStart() { double a = 0.02; double b = 0.015; Print(" norm1 dif=", ND(a - b)); // результат = 0.01 Print(" norm2 dif=", ND(a) - ND(b)); // результат = 0.0 } double ND(double d) {return NormalizeDouble(d, 2);} Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4 docs.mql4.com Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4 Yurij Kozhevnikov 2017.06.16 19:53 #54 if(MathAbs(a-b)>=Point) Vasiliy Pushkaryov 2017.06.16 23:03 #55 Yurij Kozhevnikov: 是的,你可以这样做。这是帮助中给出的第一种比较方式。我只是指出了我自己陷入的真实数字归一化陷阱,使用文档中推荐的第二种方法。 Artyom Trishkin 2017.09.16 22:27 #56 与本主题无关的评论已被移至"组织订单周期"。 fxsaber 2017.10.03 18:42 #57 与MT4的OrderProfit()不同,OrderCommission()存储的数据没有四舍五入到美分。SZZ 在OrderPrint()中,佣金是四舍五入的(和GUI中一样)。 Artyom Trishkin 2017.10.03 19:18 #58 fxsaber:与MT4的OrderProfit()不同,OrderCommission()存储的数据没有四舍五入到美分。SZZ 在OrderPrint()中,佣金是四舍五入的(和GUI中一样)。因此,我应该怎样做才能获得OrderProfit()+OrderComission()+OrderSwap()的正确值? fxsaber 2017.10.03 20:27 #59 Artyom Trishkin:据此,为了获得OrderProfit()+OrderComission()+OrderSwap()的正确值,应该怎么做?什么都没有!这是最正确的数值。由于这个佣金,我们可以在GUI中看到,总的佣金与GUI显示的数字之和相差1分。 Artyom Trishkin 2017.10.03 20:36 #60 fxsaber:什么都没有!这是最正确的数值。由于这种佣金,你可以在GUI中观察到,总的佣金与GUI显示的数字之和相差1分。那我就完全不懂了。你说"OrderCommission()存储的数据没有四舍五入到美分 " 是什么意思?它们在哪里被绕过?它们又是如何圆润的呢? 12345678910111213...36 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
与MQL5不同,在MQL4中静态数组 可以改变大小。
关于交易、自动交易系统和交易策略测试的论坛
新版MetaTrader 5 build 1595平台:获取价格历史记录
fxsaber, 2017.05.01 16:36
在MT4中,追踪止损一直存在着一个错误。如果你在价格强劲的上升和下降运动中观察。
你可以看到SL上下移动。这里抓到了一个小动作,发生了许多次大动作
2017.05.22 10:53:38.563 '9898616': 追踪止损#1465775202 -> 1.29765
2017.05.2210:53:38.483'9898616': 追踪止损#1465775202 ->1.29764
2017.05.2210:53:33.236'9898616': 追踪止损#1465775202 ->1.29763
2017.05.2210:53:33.130'9898616': 追踪止损#1465775202 ->1.29764
2017.05.22 10:53:32.813 '9898616': 追踪止损#1465775202 -> 1.29762
当SL=2(为简单起见,最后一位数字)时得到了它,在下一个嘀嗒声中,价格上涨,终端给出了一个命令,将SL提高到4。
在接下来的交易中,它下降了,但SL仍然在2。终端发出命令,将SL提高到3。
服务器像一只长颈鹿一样,处理了第一份订单,并将SL提高到4。服务器处理了第二个订单,并将SL降低到3。
因此,终端发送了额外的无意义的订单,它增加了服务器的负载。
此外,由于SL的反向运动,交易商有可能出现不必要的损失。
这也适用于由EA或脚本 跟踪的程序。 部分情况下,我们通过以3...5个点的步骤移动SL来纠正它。
该怎么做。保存SL的值,在最后一次OrderModify中发布。
然后根据这个值计算出下一个订单。
这将是这样的:少了两个到服务器的订单,只向前移动SL,减少计算机CPU的负荷
2017.05.22 10:53:38.563 '9898616': 追踪止损#1465775202 -> 1.29765
2017.05.22 10:53:33.130 '9898616': 追踪止损#1465775202 ->1.29764
2017.05.22 10:53:32.813 '9898616': 追踪止损#1465775202 -> 1.29762
在修改订单时,往往需要将之前的TP/SL与要修改的新值进行比较。如果我们试图用旧值来修改它,我们会得到错误#1。
让我们以比较美元指数的旧SL(100.03)和新SL(100.02)为例(数字=2)。它写 在帮助中。
第二种方法是将两个实数的归一化差值与一个零值进行比较。 将归一化数字的差值与零进行比较是没有用的,因为作为归一化数字的任何数学运算的结果,都是非归一化的。
也就是说,必须以这种方式进行比较。
但有时经纪人可以给出非正常化的价格。例如,我们得到的价格是100.025,而不是100.02。根据上述方案进行比较后,我们将得到0.01的差异,即我们可以修改它。但是,在通过了对数字100.025的标准化修改后,我们实际上将通过100.03,因此我们将得到错误#1。
总的来说,根据目前的经验,我得出的结论是,在修改的数字相同时,最好将归一化的数字之差与零进行比较(帮助中不建议这样做)。
要检查的脚本。
与MT4的OrderProfit()不同,OrderCommission()存储的数据没有四舍五入到美分。
SZZ 在OrderPrint()中,佣金是四舍五入的(和GUI中一样)。
与MT4的OrderProfit()不同,OrderCommission()存储的数据没有四舍五入到美分。
SZZ 在OrderPrint()中,佣金是四舍五入的(和GUI中一样)。
因此,我应该怎样做才能获得OrderProfit()+OrderComission()+OrderSwap()的正确值?
据此,为了获得OrderProfit()+OrderComission()+OrderSwap()的正确值,应该怎么做?
什么都没有!这是最正确的数值。由于这个佣金,我们可以在GUI中看到,总的佣金与GUI显示的数字之和相差1分。
什么都没有!这是最正确的数值。由于这种佣金,你可以在GUI中观察到,总的佣金与GUI显示的数字之和相差1分。
那我就完全不懂了。你说"OrderCommission()存储的数据没有四舍五入到美分 " 是什么意思?它们在哪里被绕过?它们又是如何圆润的呢?