Elaborazione OnTradeTransaction - pagina 5

 
fxsaber:

Cretino.

Pensavo che intendessi te.

Cosa è successo a"Lo capirà se vuole". "?

 
fxsaber:

È più facile per me rispondere in un solo post che fare decine di "raccomandazioni".

Se vuole, lo scoprirà.

Una volta volevo... Ma il tuo codice è un'altra cosa.
 
Alexey Viktorov:
Una volta volevo... Ma il tuo codice è qualcosa fuori dal mondo.

In questo caso hai solo bisogno di una piccola conoscenza di MT4/5.

 
fxsaber:

In questo caso hai solo bisogno di una piccola conoscenza di MT4/5.

Purtroppo so poco più che poco.

Te l'ho già detto una volta, infili il tuo codice dentro e fuori come una spina nel culo in ogni botte. Quelli che ne hanno bisogno lo usano da molto tempo e alcuni lo pubblicizzano addirittura. Ma imporlo dove non è molto necessario è semplicemente indecente. Soprattutto quando una persona vuole capire ed entrare nella programmazione in mql5, non attraverso trucchi.

 
Alexey Viktorov:

Purtroppo so poco più che poco.

Te l'ho già detto una volta, infili il tuo codice in ogni barile per affari e per nessun motivo. Quelli che ne hanno bisogno lo usano da molto tempo e alcuni lo pubblicizzano addirittura. Ma imporlo dove non è molto necessario è semplicemente indecente. Soprattutto quando una persona vuole capire ed entrare nella programmazione in mql5, non attraverso trucchi.

Vedete, quando si fanno delle affermazioni, è una buona idea sostenerle in qualche modo nella pratica. In alcune pagine non è apparsa nessuna soluzione OnTradeTransaction. E se c'è, diventa subito chiaro perché la soluzione data è così e non altrimenti. La soluzione dovrebbe mostrare la logica, non l'inferno. Se rimuovo il plug-in, il codice sorgente non perde un bit della sua logica. E bisogna solo capire la logica (idea), niente di più.

Sono d'accordo con questa affermazione. Una volta che la logica è compresa, va a buttare fuori tutti gli include e crea il proprio. Questo è esattamente il modo in cui viene proposto: non padroneggiare un inlude, ma mostrare con il codice e non spaventare come può funzionare il compito di cui si richiede la soluzione.

 

Qui torno alla fonte del problema. E sorgono le domande:

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

Elaborazione OnTradeTransaction

Ilya Child, 2019.02.07 20:08

Buona sera.

Ragazzi, per favore aiutatemi a risolvere questo problema. Il problema probabilmente non è nuovo, ma non ho trovato nessuna soluzione univoca (né nella pratica, né sui forum).

Sto eseguendo 2 robot diversi 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 dove altro scavare.

Per favore, condividete le vostre esperienze e idee.

Come posso conciliare quanto evidenziato con la seguente frase:

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

Elaborazione OnTradeTransaction

Ilya Child, 2019.02.07 20:20

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 alla fine il primo robot non l'ha vista.

Sì e logicamente ho bisogno di ottenere un commento sull'ordine dal commercio, la posizione non è di grande aiuto qui.

Non facciamo caso al refuso, uno ha comprato l'altro ha comprato... La cosa principale è che sembra che due EAs lavorino su un simbolo con il tipo di account netting... O forse non capisco qualcosa?

 
Alexey Viktorov:

Non facciamo caso al refuso, uno ha comprato l'altro ha comprato... La cosa principale è che sembra che due EAs stiano lavorando sullo stesso strumento con il tipo di account netting... O forse non capisco qualcosa?

È normale avere diversi EA su un simbolo di rete. Per esempio, quelli di rete. Quindi è abbastanza possibile che la posizione di compensazione sia zero, ma ci sono due SL e due TP. Il problema è chiaramente formulato sopra.

 
fxsaber:

Gli EA multipli sono la norma su un singolo simbolo di rete. Per esempio, le posizioni di compensazione. Quindi è abbastanza possibile che la posizione di compensazione sia zero, ma ci sono due SL e due TP. Il problema è chiaramente formulato sopra.

Possiamo indovinare tutto quello che ci piace. Mi piacerebbe sentire il "capo dei trasporti". Dopo tutto, ho citato i suoi post.

 
Alexey Viktorov:

Possiamo inventare tutto quello che vogliamo. Vorrei sentire il responsabile dei trasporti. Lo stavo citando.

Penso che il capo sia stato così "intimidito" che non si farà più vedere :)

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

Non ti seguo del tutto. Ecco la mia elaborazione della transazione

Sullo stato dell'ordine nella transazione. Vi rendete conto che non me lo sto inventando io. In tutte le transazioni deal_add questo è lo stato dell'ordine. Si prega di notare che si tratta di un ordine a mercato e che prima era un ordine pendente.

Ora abbiamo un'altra porzione di incomprensione. Una transazione deal_add è volata dentro e la posizione non è apparsa e il pending sulla posizione inesistente è stato messo.

Aggiunto.

La transazione Deal_add viene inviata, ma la posizione non è stata piazzata e un ordine pendente per la posizione non esistente è stato piazzato. Il tipo di affare è Vendere, il tipo di ordine è Comprare. Anche se inizialmente il limite era Sell_limit

A quanto pare, o le vecchie informazioni non vengono cancellate da qualche parte, o vengono prese informazioni non inizializzate.

Se ho un deal_add, l'ordine di solito è già nella storia, o è già stato cancellato, ma non è ancora apparso nella storia.

Anche se succede anche che l'ordine è ancora lì, e allora è nello stato piazzato.

Ma difficilmente può essere in questo momento.

Controlla dove un ordine o una storia sono selezionati che siano _sono_ effettivamente selezionati.