¿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().
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.1104:32:37.857 ExampleDll M 7392019.10.1104:32:37.857 ExampleDll 6602019.10.1104: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.1103:44:39.202 ExampleDll 1 leaked strings left
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?
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 |//+------------------------------------------------------------------+inputint X=10; //координата Xinputint Y=60; //координата Yinputcolor Color=clrMagenta; //цвет заливкиinputuchar BackgroundTransparentLevel=150; //прозрачность ценового графика и его фона//input string FileName="bmp_resource_001.bmp"; //имя BMP рисунока из папки \MQL5\Fileinputstring ResName="CanvasBackground"; //имя создаваемого графического ресурса
CChartCanvas canvas; //создание канвы//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+intOnStart(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);
}
//+------------------------------------------------------------------+
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.
¿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
Desde la dll, el puntero a cadena const wchar_t* copia una cadena par, con estos parámetros
wcsncpy( out, data, wcslen(data) * 2 );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?
@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?
@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
Si esto no funciona, el error debe encontrarse en otra parte
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
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.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í.
Echa un vistazo aquí.
¡Eso es, eso es!
Muchas gracias.
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?