
通常、EA を開発するときは、特定の足の足価格データを使用します。 この完全な MQL4 価格データ記事では、トレーディング EA のプログラムに役立つ、4 つのレベルの価格データ (始値、高値、安値、終値) を備えた完全に機能する Expert Advisor を作成する方法を学びます。
| レベル | 価格データ定数 / 関数 | 特徴 |
|---|---|---|
| 1 | 高値、安値、始値、終値、 関連項目: 入札、問い合わせ | 最も簡単なレベル。 価格データは、チャート シンボル、チャートの時間枠、および現在のバーの現在のデータ価格を指します。 |
| 2 | 高[]、低[]、開始[]、終了[] | 一つ上の階層へ。 価格データは、チャット シンボル、チャートの時間枠の現在のデータ価格を指しますが、どの過去のバーを参照できるかはより柔軟です。 括弧内の数字は、参照できる過去のバーを指します。 例: Close[0] = 現在の足の終値、Close[1] = 前の足の終値。 |
| 3 | iHigh()、iLow()、iOpen()、iClose() | 非常に柔軟なレベルの機能です。 価格データ機能とは、カスタムシンボル、タイムフレーム、および/またはヒストリカルバーの価格データを指します。 例 1: iClose(NULL,0,0) = 現在の足のチャート シンボル、タイムフレーム、終値。 注: この使用法は、Close や Bid、さらには iClose[0] とほとんど区別がつきません。 例 #2: iClose(“EURUSD”,30,1) = EURUSD シンボルの終値、30 分の時間枠、前のバー。 注: 今回使用すると、以前の価格データ機能に比べて 3 倍の機能が追加されます。 |
| 4 | iHighest()、iLowest()、 | 価格データ関数は、一定期間にわたる最大価格データ値を見つけるために使用されます。 特定の範囲内で最高または最低のデータ値を見つけるのに適しています。 例: Low[iLowest(Symbol(), 0, MODE_LOW, 3, 1)] = 最後の 3 つのバーの最低値。 |
これら 4 つのレベルの価格データを個別に見てみましょう。
主要価格データ: 価格データは、チャート シンボル、チャートの時間枠、および現在のバーに限定されます。
現在のチャートと時間枠の現在のバーの価格データを参照したいだけの場合は、高値、安値、始値、終値のいずれかの価格データ メソッドを使用できます。 、入札、質問。
プログラムで読み取れるように、すべての文字の先頭が大文字である必要があることに注意してください (入札が有効、入札が無効)。 MT4の終値はデフォルトでBidとなっているため、現在の終値を参照したい場合はCloseまたはBidを使用できます。 たとえば、現在の終値が 200 期間の移動平均より大きくなければならないという条件を EA に検索させたい場合は、次のように宣言できます。
閉じる> iMA ( NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1)
または、次のようにします。
入札> iMA (NULL,0,200,0,MODE_EMA,PRICE_CLOSE,1);
注: 覚えておいてくださいこの単純な価格データ レベルは、チャート シンボル、チャートの時間枠、および現在のバーに対してのみ利用可能です。 さまざまなバーを柔軟に使用したい場合は、レベル 2 またはレベル 3 の価格データに頼る必要があります。 さまざまなチャート シンボル、さまざまな時間枠、さまざまなバーを柔軟に使用したい場合は、レベル 3 価格データを使用する必要があります。
レベル 2 価格データ: 価格データは、さまざまなバーで使用できる柔軟性を備えています。
現在のチャートの価格データを使用したいが、事前定義された系列の配列 (High[]、Low[]、Open[]、Close []) を使用してバーを制御します。
配列は複数の値を格納する変数。 これらはリストのように機能し、テーブル内の項目をグループ化し、インデックスと呼ばれる行番号によってアクセスできます。 番号付きの行またはインデックスは 0 から始まり、1、2、3 などと続きます。 これらの番号付きインデックスは括弧で囲まれており、上記の特定のケースでは、番号付きの各インデックスは時間内の特定のバーを参照し、時間内の番号を変更すると、参照しているバーが変更されます。 たとえば、Close[0] は現在のバーの始値であり、0 はインデックスです。これを変更すると、他のバーの終値を取得できます。Close[1] は、現在のバーの前のバー、Close を参照します。 [2] は、現在のバーから 2 小節戻ることなどを意味します。
私たちが作成する EA のほとんどでは、現在の足または前の足の価格値を使用します。 ただし、さまざまな過去のバーの価格データだけでなく、現在のチャート以外のさまざまなシンボルや時間枠の価格データに対してもより柔軟に対応したい場合は、レベル 3 の価格データに切り替える必要があります。
レベル 3 価格データ: カスタマイズ可能なシンボル、カスタマイズ可能な時間枠、カスタマイズ可能な履歴バーを操作する機能を使用した、最も柔軟な価格データ。
現在のチャート以外のシンボルの価格データ (高値、安値、始値、終値) を使用したい場合、または価格データが必要な場合は、次の価格データを使用できます。関数: iHigh()、iLow()、iOpen()、および iClose()。 これらにより、単一期間または棒グラフで価格データ値が得られます。
次の表は、iClose() 関数の構文を示しています:
| パラメータ | 説明 |
|---|---|
| シンボル | 使用される通貨ペアのシンボル |
| 時間枠 | おおよその時間。 には、任意のタイムフレーム列挙値を指定できます。 (0) を選択して現在表示されている時間範囲を表示するか、1 つを選択します。 次のいずれか: (1, 5, 15, 30, 60, 240, 1440, 10080, 43200){すべて 分} |
| Shift | < td style="word-break: Break-all;">相対的に後方に移動します現在のバー
たとえば、時間足チャートを開いているが、日足チャートで前のバーの終値を確認したいとします。
昨日の最高値と最低価格のサンプルです:
ダブルハイ= iHigh(NULL, PERIOD_D1, 1);
ダブルロー = iLow(NULL, PERIOD_D1, 1);
パラメータ表現:< /p>
NULL = 現在のチャート コード。
PERIOD_D1 = D1 または日次チャート期間。1440 にすることもできます。
1 = シフト、1 は前のバーを意味します。
注: iHigh() 関数と iLow() 関数を使用すると、単一バーの最大値をシフトできます。 バーの範囲内で最大値を移動したい場合は、以下で詳しく説明する iHighest() 関数と iLowest() 関数を使用する必要があります。
スケジュール列挙テーブル h3>
時間範囲を配置するには 2 つの方法があります。1 つは周期定数による方法、もう 1 つは整数値によるものです。次の例に示します。
ダブルハイ = iClose (NULL,Period_D1,1);
ダブルハイ = iClose (NULL, 1440,1);< /p>
PERIOD_D1 を 1440 (1 日を構成する時間の期間) に置き換えることができることがわかります。
これは、定数値とそれに相当する整数値の完全な表です:
| 持続 | 値 | 説明 | < /tr>
|---|---|---|
| PERIOD_M1 | 1 | 1 分 |
| PERIOD_M5 | 5 td > | 5 分 | tr >
| PERIOD_M30 | 30 | 30 分 |
| PERIOD_H1 | 60 | < td style="word-break: Break-all;">1 時間PERIOD_H4 | 240 | 4 時 |
| PERIOD_D1 | 1440 | 毎日 |
| 10080 | 毎週 | |
| PERIOD_MN1 | 43200 | 毎月 |
| 0 | チャートの時間範囲 |
りも割り当てられたパラメータ ボックスに入力するのが簡単であることがわかります。 また、これらの整数を外部変数でより簡単に使用できることもわかりました。 たとえば、上半期チャートとは異なる以前の終値を参照したいが、どの時間枠を使用すればよいかわからない場合はどうすればよいでしょうか。 次に、次の例に示すように、時間範囲パラメータを外部変数として構築できます。
// 外部変数セクションに置きます
external int timeframe = 30;
// コード内のどこかに配置します
double PreviousClose = iClose (NULL, TimeFrame , 1);
TimeFrame はタイムフレーム パラメータを参照する識別子です。デフォルト値は 30 で、前の M30 バーを参照します。 シフトパラメータに1を入れているので、それが前のバーであることがわかります。 現在の M5 終値を参照したい場合は、2 番目のパラメーターに 5 を入力します。現在の足を参照したい場合は、3 番目のパラメーターに 0 を入力します。
EA で複数のタイムフレームを簡単に参照できるようになりました。必要に応じて、タイムフレームの最適化の間でストラテジー テスターを実行するように設定することもできます。
代替通貨の代替手法
優れている点は、複数のタイムフレームだけでなく、複数の通貨ペアも簡単に参照できることです。 NULL は現在のチャートのシンボルを表しますが、EA 独自のチャートの外の通貨であっても、任意の通貨記号に置き換えることができます。 これは簡単に実行できます。NULL を使用したいシンボル (市場ウィンドウに存在する必要があります) に置き換えて、それを相場市場でラップするだけです。
如果您想引用 EURUSD 符号,请示例:
double PreviousClose = iClose (“EURUSD”, 30,1);
さらに、次の例に示すように、このパラメータの外部変数を柔軟に構築できます。
// 外部変数セクションに挿入
// p>
external string 通貨名 = "EURUSD";
external int timeframe = 30;
// コード内に配置します
double PreviousClose = iClose (CurrencyName, TimeFrame, 0);
ご覧のとおり、NULL を外部用に置き換えます。文字列変数の場合、それを CurrencyName として識別し、デフォルトで「EURUSD」に設定します (ただし、相場の端数に入れる限り、市場ウィンドウで確認できる任意の通貨ペアにすることができます)。 また、外部変数に追加される通貨名はすべて、外部文字列変数を使用する必要があることに注意してください。
チャートとは異なる通貨ペアを参照する必要があるのはなぜですか?
理由はたくさん考えられますが、最初に思い浮かぶのは相関関係に基づいてトレードする場合です。 たとえば、GBPUSD を取引しているが、ほとんどの主要通貨の主要通貨は EURUSD であると考えているとします。そのため、GBPUSD で取引を開始するための前提条件として、まず EURUSD のトレンド方向を確認したいとします。
レベル 4 価格データ: 期間範囲内の最大価格データ値を使用する関数
< p >単一期間に対して iHigh() や iLow などの価格データ関数を使用することに加えて、一連の期間の最大値に対して価格データ関数 (iHighest() や iLowest()) を使用することもできます。 これらの各関数を使用すると、範囲内の複数のバーに対して h/l を操作できます。これら 2 つの関数には独自のパラメータ セットがあります。
int iHighest(stringシンボル、int タイムフレーム、int タイプ、int count=WHOLE_ARRAY、int start=0)
| パラメータ | 説明 |
|---|---|
| Symbol | 使用される記号。 NULL=現在のチャート |
| 時間枠 | おおよその時間です。 任意の時間範囲のカウントを指定できます。 0= 現在の時間範囲 |
| タイプ | シリーズ アレイの識別子。 任意の Series 配列識別子の列挙値を指定できます。 |
| バー数 | < td style="word-break: Break-all;">テストするバーの数 (開始バーから終了バーまで)計算が実行されるもの 後列の方向。|
| スタートバー | Shift は、データを取得する必要がある現在のバーを基準としたバーを表示します |
シリーズ配列識別子テーブル:
| 定数 | 値 | 説明 |
|---|---|---|
| 0 | 始値 | |
| MODE_LOW | 1 | 低価格 |
| 2 | 高価格 | |
| MODE_CLOSE | 3 | 終値 |
| MODE_VOLUME | 4 | iLowest() および iHighest() 関数の取引量。 |
| MODE_TIME | 5 | バーの開始時間。ArrayCopySeries() 関数で使用されます。 |
注: 上記のタイプのいずれかを使用することを選択できるようですが、一般的にはMODE_HIGH と iHighest()、MODE_LOW と iLowest() を使用します。
ストップロスの最後の 3 足の最低安値と最高値の例:
// stop = 最後の 3 足の最低安値
if(dir == OP_BUY)
{
stopLoss = Low[iLowest(Symbol(), 0, MODE_LOW, 3, 1)];
}else if( dir = = OP_SELL)
{
stopLoss = High[iHighest(Symbol(), 0, MODE_HIGH, 3, 1)];
}
上記は異なる使用法です A従来のストップロスタイプを上回る巧妙なテクニック。
10 ~ 20 バーの間の最小値を取得したい場合はどうすればよいでしょうか?
// 範囲内の連続する 10 個のバーの最小値を計算します
// 現在のチャートの 10 番目から 19 番目のインデックス (両端を含む) )
double val=Low[iLowest(NULL,0,MODE_LOW,10,10)];