Küçük Para Yönetimi Göstergesi, yeni MQL4 tarafından mahvoldu

 

Hey kodlayıcılar,

Benim için iyi çalışan küçük bir Moneymanagement göstergesi yaptım. Ancak yeni MQL4'ten beri baş edemediğim sorunlara neden oluyor.

Bu göstergeyi grafiğinize sürüklediğinizde, en sağ tarafta bazı sayılar yazdırılır. İlk sayı, pip cinsinden Stoploss'u, ikincisi ise lot boyutunu ifade eder. Seçeneklerde riski seçebilirsiniz. Diğer sayı Stoploss Seviyeleridir. Ancak döviz çiftini değiştirdiğimde sayılar kayboluyor. Bunun yerine birkaç kez "Etiket" kelimesini görüyorum. Ve gösterge listesine baktığımda göstergem de gitti. Özetle, döviz çiftini değiştirdikten sonra gösterge gitti ve sayılar yerine Etiketler bıraktı.

tamamen kafam karıştı. Bu gösterge sorunsuz çalışıyordu. Yardım çok takdir edilmektedir.

İşte kod:

 #property indicator_chart_window
//--- input parameters
extern int   Risk= 2 ;
extern int SL_Levels= 20 ;
int multi, exp , SL, i, k;
double MoneyRisk, Spread, _modifySpread, lots;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   k= 0 ;
   for (i= 1 ; i<=SL_Levels; i++)
   {
       if ( ObjectFind ( "SL" +i) == - 1 )
      {
         ObjectCreate ( "SL" +i, OBJ_LABEL , 0 , 0 , 0 );
         ObjectSet ( "SL" +i, OBJPROP_CORNER , 1 );
         ObjectSet ( "SL" +i, OBJPROP_XDISTANCE , 3 );
         ObjectSet ( "SL" +i, OBJPROP_YDISTANCE , k);
         k=k+ 15 ;    
      }
   }
   if ( ObjectFind ( "Spread" ) == - 1 )
   {
       ObjectCreate ( "Spread" , OBJ_LABEL , 0 , 0 , 0 );
       ObjectSet ( "Spread" , OBJPROP_CORNER , 3 );
       ObjectSet ( "Spread" , OBJPROP_XDISTANCE , 3 );
       ObjectSet ( "Spread" , OBJPROP_YDISTANCE , 1 );
   }
   
//-- 4 / 5 Digit Settings --
   multi   = 1 ;
   exp      = 0 ;
   if ( Digits == 5 || Digits == 3 )
   {
      _modifySpread = 0.1 ;
      multi= 10 ;
       exp = 1 ;
   }
//----
   SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for (i= 1 ; i<=SL_Levels; i++)
   {
       ObjectDelete ( "SL" +i);
   }
   ObjectDelete ( "Spread" );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   Spread     = MarketInfo ( Symbol (), MODE_SPREAD )*_modifySpread;
   MoneyRisk  = AccountBalance ()*Risk* 0.01 ;
   k= 0 ;
   for (i= 1 ; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
       ObjectSetText ( "SL" +i, SL+ " : " + DoubleToStr (lots, 2 ), 10 , "Calibri" , Red);
      k=k+ 15 ;
      SL = SL+ MathFloor ((( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 )/ 2 );     
   }
   SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );
   ObjectSetText ( "Spread" , DoubleToStr (Spread, 1 ), 10 , "Calibri" , Red);
   WindowRedraw ();
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 

ilk önce , ayrılmış bir int için "exp" kullanamazsınız

ikinci olarak "SL" yi ifade edersiniz

SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );

init bölümünde, kötü fikir

çünkü 4066 Hatası alırsanız "SL" = 0

o zaman "lotlarda" sıfır pay alırsınız

lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);

ve gösterge durur ve göstergeyi yeniden yüklemeniz gerekir

 
Anladım. Sadece exp değişkenini değiştirdim, ancak 4066 hatasını nasıl kontrol edeceğimi veya önleyeceğimi söyleyebilir misiniz? Bunun MetaTrader'ın yalnızca mevcut grafik ve zaman diliminin alıntılarını güncellemesiyle ilgili olduğunu okudum. Ancak 4066'dan kaçınmak için ne yapmayı önerirsiniz?
 

açıkçası güncellemeden kaçamazsınız ;-) ama " sıfır bölme " durumundan kaçınmalısınız

bu yüzden sıfır bölmeden kaçınmanız durumunda değişkenlerden birinin 0'a eşit olup olmadığını kontrol etmelisiniz.

ve bir göstergeyi durduramayacağınız için bir şey bulmanız gerekir.

misal:

SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );
if (SL == 0 ) // because error 4066 (for example)
   {
   SL = Someting;
   }
lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
 

Haklısın.. Bundan kaçamam. :-)

Demek istediğim, SL hesaplamasına geçmeden önce güncellemenin tamamlanmasını bekleyebilir miyim? Sorun şu ki, SL'ye rastgele bir değer veremem çünkü o zaman tüm gösterge işe yaramaz. Bu yüzden 4066 hatasını kontrol etmek istiyorum ve eğer oluşursa, devam etmeden önce bir şekilde bekleyip tekrar kontrol etmek istiyorum.

 

Bu arada, bu göstergeyle aynı sorunu yaşıyorum. Ama neden "eski" MetaTrader'da bir sorun değildi? Burada ATR(5) için her zaman sıfır alıyorum. NİYE YA?!?! Bu daha önce hiç olmadı.. Bu yeni MetaTrader'dan nefret ediyorum...!

 int start()
//----
  {
   double Spread = MarketInfo ( Symbol (), MODE_SPREAD );
   double ATR = iATR ( NULL , PERIOD_D1 , 5 , 0 );
   int exp1 = 0 ;
   if ( Digits == 5 || Digits == 3 )
   {
      Spread=Spread* 0.1 ;
      exp1 = 1 ;
   }
   Comment   (
             "ADR(5): " , DoubleToStr (ATR* MathPow ( 10 , Digits -exp1), 1 ),
             " || TODAY: " ,( iHigh ( NULL , PERIOD_D1 , 0 )- iLow ( NULL , PERIOD_D1 , 0 ))* MathPow ( 10 , Digits -exp1),
             " || " , DoubleToStr ((( iHigh ( NULL , PERIOD_D1 , 0 )- iLow ( NULL , PERIOD_D1 , 0 ))* MathPow ( 10 , Digits -exp1)/(ATR* MathPow ( 10 , Digits -exp1))* 100 ), 2 ), "%" ,
             "\n" +
             "SPREAD: " , Spread,
             " || RATIO: " , DoubleToStr ((Spread/ATR)* MathPow ( 10 ,-( Digits -exp1- 2 )), 2 ), "%"
            );
//----
   return ( 0 );
  }
 
sıfır derken? Tüm yorumları yazdırıyorum ve ATR(5) sıfırdan büyük çıktı gösteriyor ... aslında 50'nin üzerinde ...
 

Sanırım sorunu buldum! Kesinlikle bir güncelleme sorunudur. Şimdi para birimlerini değiştirdiğimde gösterge çalışıyor. Ama sonra bugün henüz açmadığım bir döviz çiftini açtım. Sonra şu mesajı aldım:


Bugün henüz açmadığınız bir çift açın. D1 dışında istediğiniz zaman dilimine geçin. Ardından göstergeyi grafiğinize sürükleyin. Sonuç yukarıdaki gibi bir hata olacaktır. Bana öyle geliyor ki, günlük grafiğin ATR(5)'i eksik GÜNLÜK VERİLER nedeniyle doğru değil. D1 zaman diliminde "taze" bir grafik açmak hiçbir soruna neden olmaz. Ve başka bir zaman dilimine geçtiğinizde, ATR(5) doğru olduğu için de sorun olmaz. D1 tablosunda kaldığım sürece herhangi bir çifte geçebileceğimi fark ettim. Ancak MetaTrader günlük verileri almadığı sürece D1 dışındaki zaman dilimlerinde başka çiftlere geçmek sorun yaratır. Şimdi sorum şu, D1 olmayan bir zaman diliminde yeni bir grafik açtığımda ATR hesaplamamın doğru olduğuna dair günlük verileri nasıl alabilirim?
 

gibi bir şey koymalısın

 if ( number== 0 )dothis; else dothis; 

ShowSpread.mq4'te


Sadece bu sıfır bölünmenin gerçekleştiği satırı arayın.

 
mar :

Sanırım sorunu buldum! Kesinlikle bir güncelleme sorunudur. Şimdi para birimlerini değiştirdiğimde gösterge çalışıyor. Ama sonra bugün henüz açmadığım bir döviz çiftini açtım. Sonra şu mesajı aldım:


Bugün henüz açmadığınız bir çift açın. D1 dışında istediğiniz zaman dilimine geçin. Ardından göstergeyi grafiğinize sürükleyin. Sonuç yukarıdaki gibi bir hata olacaktır. Bana öyle geliyor ki, günlük grafiğin ATR(5)'i eksik GÜNLÜK VERİLER nedeniyle doğru değil. D1 zaman diliminde "taze" bir grafik açmak hiçbir soruna neden olmaz. Ve başka bir zaman dilimine geçtiğinizde, ATR(5) doğru olduğu için de sorun olmaz. D1 tablosunda kaldığım sürece herhangi bir çifte geçebileceğimi fark ettim. Ancak MetaTrader günlük verileri almadığı sürece D1 dışındaki zaman dilimlerinde başka çiftlere geçmek sorun yaratır. Şimdi sorum şu, D1 olmayan bir zaman diliminde yeni bir grafik açtığımda ATR hesaplamamın doğru olduğuna dair günlük verileri nasıl alabilirim?
qjol zaten sorunun nerede olduğunu söyledi. Yardım istiyorsan neden insanların sana tavsiyelerini takip etmiyorsun ya da en azından kontrol etmiyorsun?
 

angevoyageur, sanırım bu gönderiyi benden görmedin:

Mart 2014.04.02 08:16 #

Haklısın.. Bundan kaçamıyorum. :-)

"Demek istediğim, SL hesaplamasına geçmeden önce güncellemenin tamamlanmasını bekleyebilir miyim? Sorun şu ki, SL'ye rastgele bir değer veremem çünkü o zaman tüm gösterge işe yaramaz. Bu yüzden kontrol etmek istiyorum. 4066 hatası için ve oluşursa, bir şekilde beklemek ve devam etmeden önce tekrar kontrol etmek istiyorum."

Orada, tavsiyeyi takip edemediğimi ve bu çözüme geldiğim için qjol'un bana ne tavsiye ettiğini kesinlikle kontrol ettiğimi görebilirsiniz.

Neden: