Errori tipici e come affrontarli quando si ha a che fare con l'ambiente del trading - pagina 9

 
Algotrader18:

Buon pomeriggio!

Ho una domanda simile per tutti e specialmente per fxsaber.
Sembra una domanda primitiva, ma non riesco a trovare la risposta.
Mi è stato detto qui https://www.mql5.com/ru/forum/6343/page939 "Prova a cercarlo. fxsaber sta lavorando su questo problema da un po' di tempo. Quello che ha funzionato non lo so, non mi interessa". Così ho deciso di chiedere a voi.

La domanda è questa. Ho aperto una posizione e voglio stampare il contenuto di MqlTradeResult:

retcode, ordine e volume sono stampati, ma deal e prezzo sono sempre degli zeri.
Per favore, consigliatemi cosa sto facendo di sbagliato e come ottenere l'accesso (almeno, stamparlo prima) al contenuto della struttura dei risultati?

Che ne dite di questo?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

Apro una posizione e voglio stampare il contenuto di MqlTradeResult come questo:

retcode, ordine e volume sono stampati ma deal e prezzo sono sempre degli zeri.
Per favore consigliatemi cosa sto facendo di sbagliato e come ottenere l'accesso (almeno la stampa prima) al contenuto della struttura dei risultati?

Gli zeri sono scritti nel risultato.

 
Artyom Trishkin:

Che ne dite di questo?

Grazie, ma il risultato è lo stesso...
 
fxsaber:

Gli zeri e sono prescritti nel risultato.

Beh, allora non è per niente chiaro - ho pensato che stavo facendo qualcosa di sbagliato, e se ci sono degli zeri, che senso ha il risultato?
Vedo un ordine aperto, ottengo result.retcode 10009 e result.price = 0 ?
Puoi spiegare il significato di risultato se non contiene un risultato?
 
Algotrader18:
Per favore, spiegate che senso ha il risultato se non contiene il risultato?

Questa è una caratteristica di MT5 in cui il risultato è solo un ordine (biglietto e nessun prezzo) ma non un trade. Hai diverse opzioni

  1. Capite da soli come funzionano le cose.
  2. Usa sviluppi di livello superiore già preparati (il livello inferiore è nascosto) dove quasi tutte le insidie sono aggirate.
 
fxsaber:

Questa è una caratteristica di MT5 in cui il risultato è solo un ordine (biglietto e nessun prezzo) ma non un trade. Hai diverse opzioni

  1. Capite da soli come funzionano le cose.
  2. Usa sviluppi di livello superiore già preparati (il livello inferiore è nascosto) dove quasi tutte le insidie sono aggirate.
Grazie.

In MQL4 non c'era una struttura di risultati e abbiamo ricevuto un ticket e selezionato l'ordine appropriato e richiesto i dati necessari. MQL5 ha la struttura dei risultati che contiene molti dati necessari, e sarebbe illogico non usarla.

1. Prima di fare una domanda sul forum, ho cercato di "capire da solo come funziona tutto" e cosa vedo - nella struttura dei risultati:

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


presente doppio prezzo; // Prezzo dell'affare, confermato dal broker.

Nel codice di esempio dello sviluppatore

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
esce result.deal, cioè si presume che abbia senso e non è sempre rappresentato da zero nella struttura del risultato. Si potrebbero fare altri esempi che indicano che result.price così come result.deal possono essere ottenuti da MqlTradeResul, che è quello che ho cercato di fare.


Da nessuna parte ho visto informazioni che "Questa è una caratteristica di MT5, quando il risultato è solo un ordine (biglietto e nessun prezzo), ma non un affare". Potreste dirmi in base a quali informazioni siete arrivati a questa conclusione?

2. Se conoscete qualche "sviluppo di livello superiore già pronto (il livello basso è nascosto)", che permette di ottenere i parametri di una posizione immediatamente dopo la sua apertura (appare il codice 10009), senza selezione preliminare per ticket, vi prego di darmi un esempio o di darmi un link.

 
Algotrader18:
Grazie.

In MQL4 non c'era una struttura di risultati e noi selezionavamo l'ordine appropriato e richiedevamo i dati necessari. MQL5 ha la struttura dei risultati con molti dati necessari e sarebbe illogico non usarla.

1. Prima di fare una domanda nel forum, ho cercato di "capire da solo come funziona tutto" e quello che ho visto è che il risultato della struttura:


C'è un prezzo doppio; // Prezzo dell'affare, confermato dal broker.

Nel codice di esempio dello sviluppatore

esce result.deal, cioè si presume che abbia senso e non è sempre rappresentato da zero nella struttura del risultato. Ci sono altri esempi che indicano che result.price così come result.deal possono essere ottenuti da MqlTradeResul, che è quello che ho provato a fare.


Da nessuna parte ho visto informazioni che "questa è una caratteristica di MT5 in cui il risultato è solo un ordine (biglietto e nessun prezzo) ma non un affare". Potreste dirmi in base a quali informazioni siete arrivati a questa conclusione?

2. Se conoscete qualche "sviluppo pronto di livello superiore (il livello basso è nascosto)", che permette di ottenere i parametri di una posizione immediatamente dopo la sua apertura (appare il codice 10009), senza selezione preliminare per ticket, vi prego di dare un esempio o di dare un link ad esso.

Una richiesta di compravendita si traduce in un rifiuto o in un ordine a mercato. Questo non è un trade, né una posizione generata da un trade.

  1. Un ordine di trading per aprire una posizione viene inviato al server (order = ordine)
  2. Se l'ordine è accettato, viene restituito il risultato dell'accettazione dell'ordine e del suo inserimento nella coda.
  3. Se l'ordine è stato eseguito, appare il trade - il risultato dell'esecuzione dell'ordine.
  4. Il risultato di un trade sarà o una nuova posizione, o l'aumento/diminuzione di una posizione esistente, o la chiusura di una posizione, o un rollover. O una nuova posizione (in un conto di copertura).
 
Artyom Trishkin:

Una richiesta di compravendita si traduce in un rifiuto o in un ordine a mercato. Questo non è un trade, né una posizione generata da un trade.

  1. Un ordine di trading per aprire una posizione viene inviato al server (order = ordine)
  2. Se l'ordine è accettato, viene restituito il risultato dell'accettazione dell'ordine e del suo inserimento nella coda.
  3. Se l'ordine è stato eseguito, apparirà un trade come risultato dell'esecuzione dell'ordine.
  4. Il risultato di una negoziazione sarà o una nuova posizione, o un aumento/diminuzione del volume di una posizione esistente, o la chiusura di una posizione, o un rollover. O una nuova posizione (nel caso di un conto di copertura)
Grazie - per favore ditemelo:
- dopo quale passo, tra quelli che avete elencato, pensate che appaia la struttura del risultato della richiesta di commercio (MqlTradeResult)?

- Secondo la descrizione di MQL5:
"Struttura del risultato della richiesta di compravendita (MqlTradeResult)
Come risposta a una richiesta di compravendita, il server commerciale restituisce dati contenenti il risultato dell'elaborazione della richiesta di compravendita come una struttura speciale predefinita MqlTradeResult". e "10009 TRADE_RETCODE_DONE Ordine eseguito".

Cioè il codice 10009 di ritorno del server commerciale significa che la richiesta OrderSend è stata eseguita con successo, cioè se richiedo i dati da MqlTradeResult, dopo aver ricevuto il codice 10009, come posso spiegare che result.price = 0?
 
Algotrader18:
Grazie:
- dopo quale passo, tra quelli elencati da voi, appare la struttura del risultato della richiesta di trade (MqlTradeResult)?

- Secondo la descrizione di MQL5:
"Struttura del risultato della richiesta di compravendita (MqlTradeResult)
Come risposta a una richiesta di compravendita, il server commerciale restituisce dati contenenti il risultato dell'elaborazione della richiesta di compravendita come una struttura speciale predefinita MqlTradeResult". e "10009 TRADE_RETCODE_DONE Ordine eseguito".

Quindi, il codice di ritorno del trade server 10009 significa che la richiesta OrderSend è stata eseguita con successo, cioè se richiedo dati da MqlTradeResult, dopo aver ricevuto il codice 10009, come posso spiegare che result.price = 0?

10009 TRADE_RETCODE_DONE - lo avete descritto voi stessi - l'ordine è stato eseguito. Questo è semplicemente il fatto che l'ordine è stato accodato con successo al server per l'esecuzione.

Inoltre, se questo ordine viene eseguito (dopo tutto, può essere rifiutato dal server), allora c'è un commercio - questo è il risultato del commercio con il prezzo di apertura.

Leggi di

OnTradeTransaction

Viene chiamato in Expert Advisors quando si verifica un evento TradeTransaction. La funzione è destinata all'elaborazione dei risultati dell'esecuzione della richiesta di compravendita.

voidOnTradeTransaction( )
const MqlTradeTransaction&trans,// struttura di una transazione commerciale
const MqlTradeRequest&request,// struttura della richiesta
const MqlTradeResult& result// struttura della risposta
);

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

Da nessuna parte ho visto l'informazione che "Questa è una caratteristica di MT5 in cui il risultato è solo un ordine (biglietto e nessun prezzo) ma non un trade". Mi dica gentilmente sulla base di quali informazioni è giunto a questa conclusione.

Esperienza propria.

2. Se conoscete qualche "sviluppo di livello superiore già pronto (il livello basso è nascosto)", che permette di ottenere i parametri di una posizione immediatamente dopo la sua apertura (appare il codice 10009), senza selezione preliminare per ticket, per favore date un esempio o date un link ad esso.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


C'è un'altra opzione, ma è "avanzata".

Motivazione: