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

 
Это ошибка или нет, что нулевой статик им не является?
int Array0[] = {};
[Удален]  
Будет ли возможность в мобильном терминале накладывать индикаторы из подвала прямо на график?
 
Igor Makanu:

в принципе как и ожидал вариант №2 быстрее, на 5000 проходов выигрыш около 30 секунд,тоже довольно не плохо

Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.

 
fxsaber:

Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.

поддерживаю, я уже не первый раз тестирую и выкладываю результаты не пойми где

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

ЗЫ: по примеру выше.... вчера не решил опять писать в этот топик нужно в примере № 2 SymbolInfoTick() на SymbolInfoInteger(_Symbol, SYMBOL_TIME)

ЗЫЗЫ: вот пример где использую, мне удобнее в оптимизаторе искать время с дискретностью в 5 минут - меньше проходов, поэтому время в оптимизаторе вообще сделал на 2 байта в ushort , если 0 - то не используется эта опция, есть еще задел - проверить как с байтами бывтрее работать, но не сейчас - в моем примере один раз в OnInit() на байты разбиваю - не критично

class CWorkTime
{
private:
   int               m_starthour, m_stophour, m_startmin, m_stopmin;
   datetime          m_starttime, m_stoptime;
   bool              UseThisSession, NotIntraDay;
   void              setTodayWorkTime();
public:
   void              CWorkTime(const ushort worktime);
   bool              Disable(); };
//+------------------------------------------------------------------+
void CWorkTime::CWorkTime(const ushort worktime): UseThisSession(true)
{  union UShortToByte { ushort u_short; uchar byte[2]; } ShortToByte;
   if(worktime == 0)
   {  UseThisSession = false;
      Print("EA working time is not used"); }
   else
   {  ShortToByte.u_short = worktime;
      int t = (int)(ShortToByte.byte[0] * 5.625);
      m_starthour = (int)(t / 60);
      m_startmin = t % 60;

      t = (int)(ShortToByte.byte[1] * 5.625);
      m_stophour = (int)(t / 60);
      m_stopmin = t % 60;
      NotIntraDay = m_starthour > m_stophour ? true : false;
      setTodayWorkTime();
      printf("EA working time start: %d h %d min , end: %d h %d min", m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+
void CWorkTime::setTodayWorkTime()
{  MqlDateTime dtstart, dtstop;
   TimeCurrent(dtstart);
   dtstop         = dtstart;
   dtstart.hour   = m_starthour;
   dtstart.min    = m_startmin;
   dtstop.hour    = m_stophour;
   dtstop.min     = m_stopmin;
   m_starttime    = StructToTime(dtstart);
   m_stoptime     = StructToTime(dtstop);
   if(NotIntraDay) m_stoptime += 86400; }
//+------------------------------------------------------------------+
bool CWorkTime::Disable(void)
{  bool result    = false;
   if(UseThisSession)
   {  datetime time = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME);
      if(m_stoptime < time) setTodayWorkTime();
      result      = time >= m_starttime && time <= m_stoptime ? false : true; }
   return(result); };
//+------------------------------------------------------------------+

использование:

int OnInit()
  {
   WorkTime=new CWorkTime(EA_Time);
   }

void OnTick()
  {
    bool DisableTradingByTime=WorkTime.Disable();
.....
    if(DisableTradingByTime) return;

т.е. результат метода Disable() - труе не рабочее время, фалсе - работаем

 
fxsaber:

Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.

Есть похожая по тематике:

Алгоритмы, методы решений, сравнение их производительности
Алгоритмы, методы решений, сравнение их производительности
  • 2017.12.10
  • www.mql5.com
В данной ветке будем обсуждать разные способы решения тех, или иных задач, сравнивать производительность предложенных решений...
 

Можно ли иметь некоторые подробности: почему SocketTlsReadAvailable () возвращает ошибку (5273 ERR_NETSOCKET_IO_ERROR), когда Socket подключен (SocketIsConnected () вернул true)?

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

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

Alain Verleyen, 2019.08.29 01:17

О функциях mql SocketXXX () это сообщение предназначено в основном для разработчиков Metaquotes: @Renat Fatkhullin, @Slava, @Ilyas

Я использую приведенный ниже код для управления приемом сообщений через защищенное соединение.

int socket;
//+------------------------------------------------------------------+
//| void OnTimer()                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   string message;
   if(receive(message))
     {
      //--- ...     
     }
  }
//+------------------------------------------------------------------+
//| Call every X ms                                                  |
//+------------------------------------------------------------------+
bool receive(string &message)
  {
//--- ...
   char response[];
   message="";

   ResetLastError();
   uint len=SocketIsReadable(socket);
   if(len>1)
     {
      int read=SocketTlsReadAvailable(socket,response,len);

      //--- analyze the response 
      if(read>0)
        {
         //--- ...

         message=CharArrayToString(response,0,read);
         return(true);
        }
      else if(read==-1)
        {
         if(SocketIsConnected(socket))
           {
            printf("ERROR: %i, socket(%i) read: len=%i",_LastError,socket,len);
           }
         else
           {
            printf("ERROR: %i, socket(%i) not connected. len=%i",_LastError,socket,len);
            //--- ...            
           }
        }
     }
   else
     {
      if(_LastError!=0)
         printf("ERROR: %i (SocketIsReadable).",_LastError);
     }
//--- ...
   return(false);
  }

Большую часть времени это работает правильно. Однако время от времени я получал сообщение об ошибке, хотя сокет подключен, и через некоторое время (от 1 до 5/6 ошибок) он продолжает работать.

... данные / сообщения получены правильно

2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ОШИБКА: 5273, гнездо (1), считано: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ОШИБКА: 5273, гнездо (1), считано: len = 1242

... данные / сообщения получены правильно

Ошибка 5273 очень общая и мало помогает. Можно ли получить больше информации о таких ошибках?


 

Подскажите в чем, может быть причина ошибки [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);
  }
//+------------------------------------------------------------------+
Файлы: