Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ho visto la foto. Tutto è chiaro per la borsa (con un ordine limite).
Per il forex e gli ordini di mercato non hai capito niente. Tutto è chiaro.
È lo stesso con un ordine a mercato (in borsa)
Aggiunto da
Se inviamo un ordine di mercato, allora quando riceviamo il biglietto, andiamo nella storia con esso e
andiamo nella storia e vediamo cosa gli è successo. Puoi anche guardare OnTradeTransaction
TRADE_TRANSACTION_HISTORY_ADD
Che dire di "se OrderSend ha restituito il biglietto, viene eseguito"?
Dovremmo correre alla storia, dopo tutto, o aspettare gli eventi? Beh, questo è ciò che riguarda questo thread!!!
Corretto. Cosa non ho detto nel "box office"?
Ho anche postato un EA (per la Borsa) come esempio
Sì, tutto sommato, non è molto in tema ) Ma grazie per l'input.
Si tratta del fatto che l'OrderSend "sincrono" termina prima che l'EA veda il suo impatto sul conto (nessun trade nella storia e nessun cambiamento di posizione).
E per funzionare correttamente, dobbiamo inventarci delle stampelle sotto forma di attesa di un evento (una caratteristica molto comoda! Ma non in questo caso) o di ricerca nella storia (anche questa con attesa).
In effetti, c'è un problema per il FOREX (ho eseguito lo stesso Expert Advisor sul FOREX)
Ma in modalità asincrona (FOREX) funziona bene
Naturalmente, tutti riceveranno il messaggio. Ma non sapranno che qualcuno non ha ricevuto lo stesso messaggio un colpo prima e non ha innescato un nuovo ordine-invio.
Nuova idea.
Scrivere un sincronizzatore EA. Una volta fatto OrderSend, i dati vengono inviati a questo EA e aspetta che risponda.
Anche se la differenza con la variante slip è la stessa delle uova. Tutto sommato, la tua variante è ottimale, purtroppo.
Lo stesso con un ordine a mercato (in borsa)
Aggiunto
Se viene inviato un ordine di mercato, una volta ricevuto il biglietto, andiamo con esso nella storia e
vedere cosa gli è successo.
OrderSend() è una funzione assolutamente sincrona - se viene ricevuto un biglietto, tutto viene eseguito.
Qui sotto c'è un esempio
Aggiunto, ed ecco i registri
https://www.mql5.com/ru/forum/38456/page85#comment_2888263
Ti ringrazio per il link. Ma la mia domanda era un po' diversa. Piuttosto, non era una domanda ma un argomento a favore del controllo dello stato dell'ordine sul posto senza aspettare che l'evento OnTrade() venga elaborato.
Non devi aver guardato il codice dell'esempio.
{
if(order_ticket>0)
{
if(OrderSelect(order_ticket))
{
RemoveOrderSyncMode(order_ticket);
}
else
{
Print(__FUNCTION__," Order not select! Ticket = ",order_ticket);
}
}
}
La cancellazione dell'ordine in modalità sync (OrderSend()) avrebbe dovuto avvenire dopo la risposta di
SendOrserSyncMode, ma non è successo.
2016.10.14 02:18:20.292 Trades'3941932': failed cancel order #102956267 buy limit 1.00 GBPUSD at 1.22374 [Invalid request]
È qui che si trova l'errore. Secondo la documentazione, se abbiamo ricevuto un ticket, l'ordine è stato inserito nel sistema di trading,
Ma (in FOREX) non è fatto, e la cancellazione è avvenuta nel corpo della funzioneRemoveOrderAsyncMode, cioè
dopo aver ricevuto un messaggio in OnTradeTransaction
Aggiunto
Per rispondere alla domanda del top-starter, dopo aver inviato un ordine usando OrderSend(),
l'ordine può essere gestito dopo aver ricevuto l'evento in OntradeTransaction (OnTrade).
Sembra che gli sviluppatori risolveranno il problema.
Aggiunto
Ora ho guardato FORTS - questo problema è anche lì
2016.10.17 18:45:19.081 Trades '1007932': accepted buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.081 Trades '1007932': buy limit 1.00 GAZR-12.16 at 12847 placed for execution
2016.10.17 18:45:19.091 Trades '1007932': order #52178167 buy limit 1.00 / 1.00 GAZR-12.16 at 12847 done in 17.440 ms
2016.10.17 18:45:19.091 Trades '1007932': failed cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847.00000 [Invalid request]
2016.10.17 18:45:19.091 Trades '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.098 Trades '1007932': accepted cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847
2016.10.17 18:45:19.099 Trades '1007932': cancel order #52178167 buy limit 1.00 GAZR-12.16 at 12847 placed for execution in 7.215 ms
2016.10.17 18:45:19.074 TestOrders (GAZR-12.16,M1) OnChartEvent Send Order Sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) SendOrderSyncMode Order sent in sync mode
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) RemoveOrderSyncMode Order not sent (remove) in sync mode.
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_REQUEST_ADD
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_PLACED
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order plased done. Ticket = 52178167
2016.10.17 18:45:19.091 TestOrders (GAZR-12.16,M1) RemoveOrderAsyncMode Order sent (remove) in async mode
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.098 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order get ticket done. Ticket = 52178167
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_UPDATE
2016.10.17 18:45:19.099 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order update state = ORDER_STATE_REQUEST_CANCEL
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_REQUEST
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_ORDER_DELETE
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Transaction type: TRADE_TRANSACTION_HISTORY_ADD
2016.10.17 18:45:19.108 TestOrders (GAZR-12.16,M1) OnTradeTransaction Order remove done. Ticket = 52178167
Per rispondere alla domanda del top-trader, dopo aver inviato un ordine usando OrderSend(),
si può operare con l'ordine dopo aver ricevuto l'evento in OntradeTransaction (OnTrade)
Nel caso di due EAs sullo stesso simbolo?
Sì, due EAs sullo stesso simbolo.
{
ENUM_TRADE_REQUEST_ACTIONS action; // Тип выполняемого действия
ulong magic; // Штамп эксперта (идентификатор magic number)
ulong order; // Тикет ордера
string symbol; // Имя торгового инструмента
double volume; // Запрашиваемый объем сделки в лотах
double price; // Цена
double stoplimit; // Уровень StopLimit ордера
double sl; // Уровень Stop Loss ордера
double tp; // Уровень Take Profit ордера
ulong deviation; // Максимально приемлемое отклонение от запрашиваемой цены
ENUM_ORDER_TYPE type; // Тип ордера
ENUM_ORDER_TYPE_FILLING type_filling; // Тип ордера по исполнению
ENUM_ORDER_TYPE_TIME type_time; // Тип ордера по времени действия
datetime expiration; // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
string comment; // Комментарий к ордеру
ulong position; // Тикет позиции
ulong position_by; // Тикет встречной позиции
};
Eliminare le posizioni, gli ordini e le compravendite "sbagliate".