Naturalmente controlleremo il vostro caso.
Ma in generale la funzione OrderSend funziona secondo l'aiuto.
Возвращаемое значение
In caso disuccesso del controllo di base delle strutture (controllo del puntatore) restituisce true - non indica la riuscita dell'esecuzione dell'operazione commerciale. Per ottenere una descrizione più dettagliata del risultato della funzione, dovremmo analizzare i campi della struttura delrisultato.
- www.mql5.com
Naturalmente controlleremo il vostro caso.
Ma in generale, la funzione OrderSend funziona secondo la guida.
No, non mi sto lamentando, voglio solo capire. Forse ho sbagliato da qualche altra parte... Ho anche analizzato i campi della struttura dei risultati dove pensavo dovessero essere [come mi è stato insegnato :)] .
Ma da quanto ho capito, almeno si suppone che la transizione all'operatore successivo dovrebbe essere fatta solo dopo che il terminale gestisce completamente la funzione OrderSend() [compreso l'ottenimento e la gestione dei campi della struttura dei risultati]?
(Scusa, nella domanda precedente ho fatto un errore di battitura: ho specificato richiesta invece di risultato).
Il primo giorno di campionato ha dimostrato che il mio Expert Advisor non funziona come previsto, cioè, invece di un singolo ordine pendente piazza diversi ordini pendenti unidirezionali. Questa è approssimativamente la stessa struttura:
Domanda: il terminale aspetta che la funzione OrderSend() del primo blocco finisca l'elaborazione [cioè aspetta che la richiesta sia ricevuta], o passa immediatamente all'operatore successivo (blocco) dopo aver inviato una richiesta di compravendita al server?Confermo il problema. Dopo aver impostato l'OrderSend() di un ordine in sospeso, OrdersTotal non sempre lo vede.
Ho impostato una pausa dopo OrderSend(). Ma non ha aiutato il robot al campionato di oggi :)
Una raccolta di link a una discussione in un altro thread:
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(sull'asincronia)
https://www.mql5.com/ru/forum/2236/page14/#comment_27552
- www.mql5.com
Buon pomeriggio a tutti.
Sto cercando di fare un programma che si limiti ad aprire un ordine in base al mercato, cioè mando un simbolo, un volume e un tipo di ordine, in un ciclo finché non appare una posizione con la direzione che voglio.
Il registro dà
2012.01.09 16:08:42 Trades '9066293' : fallito acquisto istantaneo 1.00 EURUSD a 0.0000 (deviazione: 103117312) [Stop non valido].
Quindi, se apro a mercato, perché devo specificare il prezzo di apertura? Non ho bisogno di fermate.
Io aprirei con F9.
Per favore, consigliatemi dove ho sbagliato o scrivete del codice per aprire un ordine.
Sto riempiendo la struttura con un tale minimo:
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 = "";L'intero test di Expert Advisor per l'apertura di una posizione è nel file.
Buon pomeriggio a tutti.
Sto cercando di fare un programma che apra semplicemente un ordine a mercato. Cioè mando lì un simbolo, un volume e un tipo di ordine, in un ciclo finché non appare una posizione con la direzione che voglio.
E qualcosa mi dà = Invalid Stops, mentre non ho bisogno di alcuno Stops per un ordine a mercato. Non so dove sto sbagliando...
L'intero test dell'Expert Advisor per aprire una posizione è nel file.
Ecco qui, dovrebbe funzionare.
//+------------------------------------------------------------------+ //| 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; } //+------------------------------------------------------------------+
Ecco, dovrebbe funzionare.
Grazie. Funziona. E così velocemente che non ha il tempo di aggiornare le informazioni sulla posizione.
Di conseguenza, vengono effettuati 2 ordini.
Si può risolvere con una pausa di 1 millisecondo!
if(zOrderSend(_Symbol,0.1,ORDER_TYPE_BUY)==10009) // 10009 TRADE_RETCODE_DONE Заявка выполнена { Sleep (1); Alert("Купили!"); } else Alert("Не купили...."); }
... non ha il tempo di aggiornare le informazioni sulla posizione.
Di conseguenza, vengono effettuati 2 ordini.
Questo può essere risolto con una pausa di 1 millisecondo!
Basta tenere a mente che la pausa non è una panacea:
La funzione di controllo degli ordini di KimV non aiuta?
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Il primo giorno di campionato ha dimostrato che il mio Expert Advisor non funziona come previsto, cioè, invece di un singolo ordine pendente piazza diversi ordini pendenti unidirezionali. Questa è approssimativamente la seguente struttura:
Domanda: il terminale aspetta che la funzione OrderSend() del primo blocco finisca l'elaborazione [cioè aspetta che la richiesta sia ricevuta], o passa immediatamente all'operatore successivo (blocco) dopo aver inviato una richiesta di compravendita al server?