市場シミュレーション:ポジション表示(V)
はじめに
皆さん、こんにちは。市場リプレイおよびシミュレーションシステムの構築に関する連載の次の記事へようこそ。
前回の「市場シミュレーション:ポジション表示(IV)」では、ポジションインジケータを、リプレイ/シミュレーションサービスにすでに組み込まれている3つのコアコンポーネントと接続し始めました。この初期段階では、これら4つのアプリケーションをデモ口座またはリアル口座で使用することに焦点を当てます。ただし、現時点ではリアル口座で使用することはお勧めしません。まださらなる調整が必要だからです。これらのアプリケーションをリアル口座で使用することをお勧めしない主な理由は、まさにエキスパートアドバイザー(EA)とポジションインジケータが、まだ十分に安定しておらず、安心して使用できる状態ではないためです。
Chart TradeとMouse Studyインジケータについては、リアル口座で使用しても問題ありません。しかし、EAによるサポートなしにChart Tradeだけを使用しても、まったく役に立ちません。
そこでこの記事では、多くの場合、プログラマーが実際におこなっている仕事について説明します。これは、多くの人が想像しているプログラマーの仕事とは大きく異なります。プログラミングについて話すとき、私たちはデータの確認や分析に多くの時間を費やします。コードを書く時間は、そのうちのほんの一部にすぎません。
なぜこのようなことを言うのでしょうか。多くの人は、プログラミングとは大量のコードを絶え間なく書き続けることだと考えているからです。実際には、さまざまなデータを分析し、考えられる解決策を検討した後で初めてコードを書くことになります。プログラマーが、すべてがどのように動作しているのかを理解するために、自分自身で作成したファイルをかなり長い時間かけて分析することも、決して珍しくありません。可能であれば、このようなログファイルの代わりにデバッグセッションを使用することもできます。
しかし、データ量が多く、分析に長い時間がかかる場合には、ログファイルを利用する方が適していることがよくあります。この記事では、問題に対する可能性のある解決策を見つけるために、これらのファイルをどのように利用できるかを説明します。まず、現在存在している問題を確認してみましょう。
最初の問題
前回の記事で示した内容だけを見ると、これらはすべて一見すると簡単なことのように思えるかもしれません。しかし実際には、まだいくつもの問題が残っており、完了しなければならない作業も数多くあります。読者の皆さんは、すべてが簡単で分かりやすいものだと思ってしまうかもしれません。経験がないために、目の前に提示されたものをそのまま受け入れてしまうこともあるでしょう。しかし、それは避けるべき間違いです。さらに悪いのは、自分が実際に何を使っているのかを十分に理解しないまま、何かを利用しようとすることです。
初心者は、しばしばコピー&ペーストの段階を経験します。もし、いつまでもその段階にとどまりたくないのであれば、いくつかのツールの使い方を学ぶべきです。プログラマーが最も頻繁に使用するツールの一つがドキュメントです。二つ目は、ログファイルを活用したテストです。
では、次に発生した問題を見てみましょう。前回の記事で説明したように、EAはチャート上にポジションインジケータを配置することができます。このインジケータはポジションデータを取得し、ポジションとその価格水準に対応するラインをチャート上に表示します。一見すると問題はないように見えますが、実際にはコード、より正確にはシステムの実装方法に欠陥があります。
ここで、優れたプログラマーがよくおこなうように、トレーダーがチャートからEAを削除したと仮定しましょう。あるいは、フル契約を監視していたEAに対して、フル契約の追跡からミニ契約の追跡へ切り替えるようトレーダーが指示したとします。この2つの場合、チャート上では何が起こるでしょうか。まだ、これらすべてを扱い始めたばかりであることを覚えておいてください。どちらの場合も、ポジションインジケータに関する問題が発生します。最初のケースでは、EAがチャートから削除されると、チャート上に配置済みのポジションインジケータがすべて残ってしまいます。これは正しくありません。なぜなら、トレーダーがポジションを決済したい場合に、システムをサポートするEAがもはや存在しないからです。ポジションインジケータを直接操作してポジションを決済するために必要な仕組みは、まだ実装されていませんが、近いうちに追加される予定です。今の段階から、この可能性について考え始める必要があります。これは、実際にこの機能を実装する段階になったときには、EAがチャートから削除された場合など、同じように重要な別の側面についても、すでにシステムがテストされている状態にしておく必要があるからです。
2番目のケースでは、トレーダーが契約タイプの変更を要求した場合、問題はさらに深刻になる可能性があります。なぜなら、実際に取引口座で何が起きているのかについて、トレーダーに誤った認識を与えてしまうからです。どちらの場合も、基本的な解決策は、EAにトレーダーによる何らかの操作がおこなわれた時点で、すべてのポジションインジケータを削除することです。このような操作がおこなわれると、MetaTrader 5はDeInitイベントを生成し、EAはそれをOnDeinitで処理します。したがって、解決策は基本的には、古いEAのコードを新しいバージョンに置き換えることです。厳密には多くの箇所に手を入れる必要がありますが、当面は以下の断片を差し替えるだけで、この2つの問題には対処できます。
54. //+------------------------------------------------------------------+ 55. void OnDeinit(const int reason) 56. { 57. ulong ul; 58. 59. switch (reason) 60. { 61. case REASON_REMOVE: 62. case REASON_INITFAILED: 63. EventChartCustom(0, evEA_At_ChartTrade, -1, 0, ""); 64. break; 65. } 66. if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--) 67. { 68. ul = PositionGetTicket(count); 69. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 70. ChartIndicatorDelete(0, 0, IntegerToString(ul)); 71. } 72. delete Orders; 73. delete Terminal; 74. } 75. //+------------------------------------------------------------------+
EAからの抜粋
63行目に示されているように、このコードにはいくつか変更を加えたことに注意してください。もともとは、カスタムイベントを送信する際に、明示的なチャートIDを指定していました。コード内のチェックの数を減らすためにドキュメントを調べていたところ、チャートIDとして0を渡すと、その呼び出しをおこなった現在のチャートにカスタムイベントが送信されることが分かりました。このため、ポインタが初期化されているかどうかをチェックする必要がなくなりました。66行目では状況が異なります。この段階では、ポインタが初期化されていることを確認する必要があります。初期化されていない場合は、66行目から71行目までのコードを無視します。
このコードは何をしているのでしょうか。上で説明した2つの問題を解決します。ポジションがオープンしている場合、ポジションインジケータがチャート上に表示されることに注意してください。EAがMetaTrader 5からDeInitイベントを受け取ると、上のコード断片に示した関数が呼び出されます。68行目では、インデックスによってポジションのチケット番号を取得します。続いて69行目では、ポジションの銘柄がEAが想定している銘柄と一致するかどうかを確認します。したがって、Terminalポインタが初期化されている必要があります。そうでなければ、正しい銘柄名を取得することができません。
銘柄が想定されているものと一致した場合、70行目で、ポジションのチケット番号と一致するショートネームを持つインジケータをチャートから削除するようMetaTrader 5に指示します。「ちょっと待ってください。インジケータの一覧を開いても、その名前のインジケータは見当たりません。つまり、ポジションのチケット番号と一致する名前のインジケータは存在しないということですよね。」その通りです、読者の皆さん。その理由は、ポジションインジケータが、MetaTrader 5がそのインジケータを識別するために使用するショートネームを明示的に定義しているからです。まさにその名前を、ここ70行目で指定する必要があります。
これで問題は解決しました。ところが、この問題が解決したとしても、見落とされていた一つの点によって、EAがチャート上で動作している最中にトレーダーが時間足を変更した場合、依然として障害が発生する可能性があります。この障害が発生すると、実行時エラーが起こり、EAがチャートからアンロードされ、そのエラーがMetaTrader 5のターミナルログに記録されます。
同様の実行時エラーは、ポインタを扱うC/C++プログラムでもよく発生します。初期化されていないポインタを使用しようとした場合です。「でも待ってください。前回の記事では、ポインタはNULLで初期化すると説明されていましたよね。」はい、その値で初期化されます。しかし、時間足を変更した場合、アプリケーションは最初から再起動されるわけではありません。代わりに、OnInitから再初期化が始まります。その時点では、グローバル領域でしか初期化していなかったポインタは、再初期化後に正しい状態を保証できなくなります。
そのため、アプリケーション全体の安定性が危険にさらされます。無効な、あるいは未知のメモリ領域を指しているポインタを扱うことになるからです。まさにこのようなエラーを避けるため、MQL5ではポインタの使用が制限されています。しかし、私たちはどうしてもポインタを使いたい、そして使う必要があります。そのため、この問題も修正する必要があります。とはいえ、次のコード断片に示すように、修正は非常に簡単です。
13. //+------------------------------------------------------------------+ 14. input eTypeContract user00 = MINI; //Cross order in contract 15. //+------------------------------------------------------------------+ 16. C_Orders *Orders; 17. C_Terminal *Terminal; 18. //+------------------------------------------------------------------+ 19. int OnInit() 20. { 21. Terminal = NULL; 22. Orders = new C_Orders(0xC0DEDAFE78514269); 23. 24. return INIT_SUCCEEDED; 25. } 26. //+------------------------------------------------------------------+
EAからの抜粋
21行目が、この問題を解決している部分です。前回の記事に掲載した元のコードとこのコード断片を比較すれば、ここで何が変更されたのかが分かるでしょう。なお、行番号は元のコードと同じままであることに注意してください。これで、3つの潜在的なエラーが修正されました。しかし、まだ本当に難しい問題には到達していません。話題を少し分けるために、まず最初の問題を新しいセクションで見てみましょう。
多くの解決策がある問題
ここまで説明してきたことはすべて、単純ではあるものの、障害を引き起こす可能性があるため厄介な問題を取り除くことを目的としていました。ここからは、解決する必要のある、本当に難しい問題について見ていきます。最初の問題は、平均ポジション価格の変化に関するものです。この用語に馴染みがない場合は、私たちが直面している本当の問題を理解できるように、その意味を説明しましょう。
ヘッジ口座では、取引サーバー上に平均価格という概念は存在しません。これはトレーダー側から見た場合にのみ適用されるものです。というのも、複数の異なるポジションを保有することができ、その中にはロング(Buy)のポジションもあれば、ショート(Sell)のポジションもあるからです。それぞれのポジションは、まったく異なる数量と、異なる建値を持つことがあります。それぞれのポジションの価格と数量に基づいて計算を行うことで、ある値を求めることができます。これによって、導出された平均価格と合計数量が得られます。口座がヘッジタイプの場合、トレーダーはこれらの値を手動で計算する必要があります。
これに対して、ネッティング口座では状況が少し異なります。この場合、平均価格と合計数量は取引サーバーによって計算され、管理されます。ここで、リプレイ/シミュレーションサービスを作成しようとしたときに直面する問題の大きさに注目してください。すべての操作がネッティング口座に限定されていれば、プロジェクトははるかに簡単になります。しかし、両方の口座タイプに対応する必要があるため、一連の複雑な問題が生じ、プロジェクトの完成を延期せざるを得なくなります。
では、実際の問題は何でしょうか。ヘッジ口座で新しいポジションを開く場合とは異なり、ネッティング口座でポジションを開いたり、ポジションを増やしたりすると、平均価格と合計数量の両方が変化します。数量の処理は比較的簡単ですが、まだここでは説明していません。一方、価格については少し複雑です。これは、ポジションインジケータを単一の価格に結び付けておくことが難しいためです。奇妙に聞こえるかもしれませんが、次のことを考えてみてください。サーバー上で平均ポジション価格が変化すると、EAはその更新を受け取ります。しかし、ポジションインジケータはその更新を受け取りません。これが、最初の問題です。
他にも問題はありますが、まずはこれから始めましょう。あなたはこう考えるかもしれません。「分かりました。必要なのは、ポジションインジケータがポジションで起きていることに追従するようにするだけですよね。簡単そうです。」しかし、読者の皆さん、実際にはそう簡単ではありません。ポジションインジケータがポジションの変化を追跡するように設定すると、OnTimerイベントを通じておこなう必要がありますが、これはまったく推奨されません。あるいはOnCalculateイベントを通じておこなう方法もありますが、これも望ましくありません。これは「できない」と言っているのではありません。ただ、望ましくないと指摘しているだけです。なぜなら、インジケータがフリーズする可能性があるからです。また、同じ銘柄のチャートに取り付けられている他のすべてのインジケータをブロックしてしまう可能性もあります。要するに、これは非常に良くない解決策です。
そこで、次のような提案があるかもしれません。「HLINEオブジェクトにアクセスして、EAのコードからその位置を変更すればいいのでは?」これは良い解決策に思えますが、別の問題があります。HLINEオブジェクトは、ポジションインジケータ内部で必要となり、使用するオブジェクトの一つにすぎません。したがって、この解決策は採用すべきではありません。ポジションインジケータ自体が、自分のオブジェクトの管理を単独で担当し続ける必要があります。
ここまで来ると、おそらくこう思っているでしょう。「頑固ですね。なぜそんなにすべてを複雑にするのですか。もっとシンプルにすればいいでしょう。」私も時々同じことを考えます。しかし、私は難しい問題に取り組むのが好きです。これから私が提案する方法は、頭を悩ませることになるかもしれません。というのも、ここからは多くの初心者にとってまったく未知の世界に入っていくからです。しかし、これを仕事にしている人にとっては、とても馴染みのある世界です。それでは、ログファイルをどのように作成し、解釈するのかを見てみましょう。私たちの問題を解決する最も簡単な方法は、OnTradeTransaction関数を使用することです。これは何かが起こったときにのみ呼び出されるからです。サーバーが何が起こったのかを正確に報告してくれるため、私たち自身でそれを推測する必要はありません。
しかし、OnTradeTransaction関数はかなり複雑なので、ポジションの数量を増やしたときに何が起こるのかを理解するために、ログファイルが必要になります。ここに注意してください。ポジションを開き、その直後に数量を増やした場合に何が起こるのかを示します。最後には、ポジションを完全に決済します。これらすべてを、すでに開発したEA、Mouse Studyインジケータ、およびChart Trade機能を使用しておこないます。ここでは、ポジションインジケータはいったん脇に置いておきます。
ただし、これまで提示してきたEAのコードは、今回の目的には適していません。そのため、次のバージョンに置き換える必要があります。
01. //+------------------------------------------------------------------+ 02. #property copyright "Daniel Jose" 03. #property icon "/Images/Market Replay/Icons/Replay - EA.ico" 04. #property description "Demo version between interaction" 05. #property description "of Chart Trade and Expert Advisor" 06. #property version "1.117" 07. #property link "https://www.mql5.com/pt/articles/13176" 08. //+------------------------------------------------------------------+ 09. #include <Market Replay\Order System\C_Orders.mqh> 10. #include <Market Replay\Auxiliar\C_Terminal.mqh> 11. //+------------------------------------------------------------------+ 12. enum eTypeContract {MINI, FULL}; 13. //+------------------------------------------------------------------+ 14. input eTypeContract user00 = MINI; //Cross order in contract 15. //+------------------------------------------------------------------+ 16. C_Orders *Orders; 17. C_Terminal *Terminal; 18. //+------------------------------------------------------------------+ 19. void AddIndicatorPosition(ulong arg) 20. { 21. int handle = iCustom(_Symbol, PERIOD_CURRENT, "\\Indicators\\Position View.ex5", arg); 22. ChartIndicatorAdd(0, 0, handle); 23. IndicatorRelease(handle); 24. } 25. //+------------------------------------------------------------------+ 26. int OnInit() 27. { 28. Print("Initializing the Expert Advisor..."); 29. Terminal = NULL; 30. Orders = new C_Orders(0); 31. 32. return INIT_SUCCEEDED; 33. } 34. //+------------------------------------------------------------------+ 35. void OnTick() {} 36. //+------------------------------------------------------------------+ 37. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) 38. { 39. (*Orders).DispatchMessage(id, lparam, dparam, sparam); 40. switch (id) 41. { 42. case CHARTEVENT_CHART_CHANGE: 43. if (Terminal != NULL) break; 44. else 45. { 46. ulong ul; 47. Terminal = new C_Terminal(0, 0, user00); 48. for (int count = PositionsTotal() - 1; count >= 0; count--) 49. { 50. ul = PositionGetTicket(count); 51. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 52. AddIndicatorPosition(ul); 53. } 54. } 55. case CHARTEVENT_CUSTOM + evChartTrade_At_EA: 56. EventChartCustom(0, evEA_At_ChartTrade, user00, 0, ""); 57. break; 58. } 59. } 60. //+------------------------------------------------------------------+ 61. void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) 62. { 63. Print(__FUNCTION__); 64. 65. MqlTradeTransaction ts[1]; 66. ts[0] = trans; 67. ArrayPrint(ts); 68. 69. MqlTradeRequest tr[1]; 70. tr[0] = request; 71. ArrayPrint(tr); 72. 73. MqlTradeResult rs[1]; 74. rs[0] = result; 75. ArrayPrint(rs); 76. } 77. //+------------------------------------------------------------------+ 78. void OnDeinit(const int reason) 79. { 80. ulong ul; 81. 82. switch (reason) 83. { 84. case REASON_REMOVE: 85. case REASON_INITFAILED: 86. EventChartCustom(0, evEA_At_ChartTrade, -1, 0, ""); 87. break; 88. } 89. if (Terminal != NULL) for (int count = PositionsTotal() - 1; count >= 0; count--) 90. { 91. ul = PositionGetTicket(count); 92. if (PositionGetString(POSITION_SYMBOL) != (*Terminal).GetInfoTerminal().szSymbol) continue; 93. ChartIndicatorDelete(0, 0, IntegerToString(ul)); 94. } 95. delete Orders; 96. delete Terminal; 97. } 98. //+------------------------------------------------------------------+
ログ作成用EA
このコードを見た読者の皆さんは、こう思うかもしれません。「ちょっと待ってください。あなたはどうかしてしまったのでは??このコードでは、OnTradeTransaction関数の中で何が起こっているのかを説明する診断データが、まったく生成されないように見えますが?」さて、このコードをMetaTrader 5で実行すると、次のようなログが生成されました。
OK 0 12:05:36.509 Expert Advisor (WDO$,M30) Initializing the Expert Advisor... HO 0 12:05:48.773 Chart Trade (WDO$,M30) Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 ) QH 0 12:05:48.773 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] FK 0 12:05:48.774 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 1.000 4975.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... QM 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction GF 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] DS 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 0 0 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 1.000 0 0 ... GQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OL 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... CO 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] DL 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... ER 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction KK 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] JI 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 1191195305 1612507881 "WDOU23" 6 0 0 0 0 1970.01.01 00:00:00 4975.000 0.000 0.000 0.000 1.000 1612507881 0 ... GI 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OD 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... CG 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] DD 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... EJ 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction KQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] PP 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 2 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... CP 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CN 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... GH 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] HM 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... IS 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction OH 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] KI 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 1612507881 "WDOU23" 3 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... OG 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] GG 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... KR 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] LF 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... MI 0 12:05:48.797 Expert Advisor (WDO$,M30) OnTradeTransaction CP 0 12:05:48.797 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] PM 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... OO 0 12:05:48.797 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] EQ 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 1 0 1612507881 "WDOU23" 1.000 0.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... OM 0 12:05:48.797 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] MP 0 12:05:48.797 Expert Advisor (WDO$,M30) [0] 10009 1191195305 1612507881 1.000 4975.000 4974.500 4975.000 "" 3531297432 0 ... EK 0 12:05:53.264 Chart Trade (WDO$,M30) Send evChartTradeBuy - Args ( 10?WDO$?WDOU23?D?1?0.00?0.00 ) HG 0 12:05:53.264 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] RF 0 12:05:53.264 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 1.000 4974.500 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... EF 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction KM 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] EN 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 0 0 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 1.000 0 0 ... KL 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CI 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... OD 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] PI 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... QO 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction GF 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] HF 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 1191195326 1612507912 "WDOU23" 6 0 0 0 0 1970.01.01 00:00:00 4974.500 0.000 0.000 0.000 1.000 1612507881 0 ... KD 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] CQ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... OL 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] PQ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... QG 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction GL 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] IL 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 2 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... KE 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] LJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... ML 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction CG 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] NR 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 1612507912 "WDOU23" 3 0 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... CR 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] KL 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... GO 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] HS 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... IR 0 12:05:53.287 Expert Advisor (WDO$,M30) OnTradeTransaction OK 0 12:05:53.287 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] DH 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... CJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LE 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 1 0 1612507912 "WDOU23" 1.000 0.000 0.000 0.00 0.00 1000 0 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... CJ 0 12:05:53.287 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] KM 0 12:05:53.287 Expert Advisor (WDO$,M30) [0] 10009 1191195326 1612507912 1.000 4974.500 4974.000 4974.500 "" 3531297433 0 ... JI 0 12:06:04.628 Chart Trade (WDO$,M30) Send evChartTradeSell - Args ( 11?WDO$?WDOU23?D?2?0.00?0.00 ) GS 0 12:06:04.628 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LR 0 12:06:04.628 Expert Advisor (WDO$,M30) [0] 1 0 0 "WDOU23" 2.000 4974.000 0.000 0.00 0.00 1000 1 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advisor." 0 0 ... NS 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction DH 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] HI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 0 1 0 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 2.000 0 0 ... LH 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LF 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... PQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] OE 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... RH 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction HQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] OS 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 1191195411 1612508010 "WDOU23" 6 0 0 1 0 1970.01.01 00:00:00 4974.000 0.000 0.000 0.000 2.000 1612507881 0 ... LP 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] LN 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... PI 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] OM 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... RP 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction HK 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] MI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 2 1 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... HF 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] PG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... DR 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] CG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... FI 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction LR 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] RN 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 1612508010 "WDOU23" 3 1 4 0 1 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 1612507881 0 ... DM 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] DI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 "" 0.000 0.000 0.000 0.00 0.00 0 0 0 0 1970.01.01 00:00:00 "" 0 0 ... HK 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] GH 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 0 0.000 0.000 0.000 0.000 "" 0 0 ... JN 0 12:06:04.652 Expert Advisor (WDO$,M30) OnTradeTransaction PG 0 12:06:04.652 Expert Advisor (WDO$,M30) [deal] [order] [symbol] [type] [order_type] [order_state] [deal_type] [time_type] [time_expiration] [price] [price_trigger] [price_sl] [price_tp] [volume] [position] [position_by] [reserved] KG 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 0 0 "" 10 0 0 0 0 1970.01.01 00:00:00 0.000 0.000 0.000 0.000 0.000 0 0 ... DQ 0 12:06:04.652 Expert Advisor (WDO$,M30) [action] [magic] [order] [symbol] [volume] [price] [stoplimit] [sl] [tp] [deviation] [type] [type_filling] [type_time] [expiration] [comment] [position] [position_by] [reserved] IH 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 1 0 1612508010 "WDOU23" 2.000 0.000 0.000 0.00 0.00 1000 1 2 1 1970.01.01 00:00:00 "Order Generated by Experts Advi" 0 0 ... LG 0 12:06:04.652 Expert Advisor (WDO$,M30) [retcode] [deal] [order] [volume] [price] [bid] [ask] [comment] [request_id] [retcode_external] [reserved] RI 0 12:06:04.652 Expert Advisor (WDO$,M30) [0] 10009 1191195411 1612508010 2.000 4974.000 4974.000 4974.500 "" 3531297434 0 ...
操作ログファイル
このログを見て、どう思いますか。このログファイルは悪夢のように見えると思います。まったく常軌を逸していて、意味のないものに見えるでしょう。しかし、信じてください。先ほど述べたように、ここでは3つの操作しかおこないません。その中にあるすべての値には、それぞれ明確な意味があります。ですから、諦めてしまう前に、このファイルがどのように生成されたのかを正確に見てみましょう。なお、ログの01行目は、EAのコードの28行目とまったく同じです。つまり、MetaTrader 5のターミナルに出力されたものは、すべてログにも書き込まれます。とはいえ、これをおこなっているのは私ではなく、MetaTrader 5です。
では、ログファイルの02行目を見てください。データのソースに注目してください。Chart Tradeです。この時点で、Chart TradeはEAに対して、成行でポジションを開くようメッセージを送信しました。このメッセージがさらに2回繰り返されていることにも注意してください。これらのメッセージの間には、実際の取引サーバーを扱う際にEAが何をしているのかが、正確に表示されています。表示されているデータは、63、67、71、75行目を使用してOnTradeTransaction関数内で生成されたものです。注意深く見てみましょう。
サーバーがMetaTrader 5に応答を送信するたびに、OnTradeTransactionの名前がログに表示されます。ここで、通信には一定のパターンがあることに注目してください。つまり、EAがサーバーにリクエストを送信すると、サーバーは直ちに応答を返します。それぞれの応答はOnTradeTransaction関数によって捕捉され、構造体は次の順序で出力されます。まずMqlTradeTransaction構造体のデータ、次にMqlTradeRequest構造体のデータ、そして最後にMqlTradeResult構造体のデータです。これは、サーバーからメッセージが送られるたびに繰り返されます。
では、これを私がどのように実現したのかを理解するために、EAのコードに戻りましょう。構造体のデータはArrayPrint関数を使って出力されていることに注目してください。「どうしてそんなことができるのですか。本当にArrayPrintを使って構造体のデータをターミナルに出力しているのですか。ちょっと待ってください。あなたは完全にどうかしてしまったのでは?私は、それぞれの構造体にあるこれらすべてのフィールドを一つずつ宣言する必要があると思っていました。でも、あなたはMQL5の複雑さと使い方を、本当に別のレベルにまで引き上げてしまいました。私はここで、1行ずつ大量のコードを書いているのに、あなたはこんなものを見せてくるのですか。」
まあ、すでに述べたように、常に最も分かりやすい解決策を選ぶというのは、あまり面白くありません。美しさは、言語の使い方を新しいレベルへ押し上げることにあります。しかし、ここで問題になるのは、ログにあるこれらすべての値が、あなたにとって意味を持つのかどうかです。これでもまだ理解するのが難しいのであれば、それらをSQLデータベースにエクスポートして、もっと単純な構造にすることもできます。その場合は、データベース内に3つの異なるテーブルを使用します。ただし、それは演習問題として残しておきます。まさか、そこまで全部こちらで用意して渡すと思っていたわけではないでしょう。
このデータを調べていくと、いくつかのフィールドの値が、サーバーによって実行されたアクションを示していることに気付くでしょう。ある時点で、サーバーは成行価格で実行される注文を生成します。この場合、チケット1612507881が作成され、数量は1、操作タイプは0になります。つまり、成行買いです。この時点では、まだオープンポジションはありません。Positionフィールドの値は0です。これは、MqlTradeTransaction構造体のtypeフィールドが6という値を取るまで続きます。つまり、サーバーがTRADE_TRANSACTION_DEAL_ADD列挙値をMetaTrader 5に送信するのです。この時点で、Positionフィールドはもはや0ではなくなり、サーバー上で作成された注文と同じ値になります。
その後、サーバーはイベント2を生成します。これはTRADE_TRANSACTION_ORDER_DELETEを表します。この時点で、サーバーによって作成された注文が削除されます。続いてイベント3が発生します。これはTRADE_TRANSACTION_HISTORY_ADDを表し、完了した取引を取引履歴に追加します。最後にイベント10が生成されます。これはTRADE_TRANSACTION_REQUESTを表します。このイベントによって、ポジションを開く処理が完了します。しかし、ここで作成されたチケットの値に注目してほしいと思います。これは重要です。なぜなら、Chart Tradeから送られてくる次のリクエストサイクルで、この値が再び現れるからです。サーバーによって作成された注文の値は異なっていることに注意してください。しかし、このポジションの値は保持されています。
2回目のサイクルが終わるまでには、サーバー上には数量2ロットのポジションが存在することになります。次に、このポジションを決済する必要があります。これは、ログに示されている3回目のサイクルでおこなわれます。ここでも、処理全体を通してポジションのチケット値が変わらないことに注目してください。
ここには興味深い点があります。サーバーがtype 8の値を一度も返していないことが分かります。この場合、それはTRADE_TRANSACTION_DEAL_DELETEを意味し、この文脈では2番目のtypeに対応することになります。この文脈で「2」というタイプが頻繁に現れるのは、それが成行注文に対応しているためです。したがって、このログデータを利用してOnTradeTransactionハンドラを実装することができます。これにより、アクティブな注文やオープンポジションのリスト全体をループ処理して、常にスキャンする必要がなくなります。ポジションの場合、ネッティング口座で作業しているのであれば、この方法はまったく意味をなさない場合があります。しかし、私たちは管理システムを一般化したいと考えています。そのため、EAは、実装時に多少の追加作業が必要になるケースがあるとしても、起こり得るあらゆるシナリオを正しく処理できなければなりません。
ここまで来ると、あなたはこう考えているかもしれません。「分かりました。EAのプログラミングに利用できる、これらすべての数字やデータ取得方法を示してくれました。でも、これらすべてを実際にどう使って、EAとポジションインジケータの間の通信を管理・整理するのか、まだ完全には理解できません。私から見ると、あなたがやっていることは完全に意味がないように思えます。私なら、もっとずっと簡単な方法でやります。」そう思うのであれば、私も同意しなければなりません。そうです、別の方法でおこなえば、はるかに簡単でしょう。しかし、私は明白な方法を取りたくありません。私は、まったく新しく、これまで探求されていない方法で行いたいのです。それでも、将来発生する可能性のあるどのような状況に対しても、完全に機能するものにしたいと考えています。
一つ覚えておいてください。私たちは、取引サーバーと並行して常時動作するアプリケーションを開発しているのではありません。取引サーバーの動作をシミュレートするシステムを開発しているのです。これには、これまでの実装でおそらく見慣れているものとは、まったく異なるアプローチで実装することが必要になります。もはや、何が起こっているのかを知るためにPositionsTotalのような関数を使うことはできません。リプレイ/シミュレーションシステムを使用する場合、これらの関数による助けやサポートに頼ることはできません。多くの人が最も合理的だと考える行動方針とは、まったく異なる道を選ぶ必要があるのです。
最後に
少し前に、OnTradeTransaction関数の使い方についての記事を書きました。それ以来、MetaTrader 5とMQL5についての私の理解は大きく変わりました。そのため今では、当時は取り上げる予定のなかった細かな点についても説明できるようになりました。これは、初心者の開発者や愛好家の間でこのテーマへの関心が高まっていることに気付いたからです。彼らは、なぜ私のコードがこれほど一般的ではない書き方になっているのかを理解しようとしています。これらの記事が、多くの人が可能だと思っている以上のことを、私たちは実現できるのだと理解するための助けになることを、心から願っています。
さて、解決すべき大きな問題の最初の一つを提示したので、次の記事では、システムをより完全な形で動作させ、ポジションインジケータがより確実に動作できるようにするEAのコードを作成できるでしょう。予定している実装には、すべての処理の仕組みを明確に理解してもらうための、深く詳細な説明が必要になります。そのため、ポジションが決済されたときにポジションインジケータを自動的に削除したり、取引が開始されたときにチャート上でポジションインジケータを初期化したりする役割を担う、変更後のEAコードは、この記事には掲載しません。とはいえ、これを実現すること自体は、最初に思うほど難しいものではありません。
本当の難しさは、通常のコードで見慣れている要素を使わずに、なぜこのコードが正常に動作するのかを理解することです。しかし、それについては次の記事で説明しましょう。今は、この記事で扱った内容をじっくり学んでみてください。なぜなら、プログラミングとは、問題を理解し、その数学的な解決策を見つけることにほかならないからです。
| ファイル | 説明 |
|---|---|
| Experts\Expert Advisor.mq5 | Chart TradeとEA間の相互作用をデモンストレーションする(相互作用にはMouse Studyが必要) |
| Indicators\Chart Trade.mq5 | 送信する注文の設定ウィンドウを作成する(Mouse Studyが必要) |
| Indicators\Market Replay.mq5 | リプレイ/シミュレーションサービスと対話するためのコントロールを作成する(Mouse Studyが必要) |
| Indicators\Mouse Study.mq5 | グラフィカルコントロールとユーザーとの相互作用を実現する(リプレイシステムと実市場での運用の両方に必要) |
| Indicators\Order Indicator.mq5 | 市場注文の発注、それらとの連携および管理を担当する |
| Indicators\Position View.mq5 | 市場ポジションの処理、それらとの連携および管理を担当する |
| Services\Market Replay.mq5 | 市場リプレイ/シミュレーションサービス(システム全体のメインファイル)を作成および維持する |
MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/13176
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
選択的状態空間モデルを採用したMambaベースのニューラルネットワーク自動売買ロボットの開発
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
量子リザバコンピューティング(QRC)回路の実装
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索