Смена ТФ - проблема - страница 5

 

Вот индикатор:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.42"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrLightBlue
#property indicator_color2 clrRed
#property indicator_width1 2
#property indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
      limit=rates_total-1;
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   datetime temp;
   for(i=0; i<limit; i++)
     {
      temp=time[i];
      if(close[i]>close[i+1])
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
      if(close[i]<close[i+1])
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

 

только учтите, что согласно Вашим условиям индикатор может отрисовать на нулевом баре оба буфера.

Файлы:
 
Karputov Vladimir:

Вот индикатор:

 

только учтите, что согласно Вашим условиям индикатор может отрисовать на нулевом баре оба буфера.

Чтобы два буфера не отрисовывало надо при заполнении одного буфера обнулять другой

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }
 
Vasyl Nosal:
У вас есть решение код?

Как и у многих других, не одно решение у меня есть по интересующему вас вопросу. Поскольку индикаторы разные могут быть по нюансам (выполняемым ими задачам/коду/интервалам расчётов, в общем, по многим факторам).

 
Karputov Vladimir:

Вот индикатор:

 

только учтите, что согласно Вашим условиям индикатор может отрисовать на нулевом баре оба буфера.

Вы что все гоните с меня или реально не доганяете в чём проблема?

Вот ваш индикатор при смене ТФ на неподгруженой истории.

:)))))))))))))))))))))))))))))))))))))))))))

 

 
Dina Paches:

Как и у многих других, не одно решение у меня есть по интересующему вас вопросу. Поскольку индикаторы разные могут быть по нюансам (выполняемым ими задачам/коду/интервалам расчётов, в общем, по многим факторам).

Бла бла бла...
 
Vasyl Nosal:

Вы что все гоните с меня или реально не доганяете в чём проблема?

Вот ваш индикатор при смене ТФ на неподгруженой истории.

:)))))))))))))))))))))))))))))))))))))))))))

 

Не поделитесь, какими манипуляциями Вы достигаете столь интересной картинки? И, я надеюсь, впредь Вы будете более сдержаны в выражениях.

 

Добавлено: я уже Выше говорил о том, что при подкачке истории Вам самому нужно думать о содержании индикаторных буферов:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Смена ТФ - проблема

Karputov Vladimir, 2015.12.07 10:09

У Вас в распоряжении две переменные: prev_calculated и rates_total. Контролируя подгрузку истории (при этом prev_calculated==0) Вы сами должны думать, что делать с индикаторными буферами - обычное поведение в таких случаях, это приравнять подгрузку истории к событию первой загрузки индикатора.

но Вы почему-то проигнорировали и не захотели вносить правки.

 

В общем Вот версия 1.43 (сдесь мои исправления и исправления от Alexey Viktorov):

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Смена ТФ - проблема

Alexey Viktorov, 2015.12.07 12:52

Чтобы два буфера не отрисовывало надо при заполнении одного буфера обнулять другой

      if(close[i]>close[i+1])
       {
        down_arr[i] = EMPTY_VALUE;
        up_arr[i]=low[i]-arrow_indent*Point; //up arrow
       }
      if(close[i]<close[i+1])
       {
        up_arr[i] = EMPTY_VALUE;
        down_arr[i]=high[i]+arrow_indent*Point; //down arrow
       }

:

//+------------------------------------------------------------------+
//|                                                    Shabl_ind.mq4 |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link      "http://alievtm.blogspot.com"
#property version   "1.43"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrLightBlue
#property indicator_color2 clrRed
#property indicator_width1 2
#property indicator_width2 2

input string   arr_set="Arrow settings";
input int      arrow_indent=22;
input int      up_arrow_code=233;
input int      down_arrow_code=234;

double         up_arr[];
double         down_arr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,up_arr);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,up_arrow_code);
   SetIndexLabel(0,"UP arrow");

   SetIndexBuffer(1,down_arr);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,down_arrow_code);
   SetIndexLabel(1,"DOWN arrow");

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Shabl_ind                                                        |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit=0;
//---
   if(rates_total<=20)
      return(0);
//--- last counted bar will be recounted
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      ArrayInitialize(up_arr,EMPTY_VALUE);
      ArrayInitialize(down_arr,EMPTY_VALUE);
     }
   if(prev_calculated>0)
      limit=rates_total-prev_calculated+1;
   Comment("rates_total=",rates_total,"; prev_calculated=",prev_calculated,"; limit=",limit);
//--- Shabl_ind counted in the 1-st buffer
   for(i=0; i<limit; i++)
     {
      if(close[i]>close[i+1])
        {
         down_arr[i]=EMPTY_VALUE;
         up_arr[i]=low[i]-arrow_indent*Point; //up arrow
        }
      if(close[i]<close[i+1])
        {
         up_arr[i]=EMPTY_VALUE;
         down_arr[i]=high[i]+arrow_indent*Point; //down arrow
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
Файлы:
 
Karputov Vladimir:

Не поделитесь, какими манипуляциями Вы достигаете столь интересной картинки? И, я надеюсь, впредь Вы будете более сдержаны в выражениях.

 

 

 

Открываю график валютной пары которую ещё никогда не открывал. М1 например. Прикрепляю ваш индикатор. Переключаю на М5.

 

Ну тоесть я был прав? Нужно обнулять буфера стрелок? 

 
Vasyl Nosal:

mql4

 

Неа. Вот с вашей конструкцией на паре где небыло истории.

 

Что ЭТО?

if(i>Bars-20) i=Bars-20;

 

Как я и предполагал, цикл внутри корёжится. Кроме того, раз в теле цикла обращаетесь к предыдущему бару ([i+1]), то и начинать расчёт нужно не ранее чем со второго бара в истории (считая слева). И буферы нужно на каждом баре ВСЕ заполнять, а не только один какой-то. Ну, или инициализировать их предварительно в OnInit().

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[])
{
   int nStartBar = rates_total - MathMax(prev_calculated, 2);

   for(int i = nStartBar; i >= 0; i--)
   {
      if(Close[i] > Close[i+1])
      {
         up_arr[i] = Low[i] - arrow_indent * _Point; //up arrow
         down_arr[i] = 0;
      }
         
      if(Close[i] < Close[i+1])
      {
         up_arr[i] = 0;
         down_arr[i] = High[i] + arrow_indent * _Point; //down arrow
      }
   }

   return(rates_total);
}
 
Karputov Vladimir:

В общем Вот версия 1.43 (сдесь мои исправления и исправления от Alexey Viktorov):


:

Владимир, вы вот это зачем внутри OnCalculate() делаете? Я имею в виду последние две строки - переинициализацию массивов. У вас же оба буфера на каждом баре просчитываются, это лишнее действие.

if(prev_calculated==0)
{
   limit=rates_total-1;
   ArrayInitialize(up_arr,EMPTY_VALUE);
   ArrayInitialize(down_arr,EMPTY_VALUE);
}
 
Sergei Vladimirov:

Что ЭТО?

 

Как я и предполагал, цикл внутри корёжится. Кроме того, раз в теле цикла обращаетесь к предыдущему бару ([i+1]), то и начинать расчёт нужно не ранее чем со второго бара в истории (считая слева). И буферы нужно на каждом баре ВСЕ заполнять, а не только один какой-то. Ну, или инициализировать их предварительно в OnInit().

Всё? Это глючить не будет?
Причина обращения: