基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2010年04月20日(火)

MT4によるトレードシステム開発(4) [MetaTrader4]



前回、iCustom()という関数を使って、予め作ってあった「WeeklyOpenRange.mq4」というカスタム指標プログラムから指標値を取得する方法を紹介しました。

この指標プログラムを利用すると、指標値がそのままエントリー価格や損切り価格、利食い価格に相当するので、あとは、オーダーを送信する部分さえ作れば、自動売買可能なエキスパートプログラム(EA)になります。

オーダーには、成り行き、指値、逆指値などありますが、ここでは、ブレイクアウトシステムなので、逆指値オーダーとするのが適当でしょう。

あとは、どのタイミングでオーダーを送信するかということです。

まずは簡単のため、どのティックでもオーダーが成立するという理想的なケースについて考えてみます。

理想的と言ったのは、バックテストを含め直接サーバーと通信しない場合はOKですが、実際にサーバーにオーダーを送信する場合、うまくいかないケースがあるからです。

さて、今回のシステムでは、週明けのレンジが確定した時にエントリー価格などが決まるので、そのタイミングでオーダーを送信すればいいということになります。

これをMQL4プログラミングに適した考え方に翻訳すると、次のようになります。

月曜日の19時のバーの始値でオーダー送信

この条件をプログラムすると、次のように書けます。

// マジックナンバー
#define MAGIC 20100419

// 外部パラメータ
extern double Lots = 0.1;
extern int Slippage = 3;
extern double MultBreakout = 1.0;
extern double MultTarget = 0.8;

// スタート関数
int start()
{
if(DayOfWeek() == 1 && Hour() == 19 && Volume[0] == 1)
{
double sell_sl = iCustom(NULL, 0, "WeeklyOpenRange",
MultBreakout, MultTarget, 0, 0);
double buy_sl = iCustom(NULL, 0, "WeeklyOpenRange",
MultBreakout, MultTarget, 1, 0);
double buy_entry = iCustom(NULL, 0, "WeeklyOpenRange",
MultBreakout, MultTarget, 2, 0);
double sell_entry = iCustom(NULL, 0, "WeeklyOpenRange",
MultBreakout, MultTarget, 3, 0);
double buy_tp = iCustom(NULL, 0, "WeeklyOpenRange",
MultBreakout, MultTarget, 4, 0);
double sell_tp = iCustom(NULL, 0, "WeeklyOpenRange",
MultBreakout, MultTarget, 5, 0);

double spread = Ask-Bid;

// 逆指値買い注文
OrderSend(Symbol(), OP_BUYSTOP, Lots, buy_entry+spread, Slippage,
buy_sl, buy_tp, "", MAGIC);
// 逆指値売り注文
OrderSend(Symbol(), OP_SELLSTOP, Lots, sell_entry, Slippage,
sell_sl+spread, sell_tp+spread, "", MAGIC);
}

return(0);
}

ここでのポイントは、
if(DayOfWeek() == 1 && Hour() == 19 && Volume[0] == 1)

の条件式です。

3つの条件がそれぞれ、月曜日、19時、バーの始値(そのバーのtick数が1)を表します。

上記の条件を満たす場合に限り、逆指値買い逆指値売りの両方のオーダーを送信するわけです。

OrderSend()がオーダーを送信する関数ですが、ここではパラメータの説明は省略します。

一つ注意することは、売りオーダーでは sell_entry をエントリー価格としてそのまま代入していますが、買いオーダーでは buy_entry+spread として、spread=Ask-Bid として算出した売買スプレッドを加えた価格を代入している点です。

これは、もともとオープンレンジの指標が「Bid=売値」をもとに計算されているからです。

買いオーダーでは買値を指すので、売値に対してspread分高い価格になるのです。

また、buy_sl, buy_tp は買いオーダーにおける損切り価格、利食い価格、sell_sl、sell_tpは、売りオーダーにおける損切り価格、利食い価格です。

sell_sl+spread、sell_tp+spread で spread が足されているのも同じ理由です。

これで、週の始めにオーダーを送信することができるようになりました。このままでも1週間は問題ありません。

しかし、このままでは、オーダーが逆指値でヒットして、損切り値か利食い値に達するまで決済されないことになります。

さらに次の週には新しくオーダーが送信され、オーダーが乱立してしまいます。

こういう問題を防ぐためには、週末にオーダーをリセットする必要があります。

次回はこのような週末処理の部分を組み込んでみることにしましょう。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 12時41分


ページのトップへ ページのトップへ

Sponsor AD

2010/4

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

ランダムウォークとランダムトレード(6)

ランダムウォークとランダムトレード(6)

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.