2015年06月26日

EA作成における関数化のススメ

MT4を使ってFXの自動売買をされる方の中には、自分でEAを作成して動かすという方もいらっしゃるかと思います。

しかしこのEA作成作業、手書きでプログラムしていくとかなり時間を要する上に、デバッグ作業もかなり大変です。EAを作るたびにこの作業をするのは非常に大変で、その上、EAなんてのは10個作って1個良ければいいというくらいのシロモノですので、2〜3個作ってダメだと、もう投げ出してしまう方も多いかと思います。

#今回の記事は、そんな方への内容となります。やってる人にとっては至極当たり前の話なので、「そんなのわかっとるわ!」という方は特に見なくてもいいかもしれませんw

EAと言うのはかなり複雑な処理をしているように見えますが、実は基本ロジックはそんなに差分はないのです。

基本フローとしては、

@ポジシションがない場合、エントリーの判定を行う
 →エントリー可と判断したら、実際に新規注文を入れる
Aポジションがある場合、イクジットの判定を行う
 →イクジット対象と判断したら、決済注文を入れる
Bポジションがある場合、トレイリングの判定を行う
 →トレイリング条件を満たしたら、トレイリングを行う

実はこれだけなんです(実際にはこれにフェールセーフの処理などが入ってきますが)。

EAごとに違うのって、基本的には判定ロジックの違いだけなんですね。
#ポジション数が複数だったり、成り行き系ではなく指値系のEAになるともう少し複雑な状態管理も必要になりますが、本記事の本旨ではないのでとりあえずおいておきます。

つまり、何が言いたいかというと・・・「判定部分以外はテンプレートで関数化してしまえばいい」のです!!

例えば、私が築き上げてきたEAのテンプレートはこんな感じです。

int OnInit()
{
//初期化関数
UnitPip = MakePips(); // 業者ごとの桁数を補正して共通化
if (InitFunction()) return(INIT_SUCCEEDED); // グローバル変数の初期化など
else return(INIT_FAILED); // 初期化失敗の場合はTickを動かさない
}

void OnTick()
{
bool ordersuccess; //注文が通ったかどうか

//管理外のポジションがあったら強制決済させるフェールセーフ処理
if (!OutOfStatePositionCheck(MagicNo)) return;

//ポジションがTP/SLに掛かっていたらポジション未保有のステートに遷移
if (position && isOrderStopped(Ticket)){
position = false;
return;
}

//トレイリング条件を満たしていたら実施
Trailing(trailpips);

//足が確定していない場合はこの先に進まない
if (!NewFoot()) return;

//エントリー条件
if (!position){
if (買い条件){
Ticket = MakeOrder(OP_BUY, SL, TP);
if (Ticket != -1) position = true;
}
else if (売り条件){
Ticket = MakeOrder(OP_BUY, SL, TP);
if (Ticket != -1) position = true;
}
}
//イクジット条件
else{
if (買い決済条件){
ordersuccess = CloseOrder(OP_BUY);
if (ordersuccess) position = false;
}
else if (売り決済条件){
ordersuccess = CloseOrder(OP_SELL);
if (ordersuccess) position = false;
}
}
return;
}


MakePips、OutOfStatePositionCheck、isOrderStopped、Trailing、NewFoot、MakeOrder、CloseOrder関数はどれも汎用性があるように作りこんでおり、基本的にはコード内にペタペタするだけで使えてしまいます(InitFunctionはEAによってちょっと書き換えますが)。

ここまで作りこんでおくと、新たにEAを作る際には条件のところだけ追加するだけでよく、非常に簡単です。
また、すでに実績のあるコードがほとんどになるので、デバッグの必要性もあまり出てこないという嬉しさもあります(デバッグ作業がコーディングのほとんどを占めますからね・・・)。

ということで、EAの関数化について、基本的ですが記事にしてみました。
いや、そんなのできないよ・・・という方には、以下の様なEA作成ツールを使用することをオススメします。

ここで紹介する「EAつくーる」は、ビジュアル的に簡単にEAを作ることができます。
また、出てきたコードについてもかなりちゃんと関数化されている上に、それぞれコメントでしっかりと内容が説明されており、テンプレート作成という意味でも非常に有用なツールだと思います。

月額かかるというところにコスト感を感じる方もいらっしゃると思いますが、そこで上記の関数の考え方を取り入れると良いのです。
つまり、これを使って関数テンプレートさえ作ってしまえば、あとはちょっとした勉強でこれが要らなくなるわけです。つまり、1月分だけ購入してテンプレートを作りこんでしまえばいいわけですね。

ということで、興味がある方はこの「EAつくーる」を見てみてください。

MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!
EAつくーる【定期購入版】
EAつくーる【定期購入版】 | fx-on.com

EAつくーる【定期購入版】
EAつくーる【定期購入版】 | fx-on.com

以上です。
タグ:MT4 EA
posted by しがないあらさー at 04:31 | Comment(0) | TrackBack(0) | MT4 | このブログの読者になる | 更新情報をチェックする
2015年05月26日

MT4でOnTimer()関数のバックテストをする方法

今、私はOnTimer()関数を用いたEAを作成中です。
OnTick()はあくまでティックベースで動くので、ここで売買判定を行うようなプログラムにしておくと、業者によってはエントリー・イクジット判断が10秒単位で遅れてしまう可能性があります。
それに比べ、OnTimer()関数は秒単位で動きを定義できるので、業者に依存しない安定した売買ができます(できると思います)。

ということで便利なこのOnTimer()関数なのですが、EAを作っていて大きな問題に直面してしまいました。
なんと・・・OnTimer()関数はバックテストで一切通らないのです!!

つまり、OnTimer()関数内に売買ロジックを入れ込んでいるようなEAでバックテストを行おうとしても、一切取引が行われずにバックテストが終了してしまうのです。。。

なんてこった・・・バックテストできないEAなどとても運用できないではないか!!

ということで、なんとかOnTimer()でバックテスト出来る方法を考えました。
あまりにも苦肉ですが、よかったら参考にしてみてください。

「#define DEBUG」というおまじないをコードの先頭に置き、あとは以下のコードを、OnInit()の前に置きます。
//バックテスト用
#ifdef DEBUG
int prevsec;
int BScnt = 0;

bool ForBackTest(int Timerseconds)
{
if (Seconds() != prevsec) BScnt ++;
prevsec = Seconds();
if (BScnt >= Timerseconds){
BScnt = 0;
return(true);
}
return(false);
}
#endif

おしまいに、OnTick()関数内に以下のコードを入れます。
void OnTick()
{
//---
//バックテスト用
#ifdef DEBUG
if (ForBackTest([OnTimerで設定している秒数])) OnTimer();
#endif
}

はい、こうすると擬似的にOnTimer()を表現できます。

ただ、3点注意する必要があります。

・バックテストは必ず「全ティック」で動かす必要があります。
 そうしないと、秒単位の判定ロジックがバックテスト上ではまったくうまく動かなくなります。

・バックテストはこれでいいのですが、実際に動かす場合は「#define DEBUG」のおまじないは必ず削除するようにしてください。そうしないと、2重でロジックが動いてしまうことになります。

・このやり方だと、OnTimer()を正確には再現できません(30分の間隔を開けようとしても、バックテスト上は40分位の間隔になってしまう)。
 これはバックテストのTickが飛んでいることが原因と思われますが、この辺りで若干リアルとの差分が出てくる可能性があります。
 もし分単位以上の売買ロジックであれば、上記コードのSeconds()をMinute()にして分単位にしてあげたほうが安定するかもしれません。ロジックによって使い分けてください。

ということで、以上です。
OnTick()関数のバックテストで困っている方は是非参考にしてみてください。

#他にいい方法があれば、ぜひ教えて下さい。。。
タグ:MT4 EA FX
posted by しがないあらさー at 00:33 | Comment(0) | TrackBack(0) | MT4 | このブログの読者になる | 更新情報をチェックする
2015年05月08日

【祝】ついにOANDA JAPANで両建てができるようになったそうです!!

私もMT4を用いた自動売買で利用しているオアンダジャパン。

スプレッドや約定滑りなどの条件はなかなか良く、アルパリなき今ではかなり重宝しているMT4業者の一つとなっているわけですが、このオアンダジャパンの唯一の欠点が「両建てができないこと」でした。

それがなんと・・・この度、本日5月8日より両建てが可能になるそうです!!

情報ソースはこちら

以下、謎の注釈が気になりますが・・・?

>両建てのポジションをたてると、MT4上では、売り、買いポジションが両建てされたように表示されますが、fxTradeではポジションがネットされて表示され、実際の取引サーバでもネットされて処理されます。 確定申告などの帳簿などはMT4ではなく、fxTradeの表示内容が優先されます。あらかじめご了承ください。

おそらくですが、取引サーバの仕様は変更せずに、その中継ポイントあたりで擬似的に両建て管理するというような作りこみになっているんでしょうね。。。

オアンダの取引仕様については、過去実績的にも若干怪しいところがある(こことかこことかの記事を参照)ので少し適当なEAなどで挙動を見てから、問題なければ本格投入していきたいと思います。
何かあれば、適宜このブログでもレポートしていければと思います。

なお、冒頭でも述べておりますが、オアンダジャパンは時々スプレッドが大きく開くことがありますが、基本的には良心的な業者だと思っています。
以下のとおり記事にもしておりますので、是非こちらもご参照いただければと思います。
(リンククリックで記事に飛べます)

各MT4業者を比較した記事
オアンダジャパンのスプレッド調査(詳細)

なお、オアンダジャパンでは今FX-ONとのタイアップキャンペーンを行っており、以下の画像リンクから口座開設すると、もれなく無料でWhite Bear Z EURJPY(¥29,800相当)のプレゼントが有ります。
成績も今のところ右肩上がりでかなり好調のようですね。


OANDA JAPAN×タイアップキャンペーン☆WhiteBear Z EURJPY☆プレゼント


ということで、両建てができるようになったこの機会に、オアンダに口座開設してみるのはいかがでしょうか。

以上です。
続きを読む
タグ:FX MT4 OANDA
posted by しがないあらさー at 03:33 | Comment(0) | TrackBack(0) | MT4 | このブログの読者になる | 更新情報をチェックする
ゼニカル