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

 

Подскажите в чем, может быть причина ошибки [Too many trade requests]  уже на втором вызове обычной OrderSend (после запуска терминала) ?

Посмотрел логи с с понедельника по четверг. Везде одна и та же картина: Первая отправка лимитного ордера проходит удачно, а последующие завершаются с ошибкой  [Too many trade requests] . Потом начинают проходить. Из криминального делаю только частые вызовы CopyTickRange в OnInit().


BCS Broker MetaTrader 5 Terminal x64 build 2170 started

 
Ilyas:


@Ilyas

Из dll, указатель на строку const wchar_t* копирует ровную строку, вот с такими параметрами

memcpy( out, data, wcslen(data) * sizeof(int) );
wcsncpy( out, data, wcslen(data) * 2 );

С такими параметрами, естественно течёт.

2019.10.11 04:32:37.857 ExampleDll      M 739
2019.10.11 04:32:37.857 ExampleDll       660
2019.10.11 04:32:37.857 ExampleDll       701

Но строка получается ровная, не одного лишнего символа не проскакивает.
И после завершения программы, в журнале экспертов появляется сообщение

2019.10.11 03:44:39.202 ExampleDll      1 leaked strings left


И вот такой тест

void OnStart()
{  
   Print("sizeof(char)   = " + (string)sizeof(char));
   Print("sizeof(' ')    = " + (string)sizeof(' '));
   Print("sizeof(\"\")   = " + (string)sizeof(""));
   Print("sizeof(string) = " + (string)sizeof(string));
}

Показывает следующее

2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof(char)   = 1
2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof(' ')    = 2
2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof("")     = 12
2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof(string) = 12

Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode. 
А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t

Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?


 
Roman:

@Ilyas

Из dll, указатель на строку const wchar_t* копирует ровную строку, вот с такими параметрами

С такими параметрами, естественно течёт.

Но строка получается ровная, не одного лишнего символа не проскакивает.
И после завершения программы, в журнале экспертов появляется сообщение


И вот такой тест

Показывает следующее

Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode. 
А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t

Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?


string - это объект в котором кроме указателя на строку, еще что-то есть.
 
Всем привет! Похож, что функция ResourceReadImage() при получении данных из BMP файлов работает некорректно! Нарисовал скрипт для отрисовки картинки, как фона на канве. Если картинку достаём с файла, лежащего на жёстком диске и просто заливаем на канву, то всё работает нормально, но если мы достаём пикселы картинки из BMP ресурса, который находится в самом ex5 файле, с помощью функции ResourceReadImage(), то итоговое фоновое изображение такое, словно это махонький  и сильно увеличенный кусочек исходной картинки. В чём причина?
//+------------------------------------------------------------------+
//|                                             BMP_Background_X.mqh |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
//#property description "Создание фоновой подложки с картиной из BMP файла"
//+------------------------------------------------------------------+
#include <Canvas\Canvas.mqh>
#include <\Canvas\Charts\ChartCanvas.mqh>
#include <Arrays\ArrayObj.mqh>
#resource "\\Files\\bmp_resource_002.bmp" // bmp_resource_002.bmp находится в каталог_данных_терминала\MQL5\Files\ 

//+------------------------------------------------------------------+
//| inputs                                                           |
//+------------------------------------------------------------------+
input int      X=10; //координата X
input int      Y=60; //координата Y
input color    Color=clrMagenta; //цвет заливки
input uchar    BackgroundTransparentLevel=150;  //прозрачность ценового графика и его фона
//input string   FileName="bmp_resource_001.bmp"; //имя BMP рисунока из папки \MQL5\File
input string   ResName="CanvasBackground"; //имя создаваемого графического ресурса
CChartCanvas canvas;  //создание канвы
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {  
//--- Создадим канву
   int width=50;
   int height=50;
//--- COLOR_FORMAT_ARGB_RAW - Компоненты цвета не обрабатываются терминалом (должны быть корректно заданы пользователем)
//--- COLOR_FORMAT_ARGB_NORMALIZE - Компоненты цвета обрабатываются терминалом
//--- COLOR_FORMAT_XRGB_NOALPHA - Компонента альфа-канала (прозрачность) игнорируется
   if(!canvas.CreateBitmapLabel(ResName,X,Y,width,height,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return(false);
     }
     
//--- Грузим фон на канву из файла на жёстком диске (делаем фоновый рисунок из BMP файла)
   canvas.LoadFromFile("bmp_resource_002.bmp"); //грузим рисунок из папки \MQL5\Files
   canvas.Update(); //фон нарисован 
   Sleep(10000); //пауза десять секунд   

//--- стираем полученный результат и обновляем график
   canvas.Erase(ColorToARGB(clrBlack,0));
   canvas.Update();
   Sleep(3000); //пауза три секунды
   
//--- Грузим фон на канву из данного ex5 файла скрипта (делаем фоновый рисунок из ресурса)
   string path="::Files\\bmp_resource_002.bmp";
   uint bmp_data[]; //массив для получения пикселов
   ResourceReadImage(path,bmp_data,width,height); // получаем массив пикселей 
   Print("Итоговый размер массива с пикселами: "+string(ArraySize(bmp_data)));
   Print("Разрешение полученного изображения: "+string(width)+" X "+string(height));
//--- меняем размер канвы 
   canvas.Resize(width,height);

//--- заливаем фон из массива на канву
   for(int x1=0; x1<width && !IsStopped(); x1++)
      for(int y1=0; y1<height && !IsStopped(); y1++)
        {
         canvas.PixelSet(x1,y1,bmp_data[x1+y1]);
        }
   canvas.Update();
   Sleep(5000); //пауза пять секунд
//--- стираем полученный результат и обновляем график
   canvas.Erase(ColorToARGB(clrBlack,0));
   canvas.Update();
//--- завершение работы кода по созданию подложки
   ObjectDelete(0,ResName);
   ResourceFree(path); 
   canvas.Destroy();
//----
   ChartRedraw(0);
   return(0);
  }
//+------------------------------------------------------------------+
Файлы:
 
Roman:

@Ilyas

Из dll, указатель на строку const wchar_t* копирует ровную строку, вот с такими параметрами

С такими параметрами, естественно течёт.

Но строка получается ровная, не одного лишнего символа не проскакивает.
И после завершения программы, в журнале экспертов появляется сообщение


И вот такой тест

Показывает следующее

Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode. 
А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t

Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?


1. в MQL только юникод, поэтому и размер символа 2 байта

2. cтрока это структура (4 байта размер буфера и 8 байт указатель)


Копирование в строку должно быть таким

wcscpy(out,data);

Если это не работает, то ошибку надо искать в другом месте

 
Nikolay Kositsin:
Всем привет! Похож, что функция ResourceReadImage() при получении данных из BMP файлов работает некорректно! Нарисовал скрипт для отрисовки картинки, как фона на канве. Если картинку достаём с файла, лежащего на жёстком диске и просто заливаем на канву, то всё работает нормально, но если мы достаём пикселы картинки из BMP ресурса, который находится в самом ex5 файле, с помощью функции ResourceReadImage(), то итоговое фоновое изображение такое, словно это махонький  и сильно увеличенный кусочек исходной картинки. В чём причина?

Цикл копирования точек неправильный, замените его на

//--- заливаем фон из массива на канву
   for(int y1=0; y1<height && !IsStopped(); y1++)
      for(int x1=0; x1<width; x1++)
        {
         canvas.PixelSet(x1,y1,bmp_data[y1*width+x1]);
        }
 

А такой вопрос - как получить список input-переменных, такой же, как приходит в функции  FrameInputs(), но только в одном проходе, без оптимизации ?

Вроде как такой вопрос совсем недавно всплывал, я его как-то совсем упустил из виду, а теперь у самого возникла такая задача (хочу делать автоматически set-файлы).

В какую сторону копать ? И если кто помнит то обсуждение - где оно (я найти не могу) ?

Можно, конечно, в каждом эксперте писать одтельную функцию, которая будет создавать такой список, но лучше была бы универсальная библиотечная.
 
Georgiy Merts:

Можно, конечно, в каждом эксперте писать одтельную функцию, которая будет создавать такой список, но лучше была бы универсальная библиотечная.

Посмотрите здесь.

 
fxsaber:

Посмотрите здесь.

Во, точно, оно !

Премного благодарен.

 
Ilyas:

1. в MQL только юникод, поэтому и размер символа 2 байта

2. cтрока это структура (4 байта размер буфера и 8 байт указатель)


Копирование в строку должно быть таким

Если это не работает, то ошибку надо искать в другом месте

А что будет, если размер копируемой строки будет больше или меньше, чем размер выделенного буфера?

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