Problema di ordini multipli - pagina 4

 
luisneves:

Ciao Kronin,

La tua modifica funziona. Hai limitato gli ordini massimi, ma è possibile farli chiudere tutti, invece?

Ho provato a farlo con il seguente codice, ma sembra non funzionare.

Cordiali saluti

Luis

Hmmm, non sono sicuro di capire cosa intendi...
Vuoi dire che invece di aprire l'ultimo ordine (ordine 7 se MaxOrders è impostato a 7) chiudi tutti gli ordini?

Sono abbastanza sicuro che non vuoi aspettare che MaxOrders sia raggiunto e poi chiudere immediatamente tutti. L'ultimo ordine finirebbe quasi sempre (o sempre) con una perdita.
Btw. Hai visto il PM sullo spread controller?

 
kronin:

Hmmm, non sono sicuro di capire cosa intendi...
Vuoi dire che invece di aprire l'ultimo ordine (ordine 7 se MaxOrders è impostato a 7) chiudi tutti gli ordini?

Sono abbastanza sicuro che non vuoi aspettare che MaxOrders sia raggiunto e poi chiudere immediatamente tutti. L'ultimo ordine finirebbe quasi sempre (o sempre) con una perdita.
Btw. Hai visto il PM sullo spread controller?


Ciao Kronin,

Grazie per la vostra pronta risposta.

Diciamo che dopo un ciclo di ping pong di n ordini (MaxOrders) tutti gli ordini aperti dovrebbero essere chiusi, so che potrebbe non avere senso, ma anche così.

Sto cercando di includere il codice per il rientro dell'ordine nel caso in cui fallisca e ho dei dubbi se questo abbia senso perché c'è già il codice di IsContextBusy () Sleep (10). Per quanto ho capito, il significato è "se il server è occupato o un altro ea nella piattaforma sta tentando di comunicare, allora aspetta 10 millisecondi e riprova" . Quindi suppongo che l'EA manterrà questo comportamento fino alla ricezione di un ticket, ho ragione?

Per quanto riguarda il problema del PM, in questo caso meglio non fare uso di Test nel fine settimana o farlo con la piattaforma offline....

Ho inserito la linea 5, ma penso che non sia necessario perché la linea 1 lo ha già fatto, ho ragione?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

Un altro problema,

Nel seguente pezzo di codice le linee in grassetto dove c'è sym e mn non si devono sostituire con Symbol() e MagicNumber?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

Qui, nel seguente codice ho inserito i filtri come da tuo consiglio;

(//Phil:

//Controlla la quantità totale di ordini. Aggiungerei un filtro per mercato, magia e simbolo...//<----------- Non sono sicuro di cosa intendi per filtro di mercato..... (Phil: ordini a mercato, nessun ordine in sospeso)

//.... ma sono pigro ora.....è qualcosa che devi fare tu.

È corretto?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


Cordiali saluti

Luis

 

Non commento l'uso delle funzioni. RaptorUK l'ha già fatto qualche post prima. Leggi di nuovo e capisci perché non c'è bisogno di cambiare nulla nel codice dato. Ancora meglio, capisci perché puoi usarlo così com'è in altri EA.

OrdersTotal() restituisce una quantità di ordini. Probabilmente vuoi sapere se gli ordini appartengono al tuo EA o al trading manuale o se gli ordini sono in attesa o sono già a mercato. Creerei una funzione (int) che restituisce la quantità di ordini che l'EA ha creato.

if(OTLastTick >= 2 //<------potresti commentare il significato di questa linea?
Se hai un solo ordine aperto (meno di 2), non ha senso chiamare la funzione CloseAllOnSL..... l'unico ordine aperto non è ovviamente fermo.

 
kronin:

Non commento l'uso delle funzioni. RaptorUK l'ha già fatto qualche post prima. Rileggete e capite perché non c'è bisogno di cambiare nulla nel codice dato. Ancora meglio, capisci perché puoi usarlo così com'è in altri EA.

OrdersTotal() restituisce una quantità di ordini. Probabilmente vuoi sapere se gli ordini appartengono al tuo EA o al trading manuale o se gli ordini sono in attesa o sono già a mercato. Creerei una funzione (int) che restituisce la quantità di ordini che l'EA ha creato.

if(OTLastTick >= 2 //<------potresti commentare il significato di questa linea?
Se hai un solo ordine aperto (meno di 2), non ha senso chiamare la funzione CloseAllOnSL..... l'unico ordine aperto non è ovviamente fermato.


Ciao Kronin,

Grazie per la vostra risposta ai miei problemi.

Metterò la mia massima attenzione al tuo codice così come RaptorUK consigliare dato prima.

Cordiali saluti

Luis

 

Ciao Kronin,

È venuto fuori un problema che ha a che fare con l'uso di due EA. Se metto due EA in diversi grafici e con diversi numeri di magia non funzionano contemporaneamente. Ricevo un errore come uninit reason 5 ma avendo dato un'occhiata nel forum non riesco a trovare informazioni che mi mettano nella giusta direzione per affrontare questo problema.

Avete qualche informazione complementare?

Cordiali saluti

Luis

 
luisneves:

Ciao Kronin,

È emerso un problema che ha a che fare con l'uso di due EA. Se metto due EA in diversi grafici e con diversi numeri magici non funzionano contemporaneamente. Ricevo un errore come uninit reason 5

https://docs.mql4.com/constants/uninit
 

Ciao RaptorUK,

Grazie per la tua pronta risposta.

Nel link fornito ho trovato,

PARAMETRI_RAGIONE5I parametri di input sono stati modificati dall'utente.

Ma con questa informazione non posso fare nulla (per quanto ne so). Non riesco a capire quali parametri di input sono stati cambiati. L'ea è lo stesso, cambia solo il numero magico per evitare conflitti tra gli altri ea.

A proposito, una volta che sei qui, potresti dirmi se nel codice seguente si deve introdurre del codice per far sì che gli ordini vengano inviati di nuovo mentre i ticket non sono stati ricevuti, lo stesso vale per gli ordini di chiusura?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

Cordiali saluti

Luis

 
luisneves:

Ciao RaptorUK,

Grazie per la tua pronta risposta.

Nel link fornito ho trovato,

PARAMETRI_RAGIONE5I parametri di input sono stati modificati dall'utente.

Ma con questa informazione non posso fare nulla (per quanto ne so). Non riesco a capire quali parametri di input sono stati cambiati. L'ea è lo stesso, cambia solo il numero magico per evitare conflitti tra gli altri ea.

Se hai cambiato il numero magico . . .

extern int    MagicNumber    = 08012013;

. . . ed è un esterno allora hai cambiato un parametro, l'EA riparte e dà ragione 5

Se vuoi far funzionare il tuo EA su più coppie ti suggerisco di fare 2 cose, prima di tutto far funzionare correttamente il tuo EA su una coppia, testarlo completamente in modo da sapere che funziona. Poi, in secondo luogo, introdurre un Mutex in modo che i tuoi trade siano gestiti quando l'altro EA non sta cercando di fare la stessa cosa.

 
RaptorUK:

Se hai cambiato il Magic Number . . .

. . . ed è un esterno allora hai cambiato un parametro, l'EA si riavvia e dà il motivo 5

Se vuoi eseguire il tuo EA su più coppie ti suggerisco di fare 2 cose, prima di tutto far funzionare correttamente il tuo EA su una coppia, testarlo completamente in modo da sapere che funziona. Poi, in secondo luogo, introdurre un Mutex in modo che i tuoi trade siano gestiti quando l'altro EA non sta cercando di fare la stessa cosa.


Ciao RaptorUk,

Grazie per la tua risposta sull'errore, suppongo di aver cambiato nome e numero magico e messo il secondo ea nel grafico senza chiudere la piattaforma.

Per quanto riguarda l'altro problema sugli ordini di rientro che hanno a che fare con un errore nella chiusura dell'ordine che ha restituito un errore come timeout. ecco perché non so se il codice così com'è rientrerà l'ordine di chiusura o l'ordine di invio.

Cordiali saluti

Luis

 
luisneves:


Ciao RaptorUk,

Grazie per la tua risposta sull'errore, suppongo che ho cambiato nome e numero magico e messo il secondo ea nel grafico senza chiudere la piattaforma.

Per quanto riguarda l'altro problema sugli ordini di rientro che hanno a che fare con un errore nella chiusura dell'ordine che ha restituito un errore come timeout. è per questo che non so se il codice come è rientrerà l'ordine di chiusura o l'ordine di invio.

Cordiali saluti

Luis

Leggi i codici di errore di esecuzione e fai in modo che il tuo codice sia conforme alle informazioni fornite lì, per esempio . . .

ERR_TRADE_TIMEOUT128Il timeout per il trade è stato raggiunto. Prima di riprovare(almeno, nel tempo di 1 minuto), è necessario assicurarsi che l'operazione di trading non sia realmente riuscita (non è stata aperta una nuova posizione, o l'ordine esistente non è stato modificato o cancellato, o la posizione esistente non è stata chiusa)