MetaTraderでFX自動売買研究所
4. サンプルプログラム作成(2)
ところでiHighest()に渡す引数について、少し考えてみましょう。
iHighest()に渡されるべき引数は、次の5つがあります。
- iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) //一般的な定義
- iHighest(NULL, PERIOD_H1, MODE_HIGH, BreakPeriod, 1) //今回のサンプルプログラムでの引数の設定
- symbol (string型)
計算の対象となるべき通貨ペアを指します。NULLとすることで、Expert Advisorが張り付けられているチャートの通貨ペアが使用されることになるので、通常は(=AUDJPYの取引にEURUSDのデータを使うとかでなければ)これはNULLと指定しましょう。 - timeframe (int型)
最高値を計算する対象とするチャートのタイムフレーム(時間足、月足、5分足、etc.)です(単位は分)。0と入力すると、使われているチャートのタイムフレームが有効になります。
上の例では、PERIOD_H1と入力し、これは標準定数として60が代入されていますので、時間足がタイムフレームということになります。 - type (int型)
計算に用いるPriceの種類です。
- MODE_OPEN 始値(値は0)
- MODE_LOW 安値(値は1)
- MODE_HIGH 高値(値は2)
- MODE_CLOSE 終値(値は3)
上の例では「高値」が比較の対象とされるので、「MODE_HIGH」と入力し、高値が計算されるようになっています。 - count (int型)
対象とする期間を、「含まれる足(バー)の数」という単位で指定します。
例えば時間足チャートでこの値を10に設定すれば、60 x 10 = 600分(= 10時間)の高値が計算されることになります。
何も設定しない場合(引数を3つで終わらせる場合)、この値は「PCのメモリに記録されている期間全て」として処理されます。 - start (int型)
対象とする期間(の最後)が、「どのくらい前の足(バー)なのか」を指定します。
通常は0または1を指定し、最新のデータを対象とするようにします。上の例では1を指定しています。
何も設定しない場合のデフォルト値は0です。
計算した一定期間の高値と、現在値とを比較
さて、上のようにして計算された一定期間の高値と、現在値とを比較し、もし後者のほうが高ければ、ロングポジションを取らなければなりません。
この部分は、次のようなコードで表現することができます。
- // LONG
- double max=High[iHighest(NULL, PERIOD_H1, MODE_HIGH, BreakPeriod, 1)];
- if(max <= High[0] && OrdersTotal() < 1){
- // ロングポジションを取る
- }
「もし・・・だったら」という部分は、プログラムコード中では、「if(条件式){動作}」と書いて表します。
上記の例では、現在の足の高値(つまり上昇トレンドでは現在値)の値が「計算した一定期間の高値」よりも高く、かつ現在ポジションを持っていなければ、新たにロングポジションを取る命令が実行されます。
ロングにポジションを取る
最後に実際にロングポジションを取るプログラムを記述しましょう。
- OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-StopLoss*Point, NULL, NULL, 0, 0, Blue);
一度OrderSend()については説明したので、今回は説明は割愛します。
ここまでのまとめ
ここまでで制作したコードをまとめてみましょう。
- //----
- // LONG
- double max=High[iHighest(NULL, PERIOD_H1, MODE_HIGH, BreakPeriod, 1)];
- if(max <= High[0] && OrdersTotal() < 1){
- OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Ask-StopLoss*Point, NULL, NULL, 0, 0, Blue);
- }
- //----
補足:標準定数について
先ほどから何度かでている「標準定数」について補足説明しておきます。標準定数(Standard Constant)とは、よく使われる項目ごとに、あらかじめ値をセットした定数を指します。
例えばtimeframe(タイムフレーム)をある関数(上記のiHighest())などに渡す際、その値は「分」単位で渡されます。
つまり例えば週足をタイムフレームで指定しようと思うと、渡すべき値は7 x 24 x 60 = 10080 です。こういった良く使われる値を毎回計算するのは面倒なので、よく使われるものだけがあらかじめセットされ、関数の引数として使えるようになっているわけです。
上記のタイムフレームの例では、このような値があらかじめセットされています。
定数名 | 値 | 一般名(日本語) |
PERIOD_M1 | 1 | 1分足 |
PERIOD_M5 | 5 | 5分足 |
PERIOD_M15 | 15 | 15分足 |
PERIOD_M30 | 30 | 30分足 |
PERIOD_H1 | 60 | 1時間足 |
PERIOD_H4 | 240 | 4時間足 |
PERIOD_D1 | 1440 | 日足 |
PERIOD_W1 | 10080 | 週足 |
PERIOD_MN1 | 43200 | 月足 |
この標準定数によって、
- double max = High[iHighest(NULL, 60, 2, BreakPeriod, 1)];
と書く代わりに、
- double max = High[iHighest(NULL, PERIOD_H1, MODE_HIGH, BreakPeriod, 1)];
と書いて同じ意味を表すことができるのです。