Warum liefert mein EA beim Backtesting immer wieder negative Gewinne? - Seite 4

 

Dies ist mein letzter Code. kann nicht denken, etwas falsch, außer es ist nicht geben mir die Ergebnisse, die ich will

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <stderror.mqh>
#include <stdlib.mqh>


extern int RSIPeriod        =  2;      //number of periods for RSI
extern double UpperBound    =  95;     //set upper bound value for RSI
extern double LowerBound    =  5;      //set lower bound value for RSI

extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;



//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
  Alert(OrdersTotal());

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket1;
   int Ticket2;
   bool Ticket3;
   bool Ticket4;
   
   double SL,TP;
   int Total;
   double MagicNo;
   double Slippage;
    int cnt;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 1440, 200, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 1440, 5, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,0);
   double PrevRSI =  iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,1);
   double LastRSI = iRSI (NULL, 0, RSIPeriod,PRICE_CLOSE ,2);
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }



//Check for open orders if there are none then check for conditions to open one

      if (OrdersTotal() ==0 && LastRSI > PrevRSI && PrevRSI > CurrentRSI && CurrentRSI < LowerBound && pAsk > MA200) {    //Condition to execute buy entry
  
        Ticket1 = OrderSend(Symbol(), OP_BUY, Lots, pAsk, Slippage.Pips, pBid - ( StopLoss * Point ), pAsk + ( TakeProfit * Point ), "Buy.", MagicNumber,0,Yellow);       //execute buy order
   
    if(Ticket1>0)
           {
            if(OrderSelect(Ticket1,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("BUY order opened : ",OrderOpenPrice());
            
           }
         if (Ticket1 < 0) {
         Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
   }  
  

  if (OrdersTotal() ==0 && LastRSI < PrevRSI && PrevRSI < CurrentRSI && CurrentRSI > UpperBound && pBid < MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend(Symbol(), OP_SELL, Lots, pBid, Slippage.Pips, pAsk + ( StopLoss * Point ), pBid - ( TakeProfit * Point ), "Sell.",MagicNumber, 0, Yellow)  ;     //execute sell order
       if(Ticket2>0)
           {
            if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) 
               Print("SELL order opened : ",OrderOpenPrice());
           
           }
         if (Ticket2<0) {
          Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
   } 
      
      }
 


   
    int ticket=OrderTicket();
    double lots=OrderLots();
   
   
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
   
      if (OrderSelect(i, SELECT_BY_POS))
      {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {


         if (OrderType() == OP_BUY && pBid > MA5)
         {
          Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips);
          
          if (Ticket3 == true ) {
          Print("BUY position closed", OrderClosePrice());
          }
          if (Ticket3 == false) {
          Print("Error closing BUY position", ErrorDescription(GetLastError()));
          }
          }
          
          if (OrderType() == OP_SELL && pBid < MA5)
          {
          Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips);
           if (Ticket4 == true ) {
          Print("SELL position closed", OrderClosePrice());
          }
          if (Ticket4 == false) {
          Print("Error closing SELL position", ErrorDescription(GetLastError()));
          }
    }
      }
      
   }
   }
   
   
   
        
        
           return(0);
}
 

Auf Seite 2 dieses Themas finden Sie, was ich Ihnen gegeben habe

//+------------------------------------------------------------------+
//|                                       RSI_strategy_cyxstudio.mq4 |
//|                                  Copyright 2013, Tjipke de Vries |
//|                                     https://forum.mql4.com/53695/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"


extern int RSIPeriod        =  3;      //number of periods for RSI//WHY DIDN't  YOU LEAVE THIS VALUE 3 
extern double UpperBound    =  90;     //set upper bound value for RSI//WHY DID YOU MAKE THIS TO 95
extern double LowerBound    =  5;      //set lower bound value for RSI
extern int MASlowPeriod     = 200;
extern int MAFastPeriod     = 5;
extern double Lots  = 0.1;
extern double StopLoss      = 60;       //Set the stop loss level
extern double TakeProfit    = 120;       //Set the take profit level
extern double TrailingStop = 40;
//extra settings for OrderSend
extern int        MagicNumber = 54333;
extern string     CommentEA = "RSI strategy";
extern int        Slippage.Pips    = 3;


int    BUYS=1,SELLS=1;                            //WHY DID YOU REMOVE THIS FROM YOUR CODE
//++++ These are adjusted for 5 digit brokers.
int     pips2points;      // slippage  3 pips    3=points    30=points
double  pips2dbl;         // Stoploss 15 pips    0.015      0.0150
int     Digits.pips;      // DoubleToStr(dbl/pips2dbl, Digits.pips)
//---
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----   
   if(Digits % 2 == 1)  // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
     {pips2dbl = Point*10; pips2points = 10;   Digits.pips = 1;}
     else {pips2dbl = Point;    pips2points =  1;   Digits.pips = 0;}
     // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl //WHY DID YOU REMOVE THIS       
//----      
//??    Alert(OrdersTotal());   //WHAT IS THIS DOING HERE  THIS IS NOT IN MY CODE
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int Ticket;
   double SL,TP;
   int Total;
   
   double pAsk = MarketInfo(Symbol(), MODE_ASK);
   double pBid = MarketInfo(Symbol(), MODE_BID);
   double MA200 = iMA(NULL, 1440, MASlowPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);  //200 day Moving Average   
   double MA5 = iMA(NULL, 1440, MAFastPeriod, 0,MODE_SMA,PRICE_CLOSE, 0);      //  5 day Moving Average
   double CurrentRSI = iRSI (NULL, 1440, RSIPeriod,PRICE_CLOSE ,0);
   //WHY DID YOU MAKE  PrevRSI and LastRSI  REMOVE IT IT IS NOT IN MY CODE
   
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   
   if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }


   if(OrdersTotal()<1)            //  WHY DID YOU REMOVE THIS
        {
         BUYS=0;
         SELLS=0;
        } 
 
28
cyxstudio2013.01.31 18:36
deVries:

Das ist der Anfang.....

Geben Sie Ihren Kommentar ..... über das, was ist anders als Ihre so weit...

Dann lies dir https://www.mql5.com/en/forum/139654 durch und versuche eine Schleife zu machen, die die Trades abwärts zählt.


Wie Sie sehen können, habe ich darum gebeten, eine Schleife zu erstellen, die abwärts zählt und den Handel überprüft.

Das ist mein nächster Schritt innerhalb des Codes

Ich bitte Sie nur um diesen Teil des Codes

Zählen Sie Kauf- und Verkaufstransaktionen getrennt

 
deVries:

Auf Seite 2 dieses Themas finden Sie, was ich Ihnen gegeben habe



Ich habe es entfernt, weil ich nicht wusste, wie man es benutzt. Sie haben mir den Code teilweise gegeben, aber ich konnte nicht sehen, wie er funktioniert.
 

--

 
deVries:

28
cyxstudio2013.01.31 18:36
deVries:

Das ist der Anfang.....

Geben Sie Ihren Kommentar ..... über das, was ist anders als Sie bisher...

Dann lesen Sie https://www.mql5.com/en/forum/139654 und versuchen Sie, eine Schleife zu machen, die abwärts zählt und die Trades überprüft.


Wie Sie sehen, habe ich darum gebeten, eine Schleife zu erstellen, die die Überprüfung der Trades abwärts zählt

Das ist mein nächster Schritt innerhalb des Codes

Ich bitte Sie nur um diesen Teil des Codes

Zählen Sie die Kauf- und Verkaufstransaktionen getrennt voneinander

so?

int ticket=OrderTicket();
double lots=OrderLots();
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {


//Auszuführende Codeblöcke

}
}

}

 
cyxstudio:

Ich habe es entfernt, weil ich nicht wusste, wie man es benutzt. Sie gaben mir den Code teilweise konnte ich nicht sehen, wie es funktioniert.
 if(OrdersTotal()<1)  
        {
         BUYS=0;
         SELLS=0;
        } 

In dem Moment, in dem der EA wieder startet

BUYS wird auf 1 gesetzt

SELLS wird auf 1 gesetzt

OrdersTotal() gibt die Summe aller offenen Trades auf Ihrem Konto an

Es kann Null sein, dann haben wir keine Trades offen und wir müssen nicht prüfen, ob es Trades von diesem EA gibt

WennOrdersTotal() > 0 BUYS bleibt 1 und SELLS bleibt 1

müssen wir in diesem Fall prüfen, ob es sich um unseren EA handelt und wir müssen die verschiedenen Typen zählen (buy,sell,buylimit....)

also

 
cyxstudio:

wie hier?

int ticket=OrderTicket();
double lots=OrderLots();
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {


//Auszuführende Codeblöcke

}
}

}

SRC-Schaltfläche verwenden

Diese Schleife starten wir nur (für welche Bedingung)

Woher wissen Sie, ob der ausgewählte Handel in der Schleife ein Kauf oder ein Verkauf ist?

Und wie zählen Sie sie?

 
deVries:

SRC-Taste verwenden

Diese Schleife wird nur gestartet (für welche Bedingung)

Woher wissen Sie, ob der ausgewählte Handel in der Schleife ein Kauf oder ein Verkauf ist?

Und wie werden sie gezählt?


opps.

 if (OrderType() == OP_BUY && pBid > MA5)
         {
          Ticket3 = OrderClose(ticket, lots, pBid, Slippage.Pips);
          
          if (Ticket3 == true ) {
          Print("BUY position closed", OrderClosePrice());
          }
          if (Ticket3 == false) {
          Print("Error closing BUY position", ErrorDescription(GetLastError()));
          }
          }
          
          if (OrderType() == OP_SELL && pBid < MA5)
          {
          Ticket4 = OrderClose(ticket, lots, pAsk, Slippage.Pips);
           if (Ticket4 == true ) {
          Print("SELL position closed", OrderClosePrice());
          }
          if (Ticket4 == false) {
          Print("Error closing SELL position", ErrorDescription(GetLastError()));
          }
    }
      }

für die Funktion des geschlossenen Handels.

Verwendung von

 if (OrderType() == OP_SELL && pBid < MA5)

um zwischen Kauf und Verkauf zu unterscheiden.

Ist irgendetwas falsch mit meinen Bedingungen zum Öffnen der Order?

if (OrdersTotal() == 0 )

Soll ich sie entfernen und durch die Schleife ersetzen, die ich für die Funktion "Geschlossener Auftrag" verwendet habe?

 
cyxstudio:


opps.

für die Funktion des geschlossenen Handels.

Verwendung von

um zwischen Kauf und Verkauf zu unterscheiden.

Ist irgendetwas falsch mit meinen Bedingungen zum Öffnen der Order?

Soll ich sie entfernen und durch die Schleife ersetzen, die ich für die Funktion "Geschlossener Auftrag" verwendet habe?

Zu diesem Zeitpunkt müssen Sie prüfen, ob bereits ein Handel geöffnet ist.

Bevor Sie einen Handel eröffnen, müssen Sie wissen, ob bereits ein Handel offen ist.

Ich kann immer noch nicht sehen, dass Sie das Zählen der Trades gemacht haben.

.

Werfen Sie einen Blick auf den Code des Moving Average EA auf Ihrer Metatrader Station und sehen Sie, wie es dort gemacht wird ....