parameter convertion type 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20
以下のコードが問題の再現に役立つと思われる:
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]); } } }
パラメータ変換タイプ 'long[][2]' to 'string[][] &' is not allowed SymbolFilter.mqh 199 20
以下のコードが問題の再現に役立つと思われる:
行を見つけてください:
// 組み込みの 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.この質問は記事とは無関係のようです。
セリフを見つけてください:
ヘッダーファイル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);
/配列ソート(配列);
上記の修正案の後、このスクリプト/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
私のソースを省略してしまったことをお許しください。そこで、ご提案いただいた修正に戻したところ、再びエラーが出るようになりました。ログによると、私のコードのこれらの部分がエラーにつながる部分のようです。
その傍らで、私はしばしばこれらのメッセージを目にします。
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。
Tという文字がすでにクラス・テンプレートのtypenameとして使われていることを見落としていた(このケースでコンパイラがエラーを出さなかったのは不思議だ):
最初の警告については、フォーラムにあった説明(以前私があなたに教えたもの)を見てほしい:
リークしたメモリについては、あなたのカスタムソースコードに抜けがあるようです。問題を再現するための完全なテストコードを提供するべきです。
追記興味のあるすべてのプロパティに対して単一のセレクトを 実行する方が効率的です:
注:モデレーターは、(#41から始まる)この本に関するすべての質問と回答を、適切なスレッド、例えばここ- https://www.mql5.com/en/forum/459067。
リークについては、あなたが正しいと信じています。それがどこから来ているのか、すでに見当がついていると思います。
本当にありがとうございました。
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
このコードで取引と注文にアクセスできますが、特定の時間枠にアクセスする方法がわかりません。指定した時間枠にアクセスする方法について、ドキュメントやサンプルがあれば教えてください。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
トレーダーのためのMQL5プログラミング - 書籍からのソースコード。第6部:
『トレーダーのためのMQL5プログラミング』の第6部では、MQL5言語の重要な要素である取引の自動化について学びます。まず、金融商品の仕様や取引口座の設定など、基本的なエンティティについて説明します。これらはエキスパートアドバイザー(EA)を適切に動作させるための前提条件です。
作者: MetaQuotes