スポンサーサイト

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

EA等でチャート表示と異なるタイムフレームの値を取得する場合の注意!

自作するEAの方針として、EAを載せたチャートのタイムフレームに依存しないように作る
ことにしている。
あるEAではMQL4で以下のような記述をしている。

double dAtr = iATR( NULL, PERIOD_D1, nPeriod, 1 ); // 組み込みテクニカル関数の呼び出し
OpenPositionRange( nType, dAtr*nSLRatio/100, dAtr*nTPRatio/100, true ); // 自作ライブラリのポジションをもつ関数

S/LまたはT/P値の幅を決めるのに日足のATR値を使用している。

この記述を使用したEAをデモでのフォワード・テストまたはリアル稼働させたとき、
ターミナルのポジション情報をみたら、S/L、T/P値がゼロになっており
最初から未設定であったかのようだった。
私にとっては、注文時にS/L値もT/P値も設定されないことはとても恐ろしいことだ!
そういうことを二、三度見かけた。記述を見直しても問題がなさそうだった。

iATR()関数がゼロを返しているハズと仮定してみると理由が分かった。
デモでもリアル運用でも対象の通貨ペアで日足のチャートを開いたことが一度もなかったのだ。

実験してみたが、
・iMAでもiOpenでも一度も開いたことがないタイムフレームでの値を取得しようとすると
最初はゼロを返す。
・その後しばらく経ってから呼び出すと、妥当な値が返ってくる。
・関数の再呼び出しが早すぎるとまたゼロを返すことがある。

という結果になった。
どうやら最初の関数呼び出しを契機にしてデータを取得してくるようで、
それが間に合わなければゼロを返しているらしい。

MT4を長い間使用している方にとっては当たり前の事象かも知れない。
EAを開発してテストするPCとデモでフォワードテストしたりリアル運用するPCを分けているので、
稼働させるPCのMT4では、EAを動かすまで使用するタイムフレームでチャートを
一度も開いたことがなかった、ということがよくあるのだ。

対処としては、if ( dAtr == 0 ) だったら注文を止めるか、
しばらくそこで待ってから再度リトライするかが考えられる。
しかし、最適化等のテストを考えると評価式は減らしたいし、
そもそも一度ロードしてくればそれで済むようだし。。。

init()関数内で一度使用するタイムフレームの値を取得しておく
というのが一番手軽そうだがどうだろうか?

しかし、さらに疑問がわく。
EAが関数を呼び出すまで対象のタイムフレームの値を取得していないとなると、
対象のタイムフレームのバーが次のバーに更新されたとき、
そのタイムフレームでチャートを開いていなくても、
更新された正しいシフト位置の値を関数は返しているのだろうか。。。?

更新されているとするとどのタイミングなんだろうか?
もしかして、まさかチャートを表示していないとダメとか。。。
でも、ティックか他の短い足をロードしていればそこから作れるはずだし、
そうしていると思っていたが。。。

推測だが、
・最初はN本前までのバーのデータがなければデータをロードするしかなく、
ロードするまで待たせるわけにゆかないのでゼロを返しておく。
・一度取得してしまえばそこから先は稼働している間に取得したティック等の
データから作ればよいので、作った足をもとに計算した値を返している。
という感じだろうか?

ということは、EAを動かしている間に、障害等で接続できない期間がある程度続いてから、
これらの関数が呼び出されると正しくない値が返っていることがあるのではないか?


誰か知っていれば教えてもらいたいなと思った、今日この頃。。。
スポンサーサイト

theme : Meta Trader 4
genre : 株式・投資・マネー

tag : MT4EA タイムフレーム マルチタイムフレーム ATR

comment

Secret

他通貨を参照する時も同じ…

こんにちは。
私の理解している範囲でコメントしますと・・・
チャートを開いてない状態で取得すると、2048本がダウンロードされます。ダウンロード中は、
double dAtr = iATR( NULL, PERIOD_D1....)
int err1 = GetLastError();
これで エラーコード4066 が返ります。
今のところ、これでチェックするしか無いのかなぁと思ってます。

No title

はじめまして。いつも興味のわく記事を楽しみにしています。
ビルトインIndicatorではなく、iCustomで呼ばれるIndicatorで似たようなことを調べたことがあります。おそらくビルトインIndicatorでも同様と思います。

1)IndicatorははじめてEAから呼ばれたときにInit()とstart()関数が呼ばれます。このときチャートがロードされていない場合、Indicator側がBars=-1で呼ばれることがありました。この場合Indicatorはなにも計算せずにリターンするしかありません。
ネット障害等で複数バーが一気にアップデートされるような時のはじめの呼び出し時にもBarsの値がおかしくなることがあります。

2)IndicatorはEAから呼ばれる毎にstart()が実行されます。逆にいうと呼ばれないと実行されません。呼び出し間があいたとしても、その間の4足値を読み込んで計算しますので、基本的には過去のバーの値と、最新値は保証されます。
ただし、途中のTickの値が必要な場合(Spreadの広がりの統計を取る等)はEAがTick毎に呼び出していないとだめです。

同じ通貨ペアなら同じTickでバーが更新されるのでシフトのずれの問題は無いようです。
注意しなければならないのは別の通貨ペアのIndicatorを呼び出すときで、このときは最新バーの更新時間が一致していないことがあり得ますので、iBarShiftの値がずれることがありました。
これで一時かなり悩んだことがありました。

Re: 他通貨を参照する時も同じ…

faiさん、コメント助かりました!
いわれてみれば、GetLastError()使えばよかったんですよね。
注文処理では使っているのに、、、頭が硬直化してました。。。orz

さらに実験してみましたがEAを実稼働させる場合、
案外というかかなりチェックすることが重要そうですね。

自分の現状では、他通貨ペアも見ながらの戦略を組み入れるところまで
ほど遠いので気がつきませんでしたが。。。(汗)
他通貨ペアの場合も注意しなければなりませんね。

Re: No title

きりりさん、はじめまして!
コメントありがとうございます。

1、2、さらに他通貨ペアでのインジケータ呼び出しの件に関して、
いわれてみるとそういうことがあるだろうなと納得です。
これらのことで、悩んでいる人は多いのでは?と思います。

私の場合、iCustom()関数の使用を避けているので使った経験がありません。
理由としては、他のいくつかのサイト等で重いといわれているからです。
仕組みを考えてみても、関数呼び出しのオーバーヘッドがでかいだろうと思うのです。
そのコストの割には複数本あるインジケータ・バッファのうち、
一つの値しか返せないからということもあります。

スプレッドの計測や自分なりの指標の計算はEAに直接書くかライブラリにして
それを呼び出すようにしています。

でも、最近ではライブラリからの呼び出しも遅いのでは?と思い始めています。。。
話がズレてしまいましたが、いずれiCustom()を使うときがくるような気もしますし、
使用されている方には貴重な情報だと思います。。。

☆当ブログとFX取引に関するご注意☆

もし、当ブログを閲覧、参考にしていただいた上で、FXまたはその他取引に関心を持たれた方は、以下の点にご注意して下さい。

・FX取引(外国為替証拠金取引)は元本や利益が保証された商品ではなく、市場環境の変化や相場の変動により損失が発生する場合があること。

・FXおよびその他取引をする場合は、各種のリスクを理解し、十分に検討し、かつ慎重に行う必要があること。

・当ブログで掲載、紹介している情報は、FXおよびその他取引、投資に関する勧誘、助言等ではないこと。

・当ブログで掲載、紹介している取引手法、ソース・プログラム等を用いた結果、いかなる損害が生じても当方は一切の責任を負わないこと。

投資、取引をされる場合は、必ずご自身の責任で行って下さい。
よろしくお願いいたします。
プロフィール

Dr.ヘパ


Author:Dr.ヘパ

カテゴリ&検索
最新記事
最新コメント
最新トラックバック
RSSリンクの表示
月別アーカイブ
カレンダー
08 | 2017/09 | 10
- - - - - 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
つぶやき
★DailyImpact(有償版)★
リアル口座で運用できる有償版
販売開始しました!

ご購入、お申し込み等の詳細については、下記リンク先のブログ右上にショッピング・カート「ブーボーのトレーディングキット工房」へのリンクがありますので、お手数ですがそちらをご参照下さい。

ブーボーの
トレーディングキット

Ⅰ.経済指標トレード向けEA、DailyImpactは、経済指標発表による突発的な値動きを捉えることで、利益を得ることを目指したセミオートEAです。

Ⅱ.経済指標トレードは、「指標トレード」「News Trading(ニューストレード)」とも呼ばれ、最近注目されている手法です。

Ⅲ.経済指標発表によるトレードは、いつ大きく動く可能性があるかわかっているので有利です。

Ⅳ.一方、瞬時に大きな値動きが発生するので、手動での仕掛け、手仕舞いは難しいことが多いです。

Ⅴ.高速に計算・発注可能なEAであるDailyImpactにより、手動よりも素早く、同時に多くの通貨ペアで、しかもその場にいなくても経済指標トレードができます。
★DailyImpact(DL版)★
ダウンロード版
期間限定で試用できます!!

ダウンロード、使用方法の詳細は
以下のブログを参照して下さい。



DailyImpact(ダウンロード版):ブーボーのトレーディングキット

   ☆ブーボーの
トレーディングキット

↓↓↓アンケートにご協力お願いします。↓↓↓
ブログ・ランキング
リンク&ブロとも申請
アクセス・カウンタ
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。