Domande di OrderSend() - pagina 8

 

Mentre aspettiamo un articolo su questo argomento, capisco bene il concetto generale di analisi delle operazioni commerciali.

...
bool AllowTrade = true;
ulong OrderTicket;
...
void OnTick() {
  ...
  if (!AllowTrade) return;
  ...
  MqlTradeResult Result;
  if (OrderSend(...)) {
    Ticket = Result.order;
    AllowTrade = false;
  }
}
...
void OnTrade() {
  if (AllowTrade) return;
  if (OrderSelect(Ticket)) {
    if (...)
    ...
    // AllowTrade = true|false;
  }
  else AllowTrade = true;
}
...

Cioè, più o meno, dopo aver inviato un ordine senza analizzare il retcode, vietiamo le operazioni di trading nel ciclo di lavoro (OnTick()) usando il flag "AllowTrade".

Il divieto di commercio viene sbloccato in OnTrade() solo dopo che il numero dell'ordine è stato trovato e sono state fatte alcune analisi sul suo destino.

Abbiamo due domande:

1. Qual è il biglietto d'ordine da controllare in OnTrade? Quali sono gli stati finali nella sua vita?

2. So che la coda degli eventi Tick (OnTick) può "cadere". Cioè se arriva un altro evento Tick e la funzione OnTick (dal Tick precedente) non ha ancora finito il suo lavoro, l'evento corrente sarà "abbandonato", cioè non sarà processato. C'è un approccio simile con gli eventi commerciali (OnTrade)? Cioè, è possibile che, per esempio, nel ciclo principale metto un divieto di commercio e l'evento OnTrade sull'ordine appena inviato "cade", perché al momento del suo arrivo starò ancora elaborando qualcosa nello stesso tick dell'invio dell'ordine di commercio corrispondente?

 
voix_kas: Cioè, c'è la probabilità che, per esempio, io metta un divieto di commercio nel ciclo principale e l'evento OnTrade per l'ordine appena inviato "cada fuori", poiché al momento del suo arrivo starò ancora elaborando qualcosa nello stesso tick dell'invio dell'ordine di commercio corrispondente?

Non ho trattato questo argomento, ma ecco cosa dice il Manuale:

1) La lunghezza della coda delle transazioni è di 1024 elementi. Se OnTradeTransaction() impiega troppo tempo per elaborare un'altra transazione, le vecchie transazioni nella coda possono essere sostituite da quelle più recenti;

2) OnTrade è chiamato dopo opportune chiamate OnTradeTransaction.

 
Yedelkin:

Non ho trattato questo argomento, ma ecco cosa dice il Manuale:

1) La lunghezza della coda delle transazioni è di 1024 elementi. Se OnTradeTransaction() impiega troppo tempo per elaborare un'altra transazione, le vecchie transazioni nella coda possono essere sostituite da quelle più recenti;

2) OnTrade è chiamato dopo opportune chiamate OnTradeTransaction.

Generalmente inteso. Comepapaklass ha già sottolineato e detto nell'articolohttps://www.mql5.com/ru/articles/232:

C'è solo un modo garantito per scoprire esattamente cosa è cambiato su un conto commerciale. Questo modo è quello di ricordare lo stato del commercio e la storia del commercio e confrontare il nuovo stato con quello salvato.

Un altro blocco di servizi nell'Expert Advisor. :(

In realtà, la domanda è questa. Possiamo ridurre la dimensione del codice senza analizzare tutte le variabili (ordini/trade/posizioni), e concentrarci solo sul numero di ordine ottenuto dal risultato di OrderSend? O questo numero può essere non unico/non riflesso nella storia?

 
voix_kas: Possiamo ridurre la dimensione del codice senza analizzare tutte le variabili (ordini/trade/posizioni), e concentrarci solo sull'ordine il cui numero è ottenuto dal risultato di OrderSend? O questo numero può essere non unico/non riflesso nella storia?

Naturalmente. Se una richiesta di compravendita ha portato alla ricezione di un biglietto d'ordine, allora questo biglietto è unico, e l'intero destino dell'ordine può essere tracciato da esso.

Qui potete vedere come viene usato il biglietto d'ordine nella storia: MQL5 Reference / Trading Functions / HistoryOrderGetInteger

 
Yedelkin:
Naturalmente. Se una richiesta di compravendita ha prodotto un ticket d'ordine, quel ticket è unico e può essere usato per tracciare l'intero destino dell'ordine.
Solo per informazione. Nel caso in cui l'ordine non sia stato accettato dal server per l'esecuzione, per esempio un requote, alla variabile MqlTradeResult.order viene assegnato un valore predefinito (per esempio "0")?
 
voix_kas: Nel caso in cui un ordine non sia stato accettato dal server per l'esecuzione, per esempio, un requote, alla variabile MqlTradeResult Result.order viene assegnato un valore predefinito (per esempio, "0")?
Una variabile di tipo MqlTradeResult è solitamente azzerata prima di essere utilizzata. Quindi, il campo Result.order contiene un valore zero. Non ho mai visto questo campo prendere un valore diverso dopo l'invio infruttuoso di una richiesta di scambio.
Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - Документация по MQL5
 
Yedelkin:
Una variabile di tipo MqlTradeResult è solitamente azzerata prima di essere utilizzata. Quindi il campo Result.order contiene un valore zero. Non ho mai visto questo campo prendere un valore diverso dopo l'invio infruttuoso della richiesta di scambio.
Se non vi dispiace, vorrei approfondire la questione dell'interpretazione dei codici di ritorno. 24 risposte dichiarate su 30 (speriamo di non incontrare quelle non dichiarate) indicano chiaramente il fallimento dell'ordine. Gli altri 6: 1. TRADE_RETCODE_PLACED Supponiamo di non piazzare ordini pendenti. Questa risposta è possibile nel trading di mercato (SYMBOL_TRADE_EXECUTION_MARKET)? 2. TRADE_RETCODE_DONE Non è possibile controllare altro. Tutto è andato esattamente come descritto dall'Expert Advisor. 3. TRADE_RETCODE_DONE_PARTIAL Presumo che questa risposta sia simile a TRADE_RETCODE_DONE data la modalità ORDER_FILLING_IOC, se si fa trading senza ordini in sospeso. 4. TRADE_RETCODE_ORDER_CHANGED Questo significa il rifiuto inequivocabile del nostro ordine commerciale? 5. TRADE_RETCODE_LOCKED Penso che questo sia il caso peggiore. Cosa dobbiamo fare in questo caso? Suggerisco che il numero d'ordine non è ancora disponibile. Il flusso commerciale è occupato. Non possiamo commerciare e non è chiaro come possiamo sapere che il flusso commerciale è sbloccato. 6. TRADE_RETCODE_FROZEN Questo significa un rifiuto inequivocabile del nostro ordine commerciale? Si prega di commentare ogni voce.
 

voix_kas: Если не возражаете, хотелось бы углубиться в вопрос интерпритации кодов возврата. Из 30 задекларированных вариантов ответа (будем надеятся, что с недекларированными мы не столкнёмся) 24 - указывают на явный отказ в размещении ордера. Остальные 6:  

1. TRADE_RETCODE_PLACED Supponiamo che non ci siano ordini pendenti. Questa risposta è possibile durante il trading di mercato (SYMBOL_TRADE_EXECUTION_MARKET)?

TRADE_RETCODE_DONE Non si può controllare più nulla. Tutto è andato esattamente come richiesto dall'Expert Advisor.

3. TRADE_RETCODE_DONE_PARTIAL Presumo che questa risposta sia la stessa di TRADE_RETCODE_DONE data la modalità ORDER_FILLING_IOC.

4. TRADE_RETCODE_ORDER_CHANGED Significa un rifiuto inequivocabile del nostro ordine commerciale?

5. TRADE_RETCODE_LOCKED Penso che questo sia il caso peggiore. Cosa dobbiamo fare in questo caso? Suggerisco che il numero d'ordine non è ancora disponibile. Il flusso commerciale è occupato. Non possiamo commerciare, e non è chiaro come dovremmo sapere se il flusso commerciale è sbloccato.

6. TRADE_RETCODE_FROZEN Questo significa un rifiuto inequivocabile del nostro ordine commerciale?

Si prega di commentare ogni voce.

Purtroppo le mie conoscenze non sono sufficienti per un commento completo su ogni punto. Beh, se succede qualcosa, i miei colleghi lo correggeranno.

1. Una volta il forum ha menzionato una situazione in cui un conto di trading può essere aperto con un sub-broker. In questo caso il sub-broker può inviare la richiesta di compravendita per un'ulteriore elaborazione (al broker) e inviare TRADE_RETCODE_PLACED al terminale del cliente. Non si sa se il broker alla fine elaborerà una tale richiesta di scambio.

2. Sì, lo penso anch'io. L'unica cosa che dobbiamo ricordare è che le informazioni su questo ordine saranno ricevute nel database del terminale in modo asincrono.

Penso che stiamo parlando dell'esecuzione parziale di una richiesta di compravendita nei modi ORDER_FILLING_IOC e ORDER_FILLING_RETURN.

4. https://www.mql5.com/ru/forum/1111/page124#comment_18407

5. Non so assolutamente nulla di questo codice. Tecnicamente, si scopre che la richiesta non è stata elaborata a causa di alcune ragioni interne del broker. Non è chiaro se verrà elaborato in seguito. Io stesso equiparo questo codice al rifiuto di una richiesta di scambio.

6. https://www.mql5.com/ru/forum/1111/page123#comment_18372

...E in generale - prova a fare una ricerca per parole chiave nel forum. Puoi trovare molte altre informazioni :)

 
Yedelkin:

Purtroppo, non ho abbastanza conoscenze per commentare pienamente ogni punto. Beh, semmai i colleghi lo correggeranno.

1. Una volta il forum ha menzionato una situazione in cui un conto di trading può essere aperto con un sub-broker. In questo caso il sub-broker può inviare la richiesta di compravendita per un'ulteriore elaborazione (al broker) e inviare TRADE_RETCODE_PLACED al terminale del cliente. Non si sa se il broker alla fine elaborerà una tale richiesta di scambio.

2. Sì, lo penso anch'io. L'unica cosa che dobbiamo ricordare è che le informazioni su questo ordine saranno ricevute nel database del terminale in modo asincrono.

Penso che stiamo parlando dell'esecuzione parziale di una richiesta di compravendita nei modi ORDER_FILLING_IOC e ORDER_FILLING_RETURN.

4. https://www.mql5.com/ru/forum/1111/page124#comment_18407

5. Non so assolutamente nulla di questo codice. Tecnicamente, si scopre che la richiesta non è stata elaborata a causa di alcune ragioni interne del broker. Non è chiaro se verrà elaborato in seguito. Io stesso equiparo questo codice al rifiuto di una richiesta di scambio.

6. https://www.mql5.com/ru/forum/1111/page123#comment_18372

...E in generale - prova a fare una ricerca per parole chiave nel forum. Potete trovare molte più informazioni :).

Qui abbiamo quanto segue: 26 dei 30 codici (compresi TRADE_RETCODE_ORDER_CHANGED e TRADE_RETCODE_FROZEN) rappresentano il rifiuto esplicito della richiesta (non genera un ordine).

TRADE_RETCODE_DONE e TRADE_RETCODE_DONE_PARTIAL - ordine creato garantito.

Come eseguire correttamente TRADE_RETCODE_PLACED (non in sospeso) e TRADE_RETCODE_LOCKED è una domanda. I commenti di MQ su questi due codici sarebbero apprezzati.

 
Va bene, buon anno #2015 a tutti, ma mi chiedo come sia finito. Sono stati due anni di silenzio....