erreur 4756

 

bonjour


J'ai très souvent l'erreur 4756, disons qu'au premier tick elle ne passe pas et au second l'ordre passe .

Et voici  le code d'erreur,

ERR_TRADE_SEND_FAILED

4756

Echec de l'envoi de la demande de trad


 Une idée ? Peut-être mon code, le réseau... ou la faute à pas de chance.

cdl remy




 
Il semble que cela soit lié à un problème d'arrondi dans les calculs et que cela soit mieux géré avec la classe<Trade\Trade.mqh>


Bon, bref, j'ai remplacé le code suivant

bool vente()
{
    double lotSize = 0.1;              // Taille du lot
    double stopLoss = 50;              // Stop Loss en points (50 points dans cet exemple)
    double takeProfit = 50;           // Take Profit en points (50 points dans cet exemple)

    // Récupérer le prix actuel du marché
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);

    // Calculer le prix du Stop Loss et Take Profit
    double stopLossPrice = currentPrice + stopLoss * SymbolInfoDouble(_Symbol, SYMBOL_POINT);
    double takeProfitPrice = currentPrice - takeProfit * SymbolInfoDouble(_Symbol, SYMBOL_POINT);

    // Créer une instance de MqlTradeRequest
    MqlTradeRequest request;
    ZeroMemory(request); // Initialiser toutes les valeurs de la structure à 0

    // Remplir les informations de l'ordre dans la structure MqlTradeRequest
    request.action = TRADE_ACTION_DEAL;       // Type d'action (achat ou vente)
    request.symbol = _Symbol;                // Symbole
    request.volume = lotSize;                // Taille du lot
    request.price = currentPrice;            // Prix d'ouverture de l'ordre
    request.type = ORDER_TYPE_SELL;          // Type d'ordre (vente)
    request.type_filling = ORDER_FILLING_FOK; // Type de remplissage (Fill or Kill)
    request.sl = stopLossPrice;              // Prix du Stop Loss
    request.tp = takeProfitPrice;            // Prix du Take Profit

    // Passer l'ordre de vente en utilisant MqlTradeRequest
    MqlTradeResult result;
    ZeroMemory(result); // Initialiser toutes les valeurs de la structure à 0
    if (OrderSend(request, result))
    {
        Print("Ordre de vente passé avec succès ! Numéro de ticket :", result.order);
        Print(stopLossPrice+" "+takeProfitPrice+" "+currentPrice);
        return true;
    }
    else
    {
        Print("Erreur lors de la passation de l'ordre :", GetLastError());
        Print(stopLossPrice+" "+takeProfitPrice+" "+currentPrice);
    }
    return false;
}

Par


void vente()
{

   
   double volume=0.1;                                          // specify a trade operation volume
   string symbol=_Symbol;                                      //specify the symbol, for which the operation is performed
   int    digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); // number of decimal places
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
   double bid=SymbolInfoDouble(symbol,SYMBOL_ASK);             // current price for closing LONG
   double SL=bid+50*point;                                   // unnormalized SL value
   SL=NormalizeDouble(SL,digits);                              // normalizing Stop Loss
   double TP=bid-50*point;                                   // unnormalized TP value
   TP=NormalizeDouble(TP,digits);                              // normalizing Take Profit
   
//--- receive the current open price for LONG positions
   double open_price=SymbolInfoDouble(symbol,SYMBOL_BID);
   string comment=StringFormat("Buy %s %G lots at %s, SL=%s TP=%s",
                               symbol,volume,
                               DoubleToString(open_price,digits),
                               DoubleToString(SL,digits),
                               DoubleToString(TP,digits));
   if(!trade.Sell(volume,symbol,open_price,SL,TP,comment))
     {
      //--- failure message
      Print("Buy() method failed. Return code=",trade.ResultRetcode(),
            ". Code description: ",trade.ResultRetcodeDescription());
     }
   else
     {
      Print("Ordre de Vente passé avec succès ! Numéro de ticket =",PositionGetTicket(0),
            " (",trade.ResultRetcodeDescription(),")");
     }

}

et il n'y a plus d'erreur. Enfin, presque, mais cela semble être une histoire probablement liée à une latence induite au traitement.

il y a deux demande de faite sur le même ordre et aucune erreur étonnant non ?