L'EA Trailingstop non funziona - pagina 4

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


Apprezzo molto l'aiuto che tu e tutti gli altri state fornendo. Ho provato di tutto negli ultimi due giorni per ottenere la compilazione e mi scuso per non aver chiesto. La maggior parte di voi ha suggerito di rimandare l'uso del mio codice e di usare il codice di qualcun altro, ma non ho intenzione di imparare se non capisco cosa sto facendo di sbagliato. A me il mio codice sembra corretto: gli chiedo di contare gli ordini per posizione e di selezionare solo quelli che soddisfano i miei criteri e poi di modificare quello specifico trade. Finora, dopo 4 pagine, nessuno mi ha indicato quale linea del mio codice è rotta. Se non vedo e non capisco prima cosa sto sbagliando, non mi aiuterà ad imparare usando il codice di qualcun altro. Il mio obiettivo ora non è quello di avere un EA Trailingstop che funzioni, perché ce ne sono molti là fuori, ma per me di imparare come codificare, in modo che io possa andare avanti. Infatti, il mio codice era quasi identico al codice che Jimdandy ha postato nel suo tutorial di Youtube sui Trailingstops. Dato che è praticamente identico al suo, ho copiato il codice quasi alla lettera (tranne che voglio fare trading manuale), ma il suo codice funziona solo a volte.

Ho stampato un po' di roba. Questo trade è quasi 300 punti oltre il punto in cui ho specificato che il Trailingstop si attiva (che era 150 punti):

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderModify = false

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Ask = 1.45926

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbypos = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: Selectbyticket = 1

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: ticket = 0

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSelect = true

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrdersTotal = 16

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderSymbol = EURUSD

2016.04.22 00:18:02.301 Trailing_v33 EURAUD,M15: OrderTicket = 50381828

2016.04.22 00:17:58.934 Trailing_v33 EURAUD,M15: OrderModify = false

Questo EA è posizionato solo su EURAUD. Come potete vedere ci sono 16 ordini aperti su altri 9 grafici. Il numero di Ticket Selected per questa coppia è completamente sbagliato e OrderSymbol è completamente sbagliato. Entrambi sono per un ordine EURUSD aperto. In base a quanto sopra, il mio ciclo for ha selezionato la posizione 0 in questo caso, mentre l'EURAUD che avrebbe dovuto selezionare era in posizione 14 (15-1). Perché? Gli ho detto di ignorare questo.

Nel video di cui sopra Jim si è occupato di questo problema e ha detto che usa il seguente codice per superare il mio problema, tuttavia, questo è un contatore per inviare correttamente gli ordini e non una funzione per filtrare gli ordini. Ho provato a usarlo come filtro, ma non ci sono riuscito.

int OpenOrdersThisPair(string pair){
   int total=0;
      for(int s= OrdersTotal()-1; s>= 0; s--){
         OrderSelect(s,SELECT_BY_POS,MODE_TRADES);
           if(OrderSymbol()==pair) total++;
       }
   return(total);  
}

Il mio codice ora assomiglia a questo, qualcuno può per favore criticare il mio codice in modo che io possa imparare da questo e dirmi perché non funziona su più grafici. So che non può essere così male perché in realtà a volte funziona perfettamente. Grazie

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=10;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10,Pip=Point*10;
int TS=TrailingStart-TrailingStop;
bool UseTrailingStop=true,UseAutotrading=true;
//+------------------------------------------------------------------+
//|  Expert initialization function                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
    MessageBox("Please note: Your inputs cannot be less than the minimum levels required"+
            "\nby your broker. Please reload the EA and either increase the value of the"+
            "\nTrailingStart and/or decrease the value of the TrailingStop so that "+
            "\nTrailingStart-TrailingStop >= "+StringConcatenate(stoplevel)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|    Expert deinitialization function                              |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|   Expert start function                                          |
//+------------------------------------------------------------------+
int start(){
   if(UseTrailingStop) Trailing(); 
   if(UseAutotrading) Autotrading();  
   return(0);
}
//+------------------------------------------------------------------+
void Trailing(){
for(int b=OrdersTotal()-1; b>=0; b--){
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_BUY)
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip))
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip))
                        OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue);
   }     
   for(int s=OrdersTotal()-1; s>=0; s--){
     if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol())
            if(OrderType()==OP_SELL)
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip))
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0)
                        OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red);
   }
}
void Autotrading(){
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
}


 
Trader3000:

Finora, dopo 4 pagine nessuno ha indicato quale linea del mio codice è rotta.

Non è vero! Abbiamo descritto i tuoi errori e offerto soluzioni per loro in molti gusti e alternative. Eppure tu li ignori e continui a fare a modo tuo. Non solo, ora hai addirittura peggiorato la situazione aggiungendo altri errori.

Quando un pittore impara a dipingere, lo fa prima copiando le tecniche di altri che l'hanno imparato. Solo una volta che è a suo agio con queste tecniche, inizia a creare il suo PROPRIO MODO di dipingere.

Ecco una breve lista della "mia critica":

  1. Usa le tue parentesi (parentesi "graffe"). Non cercate di lesinare e risparmiare su di esse. Finché il vostro codice non è completamente funzionale e debuggato, aggiungetele anche se solo per una singola linea contenuta nel blocco. Mettetele anche su una linea separata. Non preoccupatevi se avete molto spazio bianco. Potete sempre tornare indietro e ripulirlo, ma all'inizio, volete assicurarvi che tutto sia all'interno del loro blocco di codice corretto e che parentesi e graffe siano bilanciate. Stringere diverse dichiarazioni "if" in una cadenza è una ricetta per il disastro in quanto è molto difficile da eseguire il debug, specialmente con un compilatore pignolo come questo.
  2. Il vostro codice originale aveva un solo ciclo che ora avete trasformato in due per nessuna ragione apparente se non quella di rendere il vostro codice ancora più lento e ripetere i punti che dovete sistemare quando ci sono dei bug.
  3. Usate le variabili per memorizzare i risultati delle espressioni! Ripetete le stesse espressioni più volte, rendendo il vostro codice non solo più lento, ma più soggetto a errori e più difficile da leggere e correggere perché dovete cambiarle in più punti.

Ci sono altre cose che potrei elencare, ma sistemate almeno queste, una volta per tutte!

La codifica è proprio come qualsiasi altra lingua. Sì, puoi semplicemente mettere in fila le parole, ma questo non fa di te un poeta. Anche nel coding devi avere ritmo e struttura, per renderlo leggibile e funzionale.

 
FMIC:

Ecco una breve lista della "mia critica":

Inizialmente avevo delle parentesi per tutte le mie dichiarazioni 'if' come da codice che ho postato qui in precedenza, ma dato che quel codice non funzionava ho provato varie altre cose, tra cui copiare il codice che ho incollato nel mio post precedente. Come ho detto questo in realtà non è nemmeno il mio codice, ma non funziona nemmeno su tutte le coppie. Comunque sostituirò nuovamente le parentesi e seguirò gli altri consigli. Nel frattempo ho imparato che OrderSelect stamperà nel terminale il Symbol del primo ordine e non quello su cui si trova l'EA, quindi in effetti non era sbagliato.

EDIT: Grazie per il suggerimento #3!!!!!!! Penso che questo fosse il problema, perché l'ordine deve prima essere selezionato da Symbol e POI il valore deve essere memorizzato. Così ho spostato la variabile sotto quelle funzioni come sotto, e sembra funzionare ora (ma sono necessari altri test prima di sapere con certezza

int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10,TSTP=TrailingStart*Pip,Trail=TrailingStop*Pip,SL=StopLoss*Pip;               
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail,OrderTakeProfit(),Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
 
Trader3000:

Ok, grazie mille per questo, inizialmente avevo le parentesi per tutte le mie dichiarazioni 'if' come da codice che ho postato qui in precedenza, ma dato che quel codice non funzionava ho provato varie altre cose, tra cui copiare il codice che ho incollato nel mio post precedente. Come ho detto questo in realtà non è nemmeno il mio codice, ma non funziona nemmeno su tutte le coppie. Comunque sostituirò nuovamente le parentesi e seguirò gli altri consigli. Nel frattempo ho imparato che OrderSelect stamperà nel terminale il Symbol del primo ordine e non quello su cui si trova l'EA, quindi in effetti non era sbagliato.

EDIT: Grazie per il suggerimento #3!!!!!!! Penso che questo fosse il problema, perché l'ordine deve prima essere selezionato da Symbol e POI il valore deve essere memorizzato. Così ho spostato la variabile sotto quelle funzioni come sotto, e sembra funzionare ora (ma sono necessari altri test prima di sapere con certezza

Dando un'occhiata al tuo ultimo codice, ho questo da dire - mi arrendo! (Ti rifiuti di seguire le istruzioni)!
 
FMIC: Dando un'occhiata al tuo ultimo codice, ho questo da dire - mi arrendo! (Vi rifiutate di seguire la procedura)!
Ora forse capite la mia "dura critica" quando sprecano il tempo di tutti. Mentre capisco le "cose semplici" che pensano che sia accettabile perdere il tempo di tutti, io no.

Trader3000: Penso che questo fosse il problema,...
int start(){
      for(int i=OrdersTotal()-1; i>=0; i--) {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()!= Symbol()) continue;
               double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip, SL=StopLoss*Pip;
                  if(OrderType()==OP_BUY){
                     if(Bid-OrderOpenPrice()>TSTP){
                        if(OrderStopLoss()<Bid-Trail){
                           if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Trail, OrderTakeProfit(), Orange))
                              Print("Error Buy TrailingStop: ",GetLastError());
            }
         }
Il tuo problema è che non pensi.
int start(){
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()!= Symbol()) continue;
// Everything below is executed if NO order is selected or a selected order is symbol
      double Pip=Point*10, TSTP=TrailingStart*Pip, Trail=TrailingStop*Pip,SL=StopLoss*Pip;
      if(OrderType()==OP_BUY)
      && Bid-OrderOpenPrice()>TSTP)
      && OrderStopLoss()<Bid-Trail){
         if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid-Trail, OrderTakeProfit(), Orange))
            Print("Error Buy TrailingStop: ",GetLastError());
      }
   :
 
WHRoeder:
Ora forse capisci la mia "dura critica" quando sprecano il tempo di tutti. Mentre capisco le "cose semplici" che pensano che sia accettabile perdere il tempo di tutti, io no.

Sì! Purtroppo, sembra che tu abbia ragione!

 

Grazie per le risposte.Allora, ho cambiato il codice ad una versione precedente come sotto. Con questo in questo modo sembra funzionare perfettamente su tutte le coppie in cui lo stoplevel è di 50 punti, ma non sulle coppie in cui lo stoplevel è più alto ad esempio, EURAUD anche se le variabili esterne è superiore allo stoplevel. Quindi questo è bizzarro

extern int TrailingStart=15;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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;
           
   if(!IsTradeAllowed()){
      MessageBox("This Expert Advisor requires Auto Trading. Please reload the EA or right click on"+
                 "\nthe chart to bring up the inputs window. Under the common tab check the box to"+
                 "\nallow live trading");
      Sleep(50000);
     }
   if(!IsExpertEnabled()){
      MessageBox("This Expert Advisor requires Auto Trading. Please click the button at the top");
      Sleep(50000);
     } 
   int ticket=0,buy_ticket=0,sell_ticket=0;  
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol()){
      ticket++;
      if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
      }
            if(OrderType()==OP_BUY){
               if(OrderSelect(buy_ticket,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(OrderType()==OP_SELL){
               if(OrderSelect(sell_ticket,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);
}
//+------------------------------------------------------------------+
 

Ho anche trovato un altro EA che ha un codice molto simile al mio e ho confrontato il codice. Ho evidenziato le principali differenze.

1. Incrementi invece di decrementi

2. Moltiplica tutto con Point invece di Point*10

3. Aggiunge il Trailingstop e il Trailingstep insieme e poi ne sottrae uno e modifica l'ordine con il Trailingstep. Se ho capito bene, il Trailingstart si attiva dopo un movimento di 15 pip (150 punti). Nel mio EA, il prezzo rimarrà indietro di 5 pip e verrà fermato se il prezzo scende ancora e colpisce questo livello di 5 pip. Nel suo EA, si attiverà anche dopo 15 pip, ma la quantità di pip che rimane indietro è 19 (15+5-1), quindi il prezzo deve scendere di 19 pip per essere fermato. Per esempio: OrderOpenPrice è 1.50000. Il prezzo sale di 150 punti a 1.50150 che attiva il Trailingstop. Se il prezzo scende di nuovo a 1.50100, sarà fermato per un profitto di 5 pip. Nel suo EA, il Trailingstop è attivato anche a 1.50150, ma la traccia è a 1.49960 che penso causerà l'errore 130 poiché lo stop è troppo vicino al livello dello stoplevel. O ho capito male?

Il mio problema potrebbe essere con uno o più di questi?

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Êèì Èãîðü Â. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Àâòîìàòè÷åñêèé Trailing Stop âñåõ îòêðûòûõ ïîçèöèé    |
//|            Âåøàòü òîëüêî íà îäèí ãðàôèê                          |
//+------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link      "http://www.kimiv.ru"

//------- Âíåøíèå ïàðàìåòðû ------------------------------------------
extern bool   ProfitTrailing = True;  // Òðàëèòü òîëüêî ïðîôèò
extern int    TrailingStop   = 15;     // Ôèêñèðîâàííûé ðàçìåð òðàëà
extern int    TrailingStep   = 5;     // Øàã òðàëà
extern bool   UseSound       = True;  // Èñïîëüçîâàòü çâóêîâîé ñèãíàë
extern string NameFileSound  = "expert.wav";  // Íàèìåíîâàíèå çâóêîâîãî ôàéëà

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      TrailingPositions();
    }
  }
}

//+------------------------------------------------------------------+
//| Ñîïðîâîæäåíèå ïîçèöèè ïðîñòûì òðàëîì                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  double pBid, pAsk, pp;

  pp = MarketInfo(OrderSymbol(), MODE_POINT);
  if (OrderType()==OP_BUY) {
    pBid = MarketInfo(OrderSymbol(), MODE_BID);
    if (!ProfitTrailing || (pBid-OrderOpenPrice())>TrailingStop*pp) {
      if (OrderStopLoss()<pBid-(TrailingStop+TrailingStep-1)*pp) {
        ModifyStopLoss(pBid-TrailingStop*pp);
        return;
      }
    }
  }
  if (OrderType()==OP_SELL) {
    pAsk = MarketInfo(OrderSymbol(), MODE_ASK);
    if (!ProfitTrailing || OrderOpenPrice()-pAsk>TrailingStop*pp) {
      if (OrderStopLoss()>pAsk+(TrailingStop+TrailingStep-1)*pp || OrderStopLoss()==0) {
        ModifyStopLoss(pAsk+TrailingStop*pp);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Ïåðåíîñ óðîâíÿ StopLoss                                          |
//| Ïàðàìåòðû:                                                       |
//|   ldStopLoss - óðîâåíü StopLoss                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStopLoss) {
  bool fm;

  fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+
 
Trader3000:

Ho anche trovato un altro EA che ha un codice molto simile al mio e ho confrontato il codice.

Vediamo se capisco questa tua logica! Sei disposto a trovare un altro EA di qualcun altro da chissà dove e sei disposto a incorporare quel codice nel tuo, MA NON SEI DISPOSTO a prendere il codice che è stato specificamente scritto per aiutarti e correggere i tuoi problemi!!!

WOW! Che LOGICO da parte tua! Dov'è SPOCK quando hai bisogno di lui!

SPOCK, che tu possa riposare in pace! Manchi a tutti noi!

 
FMIC:

Vediamo se capisco questa tua logica! Siete disposti a trovare un altro EA di qualcun altro da chissà dove e siete disposti a incorporare quel codice nel vostro, MA NON SIETE DISPOSTI a prendere il codice che è stato specificamente scritto per aiutarvi e correggere i vostri problemi!!!

WOW! Che LOGICO da parte tua! Dov'è SPOCK quando hai bisogno di lui!

SPOCK, che tu possa riposare in pace! Manchi a tutti noi!

Finalmente l'ho capito, quindi grazie a tutti per l'aiuto (e le critiche). Dopo essere tornato al codice che tu e Mike avete postato nella prima pagina, ho visto il mio errore. Probabilmente l'ho trascurato perché era così sottile, ma soprattutto perché non ho capito bene la logica del codice. Il problema era che pensavo che l'importo dei pip per il TrailingStop fosse l'importo dei pip che stava seguendo. Ma il numero di pip che segue è in realtà TrailingStart-TrailingStop. Quindi le mie impostazioni erano sotto lo stoplevel per coppie come il gbpjpy perché ho inserito 15 e 5. Poiché 5 è sotto lo stoplevel di 8. Semplicemente aumentando il TrailingStop ora funziona su tutte le coppie. Grazie!!!