Questo è effettivamente ottimale. E permette di impostare condizioni di ordinamento più complesse.
Per esempio:
Sì e comunque non ci sono altre soluzioni.
Il punto del modello è di essere universale. Se passate un'altra struttura nel vostro esempio che non contiene almeno un campo a,b,c, non compilerà. Cioè, la funzione non può lavorare con due tipi di dati diversi allo stesso tempo.
Questa condizione funzionerà se l'ordine pendente è parzialmente eseguito e genera una posizione. Allora un ordine e una posizione con lo stesso ticket esisteranno allo stesso tempo.
Per questo motivo la seguente costruzione ha senso in alcune situazioni.
Per coloro che lavorano con le transazioni asincrone, sarà utile conoscere le impostazioni per il numero massimo possibile di transazioni asincrone non elaborate nel vostro account.
Questa condizione sarà attivata se l'ordine pendente è parzialmente eseguito e genera una posizione. Allora un ordine e una posizione con lo stesso ticker esisteranno allo stesso tempo.
Il seguente codice in un conto demoRannForex-Server può riprodurre immediatamente questa situazione eseguendo questo EA.
// Воспроизведение ситуации наличия позиции и отложенного ордера с одинаковыми тикетами.#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)
MqlTradeResult Result = {0};
MqlTradeRequest Request = {0};
intOnInit()
{
Request.action = TRADE_ACTION_PENDING;
Request.symbol = _Symbol;
Request.volume = 100;
Request.price = Ask;
Request.type = ORDER_TYPE_BUY_LIMIT;
return(!OrderSend(Request, Result)); // Выставили лимитник по текущей цене.
}
#define TOSTRING(A) #A + " = " + DoubleToString(A, _Digits)
voidOnTradeTransaction( constMqlTradeTransaction&, constMqlTradeRequest&, constMqlTradeResult& )
{
if (OrderSelect(Result.order) && (OrderGetInteger(ORDER_STATE) == ORDER_STATE_PARTIAL)) // Если наш лимитник исполнился частично
{
if (Ask - OrderGetDouble(ORDER_PRICE_OPEN) < 100 * _Point) // и находится близко от текущей цены
{
Request.action = TRADE_ACTION_MODIFY;
Request.order = Result.order;
Request.price = Ask - 1000 * _Point;
// тогда передвигаем его подальше.if (OrderSend(Request, Result)) // Если синхронный OrderSend выполнился успешно, то торговое окружение должно соответствовать.
{
// Проверка соответствия торгового окружения.if (OrderSelect(Request.order) && // Если получилось взять данные нашего ордераNormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN) - Request.price, _Digits)) // и цена ордера не равна цене успешного OrderSendAlert("Bug:" + TOSTRING(OrderGetDouble(ORDER_PRICE_OPEN)) + " != " + TOSTRING(Request.price)); // сообщаем о баге MT5.
}
}
elseExpertRemove();
}
}
Risultato.
A proposito, lo script mostra (non sempre la prima volta) un bug nell'esecuzione di OrderSend sincrono.
Dopo che OrderSend è stato eseguito per alcune decine/centinaia di millisecondi, il prezzo dell'ordine è quello vecchio, e non quello che è stato piazzato con successo da OrderSend.
Tornando all'argomento dei biglietti identici, possiamo trarre alcune conclusioni.
Se un ordine limite parziale è sospeso, la scheda "Ordini e compravendite" non mostrerà la compravendita generata.
Su una copertura, un singolo ordine può generare più operazioni IN con prezzi diversi. Il risultato sarà un prezzo di apertura frazionato (relativo ai pip) della posizione.
Puoi chiudere la posizione generata senza rimuovere la Put parziale. Ma se dopo che l'ordine pendente è scattato, allora verrà aperto un trade con il ticket, uguale al ticket della posizione, che è stato chiuso prima. Cioè, ci può essere una situazione in cui si chiude una posizione con un certo biglietto. E poi una posizione riappare con lo stesso ticker.
L'esecuzione parziale può essere implementata in modo diverso, a seconda del software del broker. Quanto sopra è un'implementazione standard di MT5.
Se qualcuno è riuscito a riprodurlo su un altro server di trading, per favore condivida il nome.
Potete chiudere la posizione generata senza cancellare la Put parziale. Ma se dopo che l'ordine pendente è scattato, aprirà un trade con un ticket uguale al ticket della posizione precedentemente chiusa. Cioè, ci può essere una situazione in cui si chiude una posizione con un certo biglietto. E poi una posizione appare di nuovo con lo stesso biglietto.
Non è un biglietto unico? Come può essere?
Sia gli ordini che gli scambi hanno biglietti unici?
La spiegazione che si può trovare è che finché c'è un ordine di apertura, c'è sempre una posizione. Solo che non è sempre visibile - il volume è zero. E questa posizione ha un biglietto unico. Bene, su una copertura per questo motivo è abbastanza possibile che ci siano in-trigger sulla stessa posizione dopo i corrispondenti trade in e out.
Gli ordini e le offerte hanno anche biglietti unici?
Sono unici. Ma naturalmente ORDER_TICKET può essere uguale a DEAL_TICKET.
Dovrebbe funzionare. Ma non consiglierei di farlo in questo modo).
Questo è effettivamente ottimale. E permette di impostare condizioni di ordinamento più complesse.
Per esempio:
Sì e comunque non ci sono altre soluzioni.
Il punto del modello è di essere universale. Se passate un'altra struttura nel vostro esempio che non contiene almeno un campo a,b,c, non compilerà. Cioè, la funzione non può lavorare con due tipi di dati diversi allo stesso tempo.
Forum sul trading, sistemi di trading automatico e test di strategie di trading
Pannello di controllo per il trading. AIUTO PER MQL5 NECESSARIO
Vladimir Karputov, 2020.08.18 09:04
Questo codice non funzionerebbe - non puoi confrontare polpette e quadrati:
Questa condizione funzionerà se l'ordine pendente è parzialmente eseguito e genera una posizione. Allora un ordine e una posizione con lo stesso ticket esisteranno allo stesso tempo.
Per questo motivo la seguente costruzione ha senso in alcune situazioni.
Forum sul trading, sistemi di trading automatico e test di strategia
Biblioteche: MT4Orders
fxsaber, 2020.08.20 15:44
Per coloro che lavorano con le transazioni asincrone, sarà utile conoscere le impostazioni per il numero massimo possibile di transazioni asincrone non elaborate nel vostro account.
Questo non è difficile da scoprire.
Fate attenzione, potete incorrere in un limite.
Renat ha detto molto tempo fa che non solo si può rimanere incastrati in un limite, ma si può anche essere bloccati da un DC
Questa condizione sarà attivata se l'ordine pendente è parzialmente eseguito e genera una posizione. Allora un ordine e una posizione con lo stesso ticker esisteranno allo stesso tempo.
Il seguente codice in un conto demoRannForex-Server può riprodurre immediatamente questa situazione eseguendo questo EA.
Risultato.
A proposito, lo script mostra (non sempre la prima volta) un bug nell'esecuzione di OrderSend sincrono.
Dopo che OrderSend è stato eseguito per alcune decine/centinaia di millisecondi, il prezzo dell'ordine è quello vecchio, e non quello che è stato piazzato con successo da OrderSend.
Tornando all'argomento dei biglietti identici, possiamo trarre alcune conclusioni.
Se qualcuno è riuscito a riprodurlo su un altro server di trading, per favore condivida il nome.
Stringa di ricerca: Oshibka 010.
Non è un biglietto unico? Come può essere?
Sia gli ordini che gli scambi hanno biglietti unici?
Non è un biglietto unico? Come può essere?
La spiegazione che si può trovare è che finché c'è un ordine di apertura, c'è sempre una posizione. Solo che non è sempre visibile - il volume è zero. E questa posizione ha un biglietto unico. Bene, su una copertura per questo motivo è abbastanza possibile che ci siano in-trigger sulla stessa posizione dopo i corrispondenti trade in e out.
Gli ordini e le offerte hanno anche biglietti unici?
Sono unici. Ma naturalmente ORDER_TICKET può essere uguale a DEAL_TICKET.