Ошибки, баги, вопросы - страница 935

 

Подскажите, пожалуйста в чем может быть проблема: индикаторный буфер моргает, иногда на долю секунды, а иногда и более секунды (на всей видимой части все данные пропадают, а потом снова появляются).

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &Time[],
                const double &Open[],
                const double &High[],
                const double &Low[],
                const double &Close[],
                const long &TickVolume[],
                const long &Volume[],
                const int &Spread[])
{
   int start=prev_calculated-1;
   if(prev_calculated>rates_total || prev_calculated<=0)
   {
      start=0;
      ...
   }
   ...
   for(int i=start;i<rates_total-1 && !IsStopped();i++)
   ...
}
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
fyords:

Подскажите, пожалуйста в чем может быть проблема: индикаторный буфер моргает, иногда на долю секунды, а иногда и более секунды (на всей видимой части все данные пропадают, а потом снова появляются).

 

Вообще информации маловато. Можете приложить в сервисдеск полный код + описание символа, периода, брокера?..

 
alexvd:

Вообще информации маловато. Можете приложить в сервисдеск полный код + описание символа, периода, брокера?..

Спасибо, оформил заявку #683790.
 
Изменил в стандартном индикаторе MACD в указанной ниже строчке NULL на "GBPUSD", если теперь цеплять индикатор к графику GBPUSD, то все рисует нормально, если же прицепить его на любой другой график выходит ошибка такая  "2013.03.01 17:49:48 MACD (USDCAD,M1) Not all data of ExtFastMaHandle is calculated (-1bars ). Error4806" почему? Вопрос этот задаю потому, что недавно начал писать сов, который торгует корзиной, в сове я в настройках задаю символы и возникают подобные проблемы с получением и копированием данных...объясните мне пожалуйста на примере индикатора MACD, что происходит и почему?

   ExtFastMaHandle=iMA("GBPUSD",0,InpFastEMA,0,MODE_EMA,InpAppliedPrice);
   ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_EMA,InpAppliedPrice);

 
FinEngineer:
Изменил в стандартном индикаторе MACD в указанной ниже строчке NULL на "GBPUSD", если теперь цеплять индикатор к графику GBPUSD, то все рисует нормально, если же прицепить его на любой другой график выходит ошибка такая  "2013.03.01 17:49:48 MACD (USDCAD,M1) Not all data of ExtFastMaHandle is calculated (-1bars ). Error4806" почему? Вопрос этот задаю потому, что недавно начал писать сов, который торгует корзиной, в сове я в настройках задаю символы и возникают подобные проблемы с получением и копированием данных...объясните мне пожалуйста на примере индикатора MACD, что происходит и почему?

А зачем Вам менять код стандартного индикатора?

int  iMACD(
   string              symbol,              // имя символа
   ENUM_TIMEFRAMES     period,              // период
   int                 fast_ema_period,     // период быстрой средней
   int                 slow_ema_period,     // период медленной средней
   int                 signal_period,       // период усреднения разности
   ENUM_APPLIED_PRICE  applied_price        // тип цены или handle
   );


В настройках iMACD
есть входной параметр символ. Вот и вызывайте его

iMACD("GBPUSD", ...

 
fyords:

А зачем Вам менять код стандартного индикатора?

int  iMACD(
   string              symbol,              // имя символа
   ENUM_TIMEFRAMES     period,              // период
   int                 fast_ema_period,     // период быстрой средней
   int                 slow_ema_period,     // период медленной средней
   int                 signal_period,       // период усреднения разности
   ENUM_APPLIED_PRICE  applied_price        // тип цены или handle
   );


В настройках iMACD
есть входной параметр символ. Вот и вызывайте его

iMACD("GBPUSD", ...


То же самое получится если я возьму(код ниже) и прицеплю индикатор на график с другим символом...выйдет ошибка инвалид хэндл...т.е. когда я пытаюсь ввести и использовать символ отличный от того что на графике, каждый раз возникают проблемы...смысл в этом...в предыдущем сообщении написал про макди...ничего в нем не меняю кроме этого символа и он(индикатор перестает работать) у меня у одного что-ли такая проблема?
iMACD("GBPUSD", ...
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 
Не подгружены исторические данные.
 
Karlson:
Не подгружены исторические данные.
А как их подгрузить тогда?...запускал тестер какого-нибудь советника на валютной паре, которую потом ввожу...чтобы данные прогрузились, данные по паре загружены...ошибка все равно осталась...заметил такую вешь...ошибка возникает когда копирую сразу много данных...по одному если копировать то все ок...счас выложу 2 индикатора...первый работает а второй нет...почему...
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Выше код индикатора Spread_of_symbols...я его решил переделать чтобы он работал быстрее....и получился код см ниже...данные не копируются...если в коде копировать данные начиная не с 0 , а с 1 то индикатор рисует очень быстро но выходит ошибка аут оф рэндж...что не так в коде см ниже...?

 

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }