MQL ドテン売買の仕組みを作成する
ポジション数を制限する
これで、買いと売りの記述ができました。しかしこのままでは、条件が整うと限りなくポジションを持ってしまうので、建て玉数がものすごい数になってしまいます。そこで今回は、ポジション数を「1」にして、自動売買がしっかり動作するか確認してみます。
現在のポジション数を調べる関数に「OrdersTotal()」があります。「OrdersTotal()」でポジション数を調べて、if文を使ってポジション数が0ならば取引をする、という条件にします。if文の条件は「OrdersTotal()==0」、if文の開始と閉じのかっこ入力を忘れないようにしましょう。
コンパイルしてバックテストを行う
ここまでの記述で自動売買が動きますから、試しにコンパイルしてバックテストをしてみましょう。メニューバーの下にある「compile」ボタンをクリック、画面下の「Toolbox」にきちんとコンパイルできたかどうか表示されます。「Compiling ‘MA_Sample.mq4’」と表示されればコンパイル完了です。
エラーが出てしまった場合は、エラーメッセージをダブルクリックするとエラー行に飛ぶので、もう一度見直してみましょう。コンパイルが完了すると、自動的に「MA_Sample.ex4」ファイルが作成されます。MT4に戻って、バックテストを行ってみましょう。きちんと動いたでしょうか?
MQL ドテン売買とOrderSelect関数
今度は、ポジションがあった時に移動平均線がクロスした場合、ドテン売買する仕組みに改良してみましょう。ゴールデンクロスとデッドクロスが発生する度に決済の命令を出すことになります。決済命令の関数は「OrderClose関数」なのですが、その前にどのポジションを決済するのかを指定する必要があります。ポジションの取得は「OrderSelect関数」で行います。
「OrderSelect関数」では0から始まるオーダー番号を指定するのですが、ポジション数は必ず1個なのでオーダー番号「0」を取得するために、「OrderSelect(0, SELECT_BY_POS);」とします。今回はポジションがある場合なので、「if文」の条件を「OrdersTotal()==1」になります。
ポジションを取得したら、
@買いポジションならばデッドクロスで決済、新たに売りポジションを持つ。
A売りポジションならばゴールデンクロスで決済、新たに買いポジションを持つ。
という条件分岐になります。
まずは買いポジションなのかどうかを調べてみます。ポジションが買いか売りかを調べる時には「OrderType」関数を使います。
そして、買いポジションを持った状態で移動平均線がデッドクロスしたら、ポジションを決済する「OrderClose関数」を記述します。
OrderClose(@int ticket, Adouble lots, Bdouble price, Cint slippage, Dcolor Color=CLR_NONE)
OrderClose(@決済するポジション,Aロット数,B決済したい価格, C許容スリッページ,E決済矢印の色)
@決済するポジション
「OrderSelect」関数を使った時に、「OrderTicket」関数にポジションのデータが入るので、「OrderTicket()」を入力します。
Aロット数
同じく「OrderSelect」関数を使った時に、「OrderLots」関数にロット数のデータが入るので、「OrderLots()」を入力します。
B決済価格
成行で決済します。買いポジションを決済するので、「Bid」になります。
C許容スリッページ
標準的な「3」にしました。
D決済矢印の色
決済矢印の色は、注文した時と違う色にした方が分かりやすいです。
そして同時に売りポジションを持ちます。これは前半部分の「//売りポジションを取る」と同じでよいでしょう。これで、ドテン売りの記述ができました。
次はドテン買いです。手順は先ほどと同じです。ポジションが売りかどうかを調べて、売りの場合はゴールデンクロスした時に決済、同時に買いポジションを持ちます。
完成したらコンパイルして、バックテストを行ってみましょう。単純なドテン売買では無駄な売買が増えてしまうので、まだまだ改良の余地はありそうです。