Questions "pour" du conducteur de vélo - page 10

 
WhooDoo22:

J'ai corrigé l'erreur "ticket invalide" pour l'exercice de codage que vous m'avez conseillé d'effectuer. J'ai joint une copie du conseiller expert pour votre vision personnelle.

Section de la fonction OrderClose() de cet exercice que je crois être complète.

Je crois que la section de la fonction Print() de cet exercice est complète.

Il ne me reste plus que la troisième section, la fonction OrderModify().

Merci.

Vous n'avez pas résolu le problème, vous l'avez contourné, c'est typique quand le problème n'est pas compris. Comme je l'ai déjà dit, résolvez la cause et non le symptôme....

Vous n'imprimez toujours pas le numéro de ticket USDJPY, veuillez vérifier l 'exigence originale.

Vos appels MarketInfo() sont erronés même s'ils fonctionnent....

 

Simon,

La fonction OrderModify() est exécutée sans erreur.

La fonction OrderPrint() est exécutée sans erreur.

La fonction OrderClose() est exécutée sans erreur.

Veuillez poster votre réponse.

Merci.

Dossiers :
 
WhooDoo22:


Veuillez poster votre réponse.


RaptorUK:

Vous n'avez pas résolu le problème, vous l'avez contourné, c'est typique quand le problème n'est pas compris. Comme je l'ai déjà dit, résolvez la cause et non le symptôme....

Vous n'imprimez toujours pas le numéro de ticket USDJPY, veuillez vérifier l'exigence originale.

Vos appels MarketInfo() sont erronés même s'ils fonctionnent....

Et en plus...

Si vous avez la même situation que précédemment, où il n'y a pas d'ordre USDJPY, vous aurez des appels OrderStopLoss(), OrderTakeProfit(), OrderSelect() et OrderType() qui échoueront.

Qu'est-ce que cela veut dire ? Qu'attendez-vous de cette ligne de code ? Répondez s'il vous plaît sans chercher dans la documentation.

GetLastError();

Dans le dernier bloc de code, pourquoi voulez-vous exécuter cette ligne de code ? . . .

   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

seulement si...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       

mais vous allez toujours exécuter cette ligne de code, et tout le code qui la suit, indépendamment du TP et du SL ?

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);} 

Vos appels MarketInfo() sont toujours erronés... regardez la documentation pour savoir pourquoi.

 

Simon,


Vous n'avez pas résolu le problème, vous l'avez contourné...

Quel problème pensez-vous que je n'ai pas encore résolu ?


Vous n'imprimez toujours pas le numéro de ticket USDJPY...

Numéro de billet de commande.



Vos appels MarketInfo() sont erronés même s'ils fonctionnent....

Exemple de fonction MarketInfo() du dictionnaire MetaEditor :

Exemple :

// MarketInfo() function example;

   double bid   =MarketInfo("EURUSD",MODE_BID);
   double ask   =MarketInfo("EURUSD",MODE_ASK);
   double point =MarketInfo("EURUSD",MODE_POINT);
   int    digits=MarketInfo("EURUSD",MODE_DIGITS);
   int    spread=MarketInfo("EURUSD",MODE_SPREAD);

Voici un échantillon de mon bloc de code de la fonction OrderClose() :

// OrderClose() function code block example;

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

Selon vous, qu'est-ce qui ne va pas avec mon échantillon de code de la fonction OrderClose() ? Il semble presque identique à l'exemple 'MarketInfo()' fourni par le dictionnaire MetaEditor.


Et en plus...


Quel est le but de cette fonction ? Qu'attendez-vous de cette ligne de code ? Répondez s'il vous plaît sans consulter la documentation.

GetLastError();

La fonction GetLastError() affiche une erreur sur la page 'Experts' pendant l'exécution des tests. Si la fonction ne trouve aucune erreur, zéro (0) est imprimé. Remarquez le zéro imprimé dans l'instantané que j'ai fourni ci-dessus.


Dans le dernier bloc de code, pourquoi vouloir exécuter cette ligne de code . . . .

if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}

seulement si...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

mais vous allez toujours exécuter cette ligne de code, et tout le code qui la suit, indépendamment du TP et du SL ?

if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}


Oui, je suis content que vous ayez soulevé cette question car je vais vous expliquer mon raisonnement.

Si tous les autres blocs de code sont omis de l'exécution du programme en utilisant les commentaires multi-lignes "/* - */" et que les deux seuls blocs de code restant dans les fonctions Start() et Return(0) sont...

   int i;
   double bid_ask,
          OM_Param_3,
          OM_Param_4;

// code block 1;   

while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
   
   i++;

// code block 2;

   if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))   
     {
      Print(OrderTicket());     
      GetLastError();
     }

sous le bloc de code deux est l'appel de fonction :

     {
      Print(OrderTicket());     
      GetLastError();
     }

La fonction Print() continue d'imprimer indéfiniment le numéro dans le volet des experts et continue d'imprimer. Je pensais que si j'ajoutais...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

la fonction Print() ne serait exécutée qu'une seule fois parce qu'une fois que la fonction OrderModify() directement en dessous serait exécutée, le SL et le TP ne seraient plus à zéro et provoqueraient l'arrêt de la fonction Print().

Je réalise maintenant que ce n'est pas le cas à cause de la façon dont un programme est exécuté. Je comprends qu'un programme est exécuté de haut en bas, donc lorsque le programme a terminé son cycle complet la première fois, il essaierait de s'exécuter à nouveau de haut en bas et ne parviendrait pas à imprimer le ticket dans le panneau "Experts" parce qu'il n'y a pas d'ordre sur la paire de devises USDJPY.


Merci.

 
WhooDoo22:

Simon,


Vous n'avez pas résolu le problème, vous l'avez contourné...

Quel problème pensez-vous que je n'ai pas encore résolu ?

Le problème sous-jacent qui est causé par la façon dont vous avez codé votre boucle while ... le problème qui causait le ticket invalide pour la fonction OrderClose et leticket inconnu 2 pour OrderModify que vous n'avez pas résolu parce que vous avez traité le symptôme.

WhooDoo22:

Vos appels MarketInfo() sont erronés même s'ils fonctionnent ....

Exemple de fonction MarketInfo() du dictionnaire MetaEditor :


Désolé, je me suis trompé, vous avez corrigé ce problème... Savez-vous quel était le problème auquel je faisais référence ?

WhooDoo22:

Simon,

Qu'est-ce que cette fonction est censée faire ? Qu'attendez-vous de cette ligne de code ? Répondez s'il vous plaît sans chercher dans la documentation.

La fonction GetLastError() affiche une erreur sur la page 'Experts' pendant l'exécution des tests. Si la fonction ne trouve aucune erreur, zéro (0) est imprimé. Remarquez le zéro imprimé dans l'instantané que j'ai fourni ci-dessus.


Non, GetLastError() n'imprime pas dans le journal . La fonction renvoie la dernière erreur survenue, puis la valeur de la variable spéciale last_error où est stocké le dernier code d'erreur sera remise à zéro. Ainsi, le prochain appel de GetLastError() retournera 0."

Le 0 dans votre image vient probablement de . . . .

Print(OrderCloseTime());

... et est une erreur car l'ordre n'est plus sélectionné car il n'est plus dans le pool d'ordres car il a été fermé et se trouve dans le pool d'historique. pour faire ce que vous essayez de faire, vous auriez besoin de quelque chose comme ceci ...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

. . . ajoutez ces deux lignes et essayez-le.

WhooDoo22:

La fonction Print() continue d'imprimer indéfiniment le numéro dans le volet des experts et continue d'imprimer. Je pensais que si j'ajoutais...

if((OrderStopLoss()==0)&&(OrderTakeProfit()==0))

la fonction Print() ne serait exécutée qu'une seule fois parce qu'une fois que la fonction OrderModify() directement en dessous de celle-ci serait exécutée, le SL et le TP ne seraient plus à zéro et feraient échouer la fonction Print().

Je réalise maintenant que ce n'est pas le cas à cause de la façon dont un programme est exécuté. Je comprends qu'un programme est exécuté de haut en bas, donc lorsque le programme a terminé son cycle complet la première fois, il essaierait de s'exécuter à nouveau de haut en bas et ne parviendrait pas à imprimer le ticket dans le panneau "Experts" parce qu'il n'y a pas d'ordre sur la paire de devises USDJPY.

Je pense que vous ne comprenez pas ce que je veux dire... Si j'ajoute des accolades, ce sera peut-être plus clair... ... vous avez fait cela...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      }

   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
      GetLastError();
     }

... vous vouliez faire ça ?

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      )
 
WhooDoo22:

Simon,

Vous n'imprimez toujours pas le numéro du ticket USDJPY...


L'exigence était ... "d'imprimer le numéro de ticket sur le journal sous la forme "Numéro de ticket pour USDJPY = " ".

 

Simon,


Le problème sous-jacent qui est causé par la façon dont vous avez codé votre boucle while... le problème qui causait le ticket invalide pour la fonction OrderClose et le ticket inconnu 2 pour OrderModify, vous n'avez pas résolu la cause, vous avez traité le symptôme.

Je souhaite discuter de ce problème avec vous dans les moindres détails, ce qui me permettra de me concentrer sur la résolution de ce problème sans être distrait par d'autres points.


Désolé, je me suis trompé, vous avez résolu ce problème... Savez-vous à quel problème je faisais référence ?

Oui, merci de l'avoir soulevé !


"La fonction renvoie la dernière erreur survenue, puis la valeur de la variable spéciale last_error où est stocké le dernier code d'erreur sera remise à zéro. Ainsi, l'appel suivant de GetLastError() renverra 0."

Le dictionnaire de MetaEditor le dit :

int GetLastError( )
La fonction renvoie la dernière erreur survenue, puis la valeur de la variable spéciale last_error où est stocké le dernier code d'erreur sera remise à zéro. Ainsi, le prochain appel de GetLastError() retournera 0.

Cette fonction renvoie la dernière erreur survenue, puis la valeur de la variable spéciale last error où est stocké le dernier code d'erreur sera remise à zéro...

Le vert est compris et le jaune n'est pas compris.


. . ... ajoutez ces deux lignes et essayez-le.

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      int ClosedTicketNum = OrderTicket();   //  <---- add this line
      
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      
      OrderSelect(ClosedTicketNum, SELECT_BY_TICKET);   //  <---- add this line

      Print(OrderCloseTime());
      GetLastError();
     }

Je le ferai.


Je pense que vous ne comprenez pas ce que je veux dire... Si je rajoute des accolades, ce sera peut-être plus clair... ... tu as fait ça...

Je crois que je voulais faire ça...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
      {
      if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
      if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}           
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
         {
         OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
         Print(OrderCloseTime());
         GetLastError();
         }
      }

C'est parce que je souhaitais que la condition...

if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))

soit appliquée à la section de code entre accolades ("{ }").


L'exigence était ... "d'imprimer le numéro de ticket dans le journal sous la forme "Numéro de ticket pour USDJPY = " ".

Cela peut être fait.


Merci.

 
WhooDoo22:


"La fonction renvoie la dernière erreur survenue, puis la valeur de la variable spéciale last_error où est stocké le dernier code d'erreur sera remise à zéro. Ainsi, le prochain appel de GetLastError() retournera 0."

Le dictionnaire MetaEditor est lu :

int GetLastError( )
La fonction retourne la dernière erreur survenue, puis la valeur de la variable spéciale last_error où est stocké le dernier code d'erreur sera mise à zéro. Ainsi, l'appel suivant de GetLastError() retournera 0.

Cette fonction renvoie la dernière erreur survenue, puis la valeur de la variable spéciale last error où est stocké le dernier code d'erreur sera remise à zéro...

Le vert est compris et le jaune n'est pas compris.

OK, comme vous pouvez le voir dans la documentation GetLastError() n'imprime rien... ellerenvoie juste le numéro de l'erreur.... . donc pour l'utiliser il faut faire quelque chose avec . .

Print("The last error was error number: ", GetLastError());

//  or . . .

int ErrorNumber = GetLastError();

//  or . . .

if(GetLastError() == 130)

Lorsque vous appelez GetLastError(), il renvoie l'erreur et remet à zéro la variable qu'il utilisait en interne pour contenir la dernière erreur... Donc si vous faites ceci...

OrderDelete(-1);   //  should produce an error 4108 or 3

Print("Last error was number ", GetLastError());    //  should print - Last error was number 4108

Print("Last error was number ", GetLastError());    //  should print - Last error was number 0  the previous call cleared the GetlastError internal variable
 

le 2ème appel à GetLastError() retournera 0 car le premier appel a remis à zéro la variable qui contient le numéro d'erreur... Gardez aussi à l'esprit que seule la dernière erreur est conservée.

 
WhooDoo22:


Je crois que vous ne comprenez pas ce que je veux dire... Si j'ajoute des accolades, ce sera plus clair... ... tu as fait ça...

Je crois que j'ai voulu faire ça...

C'est parce que je souhaitais que la condition...

soit appliquée à la section de code entre accolades ("{ }").

Mais vous ne l'avez pas fait... vous l'avez manqué dans votre conception, puis vous l'avez manqué lorsque vous avez codé, puis vous l'avez manqué lorsque vous avez relu votre code et vérifié qu'il faisait ce que vous vouliez, puis vous l'avez manqué lorsque vous l'avez testé... Les accolades sont l'un des éléments les plus importants du code. Les accolades font partie de ces choses fondamentales que vous devez connaître comme le fond de votre poche.

Vous devez comprendre pourquoi vous l'avez manqué et résoudre ce problème... Personne d'autre ne peut le faire pour vous, à moins que vous ne vouliez les payer pour coder à votre place.

 

Simon,


Le 0 dans votre image est probablement de . . . .

Print(OrderCloseTime());


Nah-uh-uh ! ;)

Faisons un voyage dans le monde de la documentation, d'accord ? Hahaha.

datetime OrderCloseTime( )
Renvoie l'heure de clôture de la commande actuellement sélectionnée. Si le temps de fermeture de l'ordre est différent de 0, alors l'ordre sélectionné a été fermé et récupéré dans l'historique du compte. Le temps de clôture des ordres ouverts et en attente est égal à 0.

Note : L'ordre doit être préalablement sélectionné par la fonction OrderSelect().


D'abord, jetons un coup d'oeil au bloc de code de la fonction OrderClose() que j'ai récemment codé...

   if((OrderStopLoss()!=0)&&(OrderTakeProfit()!=0))       
   if(OrderType()==OP_BUY){bid_ask=MarketInfo("USDJPY",MODE_BID);}
   if(OrderType()==OP_SELL){bid_ask=MarketInfo("USDJPY",MODE_ASK);}
   if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)&&(OrderSymbol()=="USDJPY"))
     {
      OrderClose(OrderTicket(),OrderLots(),bid_ask,3,CLR_NONE);
      Print(OrderCloseTime());
     }

Ensuite, jetons un coup d'oeil au résultat affiché dans un instantané du panneau 'Experts'...

Résultat du volet "Experts".

Aaah, qu'avons-nous ici ? :)


Veuillez poster une réponse pour le conseiller expert nouvellement joint. Répond-il encore à tous les critères que vous avez inclus dans votre exercice ?


Le problème sous-jacent qui est causé par la façon dont vous avez codé votre boucle while ... le problème qui causait le ticket invalide pour la fonction OrderClose et le ticket inconnu 2 pour OrderModify, vous n'avez pas réglé la cause, vous avez abordé le symptôme.

Je souhaite discuter de ce problème avec vous dans les moindres détails, ce qui me permettra de me concentrer sur la résolution de ce problème sans me laisser distraire par d'autres points.


Merci.

Dossiers :
Raison: