//------------------------------------------------//Open the window "Settings example 1".w_6_Settings_example_1();//------------------------------------------------
case Settings_example_1___Spin_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
Alert("S_EDIT Spin_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Slider.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);
//Alert("H_SLIDER Roll_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Spin edit.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Spin_the_value://------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
Alert("S_EDIT Spin_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Slider.//------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value://------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);
Alert("H_SLIDER Roll_the_value value entered: ",value);
//------------------------------------------------------------------------------------------------------//Your comment: Send the value to Spin edit.//------------------------------------------------------------------------------------------------------break;
2.2."Set another option"チェックボックスをロック/アンロックする関数コールを書く。
//===========================================================================================================================//WINDOW :---: Settings example 1 | #: 6 | PFX: w_6// | |//GET/SET :---: int w_6_Settings_example_1(int value = get_i, int Property = 0)//----------------| |------------------------------------------------------------------------------------------------------//ELEMENT :---: TYPE: CHECKBOX | NAME: Set an option | PAR_TYPE: int | INIT STATE: OFF | PFX: w6// | |------------------------------------------------------------------------------------------------------//LOCATION :---: Window's Main Frame //----------------| |------------------------------------------------------------------------------------------------------//G/S PROPERTIES :---: PFX: p7_ | PROPS: NONE// | |------------------------------------------------------------------------------------------------------//G/S ACTIONS :---: p7_ON | p7_OFF | p7_LOCK_ON | p7_LOCK_OFF | p7_GET_STATE |//----------------| |------------------------------------------------------------------------------------------------------// | |//GET/SET CALL :---: int w6_i_p7_CHECKBOX_Set_an_option(int value = none, int Property = 0)//---------------------------------------------------------------------------------------------------------------------------case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//1. Lock the "Set another option" checkbox in the state ON.
casechecked: w6_i_p7_CHECKBOX_Set_another_option(p7_LOCK_ON);break;
//2. Unlock "Set another option" checkbox in the state ON.
caseunchecked: w6_i_p7_CHECKBOX_Set_another_option(p7_ON);break;
}
//------------------------------------------------------------------------------------------------------//Your comment: //------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------switch((int)action)
{
//Lock both checkboxes----
casechecked: w6_i_p7_CHECKBOX_Set_another_option(p7_LOCK_ON);
w6_i_p7_CHECKBOX_And_another_option(p7_LOCK_ON);
break;
//Unlock both checkboxes---
caseunchecked: w6_i_p7_CHECKBOX_Set_another_option(p7_ON);
w6_i_p7_CHECKBOX_And_another_option(p7_ON);
break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Set_another_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//Locking the element---
casechecked: w6_s_p6_D_LIST_D_LIST_1(p6_LOCK); break;
//Unlocking the element---
caseunchecked: w6_s_p6_D_LIST_D_LIST_1(p6_UNLOCK); break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___And_another_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//Locking the element---casechecked: w6_s_p6_C_LIST_C_LIST_1(p6_LOCK); break;
//Unlocking the element---caseunchecked: w6_s_p6_C_LIST_C_LIST_1(p6_UNLOCK); break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___C_LIST_1:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Times_New_Roman"){}
if(selected_option == "Arial"){}
if(selected_option == "Tahoma"){}
if(selected_option == "Dali"){}
if(selected_option == "BatangChe"){}
if(selected_option == "Consolas"){}
if(selected_option == "Courier"){}
if(selected_option == "Courier_New"){}
if(selected_option == "DFKai_SB"){}
if(selected_option == "DotumChe"){}
if(selected_option == "FangSong"){}
if(selected_option == "Fixedsys"){}
if(selected_option == "GulimChe"){}
if(selected_option == "GungsuhChe"){}
if(selected_option == "KaiTi"){}
//Send user's choice to textbox "Comment 2" in another window.w8_s_p4_CELL_Leverage__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 75 | Digits: Integer value//------------------------------------------------------------------------------------------------------
//Sending the slider's value into the table cell.
w8_s_p4_CELL_Account_balance__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_1:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_number__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_2:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_server__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___Comment_3:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
//Sending textbox's text into the cell
w8_s_p4_CELL_Account_currency__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_2___C_LIST_1:
//------------------------------------------------------------------------------------------------------//What to do when an option selected?//------------------------------------------------------------------------------------------------------if(selected_option == "Times_New_Roman"){}
if(selected_option == "Arial"){}
if(selected_option == "Tahoma"){}
if(selected_option == "Dali"){}
if(selected_option == "BatangChe"){}
if(selected_option == "Consolas"){}
if(selected_option == "Courier"){}
if(selected_option == "Courier_New"){}
if(selected_option == "DFKai_SB"){}
if(selected_option == "DotumChe"){}
if(selected_option == "FangSong"){}
if(selected_option == "Fixedsys"){}
if(selected_option == "GulimChe"){}
if(selected_option == "GungsuhChe"){}
if(selected_option == "KaiTi"){}
//Sending C_LIST value into the cell.
w8_s_p4_CELL_Account_profit__Value(value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
ボタンのオン/オフ状態を取得するには?
これが次のトピックである。今日はそれを考えてみよう。
付け加えると、このGUIの要素は描画されるので、状態を取得する標準的な方法ObjectGetInteger(0, "button1", OBJPROP_STATE);は使えません。
また、ボタンを含むエレメントのイベントはAPIファイルに送られることも覚えておいてほしい。
考慮すべきトピックの一般的なリスト
1.インテリセンスのリストにおける方向と、右ウィンドウの機能の選択。
2.プログラムでウィンドウを開いたり閉じたりする。
3. インテリセンスのリスト内での方向づけと、正しいウィンドウで正しい要素を選択する。
4. 個別の要素プロパティのリストをナビゲートする。
5.要素とウィンドウのラッパー関数の名前の解析。
6. 選択した要素のパラメータ値を、その型の変数に返す。いくつかの異なる要素の3つの型を考える。
7.異なるタイプの要素のパラメータに値を設定する。これらの要素のインターフェイスウィンドウに値がどのように表示されるか見てみよう。
8.あるエレメントのパラメータ値を返し、その値を修正して別のエレメントに転送する。異なるタイプの要素と値を考え、異なるウィンドウで異なるタイプの要素間の転送をテストしてみましょう。
9.前の値を返す(_V_LAST)。いつ、どのような場合に最後の値が必要なのか(現在の値と混同しないように)。
10.異なるタイプのエレメントのON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK状態の設定をテストする。
11.11.異なるタイプの要素(例えば、ボタンとスライダーを持つ入力フィールド)の値の変化をリンクし、同期させてみましょう。1つの要素(手動またはソフトウェア)の値が変化すると、それに応じて2番目の要素の値も変化するとします。
12.スライダーとボタン付き入力フィールドの範囲の境界を、ラッパー関数を使ってプログラムでリセットしてみましょう。テストする時間がなかったが、うまくいきそうな気がする。しかし、見てみよう。
13.13.ラッパー関数で要素の状態を返すようにしてみよう。機能には含まれているのだが、テストする時間がない。さて、どうなることやら。結果は不明。
14.テキストとエレメント・ベースの色を取得・設定してみましょう。これらの色を簡単なイベントや値の境界に関連付けることができます。
15.新しいAPIファイルのプリントアウトをナビゲートしたり読んだりする方法について、もう少しお話ししましょう。
//------------------------------------------
すでに説明したトピックは黄色でハイライトされています。
今日は復習します:
11.異なるタイプの要素の値の変更の同期(リンク):例えば、ボタンとスライダーを持つ入力フィールド。これにより、1つの要素(手動またはソフトウェア)の値を変更すると、2つ目の要素の値もそれに応じて変更されます。
12.スライダーとボタン付き入力フィールドの範囲の境界を、ラッパー関数を使ってプログラムでリセットしてみましょう。テストする時間がなかったが、うまくいきそうな気がする。しかし、見てみよう。
13.13.ラッパー関数で要素の状態を返すようにしてみよう。機能には含まれているのだが、テストする時間がない。さて、どうなることやら。結果は不明。
11.異なるタイプのエレメントのパラメータのバインディング。
観察力のある人は、マルチウィンドウGUIでは、異なる要素がパラメータ値、プロパティ、ステートによってリンクされていることが多いことに気づいている。例えば
//-------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------
どこかで目に見えない要素の接続が行われていると思うだろう。そして、実際にあります。しかし、それは外部のオブザーバーにしか見えません。開発者にとっては、それはごく当たり前のことであり、今日はそれを詳しく考えてみよう。
1.要素の接続には2つの側面があります:
接続の技術的な実現は、グラフィカル・エンジンの存在によって単純化されます。
説明しましょう:
従来のExpert Advisorでは、各パラメータはユーザーによって 考案、 命名、 保存 、 処理さ れます。これは迂回できないルーチンワークです。しかし、グラフィカル・エンジンを使用する場合、コンストラクタで作成されたアイテムは、格納場所と処理/戻り関数とともにパラメータを自動的に受け取ります。さらに、ユーザーは型、範囲、過去の値などの プロパティを取得する。これにより、作業が大幅に簡素化される。理論的には、GUI要素の既製のパラメータを他のユーザーパラメータとして使用し、それらを取引ロジックに直接リンクすることが可能です。例えば、ロット、トレーリング・ストップ、利食い、その他を、それ自身の変数からではなく、それらの値を担当する設定フィールドから使用することができます。
いくつかの一般的な結論
1. プログラム 内にグラフィカル・コントロールが存在すること = レディメイドのプログラム・パラメータが存在する こと + そのプロパティ+値を返す/設定する機能が 存在する こと。
2. 2.インターフェース・プログラムのウィンドウにコントロールが多く配置されるほど、 取引ロジックや 取引情報の入出力に 関わるパラメータが多くなる。
3. 設定とウィンドウの数が多ければ多いほど、制御性が高く なり、市場データ出力の帯域幅が広がります(自動化を妨げるものではありません)。
4. 市場データ出力の制御が高く、帯域幅が広いほど、トレーダーの意識が 向上する。
5. 意識と 自動化および制御の 掛け算= トレーダーの機会の拡大。
自動化はしばしば手動操作と対立することを付け加えておく。彼らは、グラフィカル・インターフェースを持つことは手動取引を意味すると言う。しかし、そうではない。ソフトウェア・インターフェースは、自動化を排除するのではなく、自動化を拡大し、 自動 化に「勾配」をつける。
トレーダーに必要なのは、オプションを選択することだけです。
このためのウィンドウは簡単に作成できる。
//---------------------------------------------------------------------------------------------------
2.コントロールのパラメータをバインドする技術的な実装に話を移そう。
実際の例をいくつか考えてみましょう:
1.使い慣れた設定ウィンドウを開いてみましょう:
2.APIファイルを開き、On_Gui_Event()関数内で、開いたウィンドウの要素を見つけます:
注意: すべてのコントロール・イベントはOn_Gui_Event()関数に入ってきます;
この点に関して、パラメータ・リンクの一部をこの関数の内部に、一部を関数の外部に記述 します。
1.ボタンを持つフィールド (S_EDIT) "Spin the value" とスライダー (H_SLIDER) "Roll the value" の関係を確立しましょう:
結果:ボタンでフィールドの値を変更し、スライダーはそれ自体で動く。
(*重要 - スライダーはその範囲内(この場合、0から100まで)でのみ動くことができます。範囲を超えた場合、値は変化せず、ログにエラーが表示さ れます)。
//----------------------------------------------------------------------------------------------------------------
3.役割を逆転させてみましょう。スライダーは入力フィールドの値をコントロールします:
結果:スライダーのハンドルを動かすと、ボタンのあるフィールドは同期して値を変更します。
//----------------------------------------------------------------------------------------------------------------
4.スライダーとボタン付きフィールドの相互制御を書いてみましょう:
結果:スライダーと入力フィールドは同時にお互いをコントロールする。
//---------------------------------------------------------------------------------------------------
明日は、他の要素を使ったこのテーマの後編を投稿します。
これはすごいことだよ!時間があれば、このスレッドをもっと詳しくチェックするつもりだ。私の仕事はmt4のGUIの限界に挑戦していると思っていましたが、あなたの仕事は次のレベルです。
これは素晴らしい資料だ!時間があるときに、このトピックをもっと詳しく調べてみようと思っています。私の仕事はmt4のGUIの限界に挑戦していると思っていましたが、あなたの仕事は次のレベルですね。
ありがとうございました!
11.異なるタイプの要素のパラメータをバインドする。
トピックの続き。
パート2。
//--------------------------------------------------------------------------------------------------------------------------------
示したバインディング・メソッドを他の要素に適用できるか見てみましょう。例えば、チェックボックスです。
1.一番上のチェックボックスをロックし、その下のチェックボックスのロックを解除します:
これを行うには
1.APIファイルで"Set an option"チェックボックスを見つけてください。
2.2."Set another option"チェックボックスをロック/アンロックする関数コールを書く。
結果:チェックボックスは意図したとおりにロックされ、ロック解除される:
//--------------------------------------------------------------------------------------------------------------------------------
2.次に、チェックボックスがその下の2つのチェックボックスをロックし、アンロックするようにしてみましょう:
結果:チェックボックスはその下の2つのチェックボックスをロックし、ロックを解除する:
ダイナミクスではこのようになります:
//--------------------------------------------------------------------------------------------------------------------------------
3.それでは、下図に示す問題を解決しましょう。 チェックボックスは、その反対側のドロップダウンリストをロックし、ロックを解除する必要があります。
そのためには
結果:チェックボックスはドロップダウンリストをロックし、メインのチェックボックスで自分自身をロックする:
//--------------------------------------------------------------------------------------------------------------------------------
4.ドロップダウン・リストは、ユーザーが選択した値を別のウィンドウのフィールドに変換する必要があります。
そのためには
*結果:両方のドロップダウン・リストが、反対側のウィンドウの入力フィールドに値を送信することに成功 しました:
//--------------------------------------------------------------------------------------------------------------------------------
5.切り替えられたラジオ・ボタンが、反対側の入力フィールドに名前を送信する必要があります。
そのためには
*重要:ラジオボタンは、KIBコードでSWITCH演算子が適用されているため、トグルされます。そのため、すべてに共通のパラメータが1つあり、同じケースでAPIファイルにあります。
結果:ボタンを切り替えると、入力フィールドのテキストが変わります。*このオプションには小さな技術的問題があります。次のバージョンで修正します。
第2部は完成しました。
第3部では、テーブルを扱います。
パラメータ・バインディングの話題の最終回。
要素のパラメーターの値をテーブルのセルに渡してみましょう。
スキーマ
解決策
結果:値は選択されたテーブルセルに安全に配置さ れます。
上記の例からわかるように、私たちはシンプルで便利なソリューションを開発しました。皆さんもぜひ参考にしてください。
以上で、要素のパラメータをリンクするトピックを終わります。
以下のトピックが残されている:
12.スライダーと ボタン・フィールドの値の境界をプログラムで取得/設定(_V_MIN、_V_MAX、_V_STEP、_DIGITS)。
13.エレメントのステータスを問い合わせる(_GET_STATE)。
14.テキストとフレームの色を、間隔を空けた値の境界にリンクする。
15.APIファイルでのオリエンテーション
テーマの追加:
16.メッセージウィンドウと警告ウィンドウの外観のプログラムロジックの実現。