int _OnInit()
{
//------------------------------------------------//Open the window "Settings example 1".//------------------------------------------------w_6_Settings_example_1();//------------------------------------------------
В предыдущей статье разрабатываемая библиотека была пополнена сразу четырьмя довольно часто используемыми в графических интерфейсах элементами управления: «чекбокс», «поле ввода», «поле ввода с чекбоксом» и «комбобокс с чекбоксом». Вторая глава шестой части серии будет посвящена таким элементам управления, как слайдер и двухсторонний слайдер.
int _OnInit()
{
//------------------------------------------------//Open the window "Settings example 1".//------------------------------------------------w_6_Settings_example_1();//------------------------------------------------
//Get state of button "Start":
//------------------------------------------------intButton_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);//------------------------------------------------
//Print out:
//------------------------------------------------
Print("Button state: ",Button_state);
//------------------------------------------------
結果:状態 v_NEUTRAL_STATEに対応する値15が得られる 。
2.ボタンを押したときと離したときの状態を記録しよう:
そのためには
APIファイルでボタンを見つける。
押された 場合と離された 場合の両方の_GET_STATE リクエストを書く。
case Settings_example_1___Start:
//------------------------------------------------------------------------------------------------------//What to do when the button is pressed or released?//------------------------------------------------------------------------------------------------------switch((int)action)
{
//------------------------------------------------------------------------casepressed:
{
//Get button's state when it pressed:
intButton_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
//Print out the result:
Print("Button state: ",Button_state);
}
break;
//------------------------------------------------------------------------casereleased:
{
//Get button's state when it released:
intButton_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);
//Print out the result:
Print("Button state: ",Button_state);
}
break;
//------------------------------------------------------------------------
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
//------------------------------------------------//Open the window "Settings example 1".//------------------------------------------------w_6_Settings_example_1();
//------------------------------------------------//Get the state of the checkbox when it checked:intCheckbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
//Print out the result:Print("Checkbox state: ",Checkbox_state);
//------------------------------------------------
case Settings_example_1___Set_an_option:
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------casechecked:
{
//Get checkbox state when it checked:intCheckbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
//Print out the result:
Print("Checkbox state: ",Checkbox_state);
}
break;
//------------------------------------------------------------------------caseunchecked:
{
//Get checkbox state when it unchecked:intCheckbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);
//Print out the result:
Print("Checkbox state: ",Checkbox_state);
}
break;
//------------------------------------------------------------------------------------------------------
//Your comment:
//------------------------------------------------------------------------------------------------------
break;
//Getting state of the first element:int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);//Getting state of the second element:int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);//Setting conditions for both elements when they're simultaneously ON:if(Button_state == v_ACTIVATED_STATE)
{
//Is the checkbox was already on:if(Checkbox_state == v_ACTIVATED_STATE)
{
Function_1();
}
//If the checkbox was the last pressed element and still highlighted:if(Checkbox_state == v_ACTIVATED_HIGHLIGHTED)
{
Function_2();
}
}
例2:
//Getting state of the first element:int Button_state = w6_i_p1_BUTTON_Start(get_i,p1_GET_STATE);//Getting state of the second element:int Checkbox_state = w6_i_p7_CHECKBOX_Set_an_option(get_i,p7_GET_STATE);//Setting conditions for one element being ON, while the other is OFF:if(Button_state == v_ACTIVATED_STATE)
{
//If the checkbox was already off:if(Checkbox_state == v_NEUTRAL_STATE)
{
Function_A();
}
//If the checkbox was just turned off and still highlighted:if(Checkbox_state == v_NEUTRAL_HIGHLIGHTED)
{
Function_B();
}
}
v_NEUTRAL_STATE - это нейтральное состояние в котором элемент находится неопределенное время.
v_NEUTRAL_HIGHLIGHTED - это нейтральное состояние в которое элемент перешел ТОЛЬКО ЧТО, после отжатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.
アクティベートされた状態も同様である:
v_ACTIVATED_STATE - это активированное состояние в котором элемент находится неопределенное время.
v_ACTIVATED_HIGHLIGHTED - это активированное состояние в которое элемент перешел ТОЛЬКО ЧТО, после нажатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.
int _OnInit()
{
//------------------------------------------------//Open the windows "Settings example 1" and "Settings example 2".//------------------------------------------------w_6_Settings_example_1();w_7_Settings_example_2();//------------------------------------------------
2.要素の状態を取得する:
//------------------------------------------------//Get the states of the elements S_EDIT, H_SLIDER, EDIT and D_LIST//------------------------------------------------//1. State index is type int, S_EDIT's function is double. Convert the types.intS_edit_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d,p5_GET_STATE);//2. Getting the slider's state. intH_slider_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);//3.State index is type int, EDIT's function is string. Convert the types. intEdit_state = (int)w7_s_p4_EDIT_Comment_3(get_s,p4_GET_STATE);//State index is type int, D_LIST's function is string. Convert the types.intD_list_state = (int)w7_s_p6_D_LIST_D_LIST_1(get_s,p6_GET_STATE);//------------------------------------------------//Print out the results:Print("S_edit_state = ",S_edit_state);
Print("H_slider_state = ",H_slider_state);
Print("Edit_state = ",Edit_state);
Print("D_list_state = ",D_list_state);
//------------------------------------------------
1.APIファイルから "Set an option " チェックボックスを探し、そのケース内にEDIT、S_EDIT、H_SLIDER要素のロック/アンロックを 記述する。そして、Print()によって状態を出力する。
case Settings_example_1___Set_an_option:
switch((int)action)
{
//------------------------------------------------------------------------------------------------------//What to do when the checkbox is checked or unchecked? //------------------------------------------------------------------------------------------------------casechecked:
{
//-----------------------------------------------//Locking EDIT:w7_s_p4_EDIT_Comment_1(p4_LOCK);
//Locking H_SLIDER:w6_i_p3_H_SLIDER_Roll_the_value(p3_LOCK);
//Locking S_EDIT:w6_d_p5_S_EDIT_Spin_the_value(p5_LOCK);
//-----------------------------------------------//Getting state of EDIT:intEDIT_state = (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
//Getting state of H_SLIDER:intH_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
//Getting state of S_EDIT:intS_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE);
//-----------------------------------------------//Printing results:Print("EDIT_state = ",EDIT_state);
Print("H_SLIDER_state = ",H_SLIDER_state);
Print("S_EDIT_state = ",S_EDIT_state);
//-----------------------------------------------
}
break;
//------------------------------------------------------------------------caseunchecked:
{
//-----------------------------------------------//Unlocking the element EDIT:w7_s_p4_EDIT_Comment_1(p4_UNLOCK);
//Unlocking H_SLIDER:w6_i_p3_H_SLIDER_Roll_the_value(p3_UNLOCK);
//Unlocking S_EDIT:w6_d_p5_S_EDIT_Spin_the_value(p5_UNLOCK);
//-----------------------------------------------//Getting state of EDIT:intEDIT_state = (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
//Getting state of H_SLIDER:intH_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
//Getting state of S_EDIT:intS_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE);
//-----------------------------------------------//Printing results:Print("EDIT_state = ",EDIT_state);
Print("H_SLIDER_state = ",H_SLIDER_state);
Print("S_EDIT_state = ",S_EDIT_state);
//-----------------------------------------------
}
break;
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
API ファイルの EDIT、S_EDIT、H_SLIDER 要素を見つけ、値が入力されたときの状態を取得することを規定し、それらの関数がHIGHLIGHTED ( ハイライトされた)インデックスを返すかどうかを確認する。
始めましょう:
case Settings_example_2___Comment_1:
//------------------------------------------------------------------------------------------------------//What to do when the text is entered?//------------------------------------------------------------------------------------------------------
{
//Getting state of EDIT:intEDIT_state = (int)w7_s_p4_EDIT_Comment_1(get_s, p4_GET_STATE);
//Printing the results:Print("EDIT_state = ",EDIT_state);
}
//------------------------------------------------------------------------------------------------------//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//------------------------------------------------------------------------------------------------------
{
//Getting state of H_SLIDER:intH_SLIDER_state = w6_i_p3_H_SLIDER_Roll_the_value(get_i,p3_GET_STATE);
//Printing results:Print("H_SLIDER_state = ",H_SLIDER_state);
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------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//------------------------------------------------------------------------------------------------------
{
//Getting state of S_EDIT:intS_EDIT_state = (int)w6_d_p5_S_EDIT_Spin_the_value(get_d, p5_GET_STATE);
//Printing results:Print("S_EDIT_state = ",S_EDIT_state);
}
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
12. スライダーと ボタン付きフィールド(_V_MIN、_V_MAX、_V_STEP、_DIGITS)の値の境界をプログラムで取得/設定する。
1.上記のパラメータを持つ要素を持つウィンドウを開きましょう:
2.V_MIN、_V_MAX、_V_STEP、_DIGITSの 値をログに出力する:
結果:スライダーのパラメータ・プロパティの値がログに記録されます。
//---------------------------------------------------------------------------------------------------------------------------------------
3.ボタン付きフィールドで操作を繰り返してみましょう。スライダーとは異なり、フィールドには他の数値境界があり、その値タイプはdouble です。
結果:ボタン付きフィールドのパラメータ・プロパティの値がログに表示されます。
//---------------------------------------------------------------------------------------------------------------------------------------
4.スライダ範囲の他の境界を設定する(初めてテストされ、結果は不明)。
結果は不明:*負の数の範囲に問題があることがわかった(次のバージョンで修正)。
正数の範囲境界でチェックしてみよう:
結果:範囲境界の変更に成功。
要点 スライダーの範囲は関数を使って変更できる。
**重要:パラメータ値の型をintからdoubleへ、またはその逆へ遡及して変更することはできません。
//-------------------------------------------------------------------------------------------------
入力フィールドでも同様の実験をしてみましょう:
結果:意図したとおりに動作しました。ボタンのあるフィールドは、指定された範囲とステップを受け入れます。範囲を超えた場合は、ログにエラーが報告さ れます。
//--------------------------------------------------------------------------------------------------
5.最後に、ボタン付きフィールドにvalue_DIGITSを設定してみましょう(スライダーはパラメータ・タイプがintなので動作しません):
結果:
結果:
以上でこのトピックを終了します。
13.要素の状態を問い合わせる _GET_STATE.
インターフェースの 1つまたは別の要素の状態をプログラムで取得する必要がある場合がよくある。この問題を解決するために、_GET_STATEという 識別子が作られます。
//--------------------------------------------------------------------------------------------------------------------
*重要: request_GET_STATEでは、関数は要素の現在の状態のインデックスを返します。
//--------------------------------------------------------------------------------------------------------------------
以下の画像は、要素の状態のリストを示しています。
1.状態の識別子 :
(*次のリリースでは、接頭辞 v_は 接頭辞 s_ に置き換えられます )
ログに出力されるインデックス:
要素の状態の問い合わせと取得をテストしてみましょう:
1.ウィンドウを開き、"Start "ボタンの初期状態を取得します:
結果:状態 v_NEUTRAL_STATEに 対応する値15が得られる 。
2.ボタンを押したときと離したときの状態を記録しよう:
そのためには
結果:押された/離されたイベント時に、現在の状態インデックスがログに出力される。
注意してください:
//----------------------------------------------------------------------------------------------------------------
3.チェックボックスでクエリーを繰り返してみましょう。
1.ウィンドウが開いたときのチェックボックスの状態を取得する:
結果:ニュートラル状態v_NEUTRAL_STATE(チェックボックスがある状態)に対応する値15が得られる。
2.次に、押したときと離したときのチェックボックスの状態を調べてみましょう。
そのために
結果:値66 (v_NEUTRAL_HIGHLIGHTED) と 値 67 (v_ACTIVATED_HIGHLIGHTED)が得られました 。 これは、ハイライトされた ニュートラルとハイライトされた 押された状態を意味します。
//-----------------------------------------------------------------------------------------------
これで、このトピックの最初の部分は終わりです。
後編では、D_LIST ドロップダウン・リスト、H_SLIDER スライダー、S_EDIT およびEDIT 入力フィールドの状態を返します。
13.状態リクエスト_GET_STATE。
パート2:D_LIST、H_SLIDER、EDIT、S_EDIT 要素の状態を取得する。
前編では、BUTTON ボタンとCHECKBOX チェックボックスの状態をプログラムで返す方法を見ました。GET_STATE クエリーを使用し、関数が返す状態名のリストを示しました。全部で6つの名前があり、それぞれが接頭辞v_で 始まります。(valueの 略語で、stateの 略語であるs_に 置き換えられる)。
状態のインデックスを思い出してほしい:
この場合、特定のインデックス番号は重要ではない。ユーザーが特定の状態を条件に入れる必要があるときは、識別子を 使用する。
例1
例2:
//-----------------------------------------------------------------------------------------------------------------
*非常に重要である:
v_NEUTRAL_STATEと v_NEUTRAL_HIGHLIGHTED 状態、 v_ACTIVATED_STATEとv_ACTIVATED_HIGHLIGHTEDの 本質的な違いを説明しよう:
v_NEUTRAL_STATE - это нейтральное состояние в котором элемент находится неопределенное время. v_NEUTRAL_HIGHLIGHTED - это нейтральное состояние в которое элемент перешел ТОЛЬКО ЧТО, после отжатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.アクティベートされた状態も同様である:
v_ACTIVATED_STATE - это активированное состояние в котором элемент находится неопределенное время. v_ACTIVATED_HIGHLIGHTED - это активированное состояние в которое элемент перешел ТОЛЬКО ЧТО, после нажатия пользователя. Поэтому элемент подсвечен - HIGHLIGHTED.この違いは大きな違いです。
現在、ボタンや他のいくつかの要素は、v_NEUTRAL_STATEと v_ACTIVATED_STATEを 返すだけで、チェックボックスのようにHIGHLIGHTED 状態を返しません。これは、アイテムが今クリックされたのか、いつクリックされたのか、不定時間前なのか、ユーザーが知る術がないことを意味します。しかし、ユーザーはAPIファイルで押された瞬間をキャッチすることができる。はい、しかしこの機能はまだ他のプログラムでは利用できません。次のバージョンでは、HIGHLIGHTED 状態復帰がすべての インタラクティブ要素に追加されます。こうすることで、ユーザーはプログラムのどこからでも、要素が押さ れたばかり なのか、押されていない のか、長い間その状態にあるのかを知ることができるようになります。
//----------------------------------------------------------------------------------------------------------
実用的な部分に移りましょう:
1.ウィンドウを開く:
2.要素の状態を取得する:
結果: D_LISTcnomeの全要素は 状態インデックス15(ニュートラル状態 v_NEUTRAL_STATE)を 持つ。 D_LISTは エラー(-1)を返した。
理由: この要素の状態を返すことが中央関数で指定されていない。 技術的な欠陥です。次のバージョンで修正されます。
D_LIST 関数は まだ 状態インデックスを返さないので、状態が正常に受信された3つの項目に注目してみましょう: EDIT 、S_EDIT、H_SLIDER。
何をチェックするか:
EDIT、S_EDIT、H_SLIDERの 各要素関数は、ウィンドウを開いたときのニュートラル状態のインデックスを返すことを確認しました。 あとは他の状態を確認します。これらのタイプの要素は、理論的には、ニュートラル、ロック、ハイライトの 3つの状態にしかならないので(ボタンやチェックボックスのように多くの状態があるのとは異なります)、ロックと ハイライトの 2つの状態をチェックしなければなりません。また、「カーソルの下」状態というグループもあるが、混乱を避けるためにまだ追加したくない。次のバージョンでは、各タイプの要素の可能な状態の個別のリストを開く特別な接頭辞を作るつもりだ。これにより、プログラム上の作業がより簡単になるだろう。
EDIT、S_EDIT、H_SLIDERの ブロック状態とハイライト状態の戻りをどのようにチェックするか:
1.APIファイルから "Set an option " チェックボックスを探し、そのケース内にEDIT、S_EDIT、H_SLIDER 要素のロック/アンロックを 記述する。そして、Print()によって状態を出力する。
結果
//--------------------------------------------------------------------------------------------------
2.2つ目のタスク:
始めましょう:
結果
//-----------------------------------------------------------------------------------------------------
結果:
一般に、結果は満足のいくものであると評価できる。各要素は、意図したとおりにニュートラルとロック状態のインデックスを返す。しかし、いくつかの欠点もあります:
結論:
潜在的には、新しい要素の状態を追加することが可能である。例えば、Neutral pointedや Activated pointed( カーソルの下はニュートラル、カーソルの下はアクティベート)といった具合である 。しかし、 実用性の問題や、ユーザーがこれらの機能を本当に必要としているかという問題がある。そのような要求がない限り、私は新しいステートを追加するつもりはない。
以上でこのトピックは終わりです。
さらに、次のトピックへ。
先週、WinFormを使ってインターフェースを書き、それをMT5のチャートに埋め込む方法を研究していた。今日、ようやく実現した。
考慮すべきトピックの一般的なリスト
1.インテリセンスのリストにおける方向と、右ウィンドウの機能の選択。
2.プログラムによるウィンドウの開閉
3. プログラムで利用可能なウィンドウ要素のリストを開く。
4. 個々の要素プロパティのリストを開く。
5.要素名とウィンドウ・ラッパー関数を解析する。
6. 要素パラメーターの値をその型の変数に返す
7.異なる型の要素パラメータに値を設定する。
8.異なるエレメントのパラメーター間で値を返す、変更する、転送する。異なるタイプの要素と値を考慮し、異なるウィンドウで異なるタイプの要素間の転送をテストする。
9.前の値を返す(_V_LAST)。いつ、どのような場合に最後の値が必要か(現在の値と混同しないように)。
10.異なるエレメント・タイプに対するON、OFF、LOCK_ON、LOCK_OFF、LOCK、UNLOCK 状態の設定テスト。
11. 要素の値の変化のバインディングと同期のテスト:例えば、ボタンとスライダーを持つ入力フィールド。1つの要素(手動またはソフトウェア)の値が変更されると、それに応じて2番目の要素の値も変更されるようにする。
12.スライダーと ボタン付きフィールドの範囲境界をソフトウェアで取得/設定するテスト(プロパティ_V_MIN、_V_MAX、_V_STEP、_DIGITS)。
13.アイテム・ステータス照会(_GET_STATE)の動作テスト。
14.テキストとボーダーの色を、間隔を空けた値の境界にリンクする。
15.APIファイルにおけるオリエンテーション
16.メッセージウィンドウと警告ウィンドウの外観の簡単なプログラムロジックの実装。
//------------------------------------------
検討されたトピックは黄色でハイライトされている。
現時点では、まだ検討すべきことが残っている:
14.テキストとフレームの色を、間隔を置いた値の境界にリンクさせる。
15.APIファイルにおけるオリエンテーション。
16.メッセージ・ウィンドウと警告ウィンドウの外観に関する簡単なプログラム・ロジックの実装。
//------------------------------------------
トピック14とトピック16をリンクすることをお勧めします。パラメータ値の設定限界を超えると、まず要素の一部(テキスト、ベース、フレーム、ストライプなど)の色を変更する形でシグナルが発生し、次にダイアログ・ウィンドウが開き、次に警告ウィンドウが開きます。同時に、警告ウィンドウは、ユーザーが手動で閉じるまで、要素の値の変更をブロックします。
また、テーマを追加したい:
17. ユーザーが「キャンセル」ボタンをクリックすると、入力された設定をキャンセルする。
一昔前に、「キャンセル」ボタンをクリックすると、 ユーザー設定をキャンセルする技術が開発され、ある程度テストされました。現時点では、以前の機能がどの程度機能するかは不明である。そのため、テストが必要である。
トピックが重複するため、レビューの順序は以下のようになる:
14.スタッガード・パラメーター・バウンダリー・プロテクションの実装:
15.新しいAPIファイルのプリントアウトを詳しく考えてみよう。
//----------------------------------------------------------------------------------------------------
次に、発見されたバグや不具合をすべて集めて、次回リリースのためのタスクリストを作る。
修正と追加を加えた次のリリースの後、私はエンジンのさらなる開発の主要な方向性の1つであるテーブルに焦点を当てます。
先週、WinFormを使ってインターフェースを書き、MT5のチャートに組み込む方法を学んできた。今日、ようやくその方法がわかった。
そして、どうやってインターフェースをプログラミングコードと通信させるのか?
そして、インターフェイスとプログラミング・コードとの接続をどのように確立するのか?
さらにいくつかの質問があります:
原則的には、誰もが自分の使いやすいツールを使うことができる。私は自分のインターフェイスが使いやすいので、それを開発している。言い換えれば、私自身のアルゴリズム取引に 使おうとしているの だ。フォーラムで解決策を公開することで、モチベーションが高まる。もし私のインターフェイスが誰かの役に立てば、それでいい。
このインターフェイスには強力なツールがあり、MT5のアルゴリズム機能と組み合わせることで、正しい 取引の結果を拡大することができます。そう、この長い道のりで、私は「市場に行く」のだ。何年もかかるが、いずれにせよ、知性を磨くには時間がかかる。資金があっても頭脳がなければ、市場で取引する意味はないでしょう?
WinFormsやそれに類するものを使うという決断は、本質的に不完全だと私は思う。それは、MT5から技術的に切り離し、独立したマルチウィンドウのWindowsアプリケーションを構築することにつながる。最初の段階では、へその緒のようなデータ・チャネルによってプラットフォームと接続されます。ユーザーはDLLポールを使ってくねくねと動き、 成功する可能性さえある。必要であれば、コンテキストメニューを作成し、ウィンドウを素早く作成するためのテンプレートを使うこともできるだろう。しかし結局のところ......、2つか3つのIDEで同時に、しかも異なるプログラミング言語で作業することになる。では、どうすればいいのだろう?そしてもっと重要なことは、どうすればもっと簡単になる のか、ということだ。
その上、マルチウィンドウのWindowsアプリケーションを持つことで、ユーザーはそれを別の取引プラットフォームのAPIに直接接続することができる。そのため、タイマーを使って作業するよりも簡単なのだ。そして、市場についても言及する必要がある。彼の製品は、そこでは許可されません。一般的には、各自に。