今回は、複数のシステムによる自動売買の仕方です。
サンプルプログラムはこちらです。Zip圧縮していますので解凍してご利用ください。
サンプルプログラムの使い方は、以下の記事で説明しています。
そろそろコードの量がかなり多くなってきましたので、全てのコードを書かずに要所要所だけ説明して行くことにします。
コード全てを見たい方は、サンプルプログラムを御覧下さい。
マジックナンバーでのポジション管理
複数のシステムを一つのプログラムで動かそうとする場合、それぞれの売買ルールごとにポジションを持っているかどうか見分けなければなりません。
以前、オーダー関数を説明したときには流しましたが、ここでマジックナンバーを使います。
Ticket = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, 0,0, "Buy", 10, 0, OrangeRed);
後ろから3番目の10と数字が書かれている場所がマジックナンバーの場所です。
オーダー関数については、以下の記事を御覧下さい。
このマジックナンバーによってシステムを分けます。
例えば、AシステムとBシステムを分ける場合には、Aシステムの取引は全てマジックナンバー10、Bシステムの取引は全てマジックナンバー20という風に設定して下さい。
次に、マジックナンバーによってポジションを持っているかどうか判断します。
以前は、下記のコードになっていました。
//変数の宣言
int cnt, CurrentPosition;
// オーダーチェック(ポジションなどのデータ)
CurrentPosition=-1;
for(cnt=0;cnt < OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS);
if(OrderSymbol() == Symbol()) CurrentPosition=cnt;
}
このコードを下記のコードに変えます。
//変数の宣言
int odMACD,odMA;
int cnt;
// オーダーチェック(全オーダーを調べて、ポジションを持っていなかったら-1を変数に入れる)
// オーダーの時にマジックナンバーを入力し、それでルールごとにポジションを持っているかどうかを判別している
odMACD = -1;
odMA = -1;
for(cnt=0;cnt < OrdersTotal();cnt++)
{
OrderSelect(cnt,SELECT_BY_POS);
if(OrderMagicNumber() == 10) odMACD = cnt;
if(OrderMagicNumber() == 20) odMA = cnt;
}
以前のコードでは、全てのポジションの中からポジションを持っているかどうかということだけ調べていましたが、このコードにすることによって、システムごとに分けてポジション持っているかどうか調べることにします。
今回はMACDのシステムと移動平均線(MA)の二つのシステムを同時に起動させるシステムを作りましたので、変数odMACDにMACDのシステム、変数odMAに移動平均線のシステムのポジションのデータを入れています。
ポジションを持っていた場合はそのポジションのナンバーがそれぞれの変数に入り、一つもポジションが無い場合は-1が変数に入っています。
後は、プログラムの中身を次のようにすれば、複数のシステムを同時に起動出来ます。
if(odMACD == -1)
{
MACDの仕掛け
}
else
(
MACDの手仕舞い
)
if(odMA == -1)
(
移動平均線の仕掛け
)
else
(
移動平均線の手仕舞い
)
ポジションを持っているかどうかを分けた後は、普通に各々のシステムの内容のコードを書けば大丈夫です。
これで、プログラムの説明は終了です。
サンプルプログラムの方は、かなり長く見辛くなったので、MACDと移動平均線のオリジナル関数を作って見易くしています。
実際のシステムの中身はサンプルプログラムを見てもらえれば、出来るだけコメントをつけて分かり易くしていますので、理解出来ると思います。
また、二つのシステムが本当に動いているかどうか分かり辛かったので、移動平均のシステムを0.5ロットにしています。
結果のところを見てもらえれば、移動平均のシステムは0.5ロットに、MACDのシステムは1ロットになっているので分かると思います。
プログラムを長々と書くより、こちらの方が見易くて良いと思うのですが、どうでしょうか?
今回はこれで終了です。