Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1041

 
Igor Makanu:

попробуйте по другому задать вопрос, наверное Ваш вопрос не понятен

Попробую объяснить. Но учтите что я ноль в программировании, практически.

Имеем тиковый индикатор, который строит кривую по значениям bid.

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

Теперь что я хочу сделать.

Вешаем индикатор на график. Получаем на первом тике первое значение bid1. Запоминаем его (я делал так: вводил второй буфер y[0] и прописывал его значение а init()).

На втором тике получаем второе значение bid2.

Далее нужно получить разницу в пунктах. delta=bid1-bid2 (я делал так: delta=x[0]-x[1]).

Теперь к ранее записанному значению y[0] прибавляем delta, и получаем значение y[1], которое по факту соответствует значению bid2.

Кривая индикатора должна получиться идентичной искомому индикатору, но построение идет по вычисляемым значениям разниц bid.

Данный индикатор нужен в качестве шаблона для последующих вычислений.

Камнями не кидать. Как смог объяснил.

Спасибо.

 
Oleg Bondarev:

Попробую объяснить. Но учтите что я ноль в программировании, практически.

Имеем тиковый индикатор, который строит кривую по значениям bid.

Теперь что я хочу сделать.

Вешаем индикатор на график. Получаем на первом тике первое значение bid1. Запоминаем его (я делал так: вводил второй буфер y[0] и прописывал его значение а init()).

На втором тике получаем второе значение bid2.

Далее нужно получить разницу в пунктах. delta=bid1-bid2 (я делал так: delta=x[0]-x[1]).

Теперь к ранее записанному значению y[0] прибавляем delta, и получаем значение y[1], которое по факту соответствует значению bid2.

Кривая индикатора должна получиться идентичной искомому индикатору, но построение идет по вычисляемым значениям разниц bid.

Данный индикатор нужен в качестве шаблона для последующих вычислений.

Камнями не кидать. Как смог объяснил.

Спасибо.

не понятно что хотите сделать

тут в общем в чем будет точно проблема - Вы используете индикаторные буфера как массив для хранения тиков (Бид), размер индикаторного буффера изменяет сам терминал, и в добавок - терминал сам сдвигает индикаторные буфера при появлении нового бара

поэтому для хранения тиков нужно использовать просто массив, а рисовать с помощью индикаторного буфера

вот набросал код по аналогии с Ваши, где сохраняю тики в массив

#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 int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

теперь в этот код нужно добавить Ваш расчет и рисовать индикаторным буфером Label1Buffer по Вашей задумке

 
Было бы неплохо, если бы добавили возможность программно изменять свойства другого индикатора. Грубо говоря, чтобы после добавления (программно) на график другого индикатора можно было задать ему цвет, стиль и толщину линий
 
Igor Makanu:

не понятно что хотите сделать

тут в общем в чем будет точно проблема - Вы используете индикаторные буфера как массив для хранения тиков (Бид), размер индикаторного буффера изменяет сам терминал, и в добавок - терминал сам сдвигает индикаторные буфера при появлении нового бара

поэтому для хранения тиков нужно использовать просто массив, а рисовать с помощью индикаторного буфера

вот набросал код по аналогии с Ваши, где сохраняю тики в массив

теперь в этот код нужно добавить Ваш расчет и рисовать индикаторным буфером Label1Buffer по Вашей задумке

Спасибо что ответили. Еще немного помучаю вас.

Расчет добавлять в сюда?

int OnCalculate()

Вот мой расчет.

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

Добавил и ничего.

 
Yevhenii Levchenko:
Было бы неплохо, если бы добавили возможность программно изменять свойства другого индикатора. Грубо говоря, чтобы после добавления (программно) на график другого индикатора можно было задать ему цвет, стиль и толщину линий

Используйте Canvas и хоть мультики рисуйте.

 

Картинку еще прикреплю.

ind

 
Oleg Bondarev:

Добавил и ничего.

так дело не пойдет )))

рисовать индикаторными буферами в MQL это значит, в буфер индикатора - в моем примере это  Label1Buffer положить значение (присвоить значение)

в Вашем примере Вы присваиваете значения только по выполнению условия, а если условие не выполнится? - соответственно ничего и не выводится


ну и еще раз, я сделал Вам "заготовку" где в массиве TickArr находятся значения тиков Bid , а Вы в своих условиях используете предыдущие значения индикаторного буфера - а кто в эти буфера положил какие значения?


имхо, не получится вот так сходу, попробуйте просто нарисовать линию индикаторным буфером, потом уже тики будете сравнивать

 
Oleg Bondarev:

Картинку еще прикреплю.


А если угол перевернуть? То как будет вестись расчёт?

 
Oleg Bondarev:

Картинку еще прикреплю.


Если вы говорите что практически ноль в программировании, то зачем вы берётесь за такие задачи нестандартные, может с простых начать? Ну или подтянуть знания базовые? Проще чтоб сделали тут за вас, да.
 
Igor Makanu:

так дело не пойдет )))

рисовать индикаторными буферами в MQL это значит, в буфер индикатора - в моем примере это  Label1Buffer положить значение (присвоить значение)

в Вашем примере Вы присваиваете значения только по выполнению условия, а если условие не выполнится? - соответственно ничего и не выводится


ну и еще раз, я сделал Вам "заготовку" где в массиве TickArr находятся значения тиков Bid , а Вы в своих условиях используете предыдущие значения индикаторного буфера - а кто в эти буфера положил какие значения?


имхо, не получится вот так сходу, попробуйте просто нарисовать линию индикаторным буфером, потом уже тики будете сравнивать

Я предупредил что "колхозник")

Вот так сделал.

#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 int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Теперь рисует тиковый график, но есть какие-то разрывы линии.

Я в 4-ке делаю.

Причина обращения: