Il mio EA fa una doppia entrata - pagina 9

 

Ciao

Questo approccio funziona solo se la dimensione della posizione corrente è zero e il nuovo trade viene eseguito con successo con la dimensione della posizione desiderata.

Vedi il codice:

#include <Trade\Trade.mqh>

//--- global variables
CTrade trade;
bool position_opened=false;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   bool conditions_to_open;
   ENUM_ORDER_TYPE order_type;
   double lot;
   double price,sl,tp;

//---...set variables

//--- inside OnTick()
   if(conditions_to_open && !position_opened) //-- Or position_opened==false
     {
      if(trade.PositionOpen(_Symbol,order_type,lot,price,sl,tp,"comment")
         && 
         (trade.ResultRetcode()==10009 || trade.ResultRetcode()==10008)) //-- Or others condition according to your needs
        {
         //--- set the global variable to true to avoid duplicate orders
         position_opened=true;
         Print("Success!");
        }
      else
        {
         Print("Error = ",GetLastError(), "trade error = ", trade.ResultRetcode());
         //--- Sets the global variable to false
         // position_opened=false;                                         //-- Not needed as position_opened is already false
         return;
        }

     }
//--- 
  }


Ma cosa succede se il tuo EA sta girando la posizione: da una posizione LONG a una SHORT o viceversa e questa azione viene eseguita in 2 trade diversi?

Dopo il primo trade la booleana "position_opened" è impostata a "TRUE" e l'EA non può aprire il secondo trade perché la condizione sta controllando"if(conditions_to_open && !position_opened)", quindi il secondo trade sarà bloccato.

E cosa succede se la dimensione della posizione è solo parzialmente aperta? Avete bisogno di un secondo trade per portare la dimensione della posizione alla dimensione corretta.


Alla fine, per farla breve, avete sempre bisogno della funzione PositionSelect(Symbol()) per calcolare la dimensione della posizione CORRENTE ed è qui che è iniziato il problema (e questo thread del forum).

Nel momento critico, quando l'EA chiama la funzione PositionSelect(Symbol()), il terminale non ha ancora aggiornato la dimensione corrente della posizione e l'EA sta lavorando con la dimensione sbagliata della posizione e invia un nuovo doppio ordine al server di trading.


Penso che l'approccio di(figurelli) sia migliore perché si è costretti ad aspettare che l'EA abbia aggiornato la funzione PositionSelect(Symbol()) alla giusta dimensione della posizione.


bool fatalError=false; // atention: declare this as global

....

if(fatalError == false) 
      {
      if(m_Trade.PositionOpen(Symbol(), ORDER_TYPE_BUY, LotSize, Price, 0, 0)) 
            {
            Print("Position opened in ", Symbol());
            int maxTimeout=0;
            while(!PositionSelect(Symbol())) 
                     {
                     Sleep(100);
                     maxTimeout++;
                     if(maxTimeout > 100) 
                           {
                           Print("### PositionSelect fatal error!");
                           fatalError = true;
                           break;
                           }
                     }
            Print("--> PositionSelect delay=",maxTimeout * 100);
            break;
            }
      }
 
snelle_moda:

Ciao

Questo approccio funziona solo se la dimensione corrente della posizione è zero e il nuovo trade viene eseguito con successo con la dimensione della posizione desiderata.

Vedi il codice:


Ma cosa succede se il tuo EA sta girando la posizione: da una posizione LONG a una SHORT o viceversa e questa azione viene eseguita in 2 trade diversi?

Dopo il primo trade la booleana "position_opened" è impostata a "TRUE" e l'EA non può aprire il secondo trade perché la condizione sta controllando"if(conditions_to_open && !position_opened)", quindi il secondo trade sarà bloccato.

E cosa succede se la dimensione della posizione è solo parzialmente aperta? Avete bisogno di un secondo trade per portare la dimensione della posizione alla dimensione corretta.


Alla fine, per farla breve, avete sempre bisogno della funzione PositionSelect(Symbol()) per calcolare la dimensione della posizione CORRENTE ed è qui che è iniziato il problema (e questo thread del forum).

Nel momento critico, quando l'EA chiama la funzione PositionSelect(Symbol()), il terminale non ha ancora aggiornato la dimensione corrente della posizione e l'EA sta lavorando con la dimensione sbagliata della posizione e invia un nuovo doppio ordine al server di trading.


Penso che l'approccio di(figurelli) sia migliore perché si è costretti ad aspettare che l'EA abbia aggiornato la funzione PositionSelect(Symbol())


Hai ragione, entrambi gli approcci hanno dei limiti.

L'origine di questo problema è ora identificata chiaramente. Ognuno deve adattare il suo codice a seconda della sua strategia. Non credo che ci sia un metodo generale che possa essere applicato a tutti i casi.

 
Abbiamo bisogno di una libreria OrderSendReliable() per il grande e potente mql5?
 
Ubzen:
Abbiamo bisogno di una libreria OrderSendReliable() per il grande e potente mql5?
Non credo che il sarcasmo possa essere d'aiuto. Anche se è chiaramente un cattivo design che porta a tale complessità.
 
angevoyageur:

Hai ragione, entrambi gli approcci hanno dei limiti.

L'origine di questo problema è ora identificata chiaramente. Ognuno deve adattare il suo codice a seconda della sua strategia. Non credo che ci sia un metodo generale che possa essere applicato a tutti i casi.


Oppure dobbiamo aspettare una "dichiarazione ufficiale" dagli stessi ragazzi di Metaquotes.

C'è già una risposta dal service desk?

 
angevoyageur: Non credo che il sarcasmo possa essere d'aiuto. Anche se è chiaramente un cattivo design che porta a tale complessità.

Se fossi d'accordo con te lo considereresti poco utile? .

Ho solo insegnato che la soluzione di Dormire fino al Terminating Trading mi ricordava OrderSendReliable(). Ho insegnato che questi sarebbero stati affrontati in modo più elegante.

Mi ricorda anche la gestione di old_documents ... dove va { e tutto il trading dovrebbe essere fermato }.

Comunque, le scuse non intendevano prendersela con mql5.

 
snelle_moda:


O dobbiamo aspettare una "dichiarazione ufficiale" dagli stessi ragazzi di Metaquotes.

C'è già una risposta dal service desk?

No. Stavo solo pensando a questo... Sarebbe probabilmente utile se tutte le persone interessate scrivessero un ticket al ServiceDesk su questo problema. Tuttavia sono molto scettico se MQ è disposto a cambiare questo design. Ma possiamo provare.

Le persone possono scrivere al ServiceDesk e riportare il numero del ticket qui. Il mio è

Errori, MetaTrader 5 MQL, Aprire, Avviare: 2013.12.23 19:08, #916435
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
 
Ubzen:

Se fossi d'accordo con te, lo considereresti non utile?

Ho solo insegnato che la soluzione di Dormire fino a terminare il trading mi ha ricordato OrderSendReliable(). Ho insegnato che questi sarebbero stati affrontati in modo più elegante.

Mi ricorda anche la gestione di old_documents ... dove va { e tutto il trading dovrebbe essere fermato }.

Comunque, le scuse non intendevano prendersela con mql5.

Mi chiedo se un problema simile non possa esistere anche in mql4, ho letto almeno 2 topic negli ultimi mesi sul forum di mql4 da utenti che si lamentano dei doppi scambi. Non sono sicuro che sia correlato, ma può valere la pena di controllare questi topic. Hai letto anche questi?
 
angevoyageur: Mi chiedo se un problema simile non possa esistere anche in mql4, ho letto almeno 2 topic negli ultimi mesi sul forum di mql4 da utenti che si lamentano dei doppi scambi. Non sono sicuro che sia correlato, ma può valere la pena di controllare questi topic. Hai letto anche questi?

Sì, ma è difficile dire se è a causa di una cattiva codifica. Il doppio trading era un problema anche prima del thread sul trading multiplo. Il modo in cui viene gestito tradizionalmente è il modo in cui lo gestisce snelle_moda.

 
Ubzen:

Sì, ma è difficile dire se è a causa di una cattiva codifica. Il doppio trading era un problema anche prima del thread sul trading multiplo. Il modo in cui è tradizionalmente gestito è il modo in cui snelle_moda lo gestisce.

Non sono sicuro di capire cosa intendi. Il problema di cui stiamo parlando in questo topic non è causato da una cattiva codifica ma da una cattiva progettazione in mql5 (è la mia opinione, o forse è semplicemente un bug?). Cosa intendi per "thread di trading multipli"?
Get in touch with developers using Service Desk!
Get in touch with developers using Service Desk!
  • www.mql5.com
We therefore attach great importance to all user reports about issues in our programs and try to answer each one of them.
Motivazione: