EA'm neden tekrar test yaparken negatif kar sağlamaya devam ediyor?

 

Buradaki örnekle aynı EA'yı taklit ettim ve yazdım https://www.mql5.com/en/articles/1510 al/sell koşulları dışında

Alış pozisyonu açma koşulu: RSI 5'in altında VE Alış fiyatı 200 Günlük hareketli ortalamanın üzerinde, Satış fiyatı 5 günlük hareketli ortalamanın üzerinde olduğunda çıkın.

Satış pozisyonu açma koşulu: RSI 95'in üzerinde VE Alış fiyatı 200 Günlük hareketli ortalamanın altında, Alış fiyatı 5 günlük hareketli ortalamanın altında olduğunda çıkın.g

Testleri geri aldığımda, nedenini bilmediğim her seferinde negatif kar alıyorum. En iyi yanı, bazen bana 134 hatası veriyor, bu da yeterli paraya sahip olmadığım anlamına geliyor.

Ek olarak, shift ve ma_shift'in ne olduğunu ve bunları nasıl doldurmam gerektiğini öğrenebilir miyim? bu iRSI() göstergesi için gerekli bir parametre, ne yazacağımı bilmiyordum, bu yüzden ona 0 atadım.

işte kod

 //+------------------------------------------------------------------+
//|                                              My RSI strategy.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net"
#include <stderror.mqh> 
#include <stdlib.mqh>  
//All Variables here

extern double UpperBound    =   90 ;       //set upper bound value for RSI
extern double LowerBound    =   5 ;       //set lower bound value for RSI
extern double VarPeriod     =   2 ;       //number of periods
extern double BuyVolume     = 0.1 ;       //set buying volume(lots)
extern double SellVolume    = 0.1 ;       //set selling volume(lots)
extern double StopLoss      = 25 ;       //Set the stop loss level
extern double TakeProfit    = 25 ;       //Set the take profit level
extern double TrailingStop = 30 ;


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Alert ( "The minimum stoploss and take profit is " + MarketInfo( Symbol (),MODE_STOPLEVEL));
   double CurrentRSI;                   //Finds out the RSI for now
   double MA200;                       //200 day Moving Average           
   double MA5;                         //5 day Moving Average
   double CurrentAsk;                   //Finds out the Ask price now
   double CurrentBid;                   //Finds out the Bid price now
  
   
   CurrentAsk = MarketInfo( Symbol (), MODE_ASK);
   CurrentBid = MarketInfo( Symbol (), MODE_BID);
   MA200 = iMA ( NULL , 0 , 200 , 8 , MODE_SMA , PRICE_CLOSE , 0 );
   MA5 = iMA ( NULL , 0 , 5 , 8 , MODE_SMA , PRICE_CLOSE , 0 );
   CurrentRSI = iRSI ( NULL , 0 , VarPeriod, PRICE_CLOSE , 0 );
   
   Alert ( "Bid is " + CurrentBid);
   Alert ( "Ask is " + CurrentAsk);
   Alert ( "200 Day Moving Average is " + MA200); 
   Alert ( "5 Day Moving Average is " + MA5); 
   Alert ( "RSI Index is " + CurrentRSI);
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   
   double CurrentRSI;                   //Finds out the RSI for now
   double MA200;                       //200 day Moving Average           
   double MA5;                         //5 day Moving Average
   double CurrentAsk;                   //Finds out the Ask price now
   double CurrentBid;                   //Finds out the Bid price now
   int Ticket;
   int cnt;
   int Ticket2;
   int Total;
   
   CurrentAsk = MarketInfo( Symbol (), MODE_ASK);
   CurrentBid = MarketInfo( Symbol (), MODE_BID);
   MA200 = iMA ( NULL , 0 , 200 , 8 , MODE_SMA , PRICE_CLOSE , 0 );
   MA5 = iMA ( NULL , 0 , 5 , 8 , MODE_SMA , PRICE_CLOSE , 0 );
   CurrentRSI = iRSI ( NULL , 0 , VarPeriod, PRICE_CLOSE , 0 );
   
   
     if ( Bars < 100 )
     {
       Print ( "bars less than 100" );
       return ( 0 );  
     }
   
   if (AccountFreeMargin()<( 1000 *BuyVolume))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin());
         return ( 0 );  
        }
   
     if (CurrentRSI < LowerBound && MarketInfo( Symbol (), MODE_ASK) > MA200 ) {     //Condition to execute buy entry
  
        Ticket = OrderSend ( Symbol (), OP_BUY, BuyVolume, Ask, 3 , Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ), "Buy." , 111 , 0 ,Yellow)   ;       //execute buy order
   
     if (Ticket> 0 )
           {
             if ( OrderSelect (Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print ( "BUY order opened : " ,OrderOpenPrice());
           }
         if (Ticket < 0 ) {
         Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
   }
   return ( 0 );
  }
  
 
   if (CurrentRSI > UpperBound && MarketInfo( Symbol (), MODE_BID) > MA200) {     //Condition to execute sell entry
  
       Ticket2 = OrderSend ( Symbol (), OP_SELL, SellVolume, Bid, 3 , Ask + ( StopLoss * Point ), Bid - ( TakeProfit * Point ), "Sell." , 000 , 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 ); 
        }
       return ( 0 );
   
   } 
   
   Total= OrdersTotal ();
     for (cnt= 0 ;cnt<Total;cnt++)
  {
   OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
   if (OrderType()<=OP_SELL && OrderSymbol()== Symbol ())   // check for symbol and check for opened position 
     {
if (OrderType()==OP_BUY)   // long position is opened
{
   
   if (CurrentAsk > MA5){       //condition to close long position
    OrderClose(OrderTicket(),OrderLots(),Bid, 3 ,Violet); // close long position
   return ( 0 ); // exit
   
   if (TrailingStop> 0 )  
              {                 
               if (Bid-OrderOpenPrice()> Point *TrailingStop)
                 {
                   if (OrderStopLoss()<Bid- Point *TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Point *TrailingStop,OrderTakeProfit(), 0 ,Green);
                     return ( 0 );
                    }
                 }
              }
   
   }
   }
   
   if (OrderType()==OP_SELL)   // long position is opened
{
   if (CurrentBid < MA5){       //condition to close short position
   OrderClose(OrderTicket(),OrderLots(),Ask, 3 ,Violet); // close short position
   return ( 0 ); // exit
   }
   
   if (TrailingStop> 0 )  
              {                 
               if ((OrderOpenPrice()-Ask)>( Point *TrailingStop))
                 {
                   if ((OrderStopLoss()>(Ask+ Point *TrailingStop)) || (OrderStopLoss()== 0 ))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+ Point *TrailingStop,OrderTakeProfit(), 0 ,Red);
                     return ( 0 );
                    }
                 }
              }
   }
   }
   }
   
    
   
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 

RSI parametresi 0 olarak ayarlandı, sonuç yok. . . Hiç bir şey

RSI 0

En az 2

rsi 2

 

Her EA ve her Strateji karlı değildir

Strateji test cihazını kullanarak bunu görsel mod açıkken de yapın ve EA'da belirlediğiniz ayarlarla bulunduğunuz göstergeleri grafiğe yerleştirin.

   MA200 = iMA ( NULL , 0 , 200 , 8 , MODE_SMA , PRICE_CLOSE , 0 );
   MA5 = iMA ( NULL , 0 , 5 , 8 , MODE_SMA , PRICE_CLOSE , 0 );
   CurrentRSI = iRSI ( NULL , 0 , VarPeriod, PRICE_CLOSE , 0 );

Yukarıdaki değerleri her tikte hesaplıyorsunuz ve " ...., PRICE_CLOSE , 0 );" seçtiğiniz için her tik ile değişebilirler.

Test bittiğinde grafikte gördüğünüz değerler, bir işlem açıldığında sahip olduğunuz değerler değil...

   if (AccountFreeMargin()<( 1000 *BuyVolume))
        {
         Print ( "We have no money. Free Margin = " , AccountFreeMargin());
         return ( 0 );  
        }
   
     if (CurrentRSI < LowerBound && MarketInfo( Symbol (), MODE_ASK) > MA200 ) {     //Condition to execute buy entry
  
        Ticket = OrderSend ( Symbol (), OP_BUY, BuyVolume, Ask, 3 , Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ), "Buy." , 111 , 0 ,Yellow)   ;       //execute buy order
   
     if (Ticket> 0 )
           {
             if ( OrderSelect (Ticket,SELECT_BY_TICKET,MODE_TRADES)) 
               Print ( "BUY order opened : " ,OrderOpenPrice());
           }
         if (Ticket < 0 ) {
         Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
   }
   return ( 0 );
  }
  

Bir satın alma açmak için koşullar karşılandığında ve test cihazı bir satın alma açtığında, aynı koşulla açılmış bir tane var mı diye bir kontrol yoktur.

Bir satın alma işlemi açıldıktan sonra bir sonraki onay işareti tekrar bir ticaret açma koşuluna sahip olabilirsiniz.

Bu işlemlerin açılması, StrategyTester'da çalışabilir, ancak gerçek hesapta demoda gerçek zamanlı olarak,

test cihazında görmediğiniz hatalar alabilirsiniz. Örneğin, "3" Kaymayı seçmek, '5 haneli' hesapta işlem yapmak için çok düşük

OrderSend'in OrderStopLoss() ve OrdertakeProfit() > 0 değeriyle gönderilmesi ECN hesapları için başarısız olur

   Total= OrdersTotal ();
     for (cnt= 0 ;cnt<Total;cnt++)
  {
   OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
   if (OrderType()<=OP_SELL && OrderSymbol()== Symbol ())   // check for symbol and check for opened position 
     {
OrderSend'de ve işlemleri kontrol etmek için bu döngüde, OrderMagicNumber()'ınızı kullanmanızı özlüyorum.

ve döngünün geri saymak yerine yukarı doğru saydığını görüyorum, siz de gerekirse pozisyonları kapatmasını istiyorsunuz Yani başka bir hata

OrderModify, her Noktada olabilir, bu, tradecontext'in çok meşgul olması gibi broker hatalarına yol açabilir.

 
FXEWEN :

RSI parametresi 0 olarak ayarlandı, sonuç yok. . . Hiç bir şey

En az 2

iRSI periyodunu 2 olarak ayarladım....

 
cyxstudio :


Ek olarak, shift ve ma_shift'in ne olduğunu ve bunları nasıl doldurmam gerektiğini öğrenebilir miyim? bu iRSI() göstergesi için gerekli bir parametre, ne yazacağımı bilmiyordum, bu yüzden ona 0 atadım.


Bu bilgiyi nereden aldığından emin değilim ama yanlış. . .

iRSI() çift iRSI( string sembolü, int zaman çerçevesi, int periyodu, int uygulanan_fiyat, int shift)

belki iMA() demek istediniz? shift, MA'yı istediğiniz zamanın çubuk numarasıdır, ma_shift, MA değerini çubuk numarasına göre hareket ettirmenize izin verir, bu nedenle, ona 5'lik bir kayma ve -2'lik bir ma_shift verirseniz size MA'yı verecektir. bar 7 için, doğru olup olmadığımı kontrol etmek için bunu biraz denemeniz gerekir, prensipte öyleyim.


 
deVries :


Strateji test cihazını kullanarak bunu görsel mod açıkken de yapın ve EA'da belirlediğiniz ayarlarla bulunduğunuz göstergeleri grafiğe yerleştirin.

Yukarıdaki değerleri her tikte hesaplıyorsunuz ve " ...., PRICE_CLOSE , 0 );" seçtiğiniz için her tik ile değişebilirler.


" ...., PRICE_CLOSE , 0 );" kaydırma değeri için ne seçmeliyim? sonra?

 
cyxstudio :

" ...., PRICE_CLOSE , 0 );" kaydırma değeri için ne seçmeliyim ? sonra?

Stratejiniz neyi gerektiriyor? bunu kullan. İsterseniz çubuk 0'ı kullanın, ancak PRICE_CLOSE, Kapat[0] ( 0 çubuğunun kapanış fiyatı ) == Teklif kullansanız bile "yeniden boyayacaktır". Çubuk 0 nihayet kapandığında artık Çubuk 0 değil, Çubuk 1 olur.
 
deVries :

Her EA ve her Strateji karlı değildir

Strateji test cihazını kullanarak bunu görsel mod açıkken de yapın ve EA'da belirlediğiniz ayarlarla bulunduğunuz göstergeleri grafiğe yerleştirin.

Yukarıdaki değerleri her tikte hesaplıyorsunuz ve " ...., PRICE_CLOSE , 0 );" seçtiğiniz için her tik ile değişebilirler.

Test bittiğinde grafikte gördüğünüz değerler, bir ticaret açıldığında sahip olduğunuz değerler değil...

Bir satın alma açmak için koşullar karşılandığında ve test cihazı bir satın alma açtığında, aynı koşulla açılmış bir tane var mı diye bir kontrol yoktur.

Bir satın alma işlemi açıldıktan sonra bir sonraki onay işareti tekrar bir ticaret açma koşuluna sahip olabilirsiniz.

Bu takasların açılması, StrategyTester'da çalışabilir, ancak gerçek hesapta demoda gerçek zamanlı olarak,

test cihazında görmediğiniz hatalar alabilirsiniz. Örneğin, "3" Kaymayı seçmek, '5 haneli' hesapta işlem yapmak için çok düşük

OrderSend'in OrderStopLoss() ve OrdertakeProfit() > 0 değeriyle gönderilmesi ECN hesapları için başarısız olur

OrderSend'de ve işlemleri kontrol etmek için bu döngüde, OrderMagicNumber()'ınızı kullanmanızı özlüyorum.

ve döngünün geri saymak yerine yukarı doğru saydığını görüyorum, siz de gerekirse pozisyonları kapatmasını istiyorsunuz Yani başka bir hata

OrderModify, her Noktada olabilir, bu, tradecontext'in çok meşgul olması gibi broker hatalarına yol açabilir

Her şeyi yeniden yaptım ve döngüyü, kaymayı düzelttim, hareketli ortalamayı ve RSI değerlerini düzelttim, yeni pozisyona başlamadan önce her açık pozisyonun kapatıldığından emin oldum. ama tekrar test ettiğimde hiçbir şey olmuyor, alım/satım yapılmadı... yine sorun ne?

 //+------------------------------------------------------------------+
//|                                                My Strategy 4.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net"

extern double StopLoss = 40 ;
extern double TakeProfit = 40 ;
extern double Lots = 0.1 ;
extern double Slippage = 10 ;
extern double RSINow;
extern double MA200;
extern double MA5;
extern bool A1 = false ;
extern bool A2 = false ;
extern int Ticket;
extern int Ticket2;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+ 
int init()
  {
//----
   Alert ( "Minimum Stop Level is " + MarketInfo( Symbol (), MODE_STOPLEVEL)); //find out minimum stop loss
   
   RSINow = iRSI ( NULL , 1440 , 2 , PRICE_CLOSE , 0 );			//calculates the RSI value for 2 days
   MA200 = iMA ( NULL , 1440 , 200 , 0 , MODE_SMA , PRICE_CLOSE , 0 );		//calculates the moving average for 200 days
   MA5 = iMA ( NULL , 1440 , 5 , 0 , MODE_SMA , PRICE_CLOSE , 0 );     		//calculates the moving average for 5 days
   Alert (RSINow);
   Alert (MA200);
   Alert (MA5);
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

   
   
   //check if a long position is possible, A is false means no buy trade is open , execute buy when RSI drops below 5 and when Ask price rises above 200 day moving average
   if (A1 == false && RSINow < 5 && Ask > MA200) {
   
   Ticket = OrderSend ( Symbol (), OP_BUY, Lots, Ask, Slippage, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ));
   
   if (Ticket> 0 ) {
             if ( OrderSelect (Ticket,SELECT_BY_TICKET,MODE_TRADES)) {
               Print ( "BUY order opened : " ,OrderOpenPrice());
               A1 = true ;
           }
         if (Ticket < 0 ) {
         Print ( "Error opening BUY order : " , GetLastError ()); 
         return ( 0 ); 
   }
   }
   } 
   
   
   
     //check if a short position is possible, A2 is false means no sell trade is open , execute sell when RSI rises above 95 and when Bid price drops below 200 day moving average

   if (A2 == false && RSINow > 95 && Bid < MA200) {
   
   Ticket2 = OrderSend ( Symbol (), OP_BUY, Lots, Bid, Slippage, Ask + ( StopLoss * Point ), Bid - ( TakeProfit * Point ));
   if (Ticket2> 0 ) {
             if ( OrderSelect (Ticket2,SELECT_BY_TICKET,MODE_TRADES)) {
               Print ( "SELL order opened : " ,OrderOpenPrice());
               A2 = true ;
           }
         if (Ticket2 < 0 ) {
         Print ( "Error opening SELL order : " , GetLastError ()); 
         return ( 0 ); 
         }
   }
   
   } 
   
   
   //check if buy position can be closed, once Ask price rises above 5 day moving average, its time to close the position.
   
   if ((A1 == true ) && (Ask > MA5)) {
   OrderClose(Ticket, Lots, Bid, Slippage, Violet);
   A1 = false ;
   return ( 0 );
   }
   
   
   
   
   //check if sell position can be closed, if Bid price drops below 5 day moving average, close sell position.
   
   if ((A2 == true ) && (Bid < MA5)) {
   OrderClose(Ticket2, Lots, Bid, Slippage, Violet);
   A2 = false ;
   return ( 0 );
   }
   
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
cyxstudio :

Her şeyi yeniden yaptım ve döngüyü, kaymayı düzelttim, hareketli ortalamayı ve RSI değerlerini düzelttim, yeni pozisyona başlamadan önce her açık pozisyonun kapatıldığından emin oldum. ama tekrar test ettiğimde hiçbir şey olmuyor, alım/satım yapılmadı... yine sorun ne?


hayır döngü sabit değil, sorun daha büyük olduğu için kaldırıldı

. ticaretin açıldığı anda gerçek değeri alan A1 ve A2 kullanıyorsunuz

ama bilgisayarınızın güç kaynağı düşerse ve bilgisayarınızı ve metatrader'ınızı yeniden başlatmanız gerekirse ne olur.

EA'nızdan açık işlemler olup olmadığını o anı kontrol etmelisiniz .

Bunu nasıl yapacaksın ????

İşlemlerinizi daha kolay açmak ve kontrol etmek için belirli bir OrderMagicNumber'ı kullanın

.

hareketli ortalama şimdi gelecekte bazı çubukları hareket ettirmiyor tamam

ancak bunu yalnızca init() bölümünde hesaplarsınız, bu yalnızca Uzman Danışmanınızı başlatırken çalışır

Start()'ta özlüyorum .... Onu neden orada kaldırdınız ???

.

 

Kodunuzu yeniden yazdınız ve bir test denediniz, ayrıca ayarlara bakın

En iyi geriye dönük test verileriyle değil ama doğru yaparsanız karlı olabilir

Strateji Test Kullanıcısı Raporu
RSI_strategy_cyxstudio
AlpariUK-Demo - Mikro+Klasik (Derleme 451)

sembol EURUSD (Euro vs ABD Doları)
Dönem Günlük (D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30)
modeli Her onay işareti (mevcut tüm minimum zaman dilimlerini temel alan en kesin yöntem)
parametreler RSIPeriyodu=3; UpperBound=90; Alt Sınır=5; MASlowPeriod=200; MAFastPeriod=5; sürü = 0.1; StopLoss=60; Kâr Al=120; İzleyenDurdur=40; SihirliSayı=54333; CommentEA="RSI stratejisi"; Slippage.Pips=3;
Testteki çubuklar 1603 Modellenmiş keneler 40187739 modelleme kalitesi n/a
Uyumsuz grafik hataları 2062601
İlk para yatırma 3000.00
Toplam net kar 967.18 Brüt kazanç 2226.34 Brüt kayıp -1259.16
kar faktörü 1.77 Beklenen getiri 13.62
Mutlak düşüş 107.10 maksimum düşüş 327,47 (%7,99) göreceli düşüş %7,99 (327,47)
Toplam işlemler 71 Kısa pozisyonlar (kazanılan %) 66 (%69,70) Uzun pozisyonlar (% kazandı) 5 (80,00%)
Karlı işlemler (toplamın yüzdesi) 50 (%70,42) Zarar işlemleri (toplamın yüzdesi) 21 (%29,58)
En büyük kar ticareti 120.07 zarar ticareti -60.00
Ortalama kar ticareti 44.53 zarar ticareti -59.96
Maksimum ardışık kazançlar (para olarak kar) 8 (424,26) ardışık kayıplar (para kaybı) 3 (-179.93)
maksimum ardışık kar (kazanç sayısı) 424.26 (8) ardışık kayıp (kayıp sayısı) -179.93 (3)
Ortalama ardışık kazançlar 4 ardışık kayıplar 2

 
deVries :

Kodunuzu yeniden yazdınız ve bir test denediniz, ayrıca ayarlara bakın

En iyi geriye dönük test verileriyle değil ama doğru yaparsanız karlı olabilir


Toplam işlemler 71 Kısa pozisyonlar (kazanılan %) 66 (%69,70) Uzun pozisyonlar (% kazandı) 5 (80,00%)





Bu bana doğru olmayan bir şeyler olduğunu düşündürür.
Neden: