今回から、いよいよ実際に
自動売買出来るシステムの製作に移って行こうと思います。
あまりにも長くなってしまいましたので、前編後編で分けます。
今回から、内容が長く複雑になりますが、少しずつ理解して行けば出来ないことはありませんので頑張ってください。
また、
サンプルプログラムを作っておきましたので、エラーが出た場合などはこちらを参考にして下さい。
サンプルプログラム
http://jidoubaibai.com/Sample%20%20iMA.mq4
サンプルプログラムの使い方は、
MetaTrader4 プログラム入門 part6 システムの導入方法で説明しています。
では、いつもと同じように
MetaEditorを起動して下さい。
Nameは
iMAにして置いて下さい。
int
start()の中のreturn(0);の上辺りに次のコードを書いてください。
今回もまとめて書きますね。
今回は少し長いですが、頑張ってコードを書いてください。
//変数の宣言
int
cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double
kakob,gennzaib;
//
オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt <
OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS);
if(OrderSymbol()
== Symbol()) CurrentPosition=cnt;
}
//一時間前の21日線
kakoa =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一時間前の90日線
kakob =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);
//現在の21日線
gennzaia =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
gennzaib =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,0);
//
ポジションチェック ポジション無し
if(CurrentPosition == -1)
{
//もし21日線が90日線を下から上にクロスしたら
if( kakoa < kakob && gennzaia
>= gennzaib)
{
//買いポジションを取る
Ticket =
OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point), "Buy",
0, 0, Blue);
}
}
書けましたか?
今回は今までと比べるとかなり複雑なので、ほとんど分からないと思いますが、慣れればそれほど難しくないので、頑張ってください。
では、説明して行きます。
まず、頭に//が付いているのは
コメントです。
出来るだけ分かり易くするようにコメントを書いています。
また、自分で作る時もこういう風にコメントを付けていけば、あとでプログラムを見直すときに分かりやすいです。
//変数の宣言
int
cnt, CurrentPosition;
int Ticket;
double kakoa,gennzaia;
double
kakob,gennzaib;
これは、変数の宣言です。
doubleは小数点以下の数字を含むときに使います。
今回は移動平均のデータなどを入れるのに使います。
//
オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt <
OrdersTotal();cnt++){
OrderSelect(cnt,SELECT_BY_POS);
if(OrderSymbol()
== Symbol())
CurrentPosition=cnt;
}
これは、今現在ポジションを持っているかどうかなどを調べます。
これは説明するとかなり長く複雑になりますので、このコードを書けば
オーダーチェックしてくれるという使い方だけ覚えてください。
//一時間前の21日線
kakoa
= iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);
//一時間前の90日線
kakob =
iMA(NULL,0,90,0,MODE_SMA,PRICE_CLOSE,1);
//現在の21日線
gennzaia =
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,0);
//現在の90日線
gennzaib =
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と入力します。
今回は二つの移動平均線がクロスした時に売買するシステムを作りますので、変数kakoaとgennzaiaに21と入力し、変数kakobとgennzaibに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時間足なら、一時間前の移動平均のデータが入ります。
今回は売買ルールで現在のデータと一つ前の足のデータが必要になりますので、変数kakoaとkakobに1と入力し、変数gennzaiaとgennzaibに0と入力しています。
例えば、kakoa
=
iMA(NULL,0,21,0,MODE_SMA,PRICE_CLOSE,1);の場合は、
変数kakoaに一つ前の足の21日移動平均のデータを入れています。
これで、
関数iMAの説明は終わりです。
かなり複雑だと思いますが、ほとんど関数は似たようなものなので、一度理解すれば大抵の関数が使えます。
頑張ってください。
さて、次に
売買注文の関数が残っていますが、かなり長くなってしまったので、次回に説明します。
----------------------注意----------------------
半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。