Elaborazione OnTradeTransaction

 

Buona sera.

Ragazzi, per favore aiutatemi a capire. Il problema probabilmente non è nuovo, ma non ho trovato una sola soluzione (né nella pratica né sui forum).

Sto eseguendo 2 diversi robot nel terminale su 2 strumenti diversi. Le magie sono diverse ovunque. Il robot pone dei limiti pendenti e la procedura OnTradeTransaction mi permette di rilevare una transazione e piazzare degli ordini di stop pendenti utilizzando questa transazione.

Di seguito è riportato il codice per la transazione commerciale

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Questo è il codice della funzione che controlla se l'affare appartiene a un robot

bool getIsDealOfExpert(ulong dealTicket)
     {
      if(HistoryDealSelect(dealTicket) && HistoryDealGetInteger(dealTicket,DEAL_MAGIC)==magic_number && HistoryDealGetString(dealTicket,DEAL_SYMBOL)==symbol)
         return true;
      else
         return false;
     }

Questo è il codice della procedura per gli ordini di stop in sospeso

void analyzeFilledOrder(ulong orderTicket,double volume)
  {
   bool isFindOrder=false;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if(getIsOrderOfExpert(orderTicket,true)) //Если ордер из сделки уже в истории
     {
      fullComment=HistoryOrderGetString(orderTicket,ORDER_COMMENT);
      orderType=ENUM_ORDER_TYPE(HistoryOrderGetInteger(orderTicket,ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли в истории
     }
   if(!isFindOrder && getIsOrderOfExpert(orderTicket,false)) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment=OrderGetString(ORDER_COMMENT); 
      orderType=ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE));
      isFindOrder=true; //локальная переменная, если нашли не в истории
     }
   if(isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

Questo è il codice della funzione per cercare un ordine nella storia e fuori dalla storia

bool getIsOrderOfExpert(ulong OrderTicket,bool isHistory)
     {
      bool is_expert=false;
      //если ордер находится в истории
      if(isHistory)
        {
         if(HistoryOrderSelect(OrderTicket) && HistoryOrderGetInteger(OrderTicket,ORDER_MAGIC)==magic_number && HistoryOrderGetString(OrderTicket,ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      else
        {
         if(OrderSelect(OrderTicket) && OrderGetInteger(ORDER_MAGIC)==magic_number && OrderGetString(ORDER_SYMBOL)==symbol)
            is_expert=true;
        }
      return is_expert;
     }

Io farei uscire le informazioni sulle transazioni in entrata nei file di log nell'ordine in cui sono ricevute nel terminale. Ora ho un problema che ho affrontato durante il trading su un conto demo:

A volte le transazioni vengono nel seguente ordine TRADE_TRANSACTION_ORDER_DELETE, poi TRADE_TRANSACTION_DEAL_ADD, poi TRADE_TRANSACTION_HISTORY_ADD. In questo caso gli ordini di stop spesso non vengono piazzati dopo che un'operazione è stata eseguita. Suppongo che questo accada perché l'ordine è già stato cancellato ma non è ancora stato aggiunto alla cronologia. Significa che non possiamo trovare l'ordine dell'affare né nella storia né nel terminale. Anche se è dubbio, il fatto è che non viene piazzato nessun ordine stop perché il robot non lo trova dopo aver cercato l'ordine in tutte le dimensioni(isFindOrder=false). L'ordine delle transazioni può essere corretto, ma l'ordine non si trova da nessuna parte. In tutti i casi, il robot rileva correttamente la transazione, ma non arriva a piazzare gli ordini.Tuttavia, a volte funziona anche correttamente e gli ordini vengono piazzati.

Ho provato diversi approcci, ma niente funziona. Ora sto pensando di aggiungere un intervallo di 1 secondo all'inizio della procedura di ordine pendente. Non so davvero dove andare.

Per favore, condividete le vostre esperienze e idee.

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

Buona sera.

Ragazzi, per favore aiutatemi a capire. Il problema probabilmente non è nuovo, ma non ho trovato una sola soluzione (né nella pratica né sui forum).

Sto eseguendo 2 diversi robot nel terminale su 2 strumenti diversi. Le magie sono diverse ovunque. Il robot pone dei limiti pendenti e la procedura OnTradeTransaction mi permette di rilevare una transazione e piazzare degli ordini di stop pendenti utilizzando questa transazione.

Di seguito è riportato il codice per la transazione commerciale

Questo è il codice della funzione che controlla se l'affare appartiene a un robot

Questo è il codice della procedura per gli ordini di stop in sospeso

Questo è il codice della funzione per cercare un ordine nella storia e fuori dalla storia

Vorrei emettere le informazioni sulle transazioni in entrata nel registro nell'ordine in cui sono ricevute nel terminale. Ora ho un problema che ho affrontato durante il trading su un conto demo:

A volte le transazioni vengono nel seguente ordine TRADE_TRANSACTION_ORDER_DELETE, poi TRADE_TRANSACTION_DEAL_ADD, poi TRADE_TRANSACTION_HISTORY_ADD. In questo caso gli ordini di stop spesso non vengono piazzati dopo che un'operazione è stata eseguita. Suppongo che questo accada perché l'ordine è già stato cancellato ma non è ancora stato aggiunto alla cronologia. Significa che non possiamo trovare l'ordine dell'affare né nella storia né nel terminale. Anche se è dubbio, il fatto è che non viene piazzato nessun ordine stop perché il robot non lo trova dopo aver cercato l'ordine in tutte le dimensioni(isFindOrder=false). L'ordine della transazione può essere corretto, ma l'ordine non si trova da nessuna parte.

Provato diversi approcci, niente aiuta. Ora sto pensando di aggiungere uno sleep di 1 secondo all'inizio di una procedura per piazzare ordini in sospeso, forse il tempo non è sufficiente. Non so nemmeno dove altro scavare.

Per favore, condividete le vostre esperienze e idee.

Non ho iniziato a guardare tutto il codice. Non credo affatto che questo approccio sia corretto.

Al momento della transazione di tipo TRADE_TRANSACTION_DEAL_ADD dobbiamo scegliere la trans.position e controllare la sua magia.

if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == mag)

Potete anche controllare trans.symbol == _Symbol e prendere una decisione basata sui risultati di questi controlli.

 
Alexey Viktorov:

Non ho esaminato tutto il codice. A mio parere, l'approccio non è affatto corretto.

Al momento del tipo di transazione TRADE_TRANSACTION_DEAL_ADD si dovrebbe scegliere trans.position e controllare il suo magik.

Potete anche controllare trans.symbol == _Symbol e prendere una decisione basata sui risultati di questi controlli.

Ho dimenticato di aggiungere che la modalità è la rete. La posizione è la stessa per tutti i robot. Cioè, un robot ha comprato una posizione, il secondo l'ha comprata, gli eventi TRADE_TRANSACTION_DEAL_ADD sono arrivati in ordine inverso e il primo robot non l'ha visto come risultato.

E logicamente ho bisogno di ottenere il commento dell'ordine dal trade, la posizione non è di grande aiuto qui.
 
Илья Ребенок:

Condividete le vostre esperienze e idee per favore.

Una situazione

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

fxsaber, 2018.06.20 23:18

Ho deciso di controllare quanto durano queste situazioni di ordine fantasma, quando un ordine è nel sistema ma non nel terminale.

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


Risultato

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


32 millisecondi un ordine c'è ma non nel terminale! Provate a immaginare le conseguenze se la logica di trading fosse eseguita in questo intervallo...


È interessante che gli ordini fantasma sono più spesso presenti solo nei tipi di transazioneTRADE_TRANSACTION_ORDER_DELETE e TRADE_TRANSACTION_DEAL_ADD (molto più rari).


Una pessima sfumatura della piattaforma.


ZZY velocità discutibile delle transazioni commerciali su cinque, purtroppo.


Secondo

aprendo una posizione e OrdersTotal è aumentato di uno.

  • È stato eseguito e OrdersTotal è diminuito di uno, ma PositionsTotal non è aumentato di uno. In altre parole, c'è una posizione, ma il terminale non lo sa.
  • Per esempio, non ci sono posizioni o ordini - PositionsTotal = 0, OrdersTotal = 0.

    Hai impostato un ordine a mercato. PositionsTotal = 0, OrdersTotal = 1.

    L'ordine a mercato viene eseguito - OrdersTotal = 0. Ma PositionsTotal = 0!

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

    Ho dimenticato di aggiungere che la modalità è la rete. La posizione è la stessa per tutti i robot.

    Non importa. La posizione ha sempre un biglietto, ma può anche essere selezionata da un simbolo. Potrebbe essere necessario aggiungere un controllo sul volume degli affari o qualcos'altro. Per esempio, seleziona gli ordini e le operazioni di una posizione e scuotili per trovare quella giusta. Ma un accordo è un accordo... E nessuno garantisce la coerenza delle transazioni. Non molto tempo fa c'era un avvertimento sulla possibile perdita di transazioni.


    Visto l'addendum nel tuo post, è tutto sbagliato. In questo caso, è necessario esaminare più attentamente.

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

    Ho provato diversi approcci, ma niente funziona.

    Scrivi una semplice azione che deve essere implementata.

     
    fxsaber:

    Una situazione


    Secondo

    Grazie, lo leggerò, ma a prima vista conferma la mia supposizione.

    Alexey Viktorov:

    Non importa. La posizione ha sempre un biglietto, ma si può anche selezionare per simbolo. Potrebbe essere necessario aggiungere un controllo sul volume delle transazioni o qualcos'altro. Per esempio, seleziona gli ordini e le operazioni di una posizione e scuotili per trovare quella giusta. Ma un accordo è un accordo... E nessuno garantisce la coerenza delle transazioni. Non molto tempo fa c'è stato un avvertimento sulla possibile perdita di transazioni.


    Considerando l'addendum nel tuo post, non ci sta tutto. In questo caso, è necessario esaminare più attentamente.

    Ho visto un post sulla perdita di transazioni, ma i moderatori hanno detto che era una reliquia del passato e hanno dimenticato di rimuoverlo dalla documentazione.

    fxsaber:

    Scrivere una semplice azione da implementare.

    Non capisco bene la scrittura di una semplice azione).

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


    Ho visto un post sulla perdita di transazioni, ma i moderatori hanno detto che era una reliquia del passato e hanno dimenticato di rimuoverlo dalla documentazione.

    L'hanno fatto, ma non è stato molto tempo fa.

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

    Non capisco bene come scrivere una semplice azione) Spiega per favore.

    Qual è l'obiettivo commerciale?

     
    fxsaber:

    Qual è il tuo obiettivo di trading?

    Piazziamo ordini limite e quando scattano, piazziamo un ordine stop e un ordine take profit. Quando scatta un ordine stop, rimuoviamo il take profit e viceversa. Il ticket limite iniziale, sulla base del quale impostiamo l'ordine stop e take profit, è scritto nel commento dell'ordine stop e take profit. Questo è il motivo per cui è importante ottenere i commenti degli ordini in modo che quando scatta un ordine stop, si può trovare il take profit con lo stesso commento e cancellarlo.

    Dato che il nostro robot ci permette di ricaricare le posizioni, dovremmo anche mettere un ordine di stop e un take profit e lasciare un commento con il ticket di take profit quando compriamo altre posizioni.

    1 secondo di sonno può essere una buona idea? Avere tempo per tutte le transazioniTRADE_TRANSACTION_ORDER_DELETE eTRADE_TRANSACTION_HISTORY_ADD

    Общие принципы - Торговые операции - MetaTrader 5
    Общие принципы - Торговые операции - MetaTrader 5
    • www.metatrader5.com
    Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
     

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

    Il robot permette di scalare, quindi quando compriamo di più, mettiamo anche un ordine di stop e un take profit, e registriamo lo scaling nel ticket

    Possiamo avere >=2 ordini take e stop allo stesso tempo?