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

 
@deysmacro: Sıfıra bölmeye neden olan satırın nerede olduğunu biliyorum. Çünkü son beş günün günlük ortalama aralığına ihtiyacım var. Daha sonra göstergede bir şeyi o ATR'ye bölüyorum ve veriler güncellenmediği sürece ATR sıfır ve sorun bu. En az son 5 günün günlük verilerinin mevcut olduğundan emin olmam gerekiyor. Ancak o zaman ATR >0 olur ve gösterge çalışır.
 
mar :
@deysmacro: Sıfıra bölmeye neden olan çizginin nerede olduğunu biliyorum. Çünkü son beş günün günlük ortalama aralığına ihtiyacım var. Daha sonra göstergede bir şeyi o ATR'ye bölüyorum ve veriler güncellenmediği sürece ATR sıfır ve sorun bu. En az son 5 günün günlük verilerinin mevcut olduğundan emin olmam gerekiyor. Ancak o zaman ATR >0 olur ve gösterge çalışır.

Mevcut verileri GV'ye koyun ve alın. Böylece veriler geldiğinde veya verilerde farklılıklar olduğunda GV'yi güncellemeniz yeterli.

Belki ATR bu şekilde çalışır.


İnsanlar her zaman "Önce onu çalıştır, sonra kodu optimize et" derdi.

Bazen çalışmasını sağlamak için kod satırı çok uzundur, ancak çalıştığında kodu kırpmaya başlayabilirsiniz. :)

 

Belki aptalca gelebilir, ama GV nedir?

 
Küresel Değişkenler
 

Elbette... :-)

Açıklayamadığım başka bir şey: Aşağıdaki kod, yayınladığım ilk kodumun küçük bir modifikasyonudur. Aynı zamanda bir Moneymanagement göstergesidir ancak ATR'yi kaldırdım. Yalnızca 5 - 100 pip arasındaki stop loss seviyelerini 5 piplik adımlarla yazdırır. Yani, hiçbir ATR hesaplaması yoktur. Bu göstergeyi grafiğinize sürüklediğinizde iyi çalışıyor. Her çift, her zaman diliminde. Sorun yok. Ancak MetaTrader'ı AÇTIĞINIZDA, sıfıra bölme hatasına neden olur ve yine stoploss seviyeleri yerine sadece "Etiket" yazdırılır.

Hata bu satırda oluşur:

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

Bu satırın TÜM değişkenlerini yazdırdım ve AccountBalance() sıfır ve MarketInfo(Symbol(), MODE_TICKVALUE) sıfır olduğu sonucuna vardım. Açıkçası MetaTrader'ı açtığınızda hiçbir veri mevcut değildir. Bu, eski MetaTrader'da hiç olmadı. Bu yüzden ne yapacağım hakkında hiçbir fikrim yok...

İşte kod:

 #property indicator_chart_window
//--- input parameters
extern int   Risk= 5 ;
extern int SL_Levels= 20 ;
int multi, exp1, 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 ;
   exp1     = 0 ;
   modifySpread = 1 ;
   if ( Digits == 5 || Digits == 3 )
   {
      modifySpread = 0.1 ;
      multi= 10 ;
      exp1= 1 ;
   }
//----
   SL = 10 ;
//----
   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 ;
   Print (Spread);
   Print ( AccountBalance ());
   Print (MoneyRisk);
   Print ( MarketInfo ( Symbol (), MODE_TICKVALUE ));
   Print (SL);
   Print (multi);
   for (i= 1 ; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
       ObjectSetText ( "SL" +i, SL+ " : " + DoubleToStr (lots, 2 ), 10 , "Calibri" , White);
      k=k+ 15 ;
      SL = SL+ 5 ;     
   }
   SL = 10 ;
   ObjectSetText ( "Spread" , Spread, 10 , "Calibri" , White);

   WindowRedraw ();
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
Matematik hesaplama emirlerinin temelini bilmiyor musunuz? Hemen sorunun ne olduğunu biliyorum. Matematik hesaplama siparişleriniz.
 

Biraz daha kesin olabilir misin? Onlarla ilgili sorun tam olarak nedir (çünkü her zaman işe yaradı ..)?


Sanırım hala AccountBalance() ve MetaTrader'dan ihtiyaç duyduğum diğer veriler Platformu başlattıktan hemen sonra mevcut değil.

 

Başka bir örnek:

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
//----
  {
   Comment   ( AccountBalance ());
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
MetaTrader'ı açarsanız sonuç sıfır olacaktır! Ve siz zaman çerçevesini veya çifti değiştirene kadar sıfır kalır. Bence sıfır hatayla bölme sorunu tam olarak bu. sen de düşünmüyor musun?
 
mar :

Bu satırın TÜM değişkenlerini yazdırdım ve AccountBalance() sıfır ve MarketInfo(Symbol(), MODE_TICKVALUE) sıfır olduğu sonucuna vardım. Açıkçası MetaTrader'ı açtığınızda hiçbir veri mevcut değildir. Bu, eski MetaTrader'da hiç olmadı. Bu yüzden ne yapacağım hakkında hiçbir fikrim yok...

İşte kod:

Sorunun nedeninin bu olduğundan eminseniz, bunu Start()'tan hemen sonra ekleyin.

 if ( MarketInfo ( Symbol (), MODE_SPREAD )== 0 || AccountBalance () == 0 )
   return ( 0 );
 

Hey GumRai,

Yukarıdaki gösterge ile test ettim. MetaTrader'ın birkaç dakika çalışmasına izin versem bile AccountBalance sıfır kalıyor. Yalnızca bir şeyi manuel olarak değiştirene kadar (eşleştirme, zaman çerçevesi) doğru Hesap Bakiyesi görüntüleniyor. Ve eğer çözümünüzü kullanırsam, sıfıra bölme hatasıyla ilgili bir sorunum yok ama gösterge asla işini yapmayacak çünkü AccountBalance sıfır kalıyor.

Merak ediyorum, bu sorunu yaşayan tek kişi ben miyim? Bunun yeni MetaTrader'ın genel bir veri içe aktarma sorunu olduğunu düşünüyorum...