Questions des débutants MQL5 MT5 MetaTrader 5 - page 404

 

J'ai commencé à écrire un wrapper pour les fonctions d'ouverture et de modification des ordres (je pensais que cela réglerait mes problèmes de retour de valeurs de ces opérateurs) mais il y a le même problème.

Expliquez quel est le problème (peu importe ce que j'écris, il y a toujours un problème avec le retour des valeurs de OrderSend, OrderSelex et ModifyOrder)

Code d'habillage .

int start()

{

si (signal == 1)

{

OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

}

retour(0) ;

}

//-----------------------------------------------

int OrderSendX (string symbol,int cmd, double volume,double price,int slippage,double stoploss,double takeprofit,string comment,

int magic,datetime expiration,couleur arrow_color)

{

int err=GetLastError() ;

err = 0 ;

bool exit_loop = false ;

int ticket = -1 ;

int Retry = 10 ;

int cnt = 0 ;

if(cmd == OP_BUY || cmd == OP_SELL) //vérifier le type d'ordre à ouvrir

{

while(!exit_loop)

{

ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color) ;

err = GetLastError() ;

switch(err)

{

cas ERR_NO_ERROR :

exit_loop = true ;

pause ;

{ cas ERR_SERVER_BUSY :

cas ERR_NO_CONNECTION :

cas ERR_INVALID_PRICE :

cas ERR_BROKER_BUSY :

cas ERR_TRADE_CONTEXT_BUSY :

cnt++ ;

pause ;

cas ERR_PRICE_CHANGED :

cas ERR_OFF_QUOTES :

cas ERR_REQUOTE :

RefreshRates() ;

continuer ;

par défaut :

exit_loop = true ;

pause ;

}

si(cnt>Retry)

exit_loop = true ;

si(!exit_loop)

{

Sleep(1000) ;

RefreshRates() ;

}

sinon

{

si(err !=ERR_NO_ERROR)

{

Print("Erreur : " + err) ;

}

}

si (err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) ;

retour(ticket) ;

}

Print("Erreur d'ouverture d'ordre après" + cnt + "tentatives") ;

retour (-1) ;

}

}

}

 
Leanid Aladzyeu:

J'ai commencé à écrire un wrapper pour les fonctions d'ouverture et de modification des ordres (je pensais que cela réglerait mes problèmes de retour de valeurs de ces opérateurs) mais il y a le même problème.

Expliquez-moi quel est le problème (peu importe ce que j'ai écrit, j'ai toujours des problèmes avec le retour des valeurs de OrderSend, OrderSelex et ModifyOrder).

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

OrderModify() retourne oui , non

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

Personne ne peut l'expliquer.

Essayons un autre exemple au lieu de me copier 100 fois l'aide.

Je vais utiliser un exemple pour comprendre les corrections.

{

SL=NormaliserDouble(Bid-TrailingStop*Point,Digits) ;

si(OrderStopLoss()!=SL)

OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0) ;

}

ne pas insérer

"""ticket """= OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0) ; chaque fois que c'est correct ?

 

Et merci à tous ceux qui ont essayé de m'expliquer.

Malheureusement, je ne comprends pas comment désigner une variable à une variable qui est prédéfinie comme une fonction.

 
Leanid Aladzyeu:

Et merci à tous ceux qui ont essayé de m'expliquer.

Malheureusement, je ne comprends pas comment désigner une variable à une variable qui est prédéfinie comme une fonction.

CherLeanid. Apprenez à lire l'aide et à travailler avec les erreurs et les avertissements. Si vous n'apprenez pas à le faire, vous ne pourrez même pas programmer correctement. Ce sont les éléments de base. Avez-vous essayé de traduire ce qui est écrit dans les avertissements ? Comprenez-vous la signification des fonctions qui "doivent être vérifiées" ? L'aide décrit un exemple correct de manipulation de ces fonctions. Par exemple, OrderModify(). Regardez l'aide :

Valeur de retour

Elle renvoie true si la fonction se termine avec succès ou false en cas d'erreur. Pour obtenir des informations sur l'erreur, vous devez appeler la fonctionGetLastError().

et suit ensuite un exemple :

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

Comme vous pouvez le constater, la valeur de retour de la fonction est traitée dans l'opérateur if-else. La variable res est nécessaire "pour la beauté" pour une raison. C'est le résultat de l'exécution d'une fonction commerciale ! La fonction dont dépend votre argent ! Par conséquent, pour traiter correctement toutes les variantes possibles (le traitement dans cet exemple n'est pas fourni), nous avons besoin de la variable res et du code d'erreur renvoyé par la fonction GetLastError(). Les développeurs ont intentionnellement inclus des avertissements pour ne pas oublier qu'il existe des fonctions "importantes" pour faire attention au traitement des valeurs ! Notez également que si la valeur n'est pas vérifiée, il n'y aura pas d'erreur ! C'est-à-dire que dans ce cas, la fonction fonctionnera telle quelle, mais si une situation anormale se produit, elle ne sera pas traitée. La liste des situations non standard correspond aux codes de retour de la fonction GetLastError().

J'espère que c'est plus clair de cette façon.

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

J'ai commencé à écrire un wrapper pour les fonctions d'ouverture et de modification des commandes (je pensais que cela réglerait mon problème de retour de valeurs à partir de ces opérateurs) mais le même problème se pose.

Et dans ce cas, vous n'avez pas besoin d'écrire un wrapper. Cela ne résoudra pas les problèmes avec l'avertissement sur la vérification de la valeur de retour ! Regardez les exemples de ces fonctions et faites de même !
 
Tapochun:
Et dans ce cas, nous n'avons pas besoin d'écrire un wrapper. Cela ne résoudra pas le problème de l'avertissement concernant la vérification de la valeur de retour ! Regardez les exemples de ces fonctions et faites de même !

Comme indiqué dans la référence donne une erreur.

Je l'ai écrit comme ça et c'est bien.

if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

{

Print("La modification a réussi.") ;

}

else Print("Erreur de modification de la commande.") ;

 
Insérer le code correctement dans les messages :Insérer le code correctement dans le forum
 
Karputov Vladimir:
Insérer le code correctement dans les messages :Insérer le code correctement dans le forum
voilà...
 
Leanid Aladzyeu:

Pourquoi le chalutage ne fonctionne-t-il pas pour vendre ? Il fonctionne pour acheter !

Aucune erreur ou avertissement, sur la compilation génétique.

Voici le code :

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }

Raison: