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

 
Maxim Kuznetsov #:

кто-ж знает как вы рисовали "коробку" и линию..

а причины отличий могут быть :

время ? в смысле что разные смещения GMT 

бары..в смысле опять-же время, но открытия/начала баров

//+------------------------------------------------------------------+
//|                      СОБЫТИЕ НА ГРАФИКЕ                          |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // Тип события
                  const long& lparam,   // Параметры события
                  const double& dparam, // Координаты события
                  const string& sparam) // Текстовые параметры
  {
    // ------------------------------------------------------------------------------------------------------------------        
        
    double bid = SymbolInfoDouble(Symbol(), SYMBOL_BID),
           ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK),
           P   = SymbolInfoDouble(Symbol(), SYMBOL_POINT);
          
    // ------------------------------------------------------------------------------------------------------------------  
    
    string name_box, name_box_line; 
    double pr1_box, pr2_box;
    datetime dt1_box, dt2_box;
    
    // ------------------- Если произошло движение курсором -------------------
    
    // Запоминаем последние координаты при движении мышкой     
    if (id == CHARTEVENT_MOUSE_MOVE) // Если мышь движется
      {
        x = (int)lparam;          // Пиксельная координата X
        y = (int)dparam;          // Пиксельная координата Y
    
        int window = 0;        
        //--- преобразуем координаты X и Y  в терминах дата/время
        ChartXYToTimePrice(0, x, y, window, dt, price);    
        ChartXYToTimePrice(0, MathMax(x - Box_width, 0), MathMax(y - Box_width, 0), window, dt1_box, pr1_box);        
        ChartXYToTimePrice(0, MathMax(x + Box_width, 0), MathMax(y + Box_width, 0), window, dt2_box, pr2_box);
     }



Через событие и преобразование координат курсора мышки. 

Нажимаю занятую клавишу на клавиатуре и появляется коробка. 

По этим же координатам строится линия, только её цена2 - это тоже преобразование пикселя, который отсчитывается справа от шкалы. 

// Добавляем сдвиг при необходимости
        // узнаём ширину графика 
        // в пикселях
        int chart_width;
        chart_width = ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0);
        // отнимаем заданное число пикселей
        int box_line_shift = chart_width - Box_line_shift;
        // преобразуем 
        int window = 0;  
        double y_price;
        datetime box_line_shift_d;
        ChartXYToTimePrice(0, box_line_shift, 0, window, box_line_shift_d, y_price);    //--- преобразуем координаты X и Y  в терминах дата/время

И дальше создаётся линия, у которой ЦЕНА2 - это край графика. 

У МТ5 от БайБит право - это лево?



UPD

Проверил на 4-трёх терминалах: здешний, Альпари, ICMarkets и Альфа-ФОрекс - везде работает как надо. 

И только БайБит работает "противоположно".
 

да уж, умеете вы давать пояснения :-)

два несвязанных друг-с другом фрагмента кода ни о чём не говорят. У них даже общих переменных нет, вообще ничего общего. 

---

можно предположить что некий Box_line_shift у вас где-то неверно высчитывается. От TimeLocal например. Или от TimeCurrent

 
Maxim Kuznetsov #:

да уж, умеете вы давать пояснения :-)

два несвязанных друг-с другом фрагмента кода ни о чём не говорят. У них даже общих переменных нет, вообще ничего общего. 

---

можно предположить что некий Box_line_shift у вас где-то неверно высчитывается. От TimeLocal например. Или от TimeCurrent


Так а почему у 4-х брокеров работает



Maxim Kuznetsov #:

можно предположить что некий Box_line_shift у вас где-то неверно высчитывается. От TimeLocal например. Или от TimeCurrent

Он вынесен в настройки - это количество пикселей от правой шкалы графика
// ----------------------- НАСТРОЙКИ ИНДИКАТОРА -----------------------
input group " ------------------ Коробки "   
input int  Key_button_box  = 220;            // Код клавиши коробки 
input int  Box_width           = 20;            // Ширина коробки
input color Box_color_UP   = clrGray;        // Цвет коробки над ценой
input color Box_color_DN   = clrGray;        // Цвет коробки под ценой
input bool  Box_fill       = true;           // Заливка коробки
input int   Box_line_shift = 50;             // Сдвиг средней линии от правой стены (в пикселях)
 
Ivan Butko #:


Так а почему у 4-х брокеров работает



Он вынесен в настройки - это количество пикселей от правой шкалы графика

будем продолжать гадать :-) где-то у вас напутано со временем.

у 4-х работает например потому что у них совпадает TimeCurrent и SymbolGetInteger(symbol,SYMBOL_TIME).. а в ByBit может разница в 3 часа. (и как раз на 3 часа у вас линия и перекосячилась)

 
Maxim Kuznetsov #:

будем продолжать гадать :-) где-то у вас напутано со временем.

у 4-х работает например потому что у них совпадает TimeCurrent и SymbolGetInteger(symbol,SYMBOL_TIME).. а в ByBit может разница в 3 часа. (и как раз на 3 часа у вас линия и перекосячилась)

Извиняюсь за конспирологию

Понял, поискать и проверить все манимуляции со временем

 

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

int OnInit() {
   Print(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS));
   ChartSetInteger(0,CHART_SHOW,false);  //отключаем чарт
   return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {ChartSetInteger(0,CHART_SHOW,true);}
void OnTick() {}
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   if (id == CHARTEVENT_CHART_CHANGE)
      Print(ChartGetInteger(0,CHART_WIDTH_IN_PIXELS));
}


Просьба исправить. Ломает всю логику. 

Файлы:
 

Почему так нельзя?

#define MACROS <Trade\Trade.mqh>

// #include <Trade\Trade.mqh>
#include MACROS // 'MACROS' - double quotes or angle bracket < are needed
 
fxsaber # :

Почему так нельзя?

Ограничение препроцессора MQL (работает без проблем в C++).

Надеюсь, новая версия справится с этим.

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

Как определить путь для включаемого файла, расположенного в другой папке?

Ален Верлейен , 2021.06.05 21:56

Ни то, ни другое не работает, поскольку препроцессор Metaquotes не реализует весь стандартный препроцессор C, макрорасширения не работают с #include. Это ограничение MQL.

https://gcc.gnu.org/onlinedocs/cpp/Computed-Includes.html#Computed-Includes


 
Alain Verleyen #:

Ограничение препроцессора MQL (работает без проблем в C++).

Надеюсь, новая версия справится с этим.

Спасибо.

 
#define _version 999

string var999 = "var999";
string var_version = "var_version";

#define _print1    Print("1: ", var##_version)
#define _print2(a) Print("2: ", var##a)

void OnStart()
  {
   _print1;
   _print2(_version);
  }

MT4:

MT5:

В МТ4 мне больше нравится. Но даже для MT4 хотелось бы, что бы _print1 давал такой-же результат, как _print2. Но я не знаю, как бы это работало в C++, к стати.