短期投資技術研究所

このサイトでは、メタトレーダー(MT4)を利用したシステムトレード(自動売買取引)を中心に、為替(FX取引)から日経平均先物取引について検証・研究結果を紹介しています。ZuluTradeやシグナルプロバイダーに関する情報も。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[タグ未指定]
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

メタトレーダーMQL4:バー(bar)が完成した時のみ処理させるべきか?

プログラミング関係の記事はアップしないつもりでしたが、ちょっとだけ小ネタを。

今回は、「バー(bar)が完成した時のみ処理させるべきか?」というお題です。

メタトレーダーでプログラミングにおいては、start()関数等のいくつかの特有の関数があります。
詳しくは先日ご紹介した「文系人間のためのシステムトレーダー養成所」さんのところの特別関数の部分をお読みください。
http://fxboyt.blog56.fc2.com/blog-entry-24.html



さて、このstart()関数ですが、ティックが更新させるときに呼び出される関数で、プログラムにおいてはもっとも重要な処理が書かれる部分ともいえます。

ただ、ティックが呼び出されるたびに価格取得などさせるわけですから、かなりの負荷がかかるのかなあ、なんて漠然とですが心配してしまうわけです。
このような理由かどうかは知りませんが、例えば「FXメタトレーダー入門」でも以下のようなコードで、バー(bar)が完成した時以外はstart()関数から出るように(start関数の処理を終えるように)する内容も紹介されています。(バー完成時についてはバックテストを理由にしていますが、それだけの理由なら別の方法がいいと思うのですが...。)

start()
{
if (Volume[0]>1 || IsTraderAllowed()==false) return(0);

(処理:省略)
}


負荷対策として必要そうな気もするのですが、実際はどうなのでしょうか?

管理人が作成するEAのほとんども足(バー、bar)の完成をもって次のアクションを行うようにしていますが、上記のようなコードは使っていません。もちろん、アクションを起こす必要のないときは、return(0)はしますけど。

「if (Volume[0]>1 || IsTraderAllowed()==false) return(0);」の処理は確かによさそうなのですが、これを使うといろいろ問題も出てきそうです。

で、どんな時に困るかというと、OrderSend関数を使って注文は出したけれどもサーバ側ではねられた時の再注文の時とか、あるいはトレイリングストップをさせるときなどが該当すると思います。

なお、実はこの記事は、「はてな」で以下のような質問があって、たまたま質問を見てしまった管理人も「回答」したのですが、それがきっかけでブログ記事にしました。
ネタガナインジャノー

以下、「はてな」より抜粋--------------------------------
http://q.hatena.ne.jp/1234918937

(質問)
現在MT4にて自動売買プログラムを作成していますが、トレール注文のプログラムの組み方がわかりません、価格の変動に対して、損切、利益確定、を調節するプログラムを組もうとおもっているのですが、どのように組んでよいかわかりません。(中略)
購入後の価格変動の比較し、最高値を探る方法がわかりません、
どなたか知っている方がいればぜひ教えてください。

(回答:管理人分)
こんにちは。短期投資技術研究所管理人と申します。
最高値を取得する必要はないと思います。
start関数はティックが更新される度に呼び出されるのがメタトレーダーの仕様ですから、この時の値(Bid等で値は取得)がトレイリングストップの値分だけ上昇しているかどうかで判別するのが簡単だと思います。(少なくとも私はそうしています。)

プログラムはこんな感じになると思います。
(1)約定済みのオーダーの確認
(2)条件を満たしているかどうかの判別(トレイリングストップ分上昇したかどうか?)
(3)条件を満たせば、オーダー内容を変更する(OrderModifyを使用)

20行程度のコードになると思います。頑張ってくださいまし。
-----------------------------------------


ティックで処理すれば高値も安値も考えていないわけですから、非常に簡単な処理でトレイリングストップに関する処理をコーディングできるわけですが、足(バー)が完成した後だと値を遡って処理する必要性も生じてきますし、なによりリアルタイムでトレイルできなくなったりもするわけです。

再注文も一緒です。
注文が通ったかどうかをチェックすべきなのに、それもスキップと(笑)
まあ、世の中には、再注文機能のないトレーディングシステムもあるらしいのですが、もしかしたら上記のようなコードを書いているからなのかなあ、なんて思ったりしています。

一度、合理的だと判断した事柄って、後から見直しができなくなることがあります。
ただ、それによって、余計な苦労を強いられるようなことにもなるかもしれません。

管理人も気をつけないと。


そうそう、最後になりましたが、問題の「負荷」ですけど、普通の環境であれば特段問題にならないようにも思えます。管理人は1台のPCでデモ口座及びライブ(リアル)口座を複数運用させています。
普通のEA(Expert Advisor)であれば10や20なら特に問題はないと思います。(管理人は100前後かなあ。さすがにもう1台増やす予定です。)


っと、お題の回答が...

「バー(bar)が完成した時のみ処理させるべきか?」

ということであれば、管理人は「そうです」と答えます。
理由は、バックテストの信頼性を上げるためです。

ん?メタトレーダーにはEveryTickがある?
これって、メタトレーダーの場合には擬似的に生成された「Tick」なんですよねえ。
まあ、それでもよければ、どうぞ!ということかな。

追記
-------------
この記事は、「足(bar)が完成してから売買の判断をした方がよい」ということを前提とし、しかし、「安易なコーディングをすると実運用で苦労することになるのでは?」という管理人の疑問を記事としてまとめたものです。ちょっと、論旨がわかりにくくなってしまいました。スミマセング
-------------


以上、小ネタというか、マニアックネタというか、開発者以外の方には?な内容だと思いますが、hatenaで初回答した記念記事ということで。(しばらく前の話ダナー)



人気ブログランキングへ  為替ブログ  為替ランキング  FXランキング

関連記事

[タグ未指定]
[ 2009/03/28 22:07 ] プログラミング | TB(-) | CM(-)
無料の自動売買システム
日本人シグナルプロバイダー
ランキング

ZuluTrade
ZuluTradeは革新的なFXの自動売買システムです。あなたの口座をFXのスペシャリストに運用を任せませんか?パソコンも立ち上げる必要もありません。しかも、手数料はかからず、すべて無料です!
詳細はこちら
全記事表示リンク
プロフィール

短期投資技術研究所

Author:短期投資技術研究所
前総理は国会審議中も内職に忙しいようですが、管理人もEAのパラメータ最適化作業で忙しい毎日を過ごしております(ウソ!w)


こんなものも(笑)
mixi
最新記事
最新コメント
QRコード
QR
アクセス管理


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。