Small Moneymanagement-Indicator разрушен новым MQL4 - страница 2

 
@deysmacro: Я знаю, где находится линия, которая вызывает деление на ноль. Это потому, что мне нужен среднедневной диапазон за последние пять дней. Позже в индикаторе я делю что-то на этот ATR и пока данные не обновлены ATR равен нулю и в этом проблема. Мне нужно быть уверенным, что доступны ежедневные данные хотя бы за последние 5 дней. Только тогда ATR будет >0 и индикатор будет работать.
 
mar:
@deysmacro: Я знаю, где находится строка, которая вызывает деление на ноль. Это происходит потому, что мне нужен среднедневной диапазон за последние пять дней. Позже в индикаторе я делю что-то на этот ATR и пока данные не обновляются ATR равен нулю и в этом проблема. Мне нужно быть уверенным, что доступны ежедневные данные хотя бы за последние 5 дней. Только тогда ATR будет >0 и индикатор будет работать.

Поместите доступные данные в GV и извлекайте их. Таким образом, при поступлении данных или расхождении в данных, просто обновите GV.

Возможно, ATR работает именно так.


Люди всегда говорили: "Сначала сделайте так, чтобы это работало, а потом оптимизируйте код".

Иногда, чтобы заставить его работать, строка кода очень длинная, но когда он работает, вы можете начать сокращать код. :)

 

Может быть, это звучит глупо, но что такое ГВ?

 

Конечно... :-)

Что-то еще, что я не могу объяснить: Следующий код является небольшой модификацией моего первого кода, который я разместил. Это также индикатор Moneymanagement, но я убрал ATR. Он печатает только уровни стоп-лосса от 5 до 100 пунктов с шагом в 5 пунктов. Таким образом, ATR-расчет вообще отсутствует. Когда вы перетаскиваете этот индикатор на свой график, он работает отлично. Каждая пара, каждый таймфрейм. Никаких проблем. Но когда вы открываете MetaTrader, он вызывает ошибку деления на ноль, и снова вместо уровней стоп-лосса выводится только "Label".

Ошибка возникает в этой строке:

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

Я распечатал ВСЕ переменные этой строки и пришел к выводу, что AccountBalance() равен нулю, а MarketInfo(Symbol(), MODE_TICKVALUE) равен нулю. Поэтому очевидно, что когда вы открываете MetaTrader, никаких данных вообще нет. В старом MetaTrader такого не было. Поэтому я понятия не имею, что делать...

Вот код:

#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);
Вы не знаете основ математических расчетов? Я сразу понял, в чем проблема. В ваших математических расчетах.
 

Не могли бы вы быть немного более точным? В чем именно проблема с ними (ведь всегда все работало...)?


Я думаю, что проблема в том, что AccountBalance() и другие нужные мне данные из MetaTrader недоступны сразу после запуска платформы.

 

Другой пример:

#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, результат будет нулевым! И он останется нулевым, пока вы не смените таймфрейм или пару. Я думаю, что это именно проблема ошибки деления на ноль. А вы так же считаете?
 
mar:

Я распечатал ВСЕ переменные этой строки и пришел к выводу, что AccountBalance() равен нулю, а MarketInfo(Symbol(), MODE_TICKVALUE) равен нулю. Поэтому очевидно, что когда вы открываете MetaTrader, никаких данных вообще нет. В старом MetaTrader такого не было. Поэтому я понятия не имею, что делать...

Вот код:

Если вы уверены, что проблема именно в этом, добавьте это сразу после Start().

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

Привет, GumRai,

Я протестировал его с индикатором, приведенным выше. AccountBalance остается нулевым, даже если я позволяю MetaTrader работать в течение нескольких минут. Только после того, как я изменил что-то вручную (пару, таймфрейм), отображается правильный AccountBalance. А если я использую ваше решение, то у меня нет проблем с ошибкой деления на ноль, но индикатор никогда не будет работать, потому что AccountBalance остается нулевым.

Мне интересно, только ли у меня такая проблема? Я думаю, что это общая проблема импорта данных в новом MetaTrader...