Input変数

input ストレージクラスは、外部変数を定義しています。input 修飾子は、データ型の前に示されます。input 修飾子を持つ変数はMQL5 プログラム内で変更することはできず、読み込み専用でアクセスすることが出来ます。input 変数の値はプログラムのプロパティウィンドウから、ユーザによってのみ変更することが出来ます。

入力変数名の最大長は63文字です。文字列型の入力パラメータの場合、値の最大の長さ(文字列の長さ)は191〜253文字です (を参照)。最小の長さは0文字です(値は設定されていません)。

例:

//--- 入力パラメータ
input int            MA_Period=13;
input int            MA_Shift=0;
input ENUM_MA_METHOD MA_Method=MODE_SMMA;

Input 変数は、プログラムの入力パラメータを決定します。プログラムのプロパティウィンドウから使用出来ます。

入力パラメータ値の設定

 

「パラメータ( Inputs )」タブでの入力パラメータの外観を設定する方法はもう 1 つあります。入力パラメータの記述と同じ行へのコメントの追加です。これによって、入力パラメータの名称をユーザによって理解しやすくします。

例:

//--- 入力パラメータ
input int            InpMAPeriod=13;         // 平滑化期間
input int            InpMAShift=0;           // ライン水平シフト
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA; // 平滑化の方法

入力パラメータを表示するための合理的な方法

注意事項:配列及び複合型の変数は入力パラメータとしては使用できません。

注意事項:入力変数の文字列のコメントの長さは63文字を超えることは出来ません。

注意事項: 文字列型の入力変数の場合、値の長さ(文字列の長さ)の制限は次の条件によって設定されます。

  • パラメータ値は「parameter_name = parameter_value」文字列で表されます(「=」が考慮されます)。
  • 最大表現長255文字(total_length_max = 255または254文字(「=」を除く)。
  • </ t0> parameter_name_length </ t1> 文字列パラメータの最大長= 63文字。</ t2>

したがって、文字列パラメータの最大文字列サイズは、次の式を使用して計算されます。

parameter_value_length=total_length_max-parameter_name_length=254-parameter_name_length

最大文字列サイズは191(parameter_name_length = 63)から253文字(parameter_name_length = 1)になります。

 

MQL5 プログラムからカスタム指標を呼び出す際のパラメータの受け渡し #

カスタム指標は iCustom() 関数を使用して呼び出されます。カスタム指標名の後には、このカスタム指標の入力変数の宣言に厳密に従ってパラメータが指定される必要があります。示されたパラメータがカスタム指標で宣言された入力変数よりも少ない場合、不足しているパラメータは、変数の宣言時に指定された値で書き入れられます。

カスタム指標が最初の種類の OnCalculate 関数を使用する場合 (すなわち、指標が同じデータ配列を使用して計算される場合)、カスタム指標を呼ぶのに ENUM_APPLIED_PRICE 値の 1 つまたは別の指標ハンドルが最後のパラメータとして使用されるべきです。入力変数に対応する全てのパラメータは明確に示されなければなりません。

入力パラメータとしての列挙

MQL5 の提供する内蔵の列挙だけでなくユーザ定義の変数も入力変数(MQL5 プログラムの入力パラメータ)として使用することが出来ます。例えば、曜日を記述する dayOfWeek 列挙体を作成し、入力変数を使用して特定の曜日を数の代わりにもっと一般的な方法で指定することが出来ます。

例:

#property script_show_inputs
//--- 曜日
enum dayOfWeek
 {
  S=0,     // 日曜
  M=1,     // 月曜
  T=2,     // 火曜
  W=3,     // 水曜
  Th=4,   // 木曜
  Fr=5,   // 金曜
  St=6,   // 土曜
 };
//--- 入力パラメータ
input dayOfWeek swapday=W;

スクリプトの起動時にプロパティウィンドウからの必要な値の選択を可能にするには、プリプロセッサコマンド #property script_show_inputs を使用します。スクリプトを起動して、リストから dayOfWeek 列挙体のいずれかの値を選択することが出来ます。EnumInInput スクリプトを起動して「パラメータ( Inputs )」タブに移動します。swapday の値(3 重スワップチャージの日)はデフォルトでは水曜日(W=3)ですが、他の値を指定して、プログラムの動作を変更することが出来ます。

入力パラメータとしてのカスタム列挙の例

列挙では可能な値の数は限られています。入力値を選択するためにはドロップダウンリストが使用されます。一覧に表示された値に使用されるのは列挙型メンバのニーモニック名です。この例のようにコメントがニーモニック名に関連付けられている場合、ニーモニック名でなくコメントの内容が使用されます。

dayOfWeek 列挙の値は 0 から 6 まですが、パラメータのリストではそれぞれの値に指定されたコメントが表示されます。これは、入力パラメータの明確な記述を含むプログラムを作成するための柔軟性を提供します。

 

sinput 修飾子を持つ変数 #

input 修飾子を持つ変数はプログラムを起動時に外部パラメータ値を設定するだけでなくストラテジーテスターで取引ストラテジーを最適化する際にも必要とされます。文字列型のものを除く各入力変数は、最適化に使用することが出来ます。

時々、テスタ内の全てのパスの領域から外部プログラムのパラメータを除外することが必要です。sinput メモリ修飾子は、そのような場合のために導入されています。sinput は静的外部変数の宣言(sinput=静的入力)の略です。つまり、エキスパートアドバイザーコードで次の宣言

sinput       int layers=6;   // 層数

が完全な宣言に相当します。

static input int layers=6;   // 層数

sinput 修飾子で宣言された変数は MQL5 プログラムの入力パラメータです。このパラメータの値はプログラム起動時に変更することが出来ます。この変数は、入力パラメータの最適化には使用されません。言い方を変えると、指定された条件に合う最良のパラメータセットを検索する時には、その値は列挙されません。

ストラテジーテスターの sinput パラメータ

上に示したエキスパートアドバイザーには 5 つの外部パラメータがあります。「Number of layers」 は sinput として宣言されており 6 に等しいです。このパラメータは、取引ストラテジーの最適化中に変更することは出来ません。後で使用するために必要な値を指定することは出来ます。Start、Step と Stop のフィールドは、このような変数には使用出来ません。

よって、変数の sinput 修飾子が指定された後、ユーザがこのパラメータを最適化することは出来ません。つまり、端末ユーザは、最適化時に、ストラテジーテスターで指定された範囲内の自動列挙の初期値と最終値を設定することが出来ません。

ただし、この規則には例外が1つあります。sinput 変数は ParameterSetRange() 関数を使用して最適化タスクで変更することが出来ます。この関数は、static input( sinput )として宣言されたものを含む input 変数の使用可能な値のプログラム制御のために特異的に導入されました。ParameterGetRange() 関数は、最適化の起動時に(OnTesterInit() ハンドラで)入力変数の値を受け取り、最適化されたパラメータ値が列挙される範囲内の変更ステップ値と範囲を再設定します。

このように sinput 修飾子と入力パラメータで動作する 2 つの関数を組み合わせて、他の入力パラメータの値に依存する入力パラメータの最適化間隔を設定するための柔軟なルールを作成することが出来ます。

 

入力パラメータのグループ化 #

MQL5プログラムでの作業を簡単にするために、入力パラメータはgroupキーワードを使用して名前付きブロックに分割できます。これにより、埋め込まれたロジックに基づいて、パラメータを視覚的に分離できます。

input group           "Group name"
input int             variable1 = ...
input double         variable2 = ...
input double         variable3= ...

このように宣言されると、すべての入力パラメータは視覚的に指定されたグループに結合され、チャートまたはストラテジーテスターで起動する際のMQL5ユーザのパラメータ設定を簡素化します。各グループの指定は、新しいグループ宣言が表示されるまで有効です。

input group           "Group name #1"
input int             group1_var1 = ...
input double         group1_var2 = ...
input double         group1_var3 = ...
 
input group           "Group name #2
input int             group2_var1 = ...
input double         group2_var2 = ...
input double         group2_var3 = ...

以下目的別に分けられた入力ブロックを特徴とするEAの例です。

input group           "Signal"
input int             ExtBBPeriod = 20;       // ボリンジャーバンド期間
input double         ExtBBDeviation= 2.0;     // 偏差
input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;   // BB時間枠
 
input group           "Trend"
input int             ExtMAPeriod   = 13;       // 移動平均期間
input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;   // MA時間枠
 
input group           "ExitRules"
input bool           ExtUseSL      = true;     // StopLossを使用
input int             Ext_SL_Points = 50;       // ポイント単位のStopLoss
input bool           ExtUseTP      = false;   // TakeProfitを使用
input int             Ext_TP_Points = 100;     // ポイント単位のTakeProfit
input bool           ExtUseTS      = true;     // Trailing Stopを使用
input int             Ext_TS_Points = 30;       // ポイント単位のTrailing Stop
 
input group           "MoneyManagement"
sinput double         ExtInitialLot = 0.1;     // 初期ロット値
input bool           ExtUseAutoLot = true;     // 自動ロット計算
 
input group           "Auxiliary"
sinput int           ExtMagicNumber = 123456; // EAマジックナンバー
sinput bool           ExtDebugMessage= true;   // デバッグメッセージを出力する

ストラテジーテスターでそのようなEAを起動する場合、グループ名をダブルクリックして入力ブロックを折りたたみ/展開し、グループチェックボックスをクリックして、最適化のためにすべてのパラメータを選択できます。

ストラテジーテスターでのEA入力パラメータの配置

 

参照

iCustom列挙プログラムプロパティ