Elaborazione OnTradeTransaction - pagina 8

 
fxsaber:

Guarda questo video da 01:35 e 03:35.


Perché ho bisogno delle tue cose fatte in casa? Mi stupisci. Con tali conoscenze di programmazione non potete capire il gestore OnTradeTransaction

 
Alexey Viktorov:

Perché ho bisogno delle tue cose fatte in casa? Mi stupisci. Con tali conoscenze di programmazione non potete capire il gestore OnTradeTransaction

È difficile parlare con qualcuno che non può nemmeno immaginare il compito.

 
Alexey Viktorov:

Quindi non ci sono posizioni o sono tra virgolette?

È una situazione abbastanza normale quando in termini di netting - non c'è nessuna posizione (cioè, posizione totale == 0,0).

E dal punto di vista di due EAs - ognuno ha la sua posizione aperta.

Ci può essere più di un Expert Advisor su un singolo simbolo. Inoltre, alcuni scambi possono essere fatti con le mani.

 
JRandomTrader:

È una situazione abbastanza normale quando in termini di netting - non c'è nessuna posizione (cioè, posizione totale == 0,0).

E dal punto di vista di due consulenti - ognuno ha la sua posizione aperta.

Ci può essere più di un Expert Advisor su un singolo simbolo. Inoltre, alcuni scambi possono essere fatti a mano.

La moglie ha preso i soldi nel comodino e ha comprato un televisore. Il marito prese il televisore, lo vendette e mise i soldi nel comodino. In termini di reti, non c'è nessuna TV. E secondo la tua logica, la moglie ha la TV e i soldi nel comodino. Così decidono se comprare un altro televisore o spendere tutti i soldi ricavati in bevande.

O hanno un televisore ciascuno? Dopo tutto, ognuno di loro l'ha tenuto in mano. Esagerare.


Se un consulente ha aperto una posizione e l'altro l'ha chiusa, è andata... Dimenticati di loro... Non c'è nessuna posizione.

 
Alexey Viktorov:

La moglie ha preso i soldi nel comodino e ha comprato un televisore. Il marito ha preso la TV, l'ha venduta e ha messo i soldi nel comodino. In termini di reti, non c'è nessuna TV. E secondo la tua logica, la moglie ha la TV e i soldi nel comodino. Così decidono se comprare un altro televisore o spendere tutti i soldi ricavati in bevande.

O ognuno di loro aveva un televisore? Dopo tutto, ognuno di loro ne ha tenuto uno in mano. Esagero.


Se un consulente ha aperto una posizione e l'altro l'ha chiusa, è andata... Dimenticati di loro... Non c'è nessuna posizione.

Non c'è una posizione.

Ma come parte della loro logica - ogni EA ha una posizione diversa. Per esempio, uno - "a lungo termine" si siederà fuori dalla perdita, mentre l'altro - "scalper" prenderà il suo sulla controtendenza allo stesso tempo.

 
JRandomTrader:

Non c'è nessuna posizione.

Ma nei limiti della loro logica - ogni EA mantiene la propria posizione. Per esempio, uno - il "lungo termine" aspetterà le perdite, e l'altro - lo "scalper" andrà per una controtendenza.

A quanto pare stai cercando di applicare la logica di due strategie di copertura al netting. La sequenza più logica sarebbe la seguente.

Uno scalper su una controtendenza chiude una posizione e imposta un ordine limite al prezzo TP previsto per la sua posizione immaginaria. E se questo finecorsa funziona, la posizione sarà ripristinata nella sua totalità MA!!! con un biglietto diverso. Quindi non è assolutamente corretto considerarla come una continuazione di quella posizione chiusa, e l'EA a lungo termine non sarà in grado di determinarla come propria.

È un'altra questione se lo scalper lavorerà con un volume più piccolo. Allora il biglietto rimarrà lo stesso, nonostante il fatto che il prezzo di apertura cambierà. In generale, non cercate di trasferire semplicemente la strategia al netting per la copertura, non ne verrà fuori niente di buono. L'analogia funzionerà, ma le azioni dovrebbero essere diverse. Le specificità del netting devono essere prese in considerazione.

 
Alexey Viktorov:

A quanto pare stai cercando di applicare la logica di due strategie di copertura al netting. Una sequenza più logica sarebbe la seguente.

Uno scalper su una controtendenza chiuderà la posizione e imposterà un ordine limite al prezzo TP previsto per la sua posizione immaginaria. E se questo finecorsa funziona, la posizione sarà ripristinata nella sua totalità MA!!! con un biglietto diverso. Quindi non è assolutamente corretto considerarla come una continuazione di quella posizione chiusa e l'EA a lungo termine non sarà in grado di determinarla come propria.

Tutt'altra cosa è se lo scalper lavora con valori più piccoli. Allora il biglietto rimarrà lo stesso, nonostante il fatto che il prezzo di apertura sia cambiato. In generale, non cercate di trasferire semplicemente la strategia di netting alla copertura, non ne verrà fuori niente di buono. L'analogia funzionerà, ma le azioni dovrebbero essere diverse. Le specificità del netting devono essere prese in considerazione.

Questo è solo un esempio dello scalper e del long riser, ci possono essere molti EA sul simbolo, e possono avere lotti diversi.

"Lo scalper chiude una posizione su una controtendenza e mette un limit stop al prezzo del TP previsto per la sua posizione immaginaria. - Ma il bagarino presume per se stesso di avere una "posizione immaginaria".

E il fatto che la posizione totale abbia cambiato il biglietto - quindi il consigliere di lungo termine non ne ha bisogno, sa già che ha la sua posizione, che non è legata alla posizione totale.

Di conseguenza, ogni EA lavora indipendentemente da chi altro sta lavorando con lui su questo simbolo, senza sapere o voler sapere nulla di esso.

E sì, non sto cercando di trasferire strategie per l'hedge, perché ho iniziato subito con MT5, FORTS e netting. Volevo solo che diversi robot fossero in grado di scambiare sul simbolo ed essere ancora in grado di scambiare mani senza interferire con loro.

 

JRandomTrader:

Ma per se stesso, lo scialacquatore pensa di avere una "posizione immaginaria".

È quello che sto dicendo, bisogna costruire una logica diversa per le reti. Non ci dovrebbero essere posizioni immaginarie . L'ho messa così solo perché non riuscivo a trovare un'altra parola per farmi capire. Se c'è un riempimento, allora viene preso in considerazione il volume totale della posizione e il nuovo prezzo della posizione aperta, se c'è una chiusura parziale lo stesso e il prezzo e il volume vengono presi in considerazione.

 
Alexey Viktorov:

È quello che sto dicendo: bisogna costruire una logica diversa per le reti. Non ci dovrebbero essere posizioni immaginarie . L'ho detto solo perché non riuscivo a trovare un'altra parola per farmi capire. Se c'è un riempimento, allora viene preso in considerazione il volume totale della posizione e il nuovo prezzo di apertura; se c'è una chiusura parziale, allora vale lo stesso e viene preso in considerazione il prezzo totale e il volume.

Poi dovremo stabilire una certa interazione tra i robot e tenere conto delle azioni dei "vicini", che sono gli stessi oggi e possono essere diversi domani. E non è chiaro quali benefici questo porterà.

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

 
JRandomTrader:

Poi devo creare una sorta di interazione tra i robot e tenere conto dei "vicini" che sono uno oggi e forse un altro domani. E non è chiaro quali benefici questo porterà.

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

Per semplificare le cose, sì. Sono d'accordo.

Allora il "Transport Manager" non ha articolato completamente il problema e le sue azioni.

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

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 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;
     }

Metto 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 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.

Cosa significano gli ordini di stop? Per la posizione totale o solo per la parte con cui lavora questo Expert Advisor?
Motivazione: