Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 504

 

Bonjour à tous !

J'ai passé la moitié de la nuit à essayer de comprendre pourquoi une simple condition ne fonctionne pas, aidez-moi à trouver la solution :

      macd1 = iMACD (_Symbol,PERIOD_CURRENT,5,34,5,0,1,0);
      macd2 = iMACD (_Symbol,PERIOD_CURRENT,5,34,5,0,1,1);
      highprice1 = High [0];
      highprice2 = High [1];
      lowprice1 = Low [0];
      lowprice2 = Low [1];
              if (macd1 > 0 && macd1 > macd2 && highprice1 > highprice2) 
                 {
                 maxprice1 = highprice1;
                 macdMAXSell = macd1;
                 Print("maxprice1 = highprice1",maxprice1);
                 }
              if (macd1 < 0 && macd1 < macd2 && lowprice1 < lowprice2)
                 {
                 minprice1 = lowprice1;
                 macdMAXBuy = macd1;
                 Print("minprice1 = lowprice1",minprice1);
          	 } 

Je suis en cours d'exécution sur les données historiques, les variables macd1,2, lowprice, highprice sont des valeurs assignées, mais la condition ne veut pas exécuter, je me suis cassé la tête ne peut pas comprendre où creuser ... (((

 
Nikolay Gaylis:

peut-être 1 et 1 ?/c'est-à-dire vrai et code d'erreur 1

ERR_NO_RESULT1Pas d'erreur, mais le résultat est inconnu

Un désordre total et aucune compréhension de ce que vous faites.

bool takelimit;   // Здесь переменная равна false

//--- Здесь вот что: сначала выбирается ордер по тикету (MODE_TRADES здесь не нужно от слова "совсем", что говорит о том, что вы не представляете что вы делаете), 
//--- далее переменной takelimit присваивается результат работы функции выбора ордера, 
//--- и если ордер есть с таким тикетом, или был когда-то, то функция вернёт true, и takelimit будет присвоено true, соответственно, будет выведен код последней ошибки,
//--- что вовсе не говорит, что ошибка здесь была при выборе ордера по тикету - вы же переменную, хранящую код последней ошибки, не сбросили при помощи ResetLastError()
//--- И далее вообще не понятно к чему у вас фигурные скобки - они висят в пустоте, а это составной оператор, который должен после условия идти.

if(takelimit=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
   Print(string(takelimit)+"   :",GetLastError());//здесь возвращает число 11, получается ошибка код 11, но не нашел расшифровку нигде?
  {
   if(iBarShift(Symbol(),0,OrderOpenTime())==1)
      deletelimit=OrderDelete(ticket);
   if(!deletelimit)
      Comment(GetLastError());
  }
//+------------------------------------------------------------------+
//--- А нужно примерно так (фигурные скобки специально оставил для понимания где какой блок кода):
   ResetLastError();
   if(OrderSelect(ticket,SELECT_BY_TICKET) && OrderCloseTime()==0)
     {
      if(iBarShift(Symbol(),PERIOD_CURRENT,OrderOpenTime())==1)
        {
         if(!OrderDelete(ticket))
            Print("Ошибка удаления ордера #",(string)ticket,": ",GetLastError());
        }
     }
   else
     {
      Print("Ошибка выбора ордера #",(string)ticket,": ",GetLastError());
     }
 
Вадим Мотеюнас:

Print(takelimit,GetLastError()) renvoie deux valeurs car la 1ère variable est de type bool et n'a pas besoin de GetLastError, et comme il y a une virgule, GetLastError renvoie la dernière erreur dans le code au moment de l'appel de GetLastError ?

Oui... il y a deux valeurs qui s'impriment sur ......

C'est presque exactement ce que vous avez écrit.

int ticket;

void Fn()
  {
   ResetLastError();//Сбрасываем код предыдущей ошибки
   if(!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)){Print(GetLastError());}//Если не выбран ордер по указанному тикету-принтим код ошибки
   else//иначе(если ордер нашёлся)
     {
      if(iBarShift(Symbol(),0,OrderOpenTime())==1 && !OrderDelete(ticket)){Comment(GetLastError());}//Если выбранный ордер открылся на предыдущем баре и не удалось его удалить(надеюсь Вы работаете с отложенниками)-тогда выводим комент ошибки
     }
  }
 
Nikolay Gaylis:

Oui...il y a deux valeurs à imprimer.....

C'est presque exactement ce que vous avez écrit.

Et vous aussi...
Et si la commande est déjà supprimée, alors quoi ?
 
Artyom Trishkin:

Un désordre complet et une mauvaise compréhension de ce que vous faites...

Je ne fais rien en fait, j'ai juste supposé que l'homme imprimera 1 et 1 au lieu de 11)).

et c'est tout...

 
Artyom Trishkin:

Un désordre complet et une mauvaise compréhension de ce que vous faites...

Ah... donc vous répondez à la mauvaise personne... je vois)

 
Nikolay Gaylis:

Je ne fais rien en fait, j'ai juste supposé que la personne imprimera non pas 11, mais 1 et 1).

Comme cette ligne ici :

Print(string(takelimit)+"   :",GetLastError());

Dois-je imprimer "11" ?

Il imprimera "1:1" alors.

Le code d'erreur 1 ne correspond à aucune erreur, mais le résultat est inconnu.

 
Artyom Trishkin:

Comme cette ligne ici :

Peut-elle imprimer "11" ?

Il imprimera "1:1" alors.

Le code d'erreur 1 ne correspond à aucune erreur, mais le résultat est inconnu.

Oui, je l'ai déjà changé !

 
Nikolay Gaylis:

Ah... donc vous répondez à la mauvaise personne... je vois)

Oui, je répondais à la même personne que vous. Mais vous lui avez aussi dit la mauvaise chose - lire quand MODE_TRADES est nécessaire et quand il ne l'est pas. Et comment une commande doit être sélectionnée sur un ticket.

 
Artyom Trishkin:

Eh bien, oui, je répondais à la même personne que vous. Mais vous ne lui avez pas non plus tout dit correctement - lisez quand MODE_TRADES est nécessaire et quand il ne l'est pas. Et comment une commande doit être sélectionnée sur un ticket.

MODE_TRADES ne l'a pas encore regardé, juste le morceau que 11 a imprimé...