Elaborazione OnTradeTransaction - pagina 9

 
JRandomTrader:

Una posizione immaginaria è necessaria dal punto di vista dell'algoritmo del robot: se l'ha aperta, dovrebbe chiuderla.

Dovrei aggiungere che il compito nel primo post era ancora più semplice - avevamo bisogno di implementare il funzionamento di una griglia di ordini limite in cui ogni nodo della griglia chiude il suo SL/TP.

Per esempio, solo uno di questi EA unidirezionali funziona in un conto e nessun altro lo fa. Ma anche qui stiamo parlando di posizioni immaginarie.


E la questione sollevata non riguarda solo le reti. Lo stesso può accadere nella copertura. Ci sono diversi Expert Advisors in hedging, e qualcuno ha appena chiuso diverse posizioni con CloseBy. Se gli Expert Advisors sono implementati attraverso posizioni immaginarie, allora un tale collasso non romperà la logica.


Generalmente, questo può essere risolto attraverso un ambiente di trading virtuale. Può essere risolto facilmente. È così che gli uffici algoritmici gestiscono i loro portafogli TS nelle borse.

 
Alexey Viktorov:

Per semplificare le cose, sì. D'accordo.

A questo punto, il "Transport Manager" non ha chiarito completamente il problema e le sue azioni.

Cosa intende per ordini di stop? Per la posizione totale o solo per la parte di cui si occupa questo EA?

Naturalmente, per una parte di una posizione con la quale il nostro EA sta lavorando, gli ordini di stop sono in attesa di vendere/acquistare stop e vendere/acquistare limite.

Finora, ho capito che sarebbe meglio passare a OnTrade a causa di un gran numero di insidie di OnTradeTransactions.

 
Илья Ребенок:

Naturalmente, gli ordini di stop sono in attesa di stop di vendita/acquisto e limite di vendita/acquisto per una parte di una posizione che è gestita da un EA specifico.

Finora, ho capito che è meglio andare per OnTrade a causa di un gran numero di insidie di OnTradeTransactions.

Fate solo attenzione che lavorino insieme. Non ricordo quale sia il primo e quale il secondo. Ma OnTradeTransactions ha almeno alcune informazioni senza alcun codice aggiuntivo, mentre OnTrade deve ottenere tutto per forza. Prima di tutto dobbiamo determinare quale evento ha innescato la funzione...

 

Ho scritto un transaction catcher - può essere utile per determinare cosa e da dove (anche se c'è una semplice elaborazione a seconda del tipo di transazione) - non c'è alcun riferimento all'ordine e alla storia delle transazioni (ad esempio per stampare l'ID dell'Expert Advisor)

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type;
   if(trans_type==TRADE_TRANSACTION_ORDER_ADD || trans_type==TRADE_TRANSACTION_ORDER_UPDATE || trans_type==TRADE_TRANSACTION_ORDER_DELETE ||
      trans_type==TRADE_TRANSACTION_HISTORY_ADD || trans_type==TRADE_TRANSACTION_HISTORY_UPDATE || trans_type==TRADE_TRANSACTION_HISTORY_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","order_type",EnumToString(trans.order_type));
      PrintFormat("%-15s: %s","orders_state",EnumToString(trans.order_state));
      PrintFormat("%-15s: %s","time_type",EnumToString(trans.time_type));
      if(trans.time_type==ORDER_TIME_SPECIFIED || trans.time_type==ORDER_TIME_SPECIFIED_DAY)
        {
         PrintFormat("%-15s: %s","time_expiration",TimeToString(trans.time_expiration,TIME_DATE|TIME_SECONDS));
        }
      else
        {
         PrintFormat("%-15s: %s","time_expiration","---");
        }
      PrintFormat("%-15s: %.8f","price",trans.price);
      if(trans.order_type==ORDER_TYPE_BUY_STOP_LIMIT || trans.order_type==ORDER_TYPE_SELL_STOP_LIMIT)
        {
         PrintFormat("%-15s: %.2f","price_trigger",trans.price_trigger);
        }
      else
        {
         PrintFormat("%-15s: %s","price_trigger","---");
        }
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      if(trans_type!=TRADE_TRANSACTION_ORDER_ADD && (trans.order_type==ORDER_TYPE_BUY || trans.order_type==ORDER_TYPE_SELL))
        {
         PrintFormat("%-15s: %d","position",trans.position);
        }
      else
        {
         PrintFormat("%-15s: %s","position","---");
        }
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_DEAL_ADD || trans_type==TRADE_TRANSACTION_DEAL_UPDATE || trans_type==TRADE_TRANSACTION_DEAL_DELETE)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %d","deal",trans.deal);
      PrintFormat("%-15s: %d","order",trans.order);
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
      if(trans.order_type==ORDER_TYPE_CLOSE_BY)
        {
         PrintFormat("%-15s: %d","position_by",trans.position_by);
        }
      else
        {
         PrintFormat("%-15s: %s","position_by","---");
        }
     }
   else if(trans_type==TRADE_TRANSACTION_POSITION)
     {
      Print("---");
      Print(EnumToString(trans_type));
      PrintFormat("%-15s: %s","symbol",trans.symbol);
      PrintFormat("%-15s: %s","deal_type",EnumToString(trans.deal_type));
      PrintFormat("%-15s: %.8f","price",trans.price);
      PrintFormat("%-15s: %.8f","price_sl",trans.price_sl);
      PrintFormat("%-15s: %.8f","price_tp",trans.price_tp);
      PrintFormat("%-15s: %.2f","volume",trans.volume);
      PrintFormat("%-15s: %d","position",trans.position);
     }
   else if(trans_type==TRADE_TRANSACTION_REQUEST)
     {
      Print("---");
      Print(EnumToString(trans_type));
     }
  }
 
Илья Ребенок:

fxsaber grazie per l'esempio!

Solo che non è proprio un esempio, è una soluzione completa al problema originale.

 
Илья Ребенок:

Naturalmente, gli ordini di stop sono in attesa di stop di vendita/acquisto e limite di vendita/acquisto per una parte di una posizione che è gestita da un EA specifico.

Finora, ho capito che è meglio andare per OnTrade a causa di un gran numero di insidie di OnTradeTransactions.

Continua il buon lavoro :)

Un piccolo suggerimento MqlTradeTransaction &trans - SOLO i campi sono rilevanti

CAMPI TRADE_TRANSACTION_DEAL_*

Per le transazioni commerciali relative all'elaborazione delle transazioni (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE) i seguenti campi sono riempiti nella struttura MqlTradeTransaction

  • affare - biglietto di scambio;
  • ordine - il biglietto d'ordine, in base al quale è stato eseguito il trade;
  • simbolo - nome di uno strumento finanziario nella negoziazione;
  • tipo - tipo di transazione commerciale;
  • deal_type - tipo di scambio;
  • prezzo - prezzo al quale l'affare è stato eseguito;
  • price_sl - prezzo Stop Loss (da compilare, se specificato nell'ordine, in base al quale viene eseguita l'operazione);
  • price_tp - prezzo di Take Profit (riempito se specificato nell'ordine, in base al quale viene eseguita l'operazione);
  • volume - volume di un affare in lotti.
  • position - biglietto di una posizione aperta, modificata o chiusa come risultato dell'esecuzione di un trade.
  • position_by - biglietto della posizione opposta. Compilato solo per le transazioni per la chiusura di una posizione da quella opposta (out by).

E guardate MqlTradeResult &result.

Ma ora hai 1000 linee di codice!

 
prostotrader:

Continua il buon lavoro :)

Un piccolo suggerimento MqlTradeTransaction &trans - SOLO i campi sono rilevanti

TRADE_TRANSACTION_DEAL_*.

Per le transazioni commerciali relative all'elaborazione delle transazioni (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE) i seguenti campi sono riempiti nella struttura MqlTradeTransaction

  • affare - biglietto di scambio;
  • ordine - il biglietto d'ordine, in base al quale è stato eseguito il trade;
  • simbolo - nome di uno strumento finanziario nella negoziazione;
  • tipo - tipo di transazione commerciale;
  • deal_type - tipo di scambio;
  • prezzo - prezzo al quale l'affare è stato eseguito;
  • price_sl - prezzo Stop Loss (da riempire se è specificato nell'ordine, in base al quale viene eseguita l'operazione);
  • price_tp - prezzo di Take Profit (riempito se specificato nell'ordine, in base al quale viene eseguita l'operazione);
  • volume - volume di un affare in lotti.
  • position - biglietto di una posizione aperta, modificata o chiusa come risultato dell'esecuzione di un trade.
  • position_by - biglietto della posizione opposta. Compilato solo per le transazioni per la chiusura di una posizione da quella opposta (out by).

E guardate MqlTradeResult &result.

Ma ora hai 1000 linee di codice!

Naturalmente, capisco che stai scoppiando di ego. Esperienza, tutto...

Ma sono venuto qui non per un po' di sarcasmo ma per un aiuto. Se guardate un po' più in alto, vedrete che sono d'accordo di aver fatto un errore nell'analizzare i campi che non sono compilati per deal_add.

Vi sarei grato per un aiuto più costruttivo, posso "cagarmi" da solo) Accetto critiche costruttive.

Informazioni suMqlTradeResult &result.

Secondo l'aiuto, il risultato della transazione commerciale è riempito solo conTRADE_TRANSACTION_REQUEST e deve essere analizzato solo con questo tipo di transazioni.

 

Lei ha una strana percezione.

Non mi sognerei mai di "prendere per il culo qualcuno", questa è probabilmente la tua percezione della vita e probabilmente la usi molto tu stesso.

Probabilmente lo usi spesso anche tu.

Non sono io, ma fxsaber(a), perché in quasi ogni argomento spinge il suo

Ma lui stesso non fa trading sul mercato reale, e certamente non sui FORTI!

Ci sono soluzioni semplici e complesse per lo stesso problema.

A giudicare dalla tua domanda, sei un principiante.

Ma come dice il detto: "Non cerchiamo vie facili"!

La funzione OnTradeTransaction è stata specificamente progettata per semplificare

"La vita per i programmatori nello sviluppo dei robot, ma i veterani non vogliono usarlo",

perché sono abituati a OnTrade e devono scrivere un sacco di codice per farlo funzionare.

Ti ho già detto che l'ordine è la testa, non l'affare!

Cosa farete se il volume dell'ordine iniziale non è 1, ma 2, 10?

Hai impostato un ordine pendente, e questo significa che non puoi controllarlo "strettamente", tanto meno controllare i trade!

Non si può controllare "strettamente", tanto più se si fa qualche affare! Ci sono molte insidie con gli ordini pendenti.

Ma avete scelto la via più facile, ottenendo una dubbia soluzione preconfezionata, invece di cercare di

Ma avete scelto la via più facile, invece di cercare di capirlo da soli (con i suggerimenti).

Buona fortuna, non sono più coinvolto.

 
prostotrader:

Lei ha una strana percezione.

Non mi sognerei mai di "prendere per il culo qualcuno", questa è probabilmente la tua percezione della vita e probabilmente la usi molto tu stesso.

Probabilmente lo usi spesso anche tu.

Non sono io, ma fxsaber(a), perché in quasi ogni argomento spinge il suo

Ma lui stesso non fa trading sul mercato reale, e certamente non sui FORTI!

Ci sono soluzioni semplici e complesse per lo stesso problema.

A giudicare dalla tua domanda, sei un principiante.

Ma come dice il proverbio: "Non cerchiamo vie facili"!

La funzione OnTradeTransaction è stata specificamente progettata per rendere

"vita" per i programmatori nello sviluppo di robot, ma sono i vecchietti che non vogliono usarlo,

perché sono abituati a OnTrade e devono scrivere un sacco di codice per farlo funzionare.

Ti ho già detto che l'ordine è la testa, non l'affare!

Cosa farete se il volume dell'ordine iniziale non è 1, ma 2, 10?

Hai impostato un ordine pendente, e questo significa che non puoi controllarlo "strettamente", tanto meno controllare i trade!

Non si può controllare "strettamente", tanto più se si fa qualche affare! Ci sono molte insidie con gli ordini pendenti.

Ma avete scelto la via più facile, ottenendo una dubbia soluzione preconfezionata, invece di cercare di

Ma avete scelto la via più facile, invece di cercare di capirlo da soli (con i suggerimenti).

Buona fortuna, non sono più coinvolto.

Cominciamo con il fatto che non uso soluzioni già pronte. Non so cosa ti sei inventato per me, ma non ho usato nessuna delle soluzioni del thread (anche se ho estratto alcune conoscenze utili) e sto ancora sperimentando e capendo le cose. In generale, ho notato dai tuoi post che ti piace giudicare gli altri. Senza offesa.

Per quanto riguarda il volume degli ordini, non importa quale sia. È un accordo che mi permette di giudicare quale volume viene realmente eseguito. Penso che sia più facile che catturare l'esecuzione parziale dell'ordine per il suo tipo appropriato. In uno degli argomenti, inoltre, è stato sottolineato che solo un accordo ti rende sicuro che la posizione è stata eseguita.

 
Илья Ребенок:

Per cominciare, non uso soluzioni già pronte. Non so cosa ti sei inventato per me, ma non ho usato nessuna delle soluzioni del thread (anche se ho imparato qualcosa di utile) e sto ancora sperimentando e cercando di capire. In generale, ho notato dai tuoi post che ti piace giudicare gli altri. Senza offesa.

Per quanto riguarda il volume degli ordini, non importa quale sia. È un accordo che mi permette di giudicare il volume realmente eseguito. Penso che sia più facile che catturare l'esecuzione parziale dell'ordine secondo il tipo di ordine appropriato. In uno degli argomenti, è stato sottolineato che solo un accordo ci rende sicuri che la posizione è stata eseguita.

Hai dimenticato come si legge?

"Buona fortuna, non sono più coinvolto. "