自動更新されない!_MTF SR.mq4の修正。。


↑MetaTrader5 で Optimization を試した図。テストに使えるEAがここにあります。コア16個あるCPU をフルに使って並列処理ができるので良い感じです..。MT4ではコア1個しか活用できなかったのですが、これだけ効率よく最適化できるなら、いろいろ検討の余地があるかなぁと思ってます。
(MT4は信頼できないとして導入を断念したらしいDukascopy辺りがMT5 を採用してくれたら嬉しいけど…無理なんでしょうねぇ..。

自動更新されない!_MTF SR.mq4の修正。。


本題です。

新とまと 2010/04/28 11:35
はじめまして
JPN_Time_SubZeroやMTF_MAのCrossAlertの作りこみの丁寧さは、まさに匠の技と感動しております。
私のお願いは、!_MTF_SR.mq4の改良でございます。なぜか自動更新されないため、手動で行っています。
私も家宝にしたいものですから、何卒宜しくお願い致します。

(本当はどっちも手抜きしてます...orz すみません。。


以前に再初期化でカタチが変わってしまうインジケータへの応急処置。で説明しましたが、

int counted_bars=IndicatorCounted();

こんな一行を

int counted_bars=0;

と修正すれば、最低限の自動更新は実現できます。しかし、この方法では全ての Bar が更新されるので若干非効率です。なので、もう少し効率の良い更新方法を行います。


正攻法で対応する場合は、まず、何本前のデータまで更新すれば良いのか?をよく考えます。このインジケータは、MTFタイプなので、最長の時間足の影響が及ぶ範囲を更新する必要があります。
例えば、1分足のチャートに 5分足MTFインジケータを動かしていたら、そのインジケータは、最低でも5本(=5分足1本相当)のデータを更新する必要があるイメージです。(昨日の日記の画像を参考にどうぞ。)


!_MTF_SR.mq4 の場合、iFractals() 関数を使っているので、それだけでは足りません。
iFractals()は、Fractals.mq4 をみると、過去3本前のデータを更新しているので、3倍多いデータを更新しなくてはいけないことが分かります。結局、1分足のチャートに 5分足MTF-Fractalsを動かしたら、5本x3倍 = 15本のデータを更新する必要があるのです。



コードは、以下の部分に

int counted_bars=IndicatorCounted();
int i=0, y1d=0, y4h=0, y1h=0, y30m=0;
int limit=Bars-counted_bars;

下記のように2行追記すればOKです。

int counted_bars=IndicatorCounted();
int i=0, y1d=0, y4h=0, y1h=0, y30m=0;
int limit=Bars-counted_bars;
int MaxPeriod = MathMax(MathMax(MathMax(Period_1,Period_2),Period_3),Period_4);
limit = MathMax(MaxPeriod/Period()*3,limit);

MaxPeriodは、Period_1〜4 の中で最長の時間足を選択しています。
次の行は、更新範囲(limit) が、最長時間足の3倍より大きくなるようにしています。


MetaEditor でコピペしてコンパイルすれば動くはずなので頑張ってください><