Nous allons, bien sûr, vérifier votre dossier.
Mais en général, la fonction OrderSend fonctionne conformément à l'aide.
Возвращаемое значение
En cas desuccès du contrôle de base des structures (contrôle des pointeurs), il renvoie vrai - il n'indique pas l'exécution réussie de l'opération commerciale. Pour obtenir une description plus détaillée du résultat de la fonction, nous devons analyser les champs de la structure du résultat.
- www.mql5.com
Nous allons, bien sûr, vérifier votre dossier.
Mais en général, la fonction OrderSend fonctionne conformément à l'aide.
Non, je ne me plains pas, je veux juste comprendre. Peut-être que je me suis trompé ailleurs... J'ai également analysé les champs de la structure du résultat là où je pensais qu'ils devaient être [comme on me l'a appris :)].
Mais si je comprends bien, il est au moins supposé que la transition vers l'opérateur suivant ne doit se faire qu'après que le terminal ait complètement traité la fonction OrderSend() [y compris la récupération et la manipulation des champs de la structure de résultat] ?
(Désolé, dans la question précédente j'ai fait une faute de frappe : j'ai spécifié request au lieu de resultat).
Le premier jour du championnat a montré que mon Expert Advisor ne fonctionne pas comme prévu, à savoir qu'au lieu d'un seul ordre en attente, il place plusieurs ordres en attente unidirectionnels. Il s'agit approximativement de la même structure :
Question : Le terminal attend-il que la fonction OrderSend() du premier bloc termine son traitement [c'est-à-dire attend-il la réception de la demande], ou passe-t-il immédiatement à l'opérateur (bloc) suivant après avoir envoyé une demande de transaction au serveur ?Je confirme le problème. Après avoir défini l'OrderSend() d'un ordre en attente, OrdersTotal ne le voit pas toujours.
J'ai mis une pause après OrderSend(). Mais cela n'a pas aidé le robot au championnat aujourd'hui :)
Une collection de liens vers une discussion dans un autre fil :
https://www.mql5.com/ru/forum/2236/page13/#comment_27472
https://www.mql5.com/ru/forum/2236/page13/#comment_27486
https://www.mql5.com/ru/forum/2236/page13/#comment_27503
https://www.mql5.com/ru/forum/2236/page14/#comment_27531(à propos de l'asynchronie)
https://www.mql5.com/ru/forum/2236/page14/#comment_27552
- www.mql5.com
Bonjour à tous.
J'essaie de créer un programme qui ouvrirait simplement un ordre en fonction du marché. C'est-à-dire que j'y envoie un symbole, un volume et un type d'ordre, dans une boucle jusqu'à ce qu'une position avec la direction que je veux apparaisse.
Le journal donne
2012.01.09 16:08:42 Trades '9066293' : échec de l'achat instantané de 1,00 EURUSD à 0,0000 (écart : 103117312) [Arrêts invalides].
Si j'ouvre au marché, pourquoi dois-je préciser le prix d'ouverture ? Je n'ai pas besoin d'arrêts.
J'ouvrirais par F9.
S'il vous plaît, dites-moi où j'ai fait une erreur ou écrivez un code pour ouvrir une commande.
Je remplis la structure avec un tel minimum :
uint zOrderSend (string zSymbol, double zVolume, string zORDER_TYPE) { zSymbol = "EURUSD"; zVolume = 1; zORDER_TYPE ="Buy"; Alert ("*****************", zSymbol," ", zVolume," ", zORDER_TYPE); //--- готовим запрос MqlTradeRequest request; request.action=TRADE_ACTION_DEAL; // request.magic=0; request.symbol=zSymbol; // request.volume=zVolume; request.volume=zVolume; // request.price=0; // request.sl=0; // request.tp=0; // request.deviation=SymbolInfoInteger("EURUSD",SYMBOL_SPREAD); // slippage // request.deviation=50; //--- сформируем тип ордера if (zORDER_TYPE == "Buy" ) {request.type = ORDER_TYPE_BUY ;} // тип ордера = 0 if (zORDER_TYPE == "Sell") {request.type = ORDER_TYPE_SELL;} // тип ордера = 1 Alert ("Тип ордера: request.type = ",request.type); request.type_filling = ORDER_FILLING_FOK; request.type_time = ORDER_TIME_GTC; // request.comment = "";Le test complet de l'Expert Advisor pour l'ouverture d'une position se trouve dans le fichier.
Bonjour à tous.
J'essaie de créer un programme qui ouvrirait simplement un ordre au marché. C'est-à-dire que j'y envoie un symbole, un volume et un type d'ordre, dans une boucle jusqu'à ce qu'une position avec la direction que je veux apparaisse.
Et quelque chose me donne = Stops invalides, alors que je n'ai pas besoin de Stops pour un ordre au marché. Je ne sais pas où je me trompe...
Le test complet de l'Expert Advisor pour ouvrir une position est dans le fichier.
Voilà, ça devrait marcher.
//+------------------------------------------------------------------+ //| Deal.mq5 | //| Copyright 2012, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(1); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Alert("Купили!"); } else Alert("Не купили...."); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- } //+------------------------------------------------------------------+ uint zOrderSend(string zSymbol,double zVolume,ENUM_ORDER_TYPE zORDER_TYPE) { MqlTradeRequest request; MqlTradeCheckResult ch_result; MqlTradeResult result; // обнулим структуру запроса перед заполнением ZeroMemory(request); Alert("*****************",zSymbol," ",zVolume," ",zORDER_TYPE); // заполняем структуру request.action=TRADE_ACTION_DEAL; request.type_filling=ORDER_FILLING_AON; request.symbol=zSymbol; request.type=zORDER_TYPE; request.deviation=30; request.sl=0.0; request.tp=0.0; request.volume=zVolume; if(zORDER_TYPE==ORDER_TYPE_BUY)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); if(zORDER_TYPE==ORDER_TYPE_SELL)request.price=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); // выводим на печать заполненную структуру торгового запроса Alert(" ENUM_TRADE_REQUEST_ACTIONS request.action; // Тип выполняемого действия =",request.action,"="); Alert(" ulong request.magic; // Штамп эксперта (идентификатор magic number) =", request.magic, "=" ); Alert(" ulong request.order; // Тикет ордера =", request.order, "=" ); Alert(" string request.symbol; // Имя торгового инструмента =", request.symbol, "=" ); Alert(" double request.volume; // Запрашиваемый объем сделки в лотах =", request.volume, "=" ); Alert(" double request.price; // Цена =", request.price, "=" ); Alert(" double request.stoplimit; // Уровень StopLimit ордера =", request.stoplimit, "=" ); Alert(" double request.sl; // Уровень Stop Loss ордера =", request.sl, "=" ); Alert(" double request.tp; // Уровень Take Profit ордера =", request.tp, "=" ); Alert(" ulong request.deviation; // Максимально приемлемое отклонение от запрашиваемой цены =", request.deviation, "=" ); Alert(" ENUM_ORDER_TYPE request.type; // Тип ордера =", request.type, "=" ); Alert(" ENUM_ORDER_TYPE_FILLING request.type_filling; // Тип ордера по исполнению =", request.type_filling, "=" ); Alert(" ENUM_ORDER_TYPE_TIME request.type_time; // Тип ордера по времени действия =", request.type_time, "=" ); Alert(" datetime request.expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED) =", request.expiration, "=" ); Alert(" string request.comment; // Комментарий к ордеру =", request.comment, "=" ); // отправляем структуру запроса на проверку if(OrderCheck(request,ch_result)==false) { Alert("OrderCheck выявил ошибку: "+IntegerToString(ch_result.retcode)+"/"+ch_result.comment); return ch_result.retcode; } // отправляем запрос на торговый сервер if(OrderSend(request,result)==false) { Alert("OrderSend возвратил ошибку: "+IntegerToString(result.retcode)+"/"+result.comment); return result.retcode; } // выводим на печать структуру ответа сервера Alert("Код результата операции сервера: " + IntegerToString(result.retcode)); Alert("deal Тикет сделки " + IntegerToString(result.deal)); Alert("order Тикет ордера " + IntegerToString(result.order)); Alert("volume Объем сделки " + DoubleToString (result.volume)); Alert("price Цена в сделке " + DoubleToString (result.price)); Alert("bid(цены реквоты) " + DoubleToString (result.bid)); Alert("ask(цены реквоты) " + DoubleToString (result.ask)); Alert("Комментарий: "+result.comment); return result.retcode; } //+------------------------------------------------------------------+
Voilà, ça devrait fonctionner.
Merci. Ça marche. Et si vite qu'il n'a pas le temps de mettre à jour les informations sur la position.
En conséquence, 2 commandes sont passées.
Cela peut être corrigé avec une pause d'une milliseconde !
if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Sleep (1); Alert("Купили!"); } else Alert("Не купили...."); }
... n'a pas le temps de mettre à jour les informations sur le poste.
En conséquence, 2 commandes sont passées.
Cela peut être résolu en faisant une pause d'une milliseconde !
Gardez simplement à l'esprit que la pause n'est pas une panacée :
Gardez à l'esprit que la pause n'est pas une panacée :
La fonction de vérification des commandes de KimV n'est-elle pas utile ?
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Le premier jour du championnat a montré que mon Expert Advisor ne fonctionne pas comme prévu, à savoir qu'au lieu d'un seul ordre en attente, il place plusieurs ordres en attente unidirectionnels. Il s'agit approximativement de la structure suivante :
Question : Le terminal attend-il que la fonction OrderSend() du premier bloc termine son traitement [c'est-à-dire qu'il attende la réception de la demande], ou passe-t-il immédiatement à l'opérateur (bloc) suivant après avoir envoyé une demande de transaction au serveur ?