Новая версия платформы MetaTrader 5 build 5370: улучшения в веб-версии - страница 31

 
Alain Verleyen #:

Если проблема повторится, стоит узнать, как её воспроизвести.

Проблема воспроизводилась при закрытии и открытии Тестера (CTRL+R). Сразу происходил краш Терминала.

Думал, что причина в onnx реализации. Но через какое-то время ошибка воспроизводится перестала.

Билды выше b5440 пока не использую из-за воя об их сырости. Но если буду находить баги, то перед созданием отчета, конечно, проверю на последней бете.

Машинное обучение в трейдинге: теория, модели, практика и алготорговля
Машинное обучение в трейдинге: теория, модели, практика и алготорговля
  • 2025.12.11
  • www.mql5.com
Добрый день всем, Знаю, что есть на форуме энтузиасты machine learning и статистики...
 
Vitaly Muzichenko #:


Вот мой результат (хотя, я не заню, актуальна ли еще эта проблема).

Windows на английском языке, скриншот настроек прикрепил файлом.

MetaTrader 5 x64 build 5480 started for MetaQuotes Ltd.
Windows 10 build 19045, 8 x Intel Core i7-7700  @ 3.60GHz, AVX2, 9 / 15 Gb memory, 120 / 222 Gb disk, UAC, GMT-8
Файлы:
 
 
 

Я попытался вставить с буффера обмена (не знаю, должно ли оно работать).

build 5480, таблица символов: https://en.wikipedia.org/wiki/Wingdings#Wingdings

 
Vladislav Boyko #:

Я попытался вставить с буффера обмена (не знаю, должно ли оно работать).

build 5480, таблица символов: https://en.wikipedia.org/wiki/Wingdings#Wingdings

Это не работает, языковая RU-система попала под санкции.

 
Vladislav Boyko # :

Я попытался вставить с буффера обмена (не знаю, должно ли оно работать).

build 5480, таблица символов:  https://en.wikipedia.org/wiki/Wingdings#Wingdings

Обычно так не работает. Wingdings в MT5 — это шрифт, а не кодировка, текст должен использовать код ANSI (от 32 до 255).

На Википедии показана версия в формате Unicode, это кодировка, она работает не так, как в Unicode.

 

Причина ошибки, скорее всего, в более "правильной" работе с кодировками в новом движке. Поэтому теперь чтобы корректно увидеть символы из шрифта для однобайтной кодировки, к которым относится Wingdings, надо осуществлять принудительную перекодировку строки текста, которая задаёт текст кнопки. 

Для примера программы в этом посте в функции ButtonCreate() надо заменить эти две строки

//--- установим текст 
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 

на такой код:

//--- установим текст
   string symbolText = text;
   
   if(font == "Wingdings")
     {
      uchar chars[];
    
      StringToCharArray(symbolText, chars, 0, WHOLE_ARRAY, CP_OEMCP);
      symbolText = CharArrayToString(chars, 0, WHOLE_ARRAY, CP_SYMBOL);
     }   
   
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,symbolText);

Подобные замены, видимо, придётся делать во всех местах, где вызывается ObjectSetString(chart_ID,name,OBJPROP_TEXT,text), или где-то заранее.

Возможно, для других языковых операционных систем или языковых настроек ОС придётся делать какое-то другое преобразование. У меня на Windows 10 RU если значение переменной text берётся из входных параметров или задаётся в исходном коде в двойных кавычках, нужный результат даёт именно такая перекодировка.

При этом если текст на кнопке хотим вывести обычным шрифтом типа Arial, то перекодировку делать как раз нельзя.

 
Yuriy Bykov #:
uchar chars[];

Что делаю не так? 

 

int OnInit()
{
  ObjectDelete(0,"Arrow");
  string txt = CharToString(233);
  uchar chars[];
  StringToCharArray(txt, chars, 0, WHOLE_ARRAY, CP_OEMCP);
  txt = CharArrayToString(chars, 0, WHOLE_ARRAY, CP_SYMBOL);
  string arrowObj = "Arrow";
  if(ObjectFind(0, arrowObj) < 0) {
    ObjectCreate(0, arrowObj, OBJ_LABEL, 0, 0, 0);
    ObjectSetInteger(0, arrowObj, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
    ObjectSetInteger(0, arrowObj, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
    ObjectSetInteger(0, arrowObj, OBJPROP_XDISTANCE, 50);
    ObjectSetInteger(0, arrowObj, OBJPROP_YDISTANCE, 50);
    ObjectSetInteger(0, arrowObj, OBJPROP_FONTSIZE, 18);
    ObjectSetInteger(0, arrowObj, OBJPROP_COLOR, clrYellow);
    ObjectSetString(0, arrowObj, OBJPROP_FONT, "Wingdings");
    ObjectSetInteger(0, arrowObj, OBJPROP_BACK, false);
  }
  ObjectSetString(0, arrowObj, OBJPROP_TEXT, txt);
  return INIT_SUCCEEDED;
}
 
Vitaly Muzichenko #:

Что делаю не так?  

Это просто кошмар. Пришлось повозиться, чтобы разобраться, что не нравится MT5. Выяснилось, что нельзя устанавливать текст после установки шрифта Wingdings. Точнее, в момент установки текста шрифт объекта должен быть не Wingdings. Поэтому вместо строки 

ObjectSetString(0, arrowObj, OBJPROP_TEXT, txt);

пришлось написать

ObjectSetString(0, arrowObj, OBJPROP_FONT, "Arial"); 
ObjectSetString(0, arrowObj, OBJPROP_TEXT, txt);
ObjectSetString(0, arrowObj, OBJPROP_FONT, "Wingdings");

Другая подлость была в функции CharToString(). Видимо, использовать её нежелательно. Если вы уже знаете коды нужных вам символов, то лучше поступить так:

uchar chars[] = {233, 0};

Или можно так:

uchar chars[];
txt = "щ";
StringToCharArray(txt, chars, 0, WHOLE_ARRAY, CP_OEMCP);

И затем уже массив chars преобразовывать в строку:

txt = CharArrayToString(chars, 0, WHOLE_ARRAY, CP_SYMBOL);


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

int OnInit() {  
   ObjectDelete(0, "Arrow");
   
   string txt;

// Вариант 1 задания кодов символов   
//   uchar chars[] = {233, 0};
//-----

// Вариант 2 задания кодов символов
   uchar chars[];
   txt = "щ";
   StringToCharArray(txt, chars, 0, WHOLE_ARRAY, CP_OEMCP);
//-----

// Преобразуем массив кодов в строку   
   txt = CharArrayToString(chars, 0, WHOLE_ARRAY, CP_SYMBOL);
   
   ArrayPrint(chars);
   
   string arrowObj = "Arrow";
   if(ObjectFind(0, arrowObj) < 0) {
      ObjectCreate(0, arrowObj, OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, arrowObj, OBJPROP_CORNER, CORNER_LEFT_UPPER);
      ObjectSetInteger(0, arrowObj, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
      ObjectSetInteger(0, arrowObj, OBJPROP_XDISTANCE, 50);
      ObjectSetInteger(0, arrowObj, OBJPROP_YDISTANCE, 50);
      ObjectSetInteger(0, arrowObj, OBJPROP_COLOR, clrYellow);
      //ObjectSetString(0, arrowObj, OBJPROP_FONT, "Wingdings");
      ObjectSetInteger(0, arrowObj, OBJPROP_FONTSIZE, 18);
      ObjectSetInteger(0, arrowObj, OBJPROP_BACK, false);
   } 
      
   ObjectSetString(0, arrowObj, OBJPROP_FONT, "Arial"); 
   ObjectSetString(0, arrowObj, OBJPROP_TEXT, txt);
   ObjectSetString(0, arrowObj, OBJPROP_FONT, "Wingdings");
   
   ChartRedraw();
   
   return INIT_SUCCEEDED;
}


 

Господа разработчики,

а что случилось с Alpha слоем ? Даже в 5445 еще все работало после перехода на новый движок, в 5483 - вся полупрозрачность стала полностью непрозрачной. 

Код:

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

   uint bg[];
   int w=300;
   int h=200;
   if (-1 == ArrayResize(bg,w*h))
   {
      Print("Out of Memory (DrawBG):",w," ",h);
      return INIT_FAILED;
   
   }
   
   ArrayFill(bg,0,w*h,0x77777777);
  
   ResourceCreate("::TESTBG",bg,w,h,0,0,w,COLOR_FORMAT_ARGB_RAW);
   ObjectCreate(0,"TestBG",OBJ_BITMAP_LABEL,0,0,0);
   ObjectSetInteger(0,"TestBG",OBJPROP_XDISTANCE,50);
   ObjectSetInteger(0,"TestBG",OBJPROP_YDISTANCE,50);
 
   ObjectSetString(0,"TestBG",OBJPROP_BMPFILE,"::TESTBG");   
   
   ArrayFree(bg);
 
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int32_t rates_total,
                const int32_t prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int32_t &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Было:


Стало:

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • 2025.12.14
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Файлы: