
カスタムグラフィックコントロールパート2コントロールライブラリ
はじめに
(前稿) 「カスタムグラフィックコントロール・パート1・簡単なコントロールを作成する」 では、グラフィックコントロールを作成し、これによりプログラム(エキスパートアドバイザ、スクリプト、インディケータ)とユーザ間のインタラクションにおいて起こる主要な問題を処理するコントロールセットが作成される原則について述べました。
いくつかのコントロールはよく知られている標準コントロールにほぼ完全に準拠していますが、その他はターミナルの特徴と性能を正当に考慮した上で開発されました。全てのコントロールは独立したクラスとして設計され、前稿で用いたIncGUI.mqhというファイルに追加されています(新しいファイル名は、IncGUI_v2.mqhです)。
このファイルにはさらに、新しく追加されたコントロールクラス以外にも変更が加えられています:CGraphicObjectShellクラスが変更され、座標とサイズ(SetXYDistance()、SetXYSize())を同時にセットするメソッドが加わり、またいくつかのメソッドの名前に含まれるDistanceという単語のタイプエラーが修正されました(Distanseと表記されていました)。
CInputBoxクラスでは、 SetValueString()メソッド名のタイプエラーが修正され(SetValueStrindと表記されていました)、また、SetReadOnly()メソッドとReadOnly()メソッドが追加されました。SetReadOnly()メソッドはテキストボックスへのキーボード入力の有効/無効を設定し、ReadOnly()メソッドではキーボード入力が認められているかどうかを確認できます。
CColorSchemesクラス内では、Show()メソッドを用いて表示される色見本の順序が変更されました;現在カラースキームには予想以上に多くの色調が用意されているため、スキームは縦に、色調は横に配置されています。CColorSchemesクラスにはさらに、新しいカラースキームもいくつか加えられています。
本稿では、以下のコントロールに含まれるライブラリについて紹介します:
- CInputBox (Input Box)、
- CSpinInputBox (Spin Button Input Box)、
- CCheckBox (Checkbox)、
- CRadioGroup (Radio Button Group)、
- CVSсrollBar (Vertical Scrollbar)、
- CHSсrollBar (Horizontal Scrollbar)、
- CList (List)、
- CListMS (Multiple-Selection List)、
- CComBox (Drop-Down List)、
- CHMenu (Horizontal Menu)、
- CVMenu (Vertical Menu)、
- CHProgress (Horizontal Progress Bar)、
- CDialer (Dialer)、
- CDialerInputBox (Dialer with Input Box)、および
- CTable (Table)。
以下、各コントロールとその使用例を見てみましょう(CInputBoxについては、大変詳しいレビューが「カスタムグラフィックコントロール・パート1・簡単なコントロールを作成する」にあるため省略します)。
1. CSpinInputBoxクラス
スピンボタン入力ボックス(図1)
図 1 CSpinInputBoxクラス(スピンボタン入力ボックス)
「+」ボタンをクリックするとテキストボックス内の値が設定値分だけ増加し、同じく、「-」ボタンをクリックすると同様に減少します。
スピンボタンを使って値を変更する以外に、テキストボックスへのキーボード入力を有効にすることもできます(SetReadOnly()メソッド)。このコントロールは数値モードで動作するCInputBoxクラスに基づいており、制限値を設定するための同様のメソッド:SetMaxValue()、SetMinValue()を備えています。
CInputBoxとは異なり、CSpinInputBoxクラス内でInit()メソッドが呼び出されると、Digitsパラメータの代わりに、スピンボタンによる値の変更を意味するChangeパラメータが送信されます。Changeパラメータの値は、小数位の桁数をテキストボックス内の値のフォーマットにしたがって定義します。SetValue()メソッドやValue()メソッドを用いると、プログラムで設定を行って値を得ることができます。値がフォーマットされている小数位の桁数は、Digits()メソッドを用いて受け取ることができます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CSpinInputBox.mq5ファイルで提供されています。
2. CCheckBoxクラス
チェックボックスまたはOn-Offスイッチ(図 2)
図 2 CCheckBox Classクラス(チェックボックスまたはOn-Offスイッチ)
これは2つの値、すなわちonまたはoffのいずれかを採用することができる、たいへん簡単なコントロールです。「off」状態では、四角いボックスを意味します。「on」状態では、この四角の中にチェックマークが表示されます。SetValue()メソッドとValue()メソッドを用いると、プログラムで設定を行ったり値を知ることができます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CCheckBox.mq5ファイルで提供されています。
3. CRadioGroupクラス
ラジオボタングループ(図 3)
図 3 CRadioGroupクラス(ラジオボタングループ)
ラジオボタングループは、1つまたはいくつかのオプションからの選択用に設計されています(例えば、注文タイプの選択など)。本コントロールは、他のコントロールと同様に使用されます-まず、Init()メソッドがグループ名を特定して呼び出され、次に、ボタンが作成されます。ボタンの作成は、AddButton()メソッドを用いて実行されます。
AddButton()メソッドの第1パラメータはボタン右側のキャプションを定義し、続いて、コントロール全体の座標に相対的にX座標とY座標を定義します。
したがって、グループ内のボタンを(横または縦だけでなく)あらゆる順序で配置することが可能となり、ボタングループ全体を、個々のボタンの座標を再計算しなくとも、グループ座標の変更によって移動させることができます。AddButton() メソッドは、作成したいボタンの数と同じ回数だけ呼び出される必要があります。
ボタン作成後、選択されたボタンのインデックスを示すパラメータ1つのみを持つSetValue()メソッドによって、選択されたボタンが特定されます。 ボタンには、AddButton()メソッドによる作成順に、0から順に番号付けされます。選択されたボタンのインデックスを得るには、Value()メソッドが用いられます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CRadioGroup.mq5 fileファイルで提供されています。
4. CVSсrollBarクラス
縦スクロールバー(図 4)
図 4 CVSсrollBarクラス(縦スクロールバー)
これは、よく知られており一般的に使われるコントロールです。縦スクロールバーには独自のプロパティがあります:最小値、最大値(コントロール値の有効範囲を定義)、マイナーチェンジ(アップまたはダウンスクロールボタンをクリックしたときの値変更)、メジャーチェンジ(スクロールボタンとスクロールボックスの間の領域をクリックしたときの値変更)。
スクロールボタンをクリックする際のマイナーチェンジや、スクロールボックスとスクロールボタンの間の領域をクリックする際のメジャーチェンジによる値変更に加えて、スクロールボックスを特定の位置に移動させることも可能です。スクロールボックスを特定の位置に移動させるには、スクロールボックスをクリックして選択し(色が変わります)、次に必要な場所をクリックする必要があります-するとスクロールボックスが指定された場所に移動し、選択が解除されます。
スクロールボックスを誤って選択した場合には、再クリックして選択を解除しなければなりません。いずれかのスクロールボタンをスクロールボックスが選択されている間にクリックすると、後者がそれぞれ最初または最後に移動し、コントロールが最大または最小値となります。
本コントロールの適用は、Init()メソッドを呼び出すと同時にパラメータ内の名称、高さと条件サイズ(1から4まで)を指定することで開始します。
次に、SetMin()、SetMax()メソッドで値の範囲が定義され、SetSmallChange()メソッドとSetLargeChange()メソッドを用いてマイナーチェンジとメジャーチェンジの値がそれぞれセットされます。コントロール値(スクロールボックスの位置)は、Value()メソッドを用いて受け取ることができます。
スクロールボックスの位置は、SetValue()を活用して、プログラムにより修正することができます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CVSсrollBar.mq5ファイルで提供されています。
5. CVSсrollBarクラス
横スクロールバー(図 5)
図 5 CHSсrollBarクラス(横スクロールバー)
本コントロールは、Init()メソッドを呼び出す際に特定される第2のパラメータがバーの高さの代わりにバーの幅になる、という点を除いては、縦スクロールと完全に同一です。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CHSсrollBar.mq5で提供されています。
6. CListクラス
リスト(図 6)
図 6 CListクラス(リスト)
本コントロールは、リスト項目を表示するいくつかのテキストボックスに対応しています。コントロールを開始するとき、表示ボックスの数が定義されます。リスト項目の数が表示ボックスの数を超える場合は、縦スクロールバーが表示されます。
リスト項目の1つを選択することができます(図 6で色付きの項目)。項目選択に関して、本コントロールではSetAllowDeselect()メソッドの設定によって、項目選択解除を許可するか、しないか、の2つのモードで操作することができます。
Init()メソッドを呼び出す際、コントロール名、ピクセル幅、項目数による高さ、が送信されます。
Init()メソッドに続いて、AddItem()メソッドによって新たな項目がリストに追加されます。次に、必要に応じて、選択された項目がSetSelectedIndex()メソッドで設定されます。SetSelectedIndex()メソッドに-1の値を送信することで、項目をプログラムによって、いつでも選択解除することが可能です。
SelectedIndex()メソッドによって、選択された項目を特定することができます。メソッドが-1を返すときには、リスト内に選択された項目がないことを意味します。さらに、SelectedText()メソッドを使用すると、選択された項目のテキストを受け取ることができます。
いずれかのリスト項目のテキストを受け取るためには、Text()メソッドを項目インデックスを特定して用います。SetText()メソッドを用いると、いずれかの項目のテキストを修正することができます;またDeleteItem()メソッドで項目を削除し、Clear()メソッドでリスト全体をクリアすることができます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CList.mq5ファイルで提供されています。
7. CListMSクラス
マルチ選択リスト(図 7)
図 7 CListMSクラス(マルチ選択リスト)
本コントロールは、同時に複数の項目を選択することが認められるという1点を除いては、「リスト」コントロールと同一です。その結果、選択された項目にアクセスするために、多少異なる方法が用いられています。
単純なリストを扱う際には、SetSelected()メソッドは選択された項目のインデックスを示す1つのパラメータを受け取ります(新たな項目を選択するとすぐに、以前の項目は削除されます);他方、マルチ選択リストでは、SetSelected()メソッドで2つのパラメータ:インデックスとステータス(true/false-selected/not selected)が送信されます。項目が選択されたかどうかをチェックするためには、チェック対象項目の送信済ステータスを受け取るSelected()メソッドを活用します。
すべての選択項目を扱うためには、FirstSelected()メソッドとNextSelected()メソッドが用いられます。FirstSelected()メソッドは、第1に選択されたリスト項目のインデックスを返します; NextSelected()メソッドは、FirstSelected()メソッドまたはNextSelected()メソッドで最後に呼び出されて受け取った項目のインデックスに続いて選択された、次の項目のインデックスを返します。
以下のストラクチャを、すべての選択項目の繰り返し処理に用いることができます。
// All selected items iteration int Selected=lstm.FirstSelected(); while(Selected!=-1){ //======================================= // An action with the selected item // ====================================== Selected=lstm.NextSelected(); }
本コントロールの使用例は、添付のeIncGUI_v2_Test_CListMS.mq5ファイルで提供されています。
8. CComBoxクラス
ドロップダウンリスト(図 8.1)
図 8.1 CComBoxクラス(ドロップダウンリスト)
本コントロールは、リストをドロップダウンするための小さなボタンのついたテキストボックスを表しています(図 8.2)。このリストを表示するために、「リスト」コントロールが用いられます。リスト内の選択項目のテキストが、見えているテキストボックス内に表示されます。
本コントロールは2つのモード、すなわち、リストからの選択のみを許可する第1のモード、あるいは、キーボード入力を許可する第2のモード、で用いることができます(そのモードはSetReadOnly()メソッドで設定)。したがって、本コントロールとリストの間ではいくつかの違いが生じます。
キーボードを用いて入力された値がリストに含まれる場合は、対応するリスト項目が選択され、SelectedIndex()メソッドがこの項目のインデックスを返します。
入力された値がリスト内にない場合には、SelectedIndex()メソッドは-1を返し、そのため、本コントロールの値を受け取るためには、表示テキストボックスのコンテンツを返すValue()メソッドを用います。したがってこの値を、SetSelectedIndex()メソッド(項目をクリックしたのと同一)もしくはSetValue() メソッド(キーボードを用いた値の入力と同一)を用いて、プログラムで設定することが可能です。
図 8.2ドロップダウンリストの展開
本コントロールの使用例は、添付のeIncGUI_v2_Test_CComBox.mq5ファイルで提供されています。
9. CHMenuクラス
横メニュー(図9.1)
図 9.1 CHMenu(横メニュー)
本コントロールは、横の列に配置されるメニュー項目やその側にあるボタンで構成されたテキストボックスを表しています。縦のラインのついたサイドボタンは、メニューの最初から終わりまでをスクロールするために用いられ、矢印ボタンは、「スクリーン」ごとに(表示項目の数ごとに)スクロールするために用いられます。メニューの主な目的は、プログラム内でアクションを実行することです。
メニュー項目をクリックすると、コマンドを実行するためのイベントが生成されます。コマンドを直接実行することに加えて、あらゆる手段を有効/無効にするためにも用いることができます。
例えば、エキスパートアドバイザは、ポジションをクローズするためのいくつかのオプション、すなわちインディケータ1、2、あるいは3の使用、を備えています。ユーザは、最初にクロージングの警告を行うインディケータを用いて、ポジションをクローズするために、1つまたはすべてのオプション、あるいは2つの商品のあらゆるコンビネーションを有効にすることができます。
そこで、次のようなスキームが提案されます:メニューをクリックすると、その手段のパラメータを設定し有効化するウィンドウが表示され、そこでユーザがパラメータを設定し、有効化して「OK」をクリックすると動作を開始する。
どのような商品が現在動作しているかをはっきりと見るために、項目をマーク(チェックサイン)するメソッド-SetChecked()メソッド、があります。メニューが選択された項目を含む場合には、たとえスクロールアウトされて見えなくなっている場合でも、色を変えて、有効化された手段があることを、メニュー内に明示します。CheckedExist()メソッドを用いると、チェックされた項目をプログラムで特定することができ、 また、Checked()メソッドを活用すると、あるメニュー項目がチェックされたかどうかを確認することもできます。
図 9.2 横メニューと、チェックされた項目
本コントロールの適用は、他のすべてのコントロールの適用と同様に、Init()メソッドにコントロール名、ピクセル幅、表示アイテム数を送信することで開始します。Init()メソッドに続くAddItem()メソッドによって、項目が追加されます。
本コントロールは、コマンドの応答に対する他のコントロールの表示を暗示することから、クリックされたメニュー項目の座標を取得するメソッドを備えています。これらは、項目が配置されている画面領域を取得するメソッドと、表示されているコントロールを適切な画面領域に配置するために項目の幅を取得するメソッドです。
座標を取得するために、LastClickedX()メソッドとLastClickedY()メソッドが用いられ、LastClickedQuarter()メソッドが、四隅(値1-左上コーナー、値2-右上コーナー、値3-左下コーナー、値4-右下コーナー)を取得するために使用されます。また、LastClickedW()メソッドでは項目の幅を取得します。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CHMenu.mq5ファイルで提供されています。
10. CVMenuクラス
縦メニュー(図 10)
図 10 CVMenuクラス(縦メニュー)
本コントロールは、目的、機能、使用方法に関して、項目が縦に配置され、またスクロールのために縦スクロールバーが用いられることを除いては、横メニューと完全に同一です。しかし、1つ違いがあります-横メニューで項目の幅を取得するために用いられるLastClickedW()メソッドの代わりに、ここでは項目の高さを定義するためにItemHeight()メソッドが用いられます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CVMenu.mq5で提供されています。
11. CHProgressクラス
横プログレスバー(図 11)
図 11 CHProgress(横プログレスバー)
本コントロールは、タスクの進捗をパーセント形式で管理するために設計されています。例えば、チャート上のすべてのバーについて、調査のため、複雑で時間を要する演算を行うことが求められているとします。タスクがどの程度まで実行されているか、パフォーマンス終了までの残り時間を知ることは、以後の時間を見積もるのに、また少なくとも、プログラムがまだ実行中でフリーズしていないことを知るために、関心があることでしょう。プログレスバーの左側には、パフォーマンスのパーセンテージが表示され、右側には完了までの予測時間が表示されます。
Init()メソッドを呼び出すと、2つのパラメータ:名称とピクセル幅、が転送されます。管理されたループに入る直前に、ループパラメータ:最小値と最大値、を受け取るBegin()メソッドが呼び出される必要があります。ループ内部では、SetValue()メソッドが、プログレスバーによって表示される値をセットします。ループを抜けるとすぐに、Reset()メソッドがプログレスバーを元の状態へリセットします。
SetValue()メソッドが呼び出されるたびにグラフィックオブジェクトの再描画を行うため、プログレスバーの使用がコンピュータリソースの主な消費源となる可能性があり、その結果、プログレスバーの使用効率が落ちてしまうほどにループ実行時間が大幅に増加します。そこでこのようなケースのために、コントロールは、リフレッシュ間隔値が秒の単位で送信されるSetRefreshInterval()メソッドを備えています。
リフレッシュ間隔がセットされた場合には、SetValue()メソッドは呼び出されるたびにまず最後のコントロールリフレッシュ時刻をチェックし、その時刻が設定間隔を超える場合のみ、演算が実行されてプログレスバーが再描画されます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CHProgress.mq5ファイルで提供されています。
12. Dialerクラス
ダイアラー(図 12)
図 12 CDialerクラス(ダイアラー)
本コントロールはCDialerInputBoxクラス内での使用を目的としていますが、独立しても用いることができます。
例えば、本コントロールはあらゆるボタンを押すことにより可視化されます;ユーザが値をダイヤルし「OK」を押すと、プログラムはValue()メソッドにより、基本的にはDialer With Input Boxコントロールにおいて受け取られる値を用いて、最後に入力された値が常に、ダイアラーを拡張するボタンが配置されている隣のテキストボックスに表示されます。
Init()メソッドには、1つのパラメータ-名称-が送信されます。
ボタンに関して:「X」ボタン-ダイアラーを値を保存せずに閉じます;「C」ボタン-入力値をリセットします;「OK」ボタン-入力値を使用します;数値ボタンの使用に関しては自明の通りです;小数位-数字の小数位の桁数を入力します;「-」ボタン-数字の符号(正/負)を変更します。入力された数値は、ダイアラー下部のテキストボックス内に表示されます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CDialer.mq5ファイルで提供されています。
13. CDialerInputBoxクラス
Input Box付きダイアラー(図 13)
図 13 CDialerInputBoxクラス(Input Box付きダイアラー)
本コントロールはInput BoxコントロールとDialerコントロールに基づき、隣に配置されるダイアラーを拡張するためのボタンの付いたテキストボックスを表しています。本コントロールは、ダイアラーのみによる入力と、キーボード入力の併用による入力、の2つのモードで動作します。
SetReadOnly()メソッドにより、キーボード入力を有効化/無効化します。
Init()メソッドへは、4つのパラメータ:名称、ピクセル幅、値を表示用にフォーマットするための小数位の桁数、そしてコントロール横に表示されるキャプション、が送信されます。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CDialerInputBox.mq5ファイルで提供されています。
14. CTableクラス
テーブル(図 14)
図 14 CTableクラス(テーブル)
コントロール名そのものが示す通り、本コントロールはデータテーブルを表示するために設計されています。
Init()メソッドへは、3つのパラメータ:名称、ピクセル幅とピクセル高、が送信されます。実際のテーブルサイズは、行列の数やそれらのサイズによって定義されていますが、Init() の呼び出しで特定されるサイズ値を超えることはできません。実際のテーブルサイズがInit()の呼び出しで特定されるサイズ値を超える場合には、スクロールバーが表示されます。
用法Init()によるテーブルの初期化に続いて、テーブルの列数がSetCollsCount()メソッドにより定義され、またテーブルの行数がSetRowsCount()メソッドにより定義されます。SetRowsCount()メソッドの代わりに、AddRow()メソッドを使用することができます;このメソッドが呼び出されるごとに、テーブルに1行が追加されます。テーブルサイズ(列と行の数)が定義された後で、セルに値を入れることができます。
セルに値を入力するために、SetCellText()メソッドが用いられます。セルのテキストに加え、すべての他のプロパティ、すなわち:背景色、テキストの色、フォントサイズ、フォントタイプ、も変更することができます(SetCellBGColor()、SetCellTxtColor()、SetCellFontSize()、SetCellFont()の各メソッドを使用します)。SetRowHeight() メソッドによって行の高さを変更することができ、また、SetCollWidth()メソッドにより列幅を変更することが可能です。
SetCellsMerge()メソッドは、複数のセルを1つにまとめるために用いられ、4つのパラメータ:行インデックス、列インデックス、RowSpanとCollSpan、を備えています(HTMLのRowSpanとCollSpan属性に類似しています)。
RowSpanパラメータは、縦にマージするセルの数を定義し、CollSpanパラメータは横にマージするセルの数を定義します。マージされたセルは、RowSpanとCollSpanの値を1に設定することにより再現することができます。
テーブルは、見やすいようにクロスヘア機能を備えています。1つのセルをクリックすると、そのセルの列と行が他の色でハイライトされます。同じ行をさらにクリックすると、標準のテーブル色(ならびに標準のスクロールバーの色)に戻ります。SetAllowSelection()メソッドを使って、クロスヘア機能を有効/無効にすることができます。LastClickedRow()メソッドとLastClickedColl()メソッドは、クリックされたセルを特定するのに役立ちます。
HTML()メソッドを用いると、 テーブルのHTMLコードを取得し、さらにテーブルをブラウザ上で参照するためにhtmlファイルに保存することができます。しかし、このメソッドはコントロールを表示せずに、テーブルのhtmlコードを取得するためだけに用いることも可能です。
本コントロールの使用例は、添付のeIncGUI_v2_Test_CTable.mq5ファイルで提供されています。
結論
本稿でレビューされているコントロールセットはおそらく、プログラムとユーザの間のインタラクションで起こるすべての問題のソリューションを提供するものではありませんが、それでもなお、最も一般的なものはカバーしているはずです。
- チェックボックスを使った有効化/無効化;
- ラジオボタンやリストによる他オプションの選択;
- 素早く簡単な値入力のためのいくつかのオプション(キーボード入力、スピンボタン入力、ダイアラー入力);
- データのビジュアル表現手段-繰り返しになりますがリストと、テーブル。
これらのコントロールが万が一不十分な場合であっても、これらのいくつかは、直面する問題に対してより適切であろう他のコントロールを開発するために、コンポーネントとして用いることができます。いずれにせよ、私は提供されているコントロールは大いに役立つと信じています。
付録
添付ファイルリスト:
- IncGUI_v2.mqhは、CGraphicObjectShell、CWorkPiece、CColorSchemesおよびCInputBoxクラス、ならびに本稿で述べるすべてのコントロールクラスを含むインクルードファイルです。このファイルはTerminal Data FolderのMQL5/Includeフォルダに配置されなければなりません。
- eIncGUI_v2_Test_CSpinInputBox.mq5-CSpinInputBoxクラスの使用例。このファイルと、以降のすべてのファイル(2から16まで)は、MQL5/Expertsフォルダに配置されなければなりません。
- eIncGUI_v2_Test_CCheckBox.mq5-CCheckBoxクラスの使用例。
- eIncGUI_v2_Test_CRadioGroup.mq5-CRadioGroupクラスの使用例。
- eIncGUI_v2_Test_CVSсrollBar.mq5-CVSсrollBarクラスの使用例。
- eIncGUI_v2_Test_CHSсrollBar.mq5-CHSсrollBarクラスの使用例。
- eIncGUI_v2_Test_CList.mq5-CListクラスの使用例。
- eIncGUI_v2_Test_CListMS.mq5-クラスの使用例。
- eIncGUI_v2_Test_CComBox.mq5-CComBoxクラスの使用例。
- eIncGUI_v2_Test_CHMenu.mq5-CHMenuクラスの使用例。
- eIncGUI_v2_Test_CVMenu.mq5-CVMenuクラスの使用例。
- eIncGUI_v2_Test_CHProgress.mq5-CHProgressクラスの使用例。
- eIncGUI_v2_Test_CDialer.mq5-CDialerクラスの使用例。
- eIncGUI_v2_Test_CDialerInputBox.mq5-CDialerInputBoxクラスの使用例。
- eIncGUI_v2_Test_CTable.mq5-CTableクラスエレメントの使用例。
- eIncGUI_v2_Test_Allは、1つのエキスパートアドバイザ内にすべてのコントロールを作成した特集です。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/313





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索