Problema di ordini multipli - pagina 5

 
RaptorUK:

Legga i codici di errore di esecuzione e faccia in modo che il suo codice sia conforme alle informazioni fornite, per esempio . . .

ERR_TRADE_TIMEOUT128Il timeout per la negoziazione è 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)


Ciao RaptorUK,

Grazie per l'indizio.

Un altro problema (più uno.....);

Diciamo che su un broker ECN è aperta una negoziazione e secondo i "Requisiti e limitazioni nell'esecuzione delle negoziazioni" un ordine di mercato non può essere chiuso se lo Stoploss è all'interno della distanza di congelamento, in questo caso la funzione CloseAll chiuderà anche quegli ordini che sono all'interno della distanza di congelamento?

Cordiali saluti

Luis

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


Ciao RaptorUK,

Grazie per l'indizio.

Un altro problema (più uno.....);

Diciamo che su un broker ECN è aperta una negoziazione e per "Requisiti e limitazioni nell'esecuzione delle negoziazioni" un ordine di mercato non può essere chiuso se lo Stoploss è all'interno della distanza di congelamento, in questo caso la funzione CloseAll chiuderà anche quegli ordini che sono all'interno della distanza di congelamento?

No, fallirà, probabilmente errore 130
 

Ciao RaptorUK,

Se possibile vorrei chiederti un aiuto per questo problema;

Questo pezzo di codice trova l'ultimo OrderLots() e lo moltiplica per il fattore moltiplicatore, ma alcune volte passa questo fattore e ho ordini in questo modo; 0.01, 196,83, 590,49, ecc.

Bisogna dire che ho un limite agli ordini aperti, in questo caso 5. Ora, nel modo in cui ho visto questa logica, anche se arriva una condizione per aprire un ordine superiore a 5 non si aprirà e quindi il numero di ordini nel pool sono limitati a 5 quindi, se il codice vede solo 5 ordini nel pool la dimensione del lotto per quegli ordini dovrebbe essere; 0.01, 0.02, 0.04, 0.08, 0.16. C'è qualcosa di sbagliato in questo codice di cui non sono a conoscenza?

(spero che l'indentazione vada bene...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

Cordiali saluti

Luis

 
luisneves:

Ciao RaptorUK,

Se possibile vorrei chiederti un aiuto per questo problema;

Questo pezzo di codice trova l'ultimo OrderLots() e lo moltiplica per il fattore moltiplicatore, ma alcune volte passa questo fattore e ho ordini in questo modo; 0.01, 196,83, 590,49, ecc.

Bisogna dire che ho un limite agli ordini aperti, in questo caso 5. Ora, nel modo in cui ho visto questa logica, anche se arriva una condizione per aprire un ordine superiore a 5 non si aprirà e quindi il numero di ordini nel pool sono limitati a 5 quindi, se il codice vede solo 5 ordini nel pool la dimensione del lotto per quegli ordini dovrebbe essere; 0.01, 0.02, 0.04, 0.08, 0.16. C'è qualcosa di sbagliato in questo codice di cui non sono a conoscenza?

(spero che l'indentazione vada bene...)

Lo faccio così...

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

se OrderSelect() fallisce MLots = LotSize ?? perché ? la tua indentazione non aiuta a vedere cosa sta succedendo con le tue dichiarazioni if e le parentesi graffe . ... volevi fare questo?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

L'ho fatto...

if(MLots < 0.001)

. . come metodo rapido e sporco per evitare problemi di doppio confronto, hai letto questo?Prezzo != prezzo ?

 
RaptorUK:

Lo faccio così . . .

se OrderSelect() fallisce MLots = LotSize ?? perché ? la tua indentazione non aiuta a vedere cosa sta succedendo con i tuoi if e le parentesi graffe . ... volevi fare questo?

L'ho fatto...

. . come metodo rapido e sporco per evitare problemi di doppio confronto, hai letto questo?Prezzo != prezzo ?


Ciao RaptorUk,

Grazie per la tua pronta risposta.

Quindi, immagino che sia meglio non fare uso di altro perché è lì per niente. E grazie per il link fornito.

Migliore egards

Luis

 

Ciao RaptorUK,

Ho un problema (più uno.....)

Alcuni ordini si chiudono prima del tempo, quello che voglio dire è;

Questi ordini sono stati aperti e c'è un limite di apertura fino a 6. Tutti gli ordini dovrebbero chiudersi per mezzo del TrailingStop, ma gli ordini 1. 3 e 5 sono stati chiusi prima degli altri che sono stati chiusi dopo (07:43).

A causa di questi 3 ordini che hanno chiuso prima degli altri danno spazio all'apertura degli ordini 7, 8 e 9 e questi aprono con un lotto basato sull'ultimo lotto (2.43).

Quindi, per quanto ho capito quelle di chiusura erratica degli ordini alle 07:23 non dovrebbero avvenire e non sono stati trovati errori...

1 - 49518192013.01.28 19:51vendere0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04buy0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vendere0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20buy0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vendere0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48buy2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vendere7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40buy21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40vendere65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Il codice per chiuderli tutti tramite TrailingStop è questo;

Questo codice potrebbe fallire e chiudere gli ordini in tempi diversi ?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

Cordiali saluti

Luis

 
luisneves:


Il codice per chiuderli tutti tramite TrailingStop è questo;

Questo codice potrebbe fallire e chiudere gli ordini in tempi diversi?

Ok, questo non ha senso... uno SL di trailing è impostato in modo che se il prezzo va con un ordine lo SL viene spostato verso il prezzo, così se il nuovo SL viene colpito ci sarà meno perdita o addirittura un profitto. Perché avere un trailing SL se si sta per OrderClose() il trade in ogni caso? Per me questo non è un trailing SL, non è un SL di qualsiasi tipo in quanto si sta attivamente chiudendo il trade tramite l'EA non lo SL.

Forse la tuafunzione CloseAllOnSL() fa qualcosa di diverso da quello che penso faccia ma, ancora una volta, non hai commenti che spieghino cosa sta cercando di fare il tuo codice. Non c'è un trailing SL come non c'è OrderModify().

 

Leggi questo:Cosa sono i valori di ritorno delle funzioni? Come si usano?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

aggiungete più informazioni alla dichiarazione di stampa, aggiungete OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc qualsiasi informazione di cui avete bisogno per determinare quale sia stato il problema quando si è verificato l'errore, non è facile tornare indietro nel tempo e scoprire tutto questo, quindi quando succede stampatelo nel log.

 
luisneves:


Quindi, per quanto ho capito quelle di chiusura irregolare degli ordini alle 07:23 non dovrebbero essere accadute e non sono stati trovati errori...

1 - 49518192013.01.28 19:51vendere0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04buy0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vendere0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20buy0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vendere0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48buy2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vendere7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40buy21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40vendere65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Mostrate l'output del log quando questo accade. . .
 
RaptorUK:

Leggi questo:Cosa sono i valori di ritorno delle funzioni? Come si usano?

aggiungete più informazioni alla dichiarazione di stampa, aggiungete OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc qualsiasi informazione di cui avete bisogno per determinare quale sia stato il problema quando si è verificato l'errore, non è facile tornare indietro nel tempo e scoprire tutto questo, quindi quando succede stampatelo nel log.


Ciao RaptorUk,

Grazie per il vostro tempo.

Il codice per TrailingStop è in un'altra parte, il codice inviato è solo per chiudere tutto una volta che l'ordine è stato chiuso per mezzo di TrailingStop.

Tuttavia, seguo il tuo consiglio e cerco qualsiasi errore che possa dare ulteriori informazioni sul perché gli ordini si chiudono prima di altri.

A proposito, nel codice seguente ha senso cambiare la posizione di MLots = 0; dal posto attuale a prima del ciclo for?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

Cordiali saluti

Luis

Motivazione: