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

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

第一个问题Lots/Prikup - Dplus 必须被归一化。 仔细阅读一下。 如果变量是双倍型的,你会很惊讶,如果4/2给出的不是预期的2,而是1.999999999999 - 你可能还没有面对过这个问题。

因此,如果((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) 是假的,而且我可以大概率地说,它是假的,那么即使你的cnt_OO大于1,你也能保证来到标签1之后的区块。 所以一切与你无误,问题在于数据处理逻辑。

第二个问题是,你可以保证只处理列表中的最后一个订单,所以为什么要用for循环呢?

如果你只为测试者这样做,然后从列表中选择最后一个订单,你真的会得到需要的订单,而且不一定。在真实的市场上,特别是如果有几个专家顾问在运行,你保证会得到与你预期不同的东西,而且在使用break命令的第一遍后,循环保证会中断。

 
Vitaly Gorbunov:

第一个问题Lots/Prikup - Dplus 必须被规范化。 仔细阅读它。 如果变量是双倍类型的,你会惊讶地发现4/2给出的不是预期的2,而是1.999999999999 - 你可能还没有面对过这个问题。

因此,如果((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) 是假的,而且我可以大概率地说,它是假的,那么即使你的cnt_OO大于1,你也能保证来到标签1之后的区块。 所以一切与你无误,问题在于数据处理逻辑。

第二个问题是,你可以保证只处理列表中的最后一个订单,所以为什么要用for循环呢?

如果你只为测试者这样做,然后从列表中选择最后一个订单,你真的会得到需要的订单,而且不一定。在真实的市场上,尤其是在有几个专家顾问在运行的情况下,你保证会得到与你预期不同的东西,而且循环会在第一遍之后中断。

维塔利-戈尔布诺夫

第一个问题Lots/Prikup - Dplus 必须被规范化。 如果变量是双倍 的,你会很惊讶,如果4/2得出的不是预期的2,而是1.999999999999,也许你还没有遇到这个问题。

因此,如果((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) 是假的,而且我可以大概率地说,它是假的,那么即使你的cnt_OO大于1,你也能保证来到标签1之后的区块。 所以一切与你无误,问题在于数据处理逻辑。

第二个问题是,你可以保证只处理列表中的最后一个订单,所以为什么要用for循环呢?

如果你只为测试者这样做,然后从列表中选择最后一个订单,你真的会得到需要的订单,而且不一定。在真实的市场上,特别是如果有几个专家顾问在运行,你保证会得到完全错误的订单,而且循环会在第一遍之后的中断命令中中断。

至于规范化--谢谢,我没有注意到它的缺失。我的眼睛只是在我的头脑中迷失了。

关于for循环:在档案中,有不同的法师和来自不同对的不同订单。我从头到尾看了一遍,直到找到我需要的那个。这发生在EA还没有开始工作的时候,我需要的新订单出现在列表中。循环不是在第一遍时中断,而是在找到所需的顺序时中断。

我们必须正确理解函数Onlinit和OnDeinit。它们的必要性是显而易见的。

 

在这个实现中,循环不工作。我在不同的变体中运行了你的代码,总是一次通过。

现在很清楚你在什么地方犯了错误了!

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

我尽可能多地评论了所有的东西!试试吧!

 
Vitaly Gorbunov:

在这个实现中,循环不工作。我在不同的变体中运行了你的代码,总是一次通过。

现在很清楚,你在哪里犯了错误!

我尽可能多地评论了所有的东西!试试吧!

谢谢,我知道了。这里有一个解决缺乏规范化的错误的方法。经过对恢复算法的仔细检查,Condition&&(OrderLots() <= Lots/Prikup - Dplus)似乎是不必要的

谢谢大家的好建议



下面是测试的结果。在真实的情况下也差不多,甚至更好。提前警告--这不是一个马汀格尔。这比你想象的还要糟糕:=)。缩减1.3%的利润 507美元

 
好的结果!还有什么问题,但很难从你那里得到正确的信息,以找出问题所在。如果你愿意,你可以加我为好友,这样我就不会迷路。
 
Vitaly Muzichenko:

如果成功了,而且你不介意分享结果--写一个解决问题的方案

它没有工作(我使用了php openssl库)。以不同的方式解决了这个问题。

 
Juer:

没有工作(我使用了php openssl库)。以不同的方式解决了这个问题。

所以你最后是在MT中加密,在.php中解密?你用的是哪种方式?

 
Vitaly Muzichenko:

所以你最后是在MT中加密,在.php中解密?你用的是什么方法?

不,我告诉你它没有用。我放弃了这个想法。对于我的任务来说,一个哈希已经足够了。我正在发送和接收哈希值,并返回另一个哈希值作为确认。

所以我无法在PHP中解密。如果有人能认真研究这个问题就好了。也许是一个开发者或其他什么。

 
Juer:

不,我写的是,它没有发挥作用。我放弃了这个想法。对于我的任务来说,一个哈希已经足够了。我发送并接收了一个哈希值,并返回另一个哈希值作为确认。

所以我无法在PHP中解密。如果有人能认真研究这个问题就好了。也许是一个开发者或其他什么。

在puch中编写你自己的加密函数,并把它移到mq中。这样他们就不会解密,而且无论哪种方式都能100%地发挥作用。

 
Vitaly Muzichenko:

如果成功了,而且你不介意分享结果,请公布解决方案

google "PKCS#7的填充格式"

原因: