Можно ли как-то выровнять расстояние от баров до стрелочек?

 

Добрый вечер. Я обычно пользовался самописным вариантов отображения кастомной информации, чтобы проверить что-либо по мере необходимости у индикатора или бота. Вот как это выглядит в моём случае:

InsideBar_my_method

Вариант индикатора, который это отображает я прикрепляю к сообщению. Он называется InsideBar_my_method. В этом вариант линию и стрелочки (текст я закоментировал, чтобы не засорять график) отображаются графическими объектами. Все отрисовано, в принципе, адекватно и роовно и на одинаковом расстоянию от хай / лоу баров над / под которыми они отрисованы. Всё как-бы меня устраивает, но отрисовка всей инофрмации объектами не особо рационально, т.е. это замедляет отрисовку и работу индикатора, если рассчитывать много баров.

Следующий вариант индикатора реализован с директивой препроцессора:

#property indicator_type1  DRAW_COLOR_SECTION     // Вид графического построения 1-го буфера

Вот как ужасно выглядит то, что индикатор отображает:

InsideBar

Стрелками показано, что расстоянию от стралок до бара снизи и сверху отличается в разных случаях. В одних случаях оно приемлимое, а вдругих совсем неадекватное. Стрелки не то, что бы были на расстояние хай / лоу бара, а даже не выступают за хай /лоу т.е. находятся в пределах бара. Почему? Этот кривой вариант я тоже прикрепляю к сообщению. Он называется InsideBar.

Я думаю, чо кода индикатора хватит, что бы понять в чём дело тому, кто сэтим уже сталкивался. Если это конечно вообще правится. Но, чтобы запустить индикаторы нужны некоторые файлы. Я их тоже прикрепляю.

Файлы:
 

Взял из индикатора Барабашки: 

//--- set the vertical shift of arrows in pixels
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-(int)(InpShift));
Это - если ниже бара смещать на InpShift пикселей
 
Алексей Тарабанов:

Взял из индикатора Барабашки: 

Это - если ниже бара смещать на InpShift пикселей

Ну так у меня же там вбито статически это всё без варианций input-переменными:

  PlotIndexSetInteger(0, PLOT_ARROW, 218);
  PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, 50);
  PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);

  PlotIndexSetInteger(1, PLOT_ARROW, 217);
  PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, -65);
  PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);

Смещает не ровна, а абы как. Расстояния то разные..

 
Ну, да. Вверх на 50 пикселей, вниз - на 65. 
 
Viktar Dzemikhau:

Ну так у меня же там вбито статически это всё без варианций input-переменными:

Смещает не ровна, а абы как. Расстояния то разные..

Мне кажется, что это неправильно

#property indicator_type1  DRAW_COLOR_ARROW//попробуйте так

PlotIndexSetInteger(0, PLOT_ARROW, 218);   
PlotIndexSetInteger(0, PLOT_ARROW_SHIFT, 50);   
//PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);или так 
  
PlotIndexSetInteger(1, PLOT_ARROW, 217);   
PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, -65);   
//PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, EMPTY_VALUE);или так
 
Спим, или уходим? 
 
Самый простой способ выравнивания - использовать показания ATR в качестве отступа от экстремума бара. Для стрелки выше бара значение ATR прибавляется к High бара, для стрелки ниже - вычитается из Low бара.
 
Ihor Herasko:
Самый простой способ выравнивания - использовать показания ATR в качестве отступа от экстремума бара. Для стрелки выше бара значение ATR прибавляется к High бара, для стрелки ниже - вычитается из Low бара.

Привожу к общему знаменателю умножая на ТФ, при 1М = 1. Не очень, но работает сносно. Т.е. на минутке отступ 10 пунктов, на часе 600.

 
Алексей Тарабанов:
Спим, или уходим? 

Спал, разумеется. Уходить и не планировал..)

Щяс попробую с ATR поиграться..

 
VVT:

Мне кажется, что это неправильно

Вы ничего конкретно не написали. Всё как у меня..

 
Viktar Dzemikhau:

Следующий вариант индикатора реализован с директивой препроцессора:

#property indicator_type1  DRAW_COLOR_SECTION     // Вид графического построения 1-го буфера

Вот как ужасно выглядит то, что индикатор отображает:

Не открывал весь код, но с первого взгляда рисовать стрелки методом секции неправильно