L'EA Trailingstop non funziona - pagina 3

 
FMIC: Un consiglio: non utilizzare "Ask" o "Bid" - utilizza invece "OrderClosePrice()". Si tratta di un valore in tempo reale, indipendentemente dal fatto che si tratti di un ordine di acquisto o di vendita.
Non in tempo reale.
  1. Con Ask e Bid è necessario aggiornare RefreshRates() dopo ritardi, cioè tra più chiamate al server, dopo uno Sleep o un lungo calcolo.
  2. Con OrderClosePrice, viene aggiornato solo con un OrderSelect. Quindi, dopo uno Sleep o un calcolo lungo (o mantenendo un ordine selezionato tra le chiamate OnTick ), è necessario riselezionare.
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
Non in tempo reale.
  1. Con Ask e Bid è necessario RefreshRates() dopo ritardi, cioè tra più chiamate al server, dopo Sleep o un lungo calcolo.
  2. Con OrderClosePrice, viene aggiornato solo con un OrderSelect. Quindi, dopo uno Sleep o un lungo calcolo (o mantenendo un ordine selezionato tra le chiamate OnTick ), è necessario riselezionare.

Grazie per le informazioni. Non sapevo che "OrderClosePrice()" fosse bufferizzato. Quindi immagino che né "OrderClosePrice()" né la "Ask"/"Bid" siano la soluzione ideale in tempo reale.

Tuttavia, sei d'accordo che "OrderClosePrice()" è una soluzione globalmente migliore dell'utilizzo di "Ask"/"Bid" dopo l'esecuzione di "OrderSelect()"?

E per una soluzione in tempo reale, se è davvero necessario, allora credo che possiamo ripiegare sulle alternative:

  • Riselezionando l'ordine con "OrderSelect()" (EDIT: ho dimenticato di elencare questo nel post iniziale, anche se l'hai sottolineato)
  • "RefreshRate()" con "Ask"/"Bid"
  • "MarketInfo()" con "MODE_ASK"/"MODE_BID" (vecchio stile MQL4)
  • "SymbolInfoDouble()" con "SYMBOL_ASK"/"SYMBOL_BID" (nuovo stile MQL4+ e MQL5)
  • "SymbolInfoTick()" (che comunque uso già nella maggior parte dei miei EA)
 
FMIC: Tuttavia, sei d'accordo che "OrderClosePrice()" è una soluzione globale migliore dell'uso di "Ask"/"Bid" dopo che è stato fatto "OrderSelect()"?
assolutamente.
 

Perché stai cercando di inventare di nuovo la ruota?

Guarda qui - troverai tutto ciò di cui hai bisogno.

Altrimenti inizia a modificare il suo codice sorgente.

 

Grazie per l'aiuto di tutti finora. Penso di aver risolto il problema dell'errore 130, ma c'è qualcosa di seriamente sbagliato con la mia funzione OrderSelect, che è molto probabilmente il motivo per cui solo a volte modifica alcuni degli ordini. Di seguito è riportato un elenco di cose che ho stampato. L'OrderTicket # è completamente sbagliato. Quel numero di ticket appartiene a un trade che ho aperto per la coppia EURAUD. Anche se non ho incluso tutti i risultati, ci sono in realtà più coppie dove i numeri OrderTicket non corrispondono alla coppia nel terminale di trading.

Qualcuno può dare un'occhiata e farmi sapere cosa c'è di sbagliato in OrderSelect? Grazie

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Penso che ticket dovrebbe stampare lo stesso valore di OrdersTotal, quindi sembra che il mio contatore non funzioni.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   Print("OrdersTotal = ",OrdersTotal());
   Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
   Print("ticket = ",ticket);                     
   Print("OrderTicket = ",OrderTicket());                     
   Print("Selectbyticket = ",SELECT_BY_TICKET);                     
   Print("Selectbypos = ",SELECT_BY_POS);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

Ciao a tutti, grazie per l'aiuto, ho trovato l'errore e i problemi sono stati risolti. Siccome non uso uno Stoploss, il valore di OrderStopLoss() è sempre 0. Questo non è un problema quando si modifica l'ordine di acquisto perché 0 è sempre inferiore a Bid-Trailingstop*Pip. Questo non è un problema quando modifico l'ordine di acquisto perché 0 è sempre inferiore a Bid-TrailingStop*Pip. Ma con l'ordine di vendita 0 non può mai essere superiore a Ask+Trailingstop*Pip. Quindi ho dovuto aggiungere l'or(|| OrderStopLoss()) a questa linea:

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 Quel numero di ticket appartiene ad un trade che ho aperto per la EURAUD.
Nessun filtro nel ciclo OrderSelect. Symbol non è uguale a Ordersymbol quando un'altra valuta viene aggiunta ad un altro grafico separato.- MQL4 forum
 
WHRoeder:
Trader3000: Quel numero di ticket appartiene ad un trade che ho aperto per la EURAUD.
Nessun filtro nel ciclo OrderSelect. Symbol non è uguale a Ordersymbol quando un'altra valuta viene aggiunta ad un altro grafico separato. - MQL4 forum

Grazie mille per l'aiuto. Sì, c'è sicuramente un problema con OrderSelect perché funziona solo su alcuni grafici. L'altro problema è che non posso includere un MagicNumber perché i trade sono piazzati manualmente. Ho usato la parte di codice che penso sia rilevante, ma non riesco a farlo compilare. Mostra questo errore:

'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13

e la linea 31 è questa:

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

Ecco l'intero EA:

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

Sì, c'è sicuramente un problema con OrderSelect perché funziona solo su alcuni grafici. L'altro problema è che non posso includere un MagicNumber perché i trade sono piazzati manualmente. Ho usato la parte di codice che penso sia rilevante, ma non riesco a farlo compilare.

Ti ho dato uno scheletro di codice perfettamente buono su cui costruire, che risolve i tuoi problemi e li ha anche elencati prima, ma tu scegli di ignorarlo e continui a lottare chiedendoti perché il tuo codice non fa quello che vuoi!

Perché? Volete che il vostro codice non funzioni? Usate l'esempio e testatelo voi stessi!

 
Pensa di poter semplicemente tagliare e incollare e di non dover imparare a scrivere codice. Non riesce nemmeno a risolvere questo semplice errore senza chiedere:
'MySelect' - la funzione può essere dichiarata solo nell'ambito globale Trailing_v26.mq4 31 13
Motivazione: