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

МТ5, как программно отключить масштабирование цен через Ctrl + Mouse Wheel?
Делаю панель, программно отлавливаю Ctrl + Mouse Wheel и масштабирую элементы панели.
Однако на это же событие срабатывает масштабирование цен и загружается надпись "Waiting For Update", которая полностью перекрывая панель на неопределенное время.

Пример кода, то, что закомментировано так же используется в проекте, но ни как не влияет на вышеописанную проблему:
void HideChart(long achart, color BackClr){     
   //ChartSetInteger(achart, CHART_SHOW, false);
        //ChartSetInteger(achart, CHART_SHOW_OHLC, false);
        //ChartSetInteger(achart, CHART_SHOW_BID_LINE, false);
        //ChartSetInteger(achart, CHART_SHOW_ASK_LINE, false);
        //ChartSetInteger(achart, CHART_SHOW_LAST_LINE, false);
        //ChartSetInteger(achart, CHART_SHOW_PERIOD_SEP, false);
        //ChartSetInteger(achart, CHART_SHOW_GRID, false);
        //ChartSetInteger(achart, CHART_SHOW_VOLUMES, CHART_VOLUME_HIDE);
        //ChartSetInteger(achart, CHART_SHOW_OBJECT_DESCR, false);
        //ChartSetInteger(achart, CHART_SHOW_TRADE_LEVELS, false);
        //ChartSetInteger(achart, CHART_SHOW_DATE_SCALE, false);
        //ChartSetInteger(achart, CHART_SHOW_PRICE_SCALE, false);
        //ChartSetInteger(achart, CHART_FOREGROUND, false);
        //ChartSetInteger(achart, CHART_SHIFT, false);
        //ChartSetInteger(achart, CHART_MODE, CHART_LINE);

        //ChartSetInteger(achart, CHART_SCALE, 0);
        ChartSetInteger(achart, CHART_SCALEFIX, 0);
        ChartSetInteger(achart, CHART_SCALEFIX_11 , 0);
        ChartSetInteger(achart, CHART_SCALE_PT_PER_BAR, 0);
        ChartSetInteger(achart, CHART_EVENT_OBJECT_DELETE, 0);
        ChartSetInteger(achart, CHART_EVENT_OBJECT_CREATE, 0);

   	ChartSetInteger(achart, CHART_EVENT_MOUSE_WHEEL,1); 
        ChartSetInteger(achart, CHART_EVENT_MOUSE_MOVE, 0);
        ChartSetInteger(achart, CHART_MOUSE_SCROLL, 0);
        ChartSetInteger(achart, CHART_KEYBOARD_CONTROL, 0);
        ChartSetInteger(achart, CHART_QUICK_NAVIGATION, 0);
        
        //ChartSetInteger(achart, CHART_COLOR_BACKGROUND, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_FOREGROUND, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_CHART_LINE, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_ASK, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_BID, BackClr);
        //ChartSetDouble(achart, CHART_FIXED_MAX, 1);
        //ChartSetDouble(achart, CHART_FIXED_MIN, 1);
        //ChartSetString(achart, CHART_COMMENT, "");
        //ChartSetInteger(achart, CHART_CROSSHAIR_TOOL, 0);
        //ChartSetInteger(achart, CHART_SHOW_ONE_CLICK, 0);
        //ChartSetInteger(achart, CHART_CONTEXT_MENU, 0);
        ChartRedraw(achart);
}

void OnInit() {
   HideChart(0, clrWhite);
} 

кажется баг? ширина метки в документации написано, что доступна для чтения, но

Print(i," - ",ObjectGetInteger(0,name,OBJPROP_XDISTANCE)," - ",ObjectGetInteger(0,name,OBJPROP_XSIZE));

выдаёт

на графике текст есть:

полный код прилагаю

Файлы:
Igor Zakharov:

кажется баг? ширина метки в документации написано, что доступна для чтения, но

Ширина доступна только после полной отрисовки объекта.
Недавно тоже решал данную проблему.

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

Ошибки, баги, вопросы

Sergey Dzyublik, 2020.05.12 19:32

При использовании  OBJ_EDIT возникла проблема - необходимость установить размер OBJPROP_XSIZE и OBJPROP_YSIZE, чтобы в соответствующие размеры объекта помещался весь текст.

Вопрос: как определить размер  OBJPROP_XSIZE и OBJPROP_YSIZE, что бы туда поместился весь текст?
Рассмотрел два варианта:
1. Создание объекта OBJ_LABLE, считывание размеров, удаление объекта OBJ_LABLE.
Не подходит из-за того, что считывание размеров возможно только после фактического создания объекта и не возможно, когда объект находится в очереди на ChartRedraw.

2. Использование TextSetFont с последующим TextGetSize.
Не подходит, так как результат кардинально отличается от результатов метода №1, отличия в 2.5 - 2.9 раз в зависимости от размера шрифта.
Возможно причина в 4К мониторе и 175% DPI.

#define PRINT(x) ; Print(#x, ":", string(x))
          
void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma")
{
   ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); 
   ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); 
   ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); 
   ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font);
   ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); 
   ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0);
   ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y);
}

void OnStart(){     
   string obj_name = "test_obj";   
   string text = "AAAA::BBBB";
   int font_size = 7;
   string font_name = "Tahoma";
   
   SetLabel(0, obj_name, 0, text, clrWhite, 100, 100, 0, font_size, font_name);
   ChartRedraw(0);
   Sleep(1000);
   
   uint dx_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_XSIZE));
   uint dy_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_YSIZE));
   ObjectDelete(0, obj_name);
   
   PRINT(dx_fixed_0);
   PRINT(dy_fixed_0);
   
   
   uint dx_fixed_1;
   uint dy_fixed_1;
   TextSetFont(font_name, -10 * font_size);
   TextGetSize(text, dx_fixed_1, dy_fixed_1);
   
   PRINT(1.0 * dx_fixed_0 / dx_fixed_1);  	// Result: 1.0
   PRINT(1.0 * dy_fixed_0 / dy_fixed_1);  	// Result: 1.0
}  


Спасибо Geess за решение.
Необходимо домножить на -10 размер шрафта при передаче в TextSetFont.

Sergey Dzyublik:

Ширина доступна только после полной отрисовки объекта.
Недавно тоже решал данную проблему.

Спасибо! Решение прилагаю


Файлы:
Какие флаги и подводные камни могут быть, если из одной MQL-программы что-то должно дописываться в файл (RAM-drive) постоянно, а из других (и другой Терминал) читаться из него же все эти дописываемые данные?
fxsaber:
Какие флаги и подводные камни могут быть, если из одной MQL-программы что-то должно дописываться в файл (RAM-drive) постоянно, а из других (и другой Терминал) читаться из него же все эти дописываемые данные?

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

- нет гарантированной синхронизации при одновременном доступе, т.е. можно повторно читать уже прочитанные данные и вместе с этим не дать записать новые данные - коллизии

- нет средства обнаружения и контроля такой ситуации

решения как обычно - семафоры или писать свой диспетчер записи

ЗЫ: кажется есть возможность в памяти расположить встроенный SQLite , там хоть проконтролировать состояние БД можно

Alexey Kozitsyn:

В пятерке аналогично индикаторы работают, но все нормально, без зависаний.

Нет, в пятерке индикаторы в потоке инструмента.

Баг МТ5 (build 2340) отсутствует доступ к дефолтному operator= из объекта указателя.

class A{
public:
   char data;
   
   // uncomment to fix the bug
   //void operator=(A &a){this.data = a.data;}
};


// bypassing the bug
template<typename P1, typename P2>
void unref_assignment_operator(P1* &p1, P2* &p2){
   struct Functor{
      static void call(P1 &p1, P2 &p2){
         p1 = p2;
      }
   };
   Functor::call(p1, p2);
}

   
void OnStart(){      
   A a1;
   A a2;
   
   a2.data = 0x1;
   a1 = a2;
   printf("%d", (a1.data));               // Ok, 0x1
   
   
   A* a_ptr_1 = &a1;
   A* a_ptr_2 = &a2;
   
   a2.data = 0x2;
   a1.operator=(a2);                      //'operator=' - undeclared identifier 
   printf("%d", (a1.data));               
   
   
   a2.data = 0x3;
   unref_assignment_operator(a_ptr_1, a_ptr_2); 
   printf("%d", (a1.data));               // Ok, 0x3
}

Пожалуйста исправьте баг - краш МТ терминала при попытке отладить статическую функцию структуры.
Даже в примере выше, если поймать точку останова на строке "
p1 = p2;" это приведет к крашу терминала.