MetaTrader 4のバージョンアップにより仕様が変わってきた部分がありますので、 記事を新しい仕様で書き直しております。この注意書きが書かれていないページは 旧仕様の記事になります。旧仕様の記事でも一部を除き基本的にはシステムの制作に問題はありません。
前回の続きです。以前の記事は下記を参考にしてください。
注文を出す関数
前回はiMA関数の説明でした。
今回は残りの注文を出すときの関数の説明をします。
// ポジションチェック ポジション無し
if(CurrentPosition == -1)
{
//もし21日線が90日線を下から上にクロスしたら
if( old_fast_ma < old_slow_ma && now_fast_ma >= now_slow_ma)
{
//買いポジションを持つ
ticket = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , "Buy", 0, 0, clrBlue);
}
}
まず、if(CurrentPosition == -1) ですが、これは最初のほうでオーダーチェックしたときに変数にポジションを持っているかどうかを入れておき、if文でポジションを持っているかどうか調べています。
次に、if( old_fast_ma < old_slow_ma && now_fast_ma >= now_slow_ma) ですが、これは売買ルールです。
日本語にすると「もし、1つ前の21日移動平均線が一つの90日移動平均線の下にあって、そして現在の21日移動平均線が現在の90日移動平均線の上にあったら処理をする」という内容になります。
簡単に言うと、移動平均のゴールデンクロスです。
ここで、何故一つ前の移動平均線の条件を入れているかを考えてください。
プログラムを組むことにあまり慣れていない人はパッと思いつかないと思いますが、プログラムは人間と違って融通が利きません。
人間だったら違和感を覚えることでも、プログラムは戸惑うことなく忠実に実行してくれます。
もちろん機械だから当たり前で、むしろそこが利点なのですが、プログラミングする人間はそのことをよく理解しておかなければなりません。
もし、一つ前の条件を入れずに、if( now_fast_ma >= now_slow_ma)とコードを書くと、21日移動平均線が90日移動平均線をゴールデンクロスした瞬間だけではなく、21日移動平均線が90日移動平均線の上にあり続ける限りずっと買いポジションを立て続けます。
先程、ポジションチェックをしているので、実際には買い続けるということはないのですが、それでもポジションが無くなった時に、21日移動平均線が上にあったら、ポジションが無くなった瞬間に買いポジションを立てることになります。
私も初めてプログラミングをした時は、この間違いをしてしまい、何が間違っているのかをずっと考えました。
if文の条件分岐は、頻繁にこういうことがあるので、使うときはどういう条件かをよく考えてから使用すると良いと思います。
最後に、order_send = OrderSend(Symbol(), OP_BUY, 0.1, Ask, 30, 0,0 , “Buy”, 0, 0, clrBlue);ですね。
OrderSend()は、売買注文を出すときに使う関数です。
日本語に訳すと次のようになります。
オーダー関数(通貨ペア、注文内容、ロット数、レート、スリップページ、損切り幅、利食い幅、コメント、マジックナンバー、有効期限、色)
内容を一つずつ説明して行きますね。
通貨ペア
どの通貨ペアを売買するかを選択します。
文字列型で ”EURUSD” という風に入力できますが、選択された通貨ペアを自動で選択するSymbol() を入れておくのが一番無難です。
注文内容
成り行きの買い注文、成り行き売り注文などの注文内容のことです。
OP_BUY で成り行き買い、OP_SELL で成り行き売りです。
指値注文と逆指値注文も出来ますが、最初は成り行き注文だけ覚えていれば大丈夫です。
ロット数
注文する枚数のことです。
1ロットで10万通貨です。
1万通貨の場合は、0.1と入力して下さい。
千通貨の場合は、0.01になります。
稀に証券会社よって異なる場合がありますので、実際に運用される場合は事前にお調べください。
レート
成行注文する時のレートです。
買いならAsk、売りならBitと入力します。
AskとBitはそれぞれの現在のレートを入手してきてくれます。
スリッページ
スリッページの幅を設定します。
スリッページとはオーダーを出した時点のレートから何Pipsまでエントリーレートがズレるのを許容するかの設定になります。
1で0.1pipsです。
よく分からなければ30と入力しておくのが無難だと思います。
損切り幅
損切りの設定です。
ここに損切りレートを入力するのですがMT4の仕様で成り行き注文の場合、エントリーと同時に損切りと利食いの入力が出来ません。
指値注文の場合は可能になるのですが、成り行き注文の場合ここは0と入力してください。
エントリー後から損切り、利食いを設定する方法は別の記事で紹介させて頂きます。
利食い幅
損切りと同じように0と設定して下さい。
コメント
注文にコメントを付ける事が出来ます。
文字列型ですので、付ける場合は””を付けて、中に内容を書いてください。
必要ない場合はNULLと入力して下さい。
マジックナンバー
マジックナンバーを付ける事が出来ます。
主にどのポジションがどのEAの管轄などか分けるために使用されます。
よく分からない場合は0と入力して下さい。
有効期限
注文の有効期限を設定できます。
指値注文の時以外は使用しませんので、成り行き注文の場合は0と入力しておいて下さい。
色
チャート上に出る矢印の色を設定出来ます。
半角英数で色を英語で書いてください。(clrの後に頭文字は大文字で)
赤ならclrRed、青ならclrBlueになります。
結構色々な色がありますのでマイナーな色でない限りはあると思います。
最後に、何故ticket=OrderSend()と書いてあるのかですが、関数には戻り値と呼ばれるものが設定されていることがあります。
戻り値とは、その関数を使用したときに計算結果などを返してきてくれるものです。
OrderSend()関数は、チケットナンバーを返してくるので、それを変数に入れました。
これで、OrderSend()関数の説明は終了です。
自動売買するシステムを作るときは必ずOrderSend()関数を使いますので、使い方を覚えておいて下さい。
さて、かなり長くなりましたが、これで今回のプログラムは終了です。
では、まとめてもう一度プログラムを書きます。
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);
}
}
}
今回のプログラムは、移動平均線がゴールデンクロスした時に買いエントリーするというものです。
では、コードを全て書けたらコンパイルボタンを押してください。
エラーが出てきた場合は、半角になっているか、;を付け忘れていないか、{}を付け忘れていないか、{}の数は合っているかを確認して下さい。
どうしてもエラーが分からない場合は、サンプルプログラムを参照して下さい。
エラーが出なかったら、MetaTrader 4のバックテストでiMAを選んで、スタートして下さい。
終わったら、結果、グラフ、レポートを見てください。
エントリーのみで決済条件を入れていませんのでバックテストでは一度エントリーして終わりになります。
今回はこれで終了です。
かなり難しかったと思いますが、これを理解できるようになれば、あとはルールを変更するだけで自分だけの自動売買システムを製作することが出来ますので、頑張ってください。
次回は、手仕舞いの説明をして行きます。