エラー、バグ、質問 - ページ 2590

 

ターミナルを起動した後、OrderSend ルーチンの2回目の呼び出しで[Too many trade requests]エラーが発生する原因を教えてください。

月曜日から木曜日までのログに目を通しました。最初の指値注文は正常に送信され、次の注文はすべて[Too many trade requests]エラーで戻ってくるというのは、どこでも同じことが起こっています。そして、合格を目指し始めるのです。唯一の犯罪行為は、OnInit()内でCopyTickRangeを頻繁に呼び出すことです。


BCS Broker MetaTrader 5 Terminal x64 build 2170 を開始しました。

 
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

しかし、その文字列は、余分な文字が1つも入っていない偶数文字列であることがわかった。
そして、プログラムを終了させた後、Expert Advisorのログにメッセージが表示されます。

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 文字 ' ' は、1 バイトではなく 2 バイトを返します。おそらく、ユニコードだからでしょう。
また、文字列はwchar_tと比較すると、2バイトではなく、12バイトずつ返されます。

考えられる方法として、アッパータイプのアライメントは、どこかで弦のサイズを歪めているのかもしれませんね?


 
Roman:

イリヤス

dll からは、文字列 const wchar_t* へのポインタが、これらのパラメータを持つ偶数文字列をコピーします。

このパラメータでは、当然ながら漏れます。

しかし、文字列は均等になり、余分な文字は1つも出てこない。
そして、プログラムを終了させた後、Expert Advisorのログにメッセージが表示されます。


そして、そんなテストがある。

以下のように表示されます。

char 文字 ' ' は、1 バイトではなく 2 バイトを返します。おそらく、ユニコードだからでしょう。
また、文字列はwchar_tと比較すると、2バイトではなく、12バイトずつ返されます。

考えられる方法として、アッパータイプのアライメントは、どこかで弦のサイズを歪めているのかもしれませんね?


stringは、文字列へのポインタの他に何かを持つオブジェクトです。
 
皆さん、こんにちは!BMPファイルからデータを取得する際、ResourceReadImage()関数が 正しく動作しないようです。キャンバスに背景として絵を描くスクリプトを作りました。ハードディスクにあるファイルから画像を取り出して、それをキャンバスに塗りつぶすだけなら問題ありませんが、ex5ファイル自体にあるBMPリソースから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:

イリヤス

Dll からは、const wchar_t* 文字列ポインタは、以下のパラメータを持つプレーンな文字列をコピーします。

このパラメータでは、当然ながら漏れます。

しかし、その文字列は、余分な文字が欠落していない、偶数の文字列であることが判明した。
そして、プログラムを終了させた後、Expert Advisorのログにメッセージが表示されます。


そして、そのようなテスト

以下のように表示されます。

char 文字 ' ' は、1 バイトではなく 2 バイトを返します。おそらく、ユニコードだからでしょう。
また、文字列はwchar_tと比較すると、2バイトではなく、12バイトずつ返されます。

考えられる方法として、アッパータイプのアライメントは、どこかで弦のサイズを歪めているのかもしれませんね?


1. MQLではUnicodeのみ、そのため文字サイズは2バイトです。

2. 文字列は構造体(バッファサイズ4バイト、ポインタサイズ8バイト)です。


コピー先の文字列は

wcscpy(out,data);

これがうまくいかない場合、エラーは他の場所にあるはずです。

 
Nikolay Kositsin:
皆さん、こんにちは!BMPファイルからデータを取得する際、ResourceReadImage()関数が正しく動作しないようです。キャンバスに背景として絵を描くスクリプトを作りました。ハードディスクにあるファイルから画像を取り出してキャンバスに塗りつぶすだけなら問題ありませんが、ex5ファイル自体にあるBMPリソースから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]);
        }
 

そして、この質問 -FrameInputs() 関数に来るのと同じ入力変数のリストを、最適化せずに1パスだけで 取得するにはどうしたらよいでしょうか?

そうそう、ごく最近そのような質問があったのですが、いつの間にか失念していて、今自分もそのような課題(セットファイルを自動的に作りたい)を抱えています。

どの方向に掘ればいいのか?また、その議論を覚えている人がいれば、それはどこにあるのでしょうか(見つからないのですが)?

もちろん、それぞれのExpert Advisorに、このようなリストを作成する関数を書くこともできますが、普遍的なライブラリの関数があった方が良いでしょう。
 
Georgiy Merts:

もちろん、このようなリストを作成する関数を各EAに1つずつ書いてもいいのですが、ユニバーサルライブラリの関数の方がいいでしょう。

こちらを ご覧ください。

 
fxsaber:

こちらも ご覧ください。

そうだ、それだ!」。

ありがとうございました。

 
Ilyas:

1. MQLではUnicodeのみ、そのため文字サイズは2バイトです。

2. 文字列は構造体(バッファサイズ4バイト、ポインタサイズ8バイト)です。


コピー先の文字列は

これがうまくいかない場合、エラーは他の場所で探す必要があります。

また、コピーする文字列のサイズが、確保したバッファのサイズより大きい場合や小さい場合はどうなるのでしょうか?