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 ?
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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