Erreur n° 1 lors de la modification des commandes

 

Comment puis-je me débarrasser de cette putain d'erreur ? J'en ai marre. Je vérifie chaque paramètre d'entrée de la fonction. Pour moi, en ce moment, c'est comme ça :

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))
   New_OOP = ND (fd_MurreyLevelsValue[11]);
else New_OOP = OrderOpenPrice();
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

Autrement dit, si le paramètre n'a pas été modifié, il n'est pas nécessaire de le modifier. Je n'ai jamais fait ça avant, mais j'ai décidé de...

Les paramètres sont ensuite transmis à la méthode de modification de l'ordre comme suit :

 if (!fOrderModify (Ticket,  New_OOP, New_SL, New_TP))
{
   if (_LastError != 0)
     WriteLog (StringConcatenate (__FUNCTION__, ". В строке ", __LINE__, " ", CErrs.ErrorToString (_LastError)),
                     CLogs.GetNeedLogs(), CLogs.GetPrintUP(), CLogs.GetCommentUP());
}

Aucune sortie dans le journal :

modify #2  sell limit 0.10 EURUSD at 1.34048 sl: 1.34125 tp: 1.33362 ok
OrderModify error 1

Donc, le journal nous notifie, comme une modification : OK, mais alors une erreur. Aucun des paramètres n'a changé.

L'ordonnance est en cours. Nous pouvons donc changer le prix d'ouverture, de stop et de prise. Et cela, d'après ce que j'ai compris, ne contredisait pas la documentation.

Qui a rencontré quelque chose comme ça ? Comment le résoudre ?

 
hoz:

Comment puis-je me débarrasser de cette putain d'erreur ? J'en ai marre. Je vérifie chaque paramètre d'entrée de la fonction. Pour moi, en ce moment, c'est comme ça :

Autrement dit, si le paramètre n'a pas été modifié, il n'est pas nécessaire de le modifier. Je n'ai jamais fait ça avant, mais j'ai décidé de...

Ensuite, les paramètres sont transmis à la méthode de modification de la commande comme ceci :

Aucune sortie dans le journal :

Donc, le journal nous notifie, comme modification : OK, mais ensuite... une erreur. Aucun des paramètres n'a changé.

L'ordonnance est en cours. Nous pouvons donc changer le prix d'ouverture, de stop et de prise. Et cela, d'après ce que j'ai compris, ne contredisait pas la documentation.

Qui a rencontré quelque chose comme ça ? Comment le résoudre ?

Vous manipulez mal le code d'erreur, en oubliant que le code d'erreur est déjà surchargé après vos nombreuses fonctions.

Ainsi, lorsqu'une erreur se produit, vous devez enregistrer le code d'erreur dans une variable locale et l'imprimer à partir de là, après la masse de vos appels ultérieurs.

 
Renat:

Vous manipulez mal le code d'erreur, en oubliant que le code d'erreur est déjà surchargé après vos nombreuses fonctions.

Par conséquent, lorsqu'une erreur se produit, il faut enregistrer son code dans une variable locale, et seulement ensuite, après la masse de vos appels ultérieurs, l'imprimer.

Pourquoi ne pas créer également un tableau d'erreurs ? Il est écrit noir sur blanc dans la documentation que la variable _LastError stocke le numéro de la dernière erreur. Et elle est réinitialisée par la fonction ResetLastError(). S'il n'y a pas d'autres erreurs entre les appels de _LastError, _LastError stocke la valeur de la dernière erreur. Il n'y avait plus d'erreurs dans mon code. Eh bien, ce n'est pas le problème.

En outre, il n'est pas très logique de créer des variables pour les erreurs dans chaque méthode et d'imprimer ensuite ces variables dans les Expert Advisors.

Après tout, s'il existe une variable pour collecter les erreurs, pourquoi en créer de nouvelles ?

 

evillive, que voulez-vous dire par "il n'y a pas de contrôles" ? J'ai écrit plus haut :

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

J'ai même donné un commentaire pour le premier. Bien que tout soit élémentaire là-bas.

Comment vérifier autrement ici ?

 
Je fais une double vérification pour m'assurer que ce n'est pas égal et dirigé là où vous vous attendez !
 
evillive:
J'ai réalisé, c'est pourquoi j'ai nettoyé)))
Tu es grossier ! ;)
 
borilunad:
Je vérifie deux fois qu'il n'est pas égal et dirigé là où vous l'attendez !

Boris, que voulez-vous dire par là ? Parce qu'il est clairement écrit que si le prix n'est pas si... sinon... actuel... Quel est l'intérêt ? Vous pouvez le vérifier 20 fois... :) Ça n'a pas de sens. Je me débats avec ce code depuis le deuxième jour maintenant. Je n'ai jamais rencontré un tel bug auparavant. Maintenant, je l'ai affronté. J'ai déjà écrit et testé toutes ces méthodes à de nombreuses reprises. J'ai rencontré un problème ici.

Le fait est que je suis plus un fan des tactiques légèrement différentes. Mais en écrivant le dernier Owls, je suis tombé sur ce problème. C'est moi-même ne sais pas où creuser, parce que pristrintovav tout le code en longueur et autrement je n'ai pas plus de pensées. C'est pourquoi la fonction OrderModify() est intégrée. Et je ne connais pas sa mise en œuvre.

 
hoz:

evillive, que voulez-vous dire par "il n'y a pas de contrôles" ? J'ai écrit plus haut :

J'ai même donné un commentaire pour le premier. Bien que tout soit élémentaire là-bas.

Comment vérifier autrement ici ?

Victor, après vérification, la nouvelle valeur est attribuée ou non... Vous devez vérifier.

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11])  // Если текущая цена не равна новой.. из массива
 || OrderStopLoss() != ND (fd_MurreyLevelsValue[12])   // или 
 || OrderTakeProfit() != ND (fd_MurreyLevelsValue[2])) // или
  // если одно из условий выполнено пойдём в модифай... 
 
AlexeyVik:

Victor, après avoir vérifié que la nouvelle valeur est attribuée ou non... Vous devez vérifier

Alexey, et où avez-vous un contrôle pour vous assurer que la valeur des fonctions passées est inchangée ? J'en ai déjà tenu compte ci-dessus. Et le besoin de modification en général est fait au départ. Il y a des niveaux là, si l'indicateur signale que le niveau a changé, passons à autre chose...

 
hoz:

Boris, que voulez-vous dire par là ? Parce qu'il est clairement écrit que si le prix n'est pas si... sinon... actuel... Quel est l'intérêt ? Vous pouvez le vérifier 20 fois... :) Ça n'a pas de sens. Je me débats avec ce code depuis le deuxième jour maintenant. Je n'ai jamais rencontré un tel bug auparavant. Maintenant, je l'ai affronté. J'ai déjà écrit et testé toutes ces méthodes à de nombreuses reprises. J'ai rencontré un problème ici.

Le fait est que je suis plus un fan des tactiques légèrement différentes. Mais en écrivant le dernier Owls, je suis tombé sur ce problème. C'est moi-même ne sais pas où creuser, parce que les imprimantes tout code à la longueur et à l'envers, je n'ai plus aucune pensée. C'est pourquoi la fonction OrderModify() est intégrée. Et je ne connais pas sa mise en œuvre...

Victor, vous Renat, en général, correctement noté, Alexey a montré la dernière vérification nécessaire, et plus tôt, vérifier tous les contrôles nécessaires pour chaque paramètre avec toutes les nuances, pour éviter toute ambiguïté de sens et sans manquer aucune condition !
 
hoz:

evillive, que voulez-vous dire par "il n'y a pas de contrôles" ? J'ai écrit plus haut :

if (OrderOpenPrice() != ND (fd_MurreyLevelsValue[11]))    \\ Если текущая цена не равна новой.. из массива, то..
   New_OOP = ND (fd_MurreyLevelsValue[11]);               \\.. новая цена равна этому новому значению цены из массива( расчитанного ).
else New_OOP = OrderOpenPrice();                          \\ Иначе новая цена равно текущей цене выбранного ордера. Т.е. не изменяется.
if (OrderStopLoss() != ND (fd_MurreyLevelsValue[12]))
   New_SL = ND (fd_MurreyLevelsValue[12]);
else New_SL = OrderStopLoss();
if (OrderTakeProfit() != ND (fd_MurreyLevelsValue[2]))
   New_TP = ND (fd_MurreyLevelsValue[2]);
else New_TP = OrderTakeProfit();

J'ai même donné un commentaire pour le premier. Bien que tout soit élémentaire là-bas.

Comment vérifier autrement ici ?

Nous devons également vérifier que si aucun des 3 paramètres n'a changé, alors OrderModify ne doit pas être touché. Ou plutôt, si au moins un de ces paramètres a changé, alors seulement aller à OrderModify.