Масштаб чарта

 

какие заклинания надо сказать чарту, чтобы масштаб цен и такая линия визуально стала 45 градусов ?

Из цены и времени посредством ChartTimePriceToXY координаты получаю, 

а дальше что-то подустал :-) 

Может у кого есть готовая функция или удачная вырезка для Copy-Paste ?

 
Могу закодить скрипт для этого по минималочке ;)
Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • 2023.11.12
  • www.mql5.com
Самый большой фриланс c разработчиками программ на MQL5
 
Maxim Kuznetsov:

какие заклинания надо сказать чарту, чтобы масштаб цен и такая линия визуально стала 45 градусов ?

Из цены и времени посредством ChartTimePriceToXY координаты получаю, 

а дальше что-то подустал :-) 

Может у кого есть готовая функция или удачная вырезка для Copy-Paste ?

получаем коэффициент из найденых точек x1,x2,y1,y2:

double k = fabs(double(x1-x2)/(y1-y2));

который в данном случае больше 1

после меняем MaxPrice и MinPrice чарта:

double center_price =CurrentMaxPrice - ( CurrentMaxPrice-CurrentMinPrice)*((y1+y2)/2.0)/HeightChatInPixels;
double newMaxPrice =center_price+(CurrentMaxPrice-center_price)*k;
double newMinPrice =center_price-(center_price-CurrentMinPrice)*k;

надеюсь, ничего не напутал.

но это только для 45 градусов. Для других углов нужно будет вводить тригонометрические функции

 
Nikolai Semko #:

получаем коэффициент из найденых точек x1,x2,y1,y2:

который в данном случае больше 1

после меняем MaxPrice и MinPrice чарта:

надеюсь, ничего не напутал.

но это только для 45 градусов. Для других углов нужно будет вводить тригонометрические функции

возможно что-то напутал..потому как чё-то неработает :-)

вот это вот что значило : 

CurrentMaxPrice - ( CurrentMaxPrice-CurrentMinPrice)*((y1+y2)/2.0)/HeightChatInPixels;

??

насколько понимаю - имелась в виду цена, которая по центру..(которая при изменении масштаба некуда не сдвинется). Неисправленный вариант с 

(CurrentMaxPrice-CurrentMinPrice)/2.0

кажется более логичным, хотя тоже не работает :-)

 
Maxim Kuznetsov #:

кажется более логичным, хотя тоже не работает :-)

Это тоже не работает? Нужно попробовать передать туда скорость линии (на бар)

bool ChartPointsPerBarSet(const double value,const long chart_ID=0)
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- установим значение свойства
   if(!ChartSetDouble(chart_ID,CHART_POINTS_PER_BAR,value))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
 
Yevhenii Levchenko #:

Это не тоже не работает? Нужно попробовать передать туда скорость линии (на бар)

тоже странно себя ведёт.. надо ещё видимо как-то пункты (_Points) переводить в пиксели и дюймы, чтобы визуально стало 45 градусов


или надо как-то оба предложения объединять :-) 

---

это для всяких графо-построений на чартах: есть опорные линии которые на любом тайм-фрейме и разрешении должны визуально получаться диагональю 45. 

 
Nikolai Semko #:
double k = fabs(double(x1-x2)/(y1-y2));

ну да, ошибся.
Вместо 

double k = fabs(double(x1-x2)/(y1-y2));

нужно:

double k = fabs(double(y1-y2)/(x1-x2));

только вот идентификаторы CHART_PRICE_MIN и CHART_PRICE_MAX read only. Не знал об этом.

Поэтому, опять же, только на канвасе

 
Nikolai Semko #:


Поэтому, опять же, только на канвасе

например так.

Индикатор находит максимум и минимум и строит между ними линию с наклоном 45 градусов, накладывая новый чарт на канвасе с измененным масштабом


Файлы:
 
Nikolai Semko #:

например так.

Индикатор находит максимум и минимум и строит между ними линию с наклоном 45 градусов, накладывая новый чарт на канвасе с измененным масштабом


не, на канвасе не надо...

надо чарт терминала масштабировать

 
Maxim Kuznetsov #:

не, на канвасе не надо...

надо чарт терминала масштабировать

так если  идентификаторы CHART_PRICE_MIN и CHART_PRICE_MAX read only, то вроде это сделать невозможно.

 
Nikolai Semko #:

так если  идентификаторы CHART_PRICE_MIN и CHART_PRICE_MAX read only, то вроде это сделать невозможно.

Можно устанавливать

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