错误、漏洞、问题 - 页 2590

 

你能告诉我,在第二次调用OrderSend 程序时(启动终端后)出现[Too many trade requests]错误的原因是什么?

翻阅了周一至周四的日志。我在各地都看到了同样的情况:第一个限价订单成功发送,而接下来的所有订单都返回[交易请求太多]的错误。然后他们开始通过。唯一的犯罪行为是在OnInit()中频繁调用CopyTickRange。


BCS Broker MetaTrader 5终端x64 build 2170开始运行

 
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

char字符''返回两个字节,而不是一个字节。可能是因为它采用了Unicode。
而且,与wchar_t相比,字符串每条返回12个字节,而不是两个字节。

作为一种可能的方式,也许上型排列在某处扭曲了弦的尺寸?


 
Roman:

@Ilyas

从dll中,指向字符串的指针const wchar_t*复制了一个偶数字符串,有这些参数

有了这些参数,当然就会泄密。

但是,这个字符串原来是一个偶数,没有一个额外的字符滑过。
而在终止程序后,专家顾问日志显示了一条信息


而这样的测试

它显示如下

char字符''返回两个字节,而不是一个字节。可能是因为它采用了Unicode。
而且,与wchar_t相比,字符串每个返回12个字节,而不是两个字节。

作为一种可能的方式,也许上型排列在某处扭曲了弦的尺寸?


string是一个对象,它除了有一个指向字符串的指针外,还有一些东西。
 
大家好!当从BMP文件中获取数据时,ResourceReadImage()函数 似乎不能正常工作。我做了一个脚本,在画布上画一张图片作为背景。如果我们从位于HDD的文件中获取图像像素,并将其填充到画布上,一切都很正常,但如果我们使用ResourceReadImage()函数从位于ex5文件本身的BMP资源中获取图像像素,得到的背景图像看起来就像源图像的一个小片,并被大大放大了。原因是什么呢?
//+------------------------------------------------------------------+
//|                                             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* string指针复制了一个普通的字符串,有这些参数

有了这些参数,当然就会泄密。

但是,这个字符串变成了一个偶数,没有多余的字符丢失。
而在终止程序后,专家顾问日志显示了一条信息


而这样的测试

它显示如下

char字符''返回两个字节,而不是一个字节。可能是因为它采用了Unicode。
而且,与wchar_t相比,字符串每条返回12个字节,而不是两个字节。

作为一种可能的方式,也许上型排列在某处扭曲了弦的尺寸?


1.在MQL中只有Unicode,这就是为什么字符大小为2字节的原因。

2.字符串是一个结构(4字节的缓冲区大小和8字节的指针大小)。


拷贝到字符串的内容应该是

wcscpy(out,data);

如果这不起作用,错误必须在其他地方找到

 
Nikolay Kositsin:
大家好!当从BMP文件中获取数据时,ResourceReadImage()函数似乎不能正常工作。我做了一个脚本,在画布上画一张图片作为背景。如果我们从位于HDD的文件中获取图像像素,并将其填充到画布上,一切都很正常,但如果我们使用ResourceReadImage()函数从位于ex5文件本身的BMP资源中获取图像像素,得到的背景图像看起来就像源图像的一个小片,并被大大放大了。原因是什么呢?

拷贝点循环是错误的,用以下方式代替

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

还有这个问题--如何获得一个输入变量的列表,就像FrameInputs( )函数中的一样,但只需一次就能完成,无需优化?

是的,最近出现了这样的问题,我不知不觉中忘记了,现在我自己也有了这样的任务(我想自动制作设定文件)。

在什么方向挖掘?如果有人记得那次讨论--它在哪里(我找不到了)?

当然,在每个专家顾问中,我可以写一个函数,这将创建这样一个列表,但最好是有一个通用的库函数。
 
Georgiy Merts:

当然,你可以在每个EA中写一个单一的函数来创建这样一个列表,但一个通用的库函数会更好。

请看这里

 
fxsaber:

请看这里

这是正确的,就是这样 !

非常感谢你。

 
Ilyas:

1.在MQL中只有Unicode,这就是为什么字符大小为2字节的原因。

2.字符串是一个结构(4字节的缓冲区大小和8字节的指针大小)。


拷贝到字符串的内容应该是

如果这不起作用,必须在其他地方寻找错误的原因

如果要复制的字符串的大小大于或小于分配的缓冲区的大小,会发生什么?