自動売買システムの作り方 後編
前回の続きです。
前回は
iMA関数の説明まででしたね。
今回は残りの
注文を出すときの関数の説明をします。
//
ポジションチェック ポジション無し
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);
}
}
まず、if(CurrentPosition == -1) ですが、これは最初のほうで
オーダーチェックしたときに変数にポジションを持っているかどうかを入れておき、if文でポジションを持っているかどうか調べています。
このコードを書かないと、売買条件が一致したらポジションがどんどん増えて行きます。
次に、if( kakoa < kakob && gennzaia >= gennzaib) ですが、これは
売買ルールです。
日本語にすると「もし、1時間前の21日移動平均線が一時間前の90日移動平均線の下にあって、そして現在の21日移動平均線が現在の90日移動平均線の上にあったら処理をする」という内容になります。
簡単に言うと、
移動平均のゴールデンクロスです。
ここで、何故一時間前の移動平均線の条件を入れているかを考えてください。
プログラムを組むことにあまり慣れていない人はパッと思いつかないと思いますが、プログラムは人間と違って融通が利きません。
人間だったら違和感を覚えることでも、プログラムは戸惑うことなく忠実に実行してくれます。
もちろん機械だから当たり前で、むしろそこが利点なのですが、プログラミングする人間はそのことをよく理解しておかなければなりません。
もし、一時間前の条件を入れずに、if(
gennzaia >=
gennzaib) とコードを書くと、21日移動平均線が90日移動平均線をゴールデンクロスした瞬間だけではなく、21日移動平均線が90日移動平均線の上にあり続ける限りずっと買いポジションを立て続けます。
先程、ポジションチェックをしているので、実際には買い続けるということはないのですが、それでもポジションが無くなった時に、21日移動平均線が上にあったら、ポジションが無くなった瞬間に買いポジションを立てることになります。
私も初めてプログラミングをした時は、この間違いをしてしまい、何が間違っているのかをずっと考えました。
if文の条件分岐は、頻繁にこういうことがあるので、使うときはどういう条件かをよく考えてから使用すると良いと思います。
最後に、Ticket
= OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Ask-(200*Point), Ask+(200*Point),
"Buy", 0, 0, Blue);
ですね。
OrderSend()は、
売買注文を出すときに使う関数です。
日本語に訳すと次のようになります。
オーダー関数(通過ペア、注文内容、ロット数、レート、スリップページ、損切り幅、利食い幅、コメント、マジックナンバー、有効期限、色)
内容を一つずつ説明して行きますね。
通貨ペア
どの通貨ペアを売買するかを選択します。
文字列型で ”EURUSD” という風に入力できますが、選択された通貨ペアを自動で選択する
Symbol() を入れておくのが一番無難です。
注文内容
成り行きの買い注文、
成り行き売り注文などの
注文内容のことです。
OP_BUY で成り行き買い、
OP_SELL で成り行き売りです。
一応、指値注文と逆指値注文も出来ますが、システムトレードの性質上ほとんど使うことが無いので、基本的に成り行き注文だけで大丈夫です。
ロット数
注文する枚数のことです。
1ロットで10万通貨です。
1万通貨だけ買いたい場合は、0.1と入力して下さい。
レート
成行注文する時のレートです。
買いなら
Ask、売りなら
Bitと入力します。
AskとBitはそれぞれの現在のレートを入手してきてくれます。
スリップページ
スリップページの幅を設定します。
1で1pipsです。
3と入力しておくのが無難だと思います。
損切り幅
損切りの設定です。
損切りしないなら、0と設定しておけば大丈夫です。
設定する場合は、この関数が若干不親切で、ポジションから何pipsではなく、レートを指定しなければなりません。
Ask-(200*Point) これで、200pipsの損切りを付けた事になります。
Askは現在のレートを出すだけのものですが、買った瞬間に出すわけですから、買った時と同じレートです。
そこから、200pips引いたレートを設定します。(Pointをかけているのは数字をpipsにするためです。)
利食い幅
損切りと同じように設定して下さい。
ただ、
利食いですので、現在のレートよりは上に設定して下さい。
下に設定するとシステムが変になります。
コメント
注文に
コメントを付ける事が出来ます。
文字列型ですので、付ける場合は””を付けて、中に内容を書いてください。
要らない場合は
NULLと入力して下さい。
マジックナンバー
マジックナンバーを付ける事が出来ます。
滅多に使いませんので、よく分からない場合は0と入力して下さい。
有効期限
注文の
有効期限を設定できます。
システムトレードの性質上、滅多に使う機会がないと思いますので、0と入力しておいて下さい。
色
チャート上に出る
矢印の色を設定出来ます。
半角英数で色を英語で書いてください。(頭文字は大文字で)
赤なら
Red、青なら
Blueになります。
結構色々な色がありますので、余程マイナーな色でない限りはあると思います。
最後に、何故Ticket
=OrderSend()と書いてあるのかですが、関数には戻り値と呼ばれるものが設定されていることがあります。
戻り値とは、その関数を使用したときに計算結果などを返してきてくれるものです。
OrderSend()関数は、チケットナンバーを返してくるので、それを変数に入れました。
これで、OrderSend()関数の説明は終了です。
自動売買するシステムを作るときは必ずOrderSend()関数を使いますので、使い方を覚えておいて下さい。
さて、かなり長くなりましたが、これで今回のプログラムは終了です。
では、まとめてもう一度プログラムを書きます。
int start()
{
//変数の宣言
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);
}
}
return(0);
}
今回のプログラムは、
移動平均線がゴールデンクロスした時に買い、手仕舞いは
指値か
逆指値でするというものです。
では、
コンパイルをするために
compileのボタンを押してください。
エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。
どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。
エラーが出なかったら、
MetaTrader4の
バックテストで
iMAを選んで、スタートして下さい。
終わったら、結果、Graph、レポートを見てください。
今回はこれで終了です。
かなり難しかったと思いますが、これを理解できるようになれば、あとはルールを変更するだけで
自分だけの自動売買システムを製作することが出来ますので、頑張ってください。
次回は、
手仕舞いの説明をして行きます。
----------------------注意---------------------
半角のスペースが認識されない為、コードを見易くするために全角で書いている場合があります。
実際にプログラムにコードを書くときは、コピー&ペーストせずに半角で書いて行って下さい。