MetaTrader 4のバージョンアップにより仕様が変わってきた部分がありますので、 記事を新しい仕様で書き直しております。この注意書きが書かれていないページは 旧仕様の記事になります。旧仕様の記事でも一部を除き基本的にはシステムの制作に問題はありません。
今回から、いよいよ実際に自動売買出来るシステムの製作に移って行こうと思います。
あまりにも長くなってしまいましたので、前編後編で分けます。
今回から、内容が長く複雑になりますが、少しずつ理解して行けば出来ないことはありませんので頑張ってください。
また、サンプルプログラムを作っておきましたので、エラーが出た場合などはこちらを参考にして下さい。
サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。
サンプルプログラムの使い方は、以下の記事で説明しています。
自動売買システム制作
では、いつもと同じようにMetaEditorを起動して下さい。
NameはiMAにして置いて下さい。
void OnTick()の中に次のコードを書いてください。
今回もまとめて書きますね。
今回は少し長いですが、頑張ってコードを書いてください。
void OnTick()
{
//---
//変数の宣言
int cnt;
int CurrentPosition = -1;
double old_fast_ma,old_slow_ma;
double now_fast_ma,now_slow_ma;
int ticket;
int order_select;
// オーダーチェック(ポジションなどのデータ)
for(cnt=0;cnt= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
}
}
書けましたか?
今回は今までと比べるとかなり複雑なので、ほとんど分からないと思いますが、慣れればそれほど難しくないので、頑張ってください。
では、説明して行きます。
まず、頭に//が付いているのはコメントです。
出来るだけ分かり易くするようにコメントを書いています。
また、自分で作る時もこういう風にコメントを付けていけば、あとでプログラムを見直すときに分かりやすいです。
//変数の宣言
int cnt;
int CurrentPosition = -1;
double old_fast_ma,old_slow_ma;
double now_fast_ma,now_slow_ma;
int ticket;
int order_select;
これは、変数の宣言です。
intは整数のみの場合に使います。
doubleは小数点以下の数字を含むときに使います。
今回は移動平均のデータなどを入れるのに使います。
// オーダーチェック(ポジションなどのデータ)
for(cnt=0;cnt
これは、今現在ポジションを持っているかどうかなどを調べます。
これは説明するとかなり長く複雑になりますので、このコードを書けばオーダーチェックしてくれるという使い方だけ覚えてください。
//一つ前の21日線
old_fast_ma = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一つ前の90日線
old_slow_ma = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);
//現在の21日線
now_fast_ma = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
now_slow_ma = iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);
これは、変数に移動平均のデータを入れています。
iMA()というのは、移動平均の関数です。
Print()等と同じものです。
()の中にデータを入れると移動平均のデータを算出してくれます。
このデータはMetaEditorで関数を書いて、そこにカーソルを置いてF1キーを押せば、関数の内容が英語ですが出てきます。
iMAだとこんな風に出てきます。
double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)
()の中の内容を一つずつ説明すると次のようになります。
string symbol
どの通過ペアなのかを表すシンボルです。
基本的に選択された通過ペアで行うNULLを入れておけば問題ありません。
int timeframe
時間足等のタイムフレームです。
基本的に0を入れておけば問題ないです。
選択されたタイムフレームで行ってくれます。
int period
移動平均線の期間です。
21日移動平均線にしたい場合は21と入力し、90日移動平均線にしたい場合は90と入力します。
今回は二つの移動平均線がクロスした時に売買するシステムを作りますので、変数old_fast_ma とnow_fast_ma に21と入力し、変数old_slow_ma とnow_slow_ma に90と入力しています。
int ma_shift
移動平均線をシフトするバーの数です。
よく分からない場合は0と入力しておきましょう。
int ma_method
移動平均線の種類です。
単純移動平均、指数平滑化移動平均などの移動平均の方法です。
- MODE_SMA
- MODE_EMA
- MODE_SMMA
- MODE_LWMA
の四種類あります。
今回は、単純移動平均線の MODE_SMAを使います。
int applied_price
始値、高値、安値、終値など、どのデータを使用して移動平均線を作るかです。
- PRICE_CLOSE
- PRICE_OPEN
- PRICE_HIGH
- PRICE_LOW
- PRICE_MEDIAN
- PRICE_TYPICAL
- PRICE_WEIGHTED
の7種類あります。
今回は終値のPRICE_CLOSEを使います。
int shift
移動平均線の時間をシフトする数値です。
0なら現在の移動平均、1なら一つ前の足の移動平均のデータが入ります。
1時間足なら、一時間前の移動平均のデータが入ります。
今回は売買ルールで現在のデータと一つ前の足のデータが必要になりますので、変数old_fast_ma とold_slow_ma に1と入力し、変数now_fast_ma とnow_slow_ma に0と入力しています。
例えば、old_fast_ma = iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);の場合は、
変数old_fast_ma に一つ前の足の21日移動平均のデータを入れています。
1と0の場合は足が確定前でも条件が成立するとエントリーになりますので、もし足が確定した時にエントリーにしたい場合は、1と0を2と1にしてください。
これで、関数iMAの説明は終わりです。
かなり複雑だと思いますが、ほとんど関数は似たようなものなので、一度理解すれば大抵の関数が使えます。
頑張ってください。
さて、次に売買注文の関数が残っていますが、かなり長くなってしまったので、次回に説明します。