Errores, fallos, preguntas - página 2590

 

¿Puede decirme cuál podría ser la razón del error [Demasiadas solicitudes de operaciones] en la segunda llamada de la rutina OrderSend (después de iniciar el terminal)?

Revisé los registros de lunes a jueves. He visto lo mismo en todas partes: la primera orden limitada se envía con éxito y todas las órdenes siguientes vuelven con el error [Demasiadas solicitudes de operaciones]. Entonces empiezan a pasar. La única acción criminal es la llamada frecuente de CopyTickRange en OnInit().


BCS Broker MetaTrader 5 Terminal x64 build 2170 iniciado

 
Ilyas:


@Ilyas

Desde la dll, el puntero a cadena const wchar_t* copia una cadena par, con estos parámetros

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

Con estos parámetros, por supuesto, se filtra.

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

Pero la cadena resulta uniforme, no se cuela ni un solo carácter de más.
Y después de terminar el programa, el registro del Asesor Experto muestra un mensaje

2019.10.11 03:44:39.202 ExampleDll      1 leaked strings left


Y hay una prueba de este tipo.

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

Muestra lo siguiente

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

El carácter char ' ' devuelve dos bytes en lugar de uno. Probablemente porque está en Unicode.
Y la cadena devuelve doce bytes cada una en lugar de dos bytes cuando se compara con wchar_t.

Como forma posible, tal vez la alineación de tipo superior distorsiona el tamaño de la cuerda en alguna parte?


 
Roman:

@Ilyas

Desde la dll, el puntero a cadena const wchar_t* copia una cadena par, con estos parámetros

Con estos parámetros, por supuesto, se filtra.

Pero la cadena resulta uniforme, no se cuela ni un solo carácter de más.
Y después de terminar el programa, el registro del Asesor Experto muestra un mensaje


Y hay una prueba de este tipo.

Muestra lo siguiente

El carácter char ' ' devuelve dos bytes en lugar de uno. Probablemente porque está en Unicode.
Y la cadena devuelve doce bytes cada una en lugar de dos bytes cuando se compara con wchar_t.

Como forma posible, tal vez la alineación de tipo superior distorsiona el tamaño de la cuerda en alguna parte?


string es un objeto que tiene algo más que un puntero a una cadena.
 
Parece que la función ResourceReadImage() no funciona correctamente cuando se obtienen datos de archivos BMP. Hice un script para dibujar una imagen como fondo en el lienzo. Si tomamos los píxeles de la imagen del archivo ubicado en el disco duro y los rellenamos en el lienzo, todo funciona bien, pero si tomamos los píxeles de la imagen del recurso BMP que se encuentra en el propio archivo ex5 utilizando la función ResourceReadImage(), la imagen de fondo resultante se verá como un trozo diminuto y muy ampliado de la imagen de origen. ¿Cuál es la razón?
//+------------------------------------------------------------------+
//|                                             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);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 
Roman:

@Ilyas

Desde la dll, el puntero de cadena const wchar_t* copia una cadena simple, con estos parámetros

Con estos parámetros, por supuesto, se filtra.

Pero la cadena resulta ser par, sin que falte ningún carácter extra.
Y después de terminar el programa, el registro del Asesor Experto muestra un mensaje


Y tal prueba

Muestra lo siguiente

El carácter char ' ' devuelve dos bytes en lugar de uno. Probablemente porque está en Unicode.
Y la cadena devuelve doce bytes cada una en lugar de dos bytes cuando se compara con wchar_t.

Como forma posible, tal vez la alineación de tipo superior distorsiona el tamaño de la cuerda en alguna parte?


1. en MQL sólo Unicode, por eso el tamaño de los caracteres es de 2 bytes

2. la cadena es una estructura (4 bytes de tamaño de búfer y 8 bytes de tamaño de puntero)


La copia a la cadena debe ser

wcscpy(out,data);

Si esto no funciona, el error debe encontrarse en otra parte

 
Nikolay Kositsin:
Parece que la función ResourceReadImage() no funciona correctamente cuando se obtienen datos de archivos BMP. Hice un script para dibujar una imagen como fondo en el lienzo. Si tomamos los píxeles de la imagen del archivo ubicado en el disco duro y los rellenamos en el lienzo, todo funciona bien, pero si tomamos los píxeles de la imagen del recurso BMP que se encuentra en el propio archivo ex5 utilizando la función ResourceReadImage(), la imagen de fondo resultante se verá como un trozo diminuto y muy ampliado de la imagen de origen. ¿Cuál es la razón?

El ciclo de punto de copia es erróneo, sustitúyalo por

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

Y esta pregunta - ¿cómo obtener una lista de variables de entrada, lo mismo que viene en la funciónFrameInputs() , pero sólo en una pasada, sin optimización?

Sí, hace poco había surgido una pregunta así, de alguna manera la perdí de vista, y ahora yo mismo tengo una tarea así (quiero hacer archivos de conjunto automáticamente).

¿En qué dirección cavar? Y si alguien se acuerda de esa discusión, ¿dónde está (no la encuentro)?

Por supuesto, en cada Asesor Experto podría escribir una función, que crearía dicha lista, pero sería mejor tener una función de biblioteca universal.
 
Georgiy Merts:

Se podría, por supuesto, escribir una única función en cada EA que creara dicha lista, pero sería mejor una función de biblioteca universal.

Echa un vistazo aquí.

 
fxsaber:

Echa un vistazo aquí.

¡Eso es, eso es!

Muchas gracias.

 
Ilyas:

1. en MQL sólo Unicode, por eso el tamaño de los caracteres es de 2 bytes

2. la cadena es una estructura (4 bytes de tamaño de búfer y 8 bytes de tamaño de puntero)


La copia a la cadena debe ser

Si esto no funciona, el error debe encontrarse en otra parte

¿Y qué ocurre si el tamaño de la cadena a copiar es mayor o menor que el tamaño del buffer asignado?

Razón de la queja: