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

 
Vladislav Boyko # :

Только что случайно нашел в закладках браузера:

На сколько я понимаю (могу ошибаться): MQL не генерирует неявный конструктор копирования, а неявный  operator= не знает, что делать с константным полем.

Точно, не знал такого поведения компилятора MQL, спасибо. Так что это не ошибка, как я сказал, а ограничение.

Это также объясняется в книге , см. раздел «Конструктор копирования».

Учебник по MQL5: Объектно-Ориентированное Программирование / Классы и интерфейсы / Конструкторы: по умолчанию, параметрический, копирования
Учебник по MQL5: Объектно-Ориентированное Программирование / Классы и интерфейсы / Конструкторы: по умолчанию, параметрический, копирования
  • www.mql5.com
Мы уже сталкивались с конструкторами в главе, посвященной структурам (см. раздел Конструкторы и деструкторы ). Для классов они работают, во многом...
 

Подскажите, пожалууйста, почему терминал ByBIT показывает противоположную картину? Или совсем косячит


Вот терминал МТ5 от любого известного форекс-брокера


КОробка - линия. Так должно быть. 


А вот терминал МТ5 BYBIT


Линия куда-то влево уезжает. 


МТ5 терминалы по разному работают с графикой???

 
Ivan Butko #:

Подскажите, пожалууйста, почему терминал ByBIT показывает противоположную картину? Или совсем косячит


Вот терминал МТ5 от любого известного форекс-брокера


КОробка - линия. Так должно быть. 


А вот терминал МТ5 BYBIT


Линия куда-то влево уезжает. 


МТ5 терминалы по разному работают с графикой???

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

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

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

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

 
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