Discussione sull’articolo "Ordini, Posizioni e Deal in MetaTrader 5" - pagina 4

 

Per favore, se la funzione OrderSend restituisce true e result.order ha un order ticket (result.order!=0), garantisce che l'ordine sia accettato dal broker e sia nella scheda di trading o in questa fase la richiesta è accettata solo dal server del broker ma non dalla borsa?

E la seconda domanda: può esserci una situazione in cui OrderSend restituisce true e result.order==0?

 
Aleksey Gunin:

Potete dirmi per favore se la funzione OrderSend restituisce true e result.order ha un order ticket (result.order!=0), garantisce che l'ordine sia accettato dal broker e sia nella scheda di trading o in questa fase la richiesta è accettata solo dal server del broker ma non dalla borsa?

Garantito.

E la seconda domanda: può esserci una situazione in cui OrderSend restituisce true e result.order==0?

No, non è possibile.

 
fxsaber:

Garanzie.

No.

Proprio l'altro giorno hanno aggiunto un chiarimento per la funzione OrderSend, vedi la guida in linea.

 
Rashid Umarov:

Proprio l'altro giorno hanno aggiunto un chiarimento per la funzione OrderSend, consultate la guida in linea.

Si applica agli ordini di mercato?

Ogni ordine accettato viene memorizzato sul server di negoziazione in attesa di essere elaborato finché non si verifica una delle condizioni per la sua esecuzione:

  • scadenza,
  • il verificarsi di una richiesta di contatore,
  • attivazione dell'ordine al ricevimento del prezzo di esecuzione,
  • ricezione di una richiesta di annullamento dell'ordine.
Non è specificato che il terminale stesso chiami sempre OrderCheck prima di OrderSendAsync, e OrderSend è un'aggiunta a OrderSendAsync.

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading

Errori tipici e modi per eliminarli quando si lavora con l'ambiente di trading

fxsaber, 2018.02.20 12:23 pm.

Schema condizionale di implementazione dell'OrderSend standard (senza timeout)
static MqlTradeResult LastResult = {0};

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult &Result )
{ 
  LastResult = Result;
}

// Algoritmo condizionale per l'implementazione dell'OrdineInvio standard
bool OrderSend( const MqlTradeRequest &Request, MqlTradeResult &Result )
{  
  bool Res = OrderSendAsync(Request, Result);
  
  if (Res)
  {
    while (LastResult.request_id != Result.request_id)
      OnTradeTransaction(); // chiamata schematica
          
    Result = LastResult;    
    Res = (Result.retcode == TRADE_RETCODE_PLACED) ||
          (Result.retcode == TRADE_RETCODE_DONE) ||
          (Result.retcode == TRADE_RETCODE_DONE_PARTIAL);

    LastResult.request_id = 0;
  }
    
  return(Res);
}


Da questo schema si vede chiaramente che quando si inserisce un ordine di mercato tramite OrderSendAsync sullo stesso MetaQuotes-Demo, è impossibile garantire la cattura dell'evento di inserimento dell'ordine corrispondente fino all'esecuzione o al rifiuto dell'ordine. In altre parole, MT5 non dispone di meccanismi semplici per valutare i risultati intermedi del suo OrderSendAsync.


OrderSend viene eseguito finché Result.request_id non è uguale allo stesso valore di OrderSendAsync in OnTradeTransaction. Oppure viene terminato dal timeout. Pertanto, il risultato di OrderSend dipende solo dal tipo di messaggio in OnTradeTransaction con il request_id corrispondente.

Sarebbe utile conoscere la formazione del request_id stesso. Se ho capito bene, si tratta di un contatore di ordini inviati al server di trading dal momento dell'avvio/connessione del Terminale/Account. Il Terminale stesso analizza i messaggi in arrivo dal server di trading e assegna il request_id richiesto solo a uno di essi (il che è dubbio), oppure reimposta il request_id a un determinato messaggio (molto probabilmente). Questo comportamento ha permesso qualche tempo fa di far coincidere lo storico delle offerte con l'output di OrderSend. Ma poiché solo un messaggio in OnTradeTransaction è visibile con il giusto request_id, si verifica la situazione spiacevole in modalità asincrona nella citazione di cui sopra.

 

Buon pomeriggio, ho riscontrato delle incongruenze per MqlTradeResult.deal e MqlTradeResult.order

1) Descrizione (Manuale di riferimento MQL5)


2) Trading in tempo reale

Effettuo ordini di mercato (TRADE_ACTION_DEAL). Emetto i valori di MqlTradeResult utilizzando la funzione Print:


e l'operazione appare nel log:

Ho provato ad "addormentarmi" con la funzione Sleep per un paio di secondi e ad emettere di nuovo i dati (quando l'operazione è già stata eseguita esattamente e la posizione è aperta), il numero dell'operazione non è apparso.


3) Tester di strategia

Tutti i campi sono compilati:



Cosa causa queste differenze?

 
Konstantin Kulikov:

Buon pomeriggio, ho trovato delle incongruenze per MqlTradeResult.deal e MqlTradeResult.order




https://www.mql5.com/it/docs/trading/ordersend

Quando si invia un ordine di mercato (MqlTradeRequest.action=TRADE_ACTION_DEAL), il risultato positivo della funzione OrderSend() non significa che l'ordine è stato eseguito (le operazioni corrispondenti sono state eseguite): vero in questo caso significa solo che l'ordine è stato inserito con successo nel sistema di negoziazione per la successiva esecuzione. Il server di negoziazione può inserire i valori dei campi di negoziazione o dell'ordine nella struttura del risultato restituito , se questi dati gli sono noti al momento della formazione della risposta alla chiamata OrderSend(). In generale, l'evento o gli eventi di esecuzione delle operazioni corrispondenti all'ordine possono verificarsi dopo l'invio della risposta alla chiamata OrderSend(). Pertanto, per qualsiasi tipo di richiesta di negoziazione, quando si riceve il risultato dell'esecuzione di OrderSend(), è necessario controllare innanzitutto il codice di ritorno del server di negoziazione retcode e il codice di risposta del sistema di negoziazione esterno retcode_external (se necessario), che sono disponibili nella struttura del risultato restituito.


Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговый запрос проходит несколько стадий проверок на торговом сервере. В первую очередь проверяется корректность заполнения всех необходимых полей параметра , и при отсутствии ошибок сервер принимает ордер для дальнейшей обработки. При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true. Рекомендуется...
 

Grazie per questo articolo così informativo. @MetaQuotes

Domanda: Come posso eseguire collettivamente il loop di entrambi: ordini aperti e posizioni aperte in un singolo ciclo for() (in modo simile a come eseguiamo il loop di tutti gli ordini in MQL4 e poi controllare se un ordine è già eseguito o un ordine in sospeso)?

 
Rahul Dhangar :

Grazie per questo articolo così informativo. @MetaQuotes

Domanda: Come posso eseguire collettivamente il loop di entrambi: ordini aperti e posizioni aperte in un singolo ciclo for() (in modo simile a come eseguiamo il loop di tutti gli ordini in MQL4 e poi controllare se un ordine è già eseguito o un ordine in sospeso)?

Per calcolare le POSIZIONI e gli ORDINI IN ATTESA è necessario utilizzare due cicli indipendenti. Un ciclo enumera le POSIZIONI e il secondo ciclo enumera gli ORDINI IN ATTESA. Esempio: calcolo delle posizioni e degli ordini pendenti

How to start with MQL5
How to start with MQL5
  • 2020.12.19
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 

So che non sei uno che si preoccupa di coloro che iniziano a usare il linguaggio mql5, data la forte comunità che hai, nonostante le molte critiche, eccone un'altra:

La traduzione e la formulazione stessa del testo ostacolano la comprensione... Ho sudato, ho dovuto andare lontano per trovare chi dovesse venire prima, dato che la documentazione stessa si contraddice, nel testo:

  • Storia dell'ordine

    Per ottenere informazioni su un ordine dalla cronologia, occorre innanzitutto creare la cache della cronologia degli ordini utilizzando una delle tre funzioni: HistorySelect(start, end), HistorySelectByPosition() o HistoryOrderSelect(ticket). Se l'esecuzione ha successo, la cache memorizzerà il numero di ordini, restituito dalla funzioneHistoryOrdersTotal(). L'accesso alle proprietà di questi ordini viene effettuato da ciascuno degli elementi del ticket, utilizzando la funzione appropriata:

    1. HistoryOrderGetDouble(ticket_order, type_property)
    2. HistoryOrderGetInteger(ticket_order, tipo_proprietà)
    3. HistoryOrderGetString(ordine_biglietto, tipo_proprietà)


In contrasto con: https: //www.mql5.com/pt/docs/trading/historyorderstotal trascritto di seguito.



StoriaOrdiniTotale

Restituisce il numero di ordini presenti nella cronologia. Prima di chiamare HistoryOrdersTotal(), è necessario ricevere la cronologia delle operazioni e degli ordini utilizzando la funzioneHistorySelect() o la funzioneHistorySelectByPosition().

int StoricoOrdiniTotale();

Valore di ritorno

Valore di tipodouble.

Nota

Non confondere gli ordini della cronologia degli scambi con gliordini pendenti che appaiono nella scheda "Trade" della barra degli strumenti. L'elenco degliordini che sono stati annullati o che hanno portato a una transazione è visibile nella scheda "Cronologia" della barra degli strumenti del terminale client.

Vedere anche


Il primo passaggio si contraddice da solo, non ha bisogno di aiuto, ma il secondo arriva a complicare le cose....: dopo tutto, chi viene prima, HistoryOrdersTotal o una delle tre funzioni HistorySelect (start, end) HistorySelectByPosition() o HistoryOrderSelect(ticket), o ancora HistorySelectByPosition(), menzionate nel secondo testo.

È stato difficile, poteva essere più facile... ma credo che la prima cosa che mi viene in mente sia una delle tre funzioni HistorySelect(start, end) HistorySelectByPosition () o HistoryOrderSelect(ticket), o anche HistorySelectByPosition(), menzionate nel secondo testo...

Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
Documentação sobre MQL5: Funções de Negociação / HistoryOrdersTotal
  • www.mql5.com
HistoryOrdersTotal - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

Buon pomeriggio,
domanda agli sviluppatori: potete darmi un'informazione approssimativa, quanta memoria occupa la cache della cronologia? Circa kbyte per un affare e un ordine.

Ho eseguito lo script in un terminale con una piccola cronologia e ho ottenuto questo risultato:

void OnStart()
  {
   Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
   if(HistorySelect(0, INT_MAX))
     {
      Print("TerminalInfoInteger(TERMINAL_MEMORY_USED) = ", TerminalInfoInteger(TERMINAL_MEMORY_USED));
      Print("HistoryDealsTotal  = ", HistoryDealsTotal());
      Print("HistoryOrdersTotal = ", HistoryOrdersTotal());
     }
  }

2021.05.14 14:46:41.265	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 488
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	TerminalInfoInteger(TERMINAL_MEMORY_USED) = 489
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryDealsTotal  = 1928
2021.05.14 14:46:41.285	TestCashSize (Si-6.21,H1)	HistoryOrdersTotal = 1116

Questo significa che con una storia di un paio di milioni di operazioni e un milione di ordini, la cache richiederà circa un gigabyte?

E così per ogni programma mql?