エキスパート: トレーダーのためのMQL5プログラミング - 書籍からのソースコード。第6部

 

トレーダーのためのMQL5プログラミング - 書籍からのソースコード。第6部:

『トレーダーのためのMQL5プログラミング』の第6部では、MQL5言語の重要な要素である取引の自動化について学びます。まず、金融商品の仕様や取引口座の設定など、基本的なエンティティについて説明します。これらはエキスパートアドバイザー(EA)を適切に動作させるための前提条件です。

トレーダーのためのMQL5プログラミング - 書籍からのソースコード。第6部

作者: MetaQuotes

 
素晴らしい
 

コードを挿入する 際は CODEボタン(Alt-S)を使用して ください。

モデレーターが誤って貼り付けられたコードを整形しました。通常、そのようなコードは削除されます。



parameter convertion type 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20

parameter convertion type 'double[][2]' to 'string[][] &' is not allowed TradeFilter.mqh 332 20
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed TradeFilter.mqh 163 17


以下のコードが問題の再現に役立つと思われる:

void printSymbols() {
   SymbolFilter f;                      // フィルタオブジェクト
   string symbols[];                    // 名前の配列 
   long permissions[][2];               // データ (プロパティ値) 用の配列
   
   // 要求されたシンボルのプロパティのリスト
   ENUM_SYMBOL_INFO_INTEGER modes[] = {
      SYMBOL_TRADE_MODE,
      SYMBOL_ORDER_MODE
   };
   
   // フィルタを適用し、結果を配列で取得する
   f.let(SYMBOL_VISIBLE, true).select(true, modes, symbols, permissions);
   
   const int n = ArraySize(symbols);
   PrintFormat("===== Trade permissions for the symbols (%d) ===== ", n);
   for(int i = 0; i < n; ++i)  {
      Print(symbols[i] + ":");
      for(int j = 0; j < ArraySize(modes); ++j) {
         // ビットと数値の説明を "そのまま "表示する
         PrintFormat("  %s (%d)",
            SymbolMonitor::stringify(permissions[i][j], modes[j]),
            permissions[i][j]);
      }
   }
}

Stanislav Korotky - marketeer - Trader's profile
Stanislav Korotky - marketeer - Trader's profile
  • 2025.07.05
  • www.mql5.com
Trader's profile
 
pauldic #:


パラメータ変換タイプ 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20
parameter convertion type 'double[][2]' to 'string[][] &' is not allowed TradeFilter.mqh 332 20
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed TradeFilter.mqh 163 17


以下のコードが問題の再現に役立つと思われる:


行を見つけてください:

   // 組み込みの ArraySort のため、このオーバーロードが必要です。
   // 文字列の配列をサポートしない
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }

ヘッダーファイルSymbolFilter.mqhと TradeFilter.mqhの 次の行を見つけ、その横に次のメソッドのオーバーロードを追加してください:

   // 組み込みの ArraySort のため、このオーバーロードが必要です。
   // 文字列の配列をサポートしない
   void ArraySort(string &s[][]) const
   {
      QuickSortTm<string> qt(s);
   }
   
   template<typename T>
   void ArraySort(T &s[][]) const
   {
      ::ArraySort(s);
   }
PS.この質問は記事とは無関係のようです。
 
Stanislav Korotky #:

セリフを見つけてください:

ヘッダーファイルSymbolFilter.mqhと TradeFilter.mqhの 次の行を見つけ、その横に次のメソッドのオーバーロードを追加してください:

PS.この質問は記事とは無関係のようです。

アップデートを行った後、さらにエラーが発生しました:

parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'OrderMonitor&[][]'                   TradeFilter.mqh 338     20
parameter convertion type 'double[][2]' to 'string[][] &' is not allowed                TradeFilter.mqh 338     20
cannot convert parameter 'double[][2]' to 'PositionMonitor&[][]'                        TradeFilter.mqh 338     20
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'OrderMonitor&[][]'                             TradeFilter.mqh 163     17
parameter convertion type 'long[][2]' to 'string[][] &' is not allowed          TradeFilter.mqh 163     17
cannot convert parameter 'long[][2]' to 'PositionMonitor&[][]'                  TradeFilter.mqh 163     17
etc..

ArraySortの代わりに汎用のQuickSortTmを直接呼び出すと、一時的に問題が解決することに気づきました。

QuickSortTm<V> qt(array);
/配列ソート(配列);
 
pauldic #:

アップデートを行った後、さらにエラーが発生しました:

上記の修正案の後、このスクリプト/MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5を コンパイルし、ビルド5346で正常に実行しました。ソースコードが表示されませんでした。
 
Stanislav Korotky #:
上記の修正案の後、このスクリプト/MQL5/Scripts/MQL5Book/p6/SymbolFilterTradeMode.mq5を コンパイルし、ビルド5346で正常に実行しました。ソースコードが表示されませんでした。
ソースを省略したことをお許しください。そこで、ご提案いただいた修正に戻したところ、再びエラーが出るようになりました。ログによると、私のコードのこれらの部分がエラーにつながる部分のようです。
私はバージョン5のビルド5327

で実行しています。
void printActiveOrders() {
   
   OrderFilter filter;
   ENUM_ORDER_PROPERTY_DOUBLE properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP};
   double d[][4];
   ENUM_ORDER_TYPE types[];
   ulong tickets[], magics[];
   string symbols[], comments[];
   
   filter.select(properties, tickets, d);
   filter.select(ORDER_SYMBOL, tickets, symbols);
   filter.select(ORDER_COMMENT, tickets, comments);
   filter.select(ORDER_TYPE, tickets, types);
   filter.select(ORDER_MAGIC, tickets, magics);
   
   Print("Orders ..................  ", ArraySize(tickets));
   for (int i=0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", magics[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], "\t", comments[i]);
   }
}


void printPositions() {
   PositionFilter filter;
   
   ENUM_POSITION_PROPERTY_DOUBLE properties[] = {POSITION_PRICE_OPEN, POSITION_VOLUME, POSITION_SL, POSITION_TP, POSITION_PROFIT, POSITION_SWAP};
   
   ENUM_POSITION_TYPE types[];
   double d[][6];
   ulong tickets[], extIds[];
   string symbols[], comments[];
   
   filter.let(POSITION_MAGIC, sets.MagicNumber).select(properties, tickets, d);
   filter.select(POSITION_SYMBOL, tickets, symbols);
   filter.select(POSITION_COMMENT, tickets, comments);
   filter.select(POSITION_TYPE, tickets, types);
   filter.select(POSITION_IDENTIFIER, tickets, extIds);

   Print("Tickets\t  Parent Id\tSymbols \t Trade Type \t\t\t\t\t\tEntry \t Lots \t\t SL  \t\t\t TP \t\t\t\t Profit \tSwat \t\tComments");
   for ( int i =0; i < ArraySize(tickets); i++) {
      Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : (string)extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", (string)NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5], "\t", comments[i]);
      //Print(tickets[i], "\t", extIds[i] == 0 ? "\t\t\t\t\t\t\t\t\t" : extIds[i], "\t", symbols[i], "\t", EnumToString(types[i]), " \t", NormalizeDouble(d[i][0],3), "\t", d[i][1], " \t ",  d[i][2], " \t", d[i][3], " \t", d[i][4], " \t ", d[i][5]);
   }
}


サイドで、私はしばしばこれらのメッセージを見ます:

This single line message always shows whenever I attach my EA to a chart:
Unresolved int value as enum: 8 for MonitorInterface<ENUM_POSITION_PROPERTY_INTEGER,ENUM_POSITION_PROPERTY_DOUBLE,ENUM_POSITION_PROPERTY_STRING>::TradeState


While these ones below shows when it is detached

2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   8 leaked strings left
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   2 undeleted dynamic objects found:
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'WebSocketConnectionHybi'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)      1 object of class 'MqlWebSocketTransport'
2025.10.17 19:30:01.347 Deriv Trader (Volatility 10 (1 s) Index.0,M15)   576 bytes of leaked memory found
ファイル:
log.txt  34 kb
 
pauldic #:
私のソースを省略してしまったことをお許しください。そこで、ご提案いただいた修正に戻したところ、再びエラーが出るようになりました。ログによると、私のコードのこれらの部分がエラーにつながる部分のようです。

その傍らで、私はしばしばこれらのメッセージを目にします。

Tという文字がすでにクラス・テンプレートのtypenameとして使われていることを見落としていました(このケースでコンパイラがエラーを出さなかったのは不思議です)ので、Tを他のフリーな文字、たとえばXに変えても問題ありません:

   template<typename X>
   void ArraySort(X &s[][]) const
   {
      ::ArraySort(s);
   }

最初の警告については、フォーラムで説明されている:

取引、自動取引システム、取引戦略のテストに関するフォーラム

専門家トレーダーのためのMQL5プログラミング-本からのソースコード。パート7

スタニスラフKorotky、2025.06.14 16:26

これは、MQL5の対応する組み込み列挙に、通常は連続して代入される定数にギャップがあるという事実に起因する警告に過ぎません。このギャップはMQL5が常に変化しているために発生するもので、いくつかの定数は古くなり、その後削除される可能性があります。ソースコードを編集することで、このような警告を防ぐことができます。

リーク・メモリについては、あなたのカスタム・ソース・コードに漏れがあるようです。問題を再現するための完全なテストコードを提供するべきです。

追記興味のあるすべてのプロパティに対して単一のセレクトを 実行する方が効率的です:

   // 例:ポジションに対する利益、シンボル、チケットのリクエスト
   // 特定のマジックナンバー順、利益順
   
   #include <MQL5Book/Tuples.mqh>
   #include <MQL5Book/PositionFilter.mqh>
   #property script_show_inputs
   
   input ulong Magic;
   
   void OnStart()
   {
      int props[] = {POSITION_PROFIT, POSITION_SYMBOL, POSITION_TICKET};
      Tuple3<double,string,ulong> tuples[];
      PositionFilter filter;
      filter.let(POSITION_MAGIC, Magic).select(props, tuples, true);
      ArrayPrint(tuples);
   }



注:モデレーターは、この本に関するすべての質問と回答(#41から始まる)を、適切なスレッド、例えばここ- https://www.mql5.com/en/forum/459067。

 
Stanislav Korotky #:

Tという文字がすでにクラス・テンプレートのtypenameとして使われていることを見落としていた(このケースでコンパイラがエラーを出さなかったのは不思議だ):

最初の警告については、フォーラムにあった説明(以前私があなたに教えたもの)を見てほしい:

リークしたメモリについては、あなたのカスタムソースコードに抜けがあるようです。問題を再現するための完全なテストコードを提供するべきです。

追記興味のあるすべてのプロパティに対して単一のセレクトを 実行する方が効率的です:



注:モデレーターは、(#41から始まる)この本に関するすべての質問と回答を、適切なスレッド、例えばここ- https://www.mql5.com/en/forum/459067。

T→Xのちょっとした変更が魔法をかけました。そして、私の前の質問(前に質問したのを忘れていました)へのポインタと、あなたのリマインダーのおかげで、 以前見逃していた toyjson3.mqhの アップデートを見ることができました

リークについては、あなたが正しいと信じています。それがどこから来ているのか、すでに見当がついていると思います。

本当にありがとうございました。
 
void printActiveOrders() {
   int properties[] = {ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT};
   Tuple9<double,double,double,double,long,long,long,string,string> values[]; 
   OrderFilter filter;
   filter.select(properties, values);
   Print("\nFound:  ", ArraySize(values), " Orders\n{ORDER_VOLUME_INITIAL, ORDER_PRICE_OPEN, ORDER_SL, ORDER_TP, ORDER_TICKET, ORDER_MAGIC, ORDER_TYPE, ORDER_SYMBOL, ORDER_COMMENT}");
   ArrayPrint(values);
}

void printDeals() {
   DealFilter filter;    
   int properties[] = {DEAL_TIME, DEAL_SYMBOL, DEAL_TICKET, DEAL_TYPE, DEAL_VOLUME, DEAL_PRICE, DEAL_COMMISSION, DEAL_PROFIT};
   
   Tuple8<long,string,long,long,double,double,double,double> data[];   
   filter.select(properties, data, true); // 時間によるフィルタリング
   Print("\nFound:  ", ArraySize(data), " Deals\nTIME, SYMBOL, TICKET, TYPE, VOLUME, PRICE, COMMISSION, PROFIT");
   ArrayPrint(data);
}

StanislavKorotky
このコードで取引と注文にアクセスできますが、特定の時間枠にアクセスする方法がわかりません。指定した時間枠にアクセスする方法について、ドキュメントやサンプルがあれば教えてください。

 
pauldic #:

このコードで取引と注文にアクセスできますが、特定の時間枠にアクセスする方法がわかりません。指定した時間枠にアクセスする方法について、ドキュメントやサンプルがあれば教えてください。

注文、取引、ポジションは時間枠とは関係ありません。あなたは何かを誤解しているか、表現が間違っています。