English Русский 中文 Español Deutsch Português
preview
リプレイシステムの開発(第48回):サービスの概念を理解する

リプレイシステムの開発(第48回):サービスの概念を理解する

MetaTrader 5 | 4 11月 2024, 12:33
99 0
Daniel Jose
Daniel Jose

はじめに

前回の「リプレイシステムの開発(第47回):Chart Tradeプロジェクト(VI)」稿では、Chart Trade指標を機能させることに成功しました。これで、実際に開発する必要があるものに再び焦点を当てることができます。

リプレイ/シミュレーターシステムに関する本連載の初めに、私はサービスを利用してチャート上にコントロール指標を配置できるようにしようと時間を費やしました。最初は成功しませんでしたが、あきらめずに試行を続けました。何度も失敗し、この問題で成功することはありませんでした。しかし、プロジェクトを中止することはできなかったため、その時点で別の方法を取ることにしました。

スクリプトでは何とかできるのに、サービスで同じことをやろうとすると、うまく動作しないのが本当に気になりました。

「だから何?スクリプトで何かできるという事実は、何の意味もない」と思われるかもしれません。しかし、もしそう思われるなら、それはMQL5プログラミングの知識不足によるものだと思います。MQL5で作成されたスクリプトはすべて、サービスに変換できます。基本的に、サービスとスクリプトには2つの違いがあります。もちろん、他にも違いはありますが、この2つが最も明白で、誰でも気づくことができます。

最初の違いは、スクリプトが常に特定のチャートにリンクされ、チャートが閉じられるまでその状態が保たれることです。注目すべきは、時間枠を変更した際に、MetaTrader 5が実際にチャートを再描画するコマンドを送信する点です。このプロセスを高速化するために、グラフィックオブジェクト(ウィンドウ内のオブジェクト)を閉じて新しいオブジェクトを作成することで、チャートの再描画を迅速におこないます。しかし、スクリプトにはこの機能がないため(特定のイベントが存在しないため)、チャート上で再起動されることはありません。

そのため、スクリプトを用いてチャートを監視したい場合、チャート上で直接スクリプトを使用することはできません。代わりに、チャートの外部にあるものを使ってチャートを監視することが可能です。これは複雑でわかりにくいように思えるかもしれませんが、実際にはコードの詳細を変更し、スクリプトをサービスに変換することで実現できます。こうすることで、既にサービスとなったスクリプトは特定のチャートにリンクされなくなりつつ、資産チャートの監視を継続できます。

なぜこのようなことが起こるのか、その背後にあるロジックや理由を理解するのは難しいかもしれません。しかし、この理解がなければ、次の開発段階に進むことはできません。したがって、チャート上で何が起こっているかを監視するサービスを構築することは、今後の活動にとって極めて重要です。それは、何かを創り出す必要があるからではなく、観察する必要があるからです。

この記事で紹介されている内容は、リプレイ/シミュレーターシステムに不可欠であるため、貴重な研究リソースとして活用できます。さらに、チャートにリンクせずに分析をおこなう必要がある、より複雑で詳細なプロジェクトにも非常に役立つでしょう。


サンプルスクリプトの実装

これがどのように機能し、どのような課題に直面することになるのかを本当に理解するために、まずは非常に単純な例から始めましょう。単純ではありますが、後で実装されるより複雑なものの基礎として十分に機能します。

まず、最も基本的なレベルで理解することからスタートしましょう。以下に示すのは、非常に優れた、かつ非常にシンプルなスクリプトです。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property version   "1.00"
04. //+------------------------------------------------------------------+
05. void OnStart()
06. {
07.     long id;
08.     string szSymbol;
09.     int handle;
10.     bool bRet;
11.     ENUM_TIMEFRAMES tf;
12.     
13.     id = ChartID();
14.     szSymbol = ChartSymbol(id);
15.     tf = ChartPeriod(id);
16.     handle = iMA(szSymbol, tf, 9, 0, MODE_EMA, PRICE_CLOSE);
17.     bRet = ChartIndicatorAdd(id, 0, handle);
18.     
19.     Print(ChartIndicatorName(id, 0, 0), " ", szSymbol, " ", handle, "  ", bRet, " >> ",id);
20.     
21.     Print("*******");
22. }
23. //+------------------------------------------------------------------+

スクリプトソースコードの例

このスクリプトは非常にシンプルですが、実際に何をするのかを説明するのに役立ちます。行02と03には、コードのプロパティに関するデータがありますが、これらは説明にはそれほど重要ではありません。行05が、実際にコードを開始する場所です。これは非常にシンプルなスクリプトなので、必要な関数はOnStartだけです。

行07から11はローカル変数です。ここで注目すべき重要な点があります。1つのスクリプトでこれらすべての変数が必要なわけではありません。少なくとも、これからおこなうことではそうではありません。実際、これらの変数はどれも必要ありません。ただし、行19があるため、スクリプトではここで使用します。

実際には、スクリプトでは次の処理がおこなわれます。行13で、スクリプトを配置するチャートの識別子を取得します。次に、行14で、このチャートにある資産の名前を取得します。行15で、スクリプトが実行される時間枠を取得します。これら3つの手順はすべてオプションです。行13の手順は必須ですが、行14と15の手順はスクリプトに必須ではありません。ただし、これらの手順がここにある理由はすぐに明らかになります。

行16では、MetaTrader 5に標準テクニカル指標の1つをチャートに配置するよう指示します。この場合、それは移動平均です。ここでの重要な点は、追加された移動平均が終値に基づいて計算された指数9期間MAであることです。すべてが正しくおこなわれると、この指標はハンドルを返します。

行17では、行16で作成したハンドルを使用し、ハンドルが属する指標をチャート上で起動するようにMetaTrader 5に通知します。行19では、スクリプトによってキャプチャされ、使用されたすべての値を出力します。これはスクリプトのデバッグの形式であり、すぐに説明する別の目的にも役立ちます。

ここで述べたことは、他のさまざまな方法で実行できた可能性があります。おそらく、「何て役に立たないコードだ。なぜこんなものを作りたがる人がいるのだろう」と思われるでしょう。そのように考えるのは当然です。しかし、プログラミングに関しては、まったく意味のないものを作った場合を除いて、何も役に立たないものはありません。

このスクリプトをコンパイルしてチャートに配置すると、終値に基づく9期間の指数移動平均が表示されます。スクリプトコードは非常に高速に実行および完了し、主に他のテストを目的としているため、エラーチェックは含まれていません。発生したエラーはすべてMetaTrader 5ログに表示されます。

さて、ここからが楽しい部分です。考えてみましょう。たとえば、行16を別の行に置き換えた場合を考えてみましょう。

handle = iCustom(szSymbol, tf, "Replay\\Chart Trade.ex5", id);

スクリプトを使用して、Chart Trade指標をチャート上に配置できます。しかし、これの本当のメリットは何でしょうか。この記事の冒頭で述べたように、このスクリプトをスクリプトとしてだけでなく、サービスとしても使い始めると、興味深いことが起こります。


スクリプトをサービスに変換する

スクリプトをサービスに変換することは、少なくともこの段階では、それほど難しいことではありません。基本的に、コード内の唯一の違いは、スクリプトが実際にはサービスであることを示すプロパティの使用です。基本的にはそれだけですが、一見単純そうに見えるこの作業を正しく実行するには、理解する必要がある詳細がいくつかあります。

簡単な例に戻りましょう。このスクリプトをサービスに変換しようとすると、コードを変更せずにサービスであることを示すプロパティを追加するだけでは何も機能しません。なぜでしょうか。

その理由は、スクリプトとは異なり、サービスは実際にはチャートにリンクされていないからです。この状況が、多少複雑さを生じさせます。

理解しやすくするために、まずはMetaTrader 5の仕組みを理解しましょう。チャートを開かずにプラットフォームを起動することから始めましょう。サービスを追加することはできますが、他のことは何もできません。最初のチャートが開くとすぐに、指標、スクリプト、EAを配置できます。ただし、このサービスを使用してチャートを操作することもできます。

おそらく、これを試したことも、誰かがやっているのを見たこともないでしょう。今までのところはです。しかし、サービスに特定の要素をチャート上に配置させることは可能なのです。私たちはそこに到達しますが、急がないでください。この基礎を適切に理解しなければ、次回の解説を理解することはできません。なぜなら、私は同様のアプローチを用いて、他のことを高速化し、簡素化しようとしているからです。

MetaTrader 5でチャートを追加するときに、前のチャートを閉じないと、一連のチャートが作成されます。ただし、チャートへのアクセス順序は、MetaTrader 5端末で整理されている順序とは異なります。アクセス順序は、チャートが開かれる順序によって決まります。これが最初のポイントです。幸いなことに、MQL5ではこのチャートのリスト内を移動できるため、これは私たちにとって重要です。

したがって、テンプレートを作成する代わりに、特定の資産に特定の指標を追加する方法を開発したい場合は、サービスを使用する必要があります。複雑に思えますが、実際に何が起こっているのかを本当に理解していれば、それほど難しくはありません。

以前のトピックでスクリプトを使用して9期間の指数移動平均を追加したコードに戻りましょう。次に、次の操作をおこないます。最初のチャートが開かれると、この移動平均が取得されます。資産が何であっても構いません。重要なのは、これが最初に開かれるチャートであることです。この場合、同じスクリプトを以下に示すサービスコードに変換する必要があります。 

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property version   "1.00"
05. //+------------------------------------------------------------------+
06. void OnStart()
07. {
08.     long id;
09.     string szSymbol;
10.     int handle;
11.     bool bRet;
12.     ENUM_TIMEFRAMES tf;
13.     
14.     Print("Waiting for the chart of the first asset to be opened...");
15.     while ((id = ChartFirst()) < 0);
16.     szSymbol = ChartSymbol(id);
17.     tf = ChartPeriod(id);
18.     handle = iMA(szSymbol, tf, 9, 0, MODE_EMA, PRICE_CLOSE);
19.     bRet = ChartIndicatorAdd(id, 0, handle);
20.     
21.     Print(ChartIndicatorName(id, 0, 0), " ", szSymbol, " ", handle, "  ", bRet, " >> ",id);
22.     
23.     Print("*******");
24. }
25. //+------------------------------------------------------------------+

サービスのソースコード

上記のコードを、前のトピックのコードと比較してみましょう。違いは何でしょうか。おそらく、このコードをサービスとして定義するプロパティが2行目にあると思われるでしょう。これは事実ですが、他にも違いがあります。また、2つの異なる行があります。14行目では、MetaTrader 5端末にチャートが配置されるのをサービスが待機しているというメッセージを出力しており、15行目でチャートが開くことを期待しています。

ここからが、もっと面白いところです。実際に何が起こっているかを理解するには、上記のコードを記述し、MetaEditorを使用してコンパイルします。MetaTrader 5を開き、開いているチャートをすべて閉じます。その後、作成したサービスを実行します。ログウィンドウを開くと、14行目に示されているメッセージが表示されます。これが起こった場合、すべてが正しくおこなわれたことになります。次に、任意の銘柄のチャートを開きます。すぐに21行目のメッセージが表示され、サービスが閉じられます。ただし、チャートを見ると、予想どおり9期間の指数移動平均があることに気付くでしょう。これは、サービスがそこに配置したためです。

読者の皆さん、これから少し複雑な話になるので、注意深く読んでいただければ幸いです。


標準チャートの確保

ここから、サービスを使用する上で本当に楽しい部分が始まります。多くの人は、テンプレートを作成するための標準化されたグラフィカルモデルを好みます。プリセットテンプレートはこの点で役立ちます。これにより、すべてのチャートが作成時に標準に準拠していることが保証されます。ただし、テンプレートを適用した後、誤って指標を削除したり、1つの設定を変更したりすることがあります。多くの場合、これは問題ではありません。指標を復元するだけで済むからです。しかし、この問題を回避してMetaTrader 5を使用することはできるのでしょうか。そのためには、このプラットフォームが常にBloomberg端末に非常に近いものになる必要があります。

はい、可能です。実際、ユーザーや自分自身が端末内の設定を解除するのを防ぐことができます。この特定のケースでは、指標についてお話ししています。以前の記事では、チャート上の特定の指標をシステムに強制的にサポートさせる方法を示しました。これは、チャートからコントロール指標が削除されるのを避けるために、このリプレイ/シミュレーターシステムで長い間おこなわれてきました。しかし、チャート上のあらゆる要素を保持し、他の要素が表示されないようにする、より普遍的なソリューションも存在します。

予防に関しては、その方法を示すことにあまり意味はないと思いますが、維持に関しては本当に興味深いです。そこで、前のトピックで示したコードを再度変更すると、次のコードになります。 

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property version   "1.00"
05. //+------------------------------------------------------------------+
06. void OnStart()
07. {
08.     long id;
09.     string szSymbol;
10.     int handle;
11.     
12.     Print("Waiting for the chart of the first asset to be opened...");
13.     while (!_StopFlag)
14.     {
15.             while (((id = ChartFirst()) < 0) && (!_StopFlag));
16.             while ((id > 0) && (!_StopFlag))
17.             {
18.                     if (ChartIndicatorName(id, 0, 0) != "MA(9)")
19.                     {
20.                             handle = iMA(szSymbol = ChartSymbol(id), ChartPeriod(id), 9, 0, MODE_EMA, PRICE_CLOSE);
21.                             ChartIndicatorAdd(id, 0, handle);
22.                             IndicatorRelease(handle);
23.                     }
24.                     id = ChartNext(id);
25.             }
26.             Sleep(250);
27.     }
28.     Print("Service finish...");
29. }
30. //+------------------------------------------------------------------+

改善されたサービスコード

このコードには、奇妙に思える要素が含まれているかもしれませんが、各要素にはコード内に存在する理由があります。コード自体は前のトピックで説明したものと大きな違いはありませんが、非常に興味深い機能を持っています。このコードが何をするのかを確認し、ご自分のニーズや興味に合わせて調整してみてください。

12行目では、サービスが待機中であることを示すメッセージを出力しています。また、28行目では、サービスが削除され、実行されなくなったことを通知しています。この2行の間に発生することが、私たちにとって非常に興味深い内容です。MetaTrader 5で問題が発生することなくサービスが正しく終了することを確認するために、_StopFlag定数をチェックします。この定数は、サービスを閉じるように要求されるまでtrueのままです。

そのため、13行目では無限ループに入ります。このループは実際には無限ではなく、サービスを閉じるように指示した瞬間に終了します。

15行目では、前のコードと同様に、サービスを閉じる際の問題を回避するためのチェックが追加されています。注意すべき点は、ChartFirstが値を返す場合、これはMetaTrader 5端末で開いた最初のウィンドウの値であることです。この値はid変数に格納されます。この事実を覚えておくことが重要で、今後のアクションのシーケンスを考慮する必要があります。

18行目では、ウィンドウに9期間の移動平均であるiMA 指標が含まれているかどうかを確認します。この条件が満たされない場合、つまりMAがチャート上に見つからない場合には、MAを追加します。これをおこなうために、まず20行目でハンドルを作成し、次に21行目でMAをチャートに追加します。これが完了したら、ハンドルは不要になるため削除します。そのため、チャートからMAが削除されると、MAは再度追加されることになります。これは、サービスの実行中に自動的におこなわれます。

24行目では、次のウィンドウを探します。MetaTrader 5が次のインデックスを認識できるようにするために、現在のウィンドウのインデックスが必要です。混乱しないように注意してください。別のウィンドウが見つかった場合、ループは繰り返され、ChartNext-1の値を返すまで繰り返します。16行目で開始したループは、最終的に終了します。

もちろん、サービスが愚かな狂人のように動作することは望ましくありません。そのため、26行目で、ループの次の反復の前に約250ミリ秒の遅延を生成します。これにより、サービスは1秒あたり4回実行され、MetaTrader 5端末で開いているすべてのチャートに指定された移動平均が常に表示されるようになります。このような機能は非常に興味深いと思いませんか。。

しかし、さらにもう少しできることがあります。特定の銘柄の特定のチャートに要素を強制的に配置することができます。これは、本連載の初めから何度も試みてきたことですが、うまくいかなかった理由がありました。例えば、あなたがB3(ブラジル証券取引所)のトレーダーであり、特定の指標を特定の銘柄にのみ、常にその銘柄にのみ使用する必要があると判断した場合、テンプレートを使用することは1つの方法ですが、日々の忙しさの中でこの銘柄を閉じてしまう可能性が高く、チャートを再び開いたときに必要な指標が欠落していることに気づくのは手遅れです。

しかし、サービスを使用することで、このような問題は解消されます。MetaTrader 5端末で銘柄チャートが開かれるとすぐに、サービスが指標を追加します。また、テンプレートを使用して追加の要素を追加することも可能です。しかし、テンプレートの使用に関しては、本連載で今後取り上げる予定ですので、別の機会に説明します。

それでは、これをどのようにおこなうのかを見ていきましょう。混乱を避けるために、新しいトピックで検討したいと思います。

 

端末品質の確保

前のトピックで見た内容が興味深いと思った方は、準備してください。これはさらに面白い内容になります。私たちが求めているのは、銘柄チャートが常に事前に設定された端末に対応するようにすることです。MetaTrader 5 を Bloomberg端末lのように見せることができるのです。ただし、テンプレートに依存せず、サービス設定の一部になるため、設定が誤って変更されることはありません。

例として、前のトピックで説明したサービスコードがどのように変更されたかを見てみましょう。完全なコードを以下に示します。

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property version   "1.00"
05. //+------------------------------------------------------------------+
06. void OnStart()
07. {
08.     long id;
09.     string szSymbol;
10.     int handle;
11.     ENUM_TIMEFRAMES tf;
12.     
13.     Print("Waiting for the chart of the first asset to be opened...");
14.     while (!_StopFlag)
15.     {
16.             while (((id = ChartFirst()) < 0) && (!_StopFlag));
17.             while ((id > 0) && (!_StopFlag))
18.             {
19.                     szSymbol = ChartSymbol(id);
20.                     tf = ChartPeriod(id);
21.                     if ((StringSubstr(szSymbol, 0, 3) == "WDO") && (ChartWindowFind(id, "Stoch(8,3,3)") < 0))
22.                     {
23.                             handle = iStochastic(szSymbol, tf, 8, 3, 3,MODE_SMA, STO_CLOSECLOSE);
24.                             ChartIndicatorAdd(id, (int)ChartGetInteger(id, CHART_WINDOWS_TOTAL), handle);
25.                             IndicatorRelease(handle);
26.                     }
27.                     if (ChartIndicatorName(id, 0, 0) != "MA(9)")
28.                     {
29.                             handle = iMA(szSymbol, tf, 9, 0, MODE_EMA, PRICE_CLOSE);
30.                             ChartIndicatorAdd(id, 0, handle);
31.                             IndicatorRelease(handle);
32.                     }
33.                     id = ChartNext(id);
34.             }
35.             Sleep(250);
36.     }
37.     Print("Service finish...");
38. }
39. //+------------------------------------------------------------------+

サービスコード

変更は小さいですが、その結果には目を見張るものがあります。ここではデモ用にB3(ブラジル証券取引所)のシンボルを使用します。これはミニドル先物契約です。この契約は毎月期限が切れますが、それは問題ではありません。この点を理解するために、コード自体の説明に移りましょう。難しくはありませんが、細部に注意を払う必要があります。そうしないと、期待どおりの結果は得られません。

すでに説明した内容についてはここでは触れませんので、コードの新しい部分に焦点を当てます。19行目と20行目には、サービスがチェックするチャートのデータが入力されます。将来の間違いを避けるために、銘柄名とチャートの時間枠が必要です。これらの値は、2つの変数に格納されます。

21行目では、次の2つのチェックをおこないます。

  • 最初のものは、設定する銘柄の名前に関するものです  
  • 2つ目は特定の指標の有無です

両方のチェックがtrueであれば、さらにコードを実行します。ここで、これは有効期限のある先物契約であるため、銘柄名の最初の3文字のみを使用していることに注意してください。銘柄名を頻繁に変更したくないため、現在の契約に関係なく、銘柄名の共通部分を使用します。

2番目に注意すべき点は、指標に関するものです。指標の短縮名を指定する必要があります。この名前がわからない場合は、この指標をチャート上に配置し、簡単なスクリプトを使用してその名前を端末に出力します。こうすることで、そこで使用する名前を正確に知ることができます。この場合、8期間、MA3、定数3のストキャスティクス指標を使用します。ただし、指標が異なる場合は、stringを正しい名前に変更してください。そうしないと、次のステップで問題が発生します。

それでは、指標が指定された銘柄のチャート上にない状況に戻りましょう。この場合、まず23行目を実行し、目的の指標を設定します。次に、24行目で指標を新しいサブウィンドウに追加します。この時点では注意してください。サブウィンドウ番号を指定すると、MetaTrader 5は指定されたウィンドウに指標を配置します。これにより混乱が生じる可能性があります。しかし、既存のコードによると、MetaTrader 5は新しいサブウィンドウを作成し、そこに指標を追加します。

25行目では、ハンドルは不要になったため解放します。説明されているすべてのことは、指標がチャート上に存在しない場合にのみ発生します。指標を削除しようとすると、サービスはMetaTrader 5にそれを再度チャート上に配置させます。しかし、指標がすでにチャート上に存在している場合、サービスはアクティブ化されず、単に何が起きているかを監視します。

重要な注意:コードは機能し、十分なパフォーマンスを発揮しますが、実用的な理由から、27行目のチェックをより効率的なものに変更することをお勧めします。1つのチャートで複数の指標を使用する場合は、コードでおこなわれているようにインデックスではなく名前でテストするのが最適です。27行目を次のコードに置き換えるだけです。 

27.     if (ChartIndicatorGet(id, 0, "MA(9)") == INVALID_HANDLE)

したがって、指標がどのようなインデックスを持つかに関係なく、チャート上に表示される指標は1つだけです。つまり、サービスによってチャートに配置される指標です。


結論

この記事では、実際にやり方を知っている人がほとんどいないことを説明しました。この状況があなたに当てはまるなら、MetaTrader 5が見た目以上に強力なツールであることをお伝えできてとても嬉しいです。自分が何をしているのかを深く理解し、そのすべての機能をフル活用できる人にとって、MetaTrader 5はおそらく最高のプラットフォームでしょう。

この記事に関連したビデオでは、MetaTrader 5が実際にどのように機能するかを確認できますが、これはあくまで基本的な紹介に過ぎません。読者の皆さんがこの記事を読んで興味を持ち、さらに学びを深めようとしていることに心から感謝します。ただし、学びとは教育的な記事を読むことだけでなく、自ら解決策を見つけ出すことでもあることを強調したいと思います。

あらゆることから最大限の成果を引き出すよう努力し、限界に達したと感じたら、適切な人に助けを求めてください。そして、常に過去の成果を上回るよう努めることが大切です。これが進化の本質であり、真のプロフェッショナルへと成長するための道です。

デモビデオ

MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/11781

添付されたファイル |
Anexo.zip (420.65 KB)
ニューラルネットワークの実践:最小二乗法 ニューラルネットワークの実践:最小二乗法
この記事では、数式がコードで実装されたときよりも見た目が複雑になる理由など、いくつかのアイデアについて説明します。さらに、チャートの象限を設定する方法と、MQL5コードで発生する可能性のある1つの興味深い問題についても検討します。正直に言うと、まだどう説明すればいいのかよくわかりません。とにかく、コードで修正する方法を紹介します。
行列分解:より実用的なモデリング 行列分解:より実用的なモデリング
行と列ではなく列のみが指定されているため、行列モデリングが少し奇妙であることに気付かなかったかもしれません。行列分解を実行するコードを読むと、これは非常に奇妙に見えます。行と列がリストされていることを期待していた場合、因数分解しようとしたときに混乱する可能性があります。さらに、この行列モデリング方法は最適ではありません。これは、この方法で行列をモデル化すると、いくつかの制限に遭遇し、より適切な方法でモデル化がおこなわれていれば必要のない他の方法や関数を使用せざるを得なくなるためです。
リプレイシステムの開発(第49回):物事は複雑になる(I) リプレイシステムの開発(第49回):物事は複雑になる(I)
この記事では、物事は少し複雑になります。前回の記事で紹介した内容を使用して、ユーザーが独自のテンプレートを使用できるようにテンプレート ファイルを開きます。ただし、MetaTrader 5の負荷を軽減するために指標を改良していく予定なので、変更は徐々におこなっていく予定です。
リプレイシステムの開発(第47回):Chart Tradeプロジェクト(VI) リプレイシステムの開発(第47回):Chart Tradeプロジェクト(VI)
ついに、Chart Trade指標はEAと相互作用を開始し、情報をインタラクティブに転送できるようにします。そこで今回は、この指標を改良し、どのEAでも使えるような機能的なものにします。これにより、Chart Trade指標にアクセスし、実際にEAに接続されているかのように操作できるようになります。しかし、以前よりもずっと興味深い方法でそれをおこなうつもりです。