Domanda sulla funzione OnTradeTransaction - pagina 5

 
papaklass:

OnTradeTransaction() è il RUNNER di un evento commerciale. Non importa cosa ha scatenato l'evento, l'importante è che l'evento si sia verificato.

Ecco un estratto della documentazione:

OrderSend() / OrderSendAsync() sono FUNZIONI COMMERCIALI.

Per OnTradeTransaction() non fa differenza quale funzione avete usato per inviare l'ordine di compravendita OrderSend() o OrderSendAsync().

L'ho letto così tante volte prima di creare il soggetto ... Non dirò una parola.

Ma tuttavia, la mia conclusione è che è più probabile perdere una transazione in un mucchio che perdere una transazione in un secondo, e forse nemmeno una (secondo). È esattamente quello che sto cercando di scoprire. Cerco di avere la vostra opinione su questo. Qual è la probabilità di perdere una transazione se sono abbastanza rare e singole?

 
papaklass:
In termini di probabilità, non lo so.

Dovrò affidarmi alla sola opinione di Michael, basata sulla sua esperienza personale. Se non ha perso una sola transazione in mezzo anno su un mucchio di ordini, allora assumeremo che un singolo ordine non andrà perso.

Sto lentamente prendendo la mano, cercando di non rompere la logica, ma a volte uno si mette di mezzo all'altro...

 
AlexeyVik:

Dovremo fare affidamento sulla sola opinione di Michael, basata sulla sua esperienza personale. Se non ha perso una sola transazione in sei mesi da un mucchio di ordini, allora assumeremo che un singolo ordine non andrà perso.

Lo sto padroneggiando lentamente, cercando di non rompere la logica, ma a volte si scopre che uno interferisce con l'altro...

Alexei, fatti una semplice domanda:

Cosa è meglio, scavare nella storia dopo ogni comando, o 1 volta, o forse mai, per ricontrollare l'ordine (OnTradeTransaction non è stato attivato)?

La convalida non è facile da implementare (a proposito, il mio esempio ha degli errori), ma il principio principale è che OGNI ordine ha la sua magia.

E un'altra cosa. Ho già detto che ognuno è libero di andare per la sua strada....

 
Mikalas:

Alexey, fatti una semplice domanda:

È meglio scavare nella storia dopo ogni comando o ricontrollare l'ordine (OnTradeTransaction non ha funzionato) una volta o mai?

Laconvalida non è facile da implementare (a proposito, il mio esempio ha degli errori), ma il principio principale è che OGNI ordine ha la sua magia.

E un'altra cosa. Ho già detto che ognuno è libero di andare per la sua strada....

Michael, è la semplice risposta a questa semplice domanda che mi ha portato a tutta questa discussione. E finora non ho intenzione di rinunciarvi. Ma non riesco ancora a capire se la perdita di transazione è possibile dopo il comando OrderSend() o l'attivazione dell'ordine pendente, o durante la chiusura della posizione usando lo stop/stop.

Dalla tua prima risposta ho capito che anche OrderSendAsync() non si perde la transazione. Sto cercando di capirlo per decidere se è necessario preoccuparsi di controllare queste transazioni piuttosto rare. Inoltre, tenendo conto di ciò che ho stanziato.

Puramente logico, se OrderSend() non viene terminato finché non riceve una risposta, la transazione non può essere persa. Ma l'attivazione di un ordine pendente e la chiusura di una posizione non rientrano nella mia logica. Se una transazione in questo caso è attivata all'interno di MT5, rispettivamente, non sarà persa, ma se attraverso un server... Non lo so. (Ma suppongo che l'intuizione dica che il server mi invia una risposta e attiva OnTradeTransaction().

 

Ragazzi, ecco il problema:

Se apro una posizione, OnTradeTransaction gestisce solo TRADE_TRANSACTION_DEAL_ADD... Tutto è a posto.

Se un SellStop, per esempio, è piazzato, solo TRADE_TRANSACTION_ORDER_ADD è attivato... Tutto è anche normale.

Ma se imposto una posizione e un ordine pendente, TRADE_TRANSACTION_DEAL_ADD funziona e TRADE_TRANSACTION_ORDER_ADD funziona due volte

perché è così?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool  NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
    MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit()
{
 point = _Digits%2 == 0 ? _Point : _Point * 10;
  NewStart = true;
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
{
 if(NewStart)
  {
   Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, 0.1, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
    Trade.SellStop(0.78, SymbolInfoDouble(_Symbol, SYMBOL_BID)-52*point, Symbol(), 0.0, 0.0, 0, 0);
   NewStart = false;
  }
}/*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{

  ENUM_TRADE_TRANSACTION_TYPE type = (ENUM_TRADE_TRANSACTION_TYPE)trans.type;
   
   switch(type)
    {
     case TRADE_TRANSACTION_ORDER_ADD:
      {
       Print("order add    * Тикет ордера * ", trans.order);
        Print("order add    * Объём ордера * ", trans.volume);
       break;
      }
     case TRADE_TRANSACTION_DEAL_ADD:
      {
       Print("deal add    * Тикет сделки * ", trans.deal);
        Print("deal add    * Объём сделки * ", trans.volume);
       break;
      }
     default: break;
    }

}/*******************************************************************/
 
AlexeyVik:

Ragazzi, ecco il problema:

Se apro una posizione, OnTradeTransaction gestisce solo TRADE_TRANSACTION_DEAL_ADD... Tutto è a posto.

Se un SellStop, per esempio, è piazzato, solo TRADE_TRANSACTION_ORDER_ADD è attivato... Tutto è anche normale.

Ma se imposto una posizione e un ordine pendente, TRADE_TRANSACTION_DEAL_ADD e due volte TRADE_TRANSACTION_ORDER_ADD si attivano

perché è così?

Devi esserti sbagliato da qualche parte. Ci devono essere almeno due eventi in entrambi i casi: TRADE_TRANSACTION_ORDER_ADD e TRADE_TRANSACTION_DEAL_ADD. Perché non si ottiene TRADE_TRANSACTION_ORDER_ADD non è chiaro.

Provate a commentare l'interruttore e a stampare il log completo di tutti gli eventi ricevuti in OnTradeTransaction.

 
C-4:

Avete sbagliato da qualche parte. In entrambi i casi ci devono essere almeno due eventi: TRADE_TRANSACTION_ORDER_ADD e TRADE_TRANSACTION_DEAL_ADD. Perché non si ottiene TRADE_TRANSACTION_ORDER_ADD non è chiaro.

Provate a commentare l'interruttore e a stampare il log completo di tutti gli eventi ricevuti in OnTradeTransaction.

Sì, l'ho provato. Il Print(EnumToString(type)) è stato stampato prima di switch(type); ha stampato esattamente come ho descritto.

Ecco gli esperimenti ripetuti.




 

Ho controllato il tuo codice per conto mio. - Tutto funziona correttamente.

Opzione senza inviareun ordine di stop per seguire:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

Opzione per inviare un ordine di stop:

2015.02.10 18:35:59.633 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


s.e., il tempo per il ciclo completo è stato una piacevole sorpresa: stabilmente 60-70 msec. Ben fatto, sviluppatori!
 
C-4:

Ho controllato il tuo codice per conto mio. - Tutto funziona correttamente.

Variante senza inviare successivamenteun ordine di stop:

Opzione con l'invio di un ordine di stop:

s.e., il tempo per il ciclo completo è stato piacevolmente sorpreso: stabilmente 60-70 msec. Complimenti agli sviluppatori, hanno fatto un buon lavoro!

A quanto pare questa è la perdita delle transazioni... e, prima di tutto, (estratto dalla documentazione)

L'ordine in cui queste transazioni arrivano al terminale non è garantito

Vasily, è un tester o una demo? Ho un campione del tester. Mi chiedo se c'è una differenza tra l'operazione OnTradeTransaction nel tester e sul conto. Lo controllerò di tanto in tanto.


ps; Risulta che dopo aver perso una transazione, questa appare improvvisamente all'attivazione successiva di OnTradeTransaction.

 
AlexeyVik:

A quanto pare questa è la perdita delle transazioni... e, prima di tutto, (estratto dalla documentazione)

Vasily, è un tester o una demo? Ho dei campioni dal tester. Mi chiedo se c'è una differenza tra l'attivazione di OnTradeTransaction nel tester e nel conto. Lo controllerò di tanto in tanto.


ps; Risulta che dopo aver perso una transazione, questa appare improvvisamente quando OnTradeTransaction è attivato la prossima volta.

No, le transazioni non sono perse, solo che potrebbero non arrivare in una certa sequenza.

Solo TRADE_TRANSACTION_REQUEST viene sempre prima, altrimenti non si otterrebbe un biglietto per l'ordine.

Leggete ATTENTAMENTE la documentazione.

Motivazione: