mql4语言的特点、微妙之处以及技巧 - 页 6

 
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
}
 

在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)。它写 在帮助中。

第二种方法是将两个实数的归一化差值与一个零值进行比较。 将归一化数字的差值与零进行比较是没有用的,因为作为归一化数字的任何数学运算的结果,都是非归一化的。

也就是说,必须以这种方式进行比较。

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
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL4
 
if(MathAbs(a-b)>=Point)
 
Yurij Kozhevnikov:
是的,你可以这样做。这是帮助中给出的第一种比较方式。我只是指出了我自己陷入的真实数字归一化陷阱,使用文档中推荐的第二种方法。
 
与本主题无关的评论已被移至"组织订单周期"。
 

与MT4的OrderProfit()不同,OrderCommission()存储的数据没有四舍五入到美分。


SZZ 在OrderPrint()中,佣金是四舍五入的(和GUI中一样)。

 
fxsaber:

与MT4的OrderProfit()不同,OrderCommission()存储的数据没有四舍五入到美分。


SZZ 在OrderPrint()中,佣金是四舍五入的(和GUI中一样)。

因此,我应该怎样做才能获得OrderProfit()+OrderComission()+OrderSwap()的正确值?

 
Artyom Trishkin:

据此,为了获得OrderProfit()+OrderComission()+OrderSwap()的正确值,应该怎么做?

什么都没有!这是最正确的数值。由于这个佣金,我们可以在GUI中看到,总的佣金与GUI显示的数字之和相差1分。

 
fxsaber:

什么都没有!这是最正确的数值。由于这种佣金,你可以在GUI中观察到,总的佣金与GUI显示的数字之和相差1分。

那我就完全不懂了。你说"OrderCommission()存储的数据没有四舍五入到美分 " 是什么意思?它们在哪里被绕过?它们又是如何圆润的呢?

原因: