Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Backtest bringt keine Ergebnisse

Geschrieben

Hallo in die Runde

Seit kurzem versuche ich mich in der MQL-Programmierung. Habe auch entsprechende Foren durchforstet und mitgelesen.

Nun habe ich aber ein Problem und ehe ich verzweifle stelle ich das mal in die Runde.

Der EA, den ich mir gebastelt habe, habe ich als Demo laufen lassen. Im Journal erkenne ich, daß er entsprechende Signale liefert.

Bei einem Bachtest scheitere ich aber immer wieder wieder kläglich.

Was ist hier grundsätzlich falsch?

 

bullet_go.png

#define MagicNumber 1001

double Profit       = 50;
double Stopp        = 30;

int TimeClose       = 0;

double lot          = 0.1;
double Slippage     = 2;

datetime prevtime = 0;

int Fall;
int Fall1_vHP, Fall3_vHP;
int i_CCI_long, i_CCI_short, CCI_long, CCI_short;
double CCI50_0, Diff_CCI5, Osma1_Diff0, Osma5_Diff0, Osma5_Diff1, MACD5_Diff0, MACD5_Diff1, Osma5;
double MACD1_Diff0;
int i_entry_long, i_entry_short, entry_long, entry_short;
double Kauf;
int Pip;
int Stop0; int Stop = -10;
int Stop_1; int Stop_exit;
int i_Stop_long, i_Stop_short;
extern int  Start_Trailing_Stop        =  -15;
int order_long = 0; int order_short = 0;
int exit = 0; int exit_long = 0; int exit_short = 0;
int buys, sells;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
 {
//----
  //Ermittlung der Ausgangssituation (Fall)
  
    / 
  CCI50_0 = iCCI(NULL,5,14,PRICE_TYPICAL,0);
  Diff_CCI5 = iCCI(NULL,5,14,PRICE_TYPICAL,0) - iCCI(NULL,5,14,PRICE_TYPICAL,1);
  Osma5_Diff0 = 10000*(iOsMA(NULL,5,12,26,9,PRICE_TYPICAL,0)-iOsMA(NULL,5,12,26,9,PRICE_TYPICAL,1));
  if(CCI50_0 < -130) Fall = 1;
  if(CCI50_0 > -130 && CCI50_0 < 130) Fall = 2;
  if(CCI50_0 > 130) Fall = 3;
  //if (Fall == 1 && (Diff_CCI5 > 0 || Osma5_Diff0 > 0)) Fall1_vHP = 1;
  //if (Fall == 3 && (Diff_CCI5 < 0 || Osma5_Diff0 < 0)) Fall3_vHP = 1;
  
 // Alert("Fall: ", Fall, ", CCI: ", CCI50_0, ", ", Fall1_vHP, ", ", Fall3_vHP);
  
  
  
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
 {
//----
  
//----
  return(0);
 }
 
 
 
 
int CalcCurOrd()
 {
  buys=0;sells=0;
//---- 
  for(int i=0;i<OrdersTotal();i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
       {
        if(OrderType()==OP_BUY) buys++;
        if(OrderType()==OP_SELL) sells++;
       }
    }
//----
  if(buys>0) return(buys);
  else       return(-sells);
 }




double PointX()
 {
  if (Digits==5 || Digits ==3)

  return(Point*10); else return(Point);
 }
 
 
void Count_for_CCI5()
{
     CCI50_0 = iCCI(NULL,5,14,PRICE_TYPICAL,0);
     Diff_CCI5 = iCCI(NULL,5,14,PRICE_TYPICAL,0) - iCCI(NULL,5,14,PRICE_TYPICAL,1);
     
if(CCI50_0 > -130 && CCI50_0 < 130) Fall = 2;

if(CCI50_0 > 130 && Fall == 2)
     {
        Fall = 3;
        Alert("CCI5-aktuell, Fall: ", Fall, ", CCI5: ", CCI50_0);
     }
     
     if(CCI50_0 < -130 && Fall == 2)
     {
        Fall = 1;
        Alert("CCI5-aktuell, Fall: ", Fall, ", CCI5: ", CCI50_0);
     }
  
     if (Fall == 1 && Fall1_vHP == 0)
     {
        
        if (Diff_CCI5 > 0 && i_CCI_long == 0) { CCI_long = 1;
                                           { if (i_CCI_long == 0) Alert("CCI_long: ", CCI_long);
                                    //         Alert(OrdersTotal(), "  ", buys, "  ", sells, "  ", OrderMagicNumber());
                                             i_CCI_long = 1;
                
                                           }
                             
                                         }
     }
     if (Fall == 3 && Fall3_vHP == 0)
     {
        
        if (Diff_CCI5 < 0 && i_CCI_short == 0) { CCI_short = 1;
                                           { if (i_CCI_short == 0) Alert("CCI_short: ", CCI_short);
                                    //         Alert(OrdersTotal(), "  ", buys, "  ", sells, "  ", OrderMagicNumber());
                                             i_CCI_short = 1;
                                           }
                             
                                       }
     }
return;      
}
 
 
 
 
 
void CheckForEntry() 
{
     Count_for_CCI5();
     Osma1_Diff0 = 10000*(iOsMA(NULL,1,12,26,9,PRICE_TYPICAL,0)-iOsMA(NULL,1,12,26,9,PRICE_TYPICAL,1));
     Osma5_Diff0 = 10000*(iOsMA(NULL,5,12,26,9,PRICE_TYPICAL,0)-iOsMA(NULL,5,12,26,9,PRICE_TYPICAL,1));
     MACD1_Diff0 = 1000*(iMACD(NULL,1,12,26,9,PRICE_TYPICAL,MODE_MAIN,0) - iMACD(NULL,1,12,26,9,PRICE_TYPICAL,MODE_MAIN,1));
     Osma5 = iOsMA(NULL,1,12,26,9,PRICE_TYPICAL,0);
           
     if (CCI_long == 1 && Osma1_Diff0 > 0 && MACD1_Diff0 > 0 && Osma5_Diff0 > 0 && i_entry_long == 0) 
                                                           { entry_long = 1; 
                                                   //          Alert("CCI_long: ", CCI_long, entry_long, " Ask: ", Ask);
                                                             i_CCI_long = 0;
                                                            CCI_long = 0;
                                                           }
     
                                                     
     
     
     if (CCI_short == 1 && Osma1_Diff0 < 0 && MACD1_Diff0 < 0 && Osma5_Diff0 < 0 && i_entry_short == 0) 
                                                            { entry_short = -1;                                        
                                                   //           Alert("CCI_short: ", CCI_short, entry_short, " Bid: ", Bid);
                                                              i_CCI_short = 0;
                                                              CCI_short = 0;
                                                            }
return;      

}
 
 
void CheckForOpen()  
{
int res;
if(prevtime == Time[0]) return;

CheckForEntry();


if (order_long == 0 && order_short == 0 && entry_long == 1)
        {
         res=OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,
                    Bid-PointX()*Stopp,Ask+PointX()*Profit,"long",MagicNumber,0,Green);
                                        
         Kauf = Ask;
         order_long = 1; Stop_1 = 0; i_Stop_long = 0; i_entry_long = 1;
     //    Alert ("res-long: ", res, " Ask: ", Ask, " Kauf: ", Kauf);
         prevtime = Time[0]; return;
        }
        
if (order_short == 0 && order_long == 0 && entry_short == -1)
        {
         res=OrderSend(Symbol(),OP_SELL,lot,Bid,Slippage,
                    Ask+PointX()*Stopp,Bid-PointX()*Profit,"short",MagicNumber,0,Red);
         Kauf = Bid;
         order_short = 1; Stop_1 = 0; i_Stop_short = 0; i_entry_short = 1;
   //      Alert ("res-short: ", res, " Bid: ", Bid, " Kauf: ", Kauf); 
         prevtime = Time[0]; return; 
        }
    
        
}  
 
 
 
 
void CheckForExit() 
{
 Osma5_Diff0 = 10000*(iOsMA(NULL,5,12,26,9,PRICE_CLOSE,0)-iOsMA(NULL,5,12,26,9,PRICE_CLOSE,1));
 Osma1_Diff0 = 10000*(iOsMA(NULL,1,12,26,9,PRICE_CLOSE,0)-iOsMA(NULL,1,12,26,9,PRICE_CLOSE,1));
 MACD5_Diff0 = 10000*(iMACD(NULL,0,12,26,9,PRICE_TYPICAL,MODE_MAIN,0) - iMACD(NULL,0,12,26,9,PRICE_TYPICAL,MODE_MAIN,1));
 MACD5_Diff1 = 10000*(iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1) - iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2));
 
 if (order_long == 1) 
{ 
  Profit = Bid - Kauf;
  Pip = Profit / PointX();
  
  if(Osma1_Diff0 > 0 || Osma5_Diff0 > 0 || MACD5_Diff0 > 0) 
                                      { Stop0 = Pip;
                                        Alert("Stop0: ", Stop0, " Stop_1: ", Stop_1);
                                        if(Stop0 > Stop_1) {Stop_1 = Stop0;
                                                            Alert ("Stopp_long: ", Stop_1);
                                                            if(Stop_1 > 3) Stop = 3; 
                                                           }
                                      }
  Stop_exit = Stop_1 - 6;
  if(entry_short == -1 || Pip < Stop_exit || Pip <= Stop) {exit_long = 1;
  Alert ("entry_short: ", entry_short, " Pip: ", Pip, " Stop_exit: ", Stop_exit, " Stop: ", Stop); 
  }
}
 
 if (order_short == 1) 
{
 Profit = Kauf - Ask;
 Pip = Profit / PointX();
  
 if(Osma1_Diff0 < 0 || Osma5_Diff0 < 0 || MACD5_Diff0 < 0) 
                                      { Stop0 = Pip;
                                        Alert("Stop0: ", Stop0, " Stop_1: ", Stop_1);
                                        if(Stop0 > Stop_1) {Stop_1 = Stop0;
                                                            Alert ("Stopp_short: ", Stop_1);
                                                            if(Stop_1 > 3) Stop = 3; 
                                                           }
                                      }
  Stop_exit = Stop_1 - 6;
  if(entry_long == 1 || Pip < Stop_exit || Pip <= Stop) {exit_short = 1;
  Alert ("entry_long: ", entry_long, " Pip: ", Pip, " Stop_exit: ", Stop_exit, " Stop: ", Stop); 
  } 
}
}
 
void CheckForClose()  
{
  if (order_long == 1 || order_short == 1) CheckForExit();
  for(int i=0;i<OrdersTotal();i++)
  {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)     break;
      if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;    

  
  if (OrderType()==OP_BUY && order_long == 1 && exit_long == 1)                        //&& OrderType()==OP_BUY
     {  Alert("Verkauf long: ",exit_long, ", Bid: ", Bid);
        order_long = 0; exit_long = 0; i_Stop_long = 0; entry_long = 0; i_entry_long = 0;
        
        OrderClose(OrderTicket(),lot,Bid,Slippage,Red);
         return(0);
        
        
     }
  
  if (OrderType()==OP_SELL && order_short == 1 && exit_short == 1)                        //&& OrderType()==OP_SELL
     {  Alert("Verkauf short: ",exit_short, ", Ask: ", Ask);
        order_short = 0; exit_short = 0; i_Stop_short = 0; entry_short = 0; i_entry_short = 0;
        
        OrderClose(OrderTicket(),lot,Bid,Slippage,Green);
         return(0);
     } 
  }   
}  
 
 
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
//----
  
  if(CalcCurOrd()==0) CheckForOpen();
  if(CalcCurOrd()!=0) CheckForClose();
  
  
  
//----
  return(0);
 }
//+------------------------------------------------------------------+

Habe den Quelltext auch als Datei angehängt.

Wäre sehr schön, wenn da ein "Versierter" mich aufklären könnte.Test26.mq4

Bearbeitet von Henrik
Codetags gesetzt

Featured Replies

Geschrieben
Der EA, den ich mir gebastelt habe, habe ich als Demo laufen lassen. Im Journal erkenne ich, daß er entsprechende Signale liefert.

Bei einem Bachtest scheitere ich aber immer wieder wieder kläglich.

Was ist hier grundsätzlich falsch?

 

Ich weiß, es ist immer wieder fies, wenn Fragen mit Gegenfragen beantwortet werden, aber:

Inwiefern "scheiterst" du beim Backtest?

Werden keine Trades angezeigt obwohl das Journal sagt das getraded wird? In dem Fall die erste Frage: Tust du backtesten oder optimieren? könntest du einen kurzen Auszug des Journals posten, würde sicher einiges vereinfachen.

Oder ist das Problem das die Performance negativ ist? Sprich gehts um ein "technisches"/programmiertechnisches Problem, oder ein Strategietechnisches?

 

Rein vom Code her ist es leider schwer zu sagen wo das/ob überhaupt ein Problem liegt. Da wär eine detailiertere Problembeschreibung hilfreich.

 

hth

Geschrieben

...und noch eine Frage.

Der EA, den ich mir gebastelt habe, habe ich als Demo laufen lassen. Im Journal erkenne ich, daß er entsprechende Signale liefert.

Meinst du mit "liefert Signale", dass er eigentlich einsteigen müßte, weil im Journal eine Meldung ausgegeben wird, er das aber nicht tut, oder meinst du damit, dass er im Demo wirklich eine Position öffnet und das nur beim Backtest nicht klappt?

Geschrieben
  • Autor

Hier ein kurzer Auszug des Journals:

 

2010.09.02 16:39:41 2010.06.23 04:10 Test27 EURUSD,M5: OrderSend error 130

2010.09.02 16:39:41 2010.06.23 01:20 Test27 EURUSD,M5: close #1 sell 0.10 EURUSD at 1.2273 sl: 1.2305 tp: 1.2223 at price 1.2281

2010.09.02 16:39:41 2010.06.23 01:16 Test27 EURUSD,M5: open #1 sell 0.10 EURUSD at 1.2273 sl: 1.2305 tp: 1.2223 ok

2010.09.02 16:39:41 Test27 inputs: Start_Trailing_Stop=-15;

2010.09.02 16:39:41 TestGenerator: unmatched data error (low value 1.2660 at 2010.08.31 20:55 is not reached from the least timeframe, low price 1.2661 mismatches)

2010.09.02 16:39:41 TestGenerator: unmatched data error (high value 1.2725 at 2010.08.30 11:10 is not reached from the least timeframe, high price 1.2724 mismatches)

2010.09.02 16:39:41 TestGenerator: unmatched data error (high value 1.2767 at 2010.08.27 17:25 is not reached from the least timeframe, high price 1.2766 mismatches)

2010.09.02 16:39:41 TestGenerator: unmatched data error (high value 1.2764 at 2010.08.27 17:20 is not reached from the least timeframe, high price 1.2763 mismatches)

2010.09.02 16:39:41 TestGenerator: unmatched data error (low value 1.2670 at 2010.08.24 18:45 is not reached from the least timeframe, low price 1.2671 mismatches)

2010.09.02 16:39:41 TestGenerator: unmatched data error (low value 1.2670 at 2010.08.24 18:30 is not reached from the least timeframe, low price 1.2671 mismatches)

2010.09.02 16:39:41 TestGenerator: unmatched data error (volume limit 10 at 2010.08.20 21:55 exceeded)

 

Es tradet nicht. Unsympatisch sind mir auch die Datenfehler, die sich noch eine ganze Stange fortsetzen.

Im Demo habe ich mir durch Printanweisung die generierten Signale anzeigen lassen. Diese hätten dann zum Öffnen oder schließen einer Position geführt.

Mit OrderSend() und OrderClose() scheitere ich im Backtest aber kläglich.

Geschrieben

wieso einen trade machst du doch offensichtlich :)

 

OrderSEndError 130 =

ERR_INVALID_STOPS 130 Stops are too close, or prices are ill-calculated or unnormalized (or in the open price of a pending order). The attempt can be repeated only if the error occurred due to the price obsolescense. After 5-second (or more) delay, it is necessary to refresh data using the RefreshRates function and make a retry. If the error does not disappear, all attempts to trade must be stopped, the program logic must be changed.

 

Könnte eventuell am normalisieren liegen?

Wenn ich mir die Ausgaben so anschaue scheinst du zu hohe oder zu nierige Werte fürs Kaufen/Verkaufen anzugeben. Wie viel slippage lässt du denn zu?

 

edit:

scheint nen bug zu sein?

http://forum.mql4.com/20273

http://forum.mql4.com/14612

Bearbeitet von Quickbeam2k1

Geschrieben

Dein Problem liegt in der Variablen „Profit“.

Du hast zuerst diesen Wert mit 50 belegt

Profit=50

Und sendest des in deiner SendOrder als Profitwert ab

„OrderSend(Symbol(),OP_BUY,lot,Ask,Slippage,Bid-PointX()*Stopp,Ask+PointX()*Profit,"long",MagicNumber,0,Green);”

 

Du brauchst also eine ganze Zahl.

In der Funktion "CheckForExit()“ gibst du Profit aber einen kleinen doublewert

Profit = Bid - Kauf;“ wäre hier bei eur/usd irgendwas mit 1,2836 und "Kauf" entspricht ein Askwert also auch irgendeine kleine doublezahl.

 

Sobald er also deine erste Posi schliesst und eine zweite aufmachen will nimmt er nun als Profit:

1,2850+0,0001*0,0020-> dein Profit ist nicht mal 1 pip von deinem Einstiegskurs entfernt

Geschrieben
  • Autor

Hallo, siscop,

 

du hast den Finger genau in die richtige Wunde gelegt.

Mein Programm hat zwar noch mehr Macken, vielleicht habe ich auch nicht die richtige Strategie, aber der Backtest läuft erst mal.

Plups und danke.

Vielleicht kannst du auch mit dieser Meldung etwas anfangen, die zum Start des Backtest als ganzes Paket kommt.

 

2010.09.02 19:07:20 TestGenerator: unmatched data error (volume limit 61 at 2010.08.05 17:25 exceeded)

 

Und, obwohl der Zeitraum bis heute eingestellt ist, wird mit folgender Meldung eher abgebrochen:

 

2010.09.02 19:19:29 2010.07.12 00:01 Test27 EURUSD,M5: OrderSend error 4107

2010.09.02 19:19:29 2010.07.12 00:01 Test27 EURUSD,M5: invalid price 1.26443000 for OrderSend function

2010.09.02 19:19:29 2010.07.09 20:11 Test27 EURUSD,M5: close #180 sell 0.10 EURUSD at 1.2642 sl: 1.2674 tp: 1.2592 at price 1.2644

2010.09.02 19:19:29 2010.07.09 20:11 Test27 EURUSD,M5: open #180 sell 0.10 EURUSD at 1.2642 sl: 1.2674 tp: 1.2592 ok

 

Ich weiß, man soll auch selbst was rausfinden. Aber in der Schule konnte ich auch den Lehrer fragen.

Geschrieben

zum 2010.09.02 19:07:20 TestGenerator: unmatched data error (volume limit 61 at 2010.08.05 17:25 exceeded)

das wirst du immer wieder haben. Ich lebe auch damit. Habe bisher noch keine Nachteile damit feststellen können und ich trade schon einige Zeit mit MT4.

 

zum OrderSend error 4107

Es heisst dass dein angegebener Preis kein gültiger Preis ist. Ich weiss jetzt natürlich nicht woher dieser Preis von 1.26443 kommt. Der hat 5 Nachkommastellen wobei dein Broker wahrscheinlich nur 4 Nachkommastellen haben will.

Befehl

"NormalizeDouble(Preis,4)" stellt sicher dass deine Variable "Preis" wirklich nur 4-Nachkommastellen hat.

Geschrieben

2010.09.02 19:07:20 TestGenerator: unmatched data error (volume limit 61 at 2010.08.05 17:25 exceeded)

 

Das mit dem TestGenerator error ist recht ärgerlich.

 

Genau heißt das, dass das Tick-Volumen, das der Strategietester aus den Minutendaten generiert nicht mit denen der Minutendaten zusammenpasst (obwohl er diese ja selbst erzeugt).

 

Der Fehler kommt immer wieder mal. Das geht soweit, dass hin und wieder die history für einen Wert teilweise verloren geht.

Ich hab noch nicht nachvollziehen können, woran das liegt, tippe aber auf einen MT4 Bug.

 

Lösen kannst du das, wenn du zu dem Wert über das History-Center einfach die history zu diesem Wert nochmal downloadest.

 

Der 4107-Fehler sollte mit Siscops Lösung zu beheben sein.

 

Generell möchte ich aber noch was zu deinen gesetzten SL/TP sagen.

Ich persönlich finde es als sympatischer, den SL vom EA zu überwachen lassen und am Server (also per OrderSend) nur einen sog. Katastrophenstop, weit vom Kurs enfernt, zu hinterlegen.

Das macht das Programm um einiges flexibler.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.