テスターで奇跡を起こす。 - ページ 2

 
いろいろな方法を試してみた-そして
ArrayInitialize
и
Циклом 
// ===Если это первый запуск обнулим все буферы:)
if(prev_calculated <= 0)// проверка на первый старт расчёта индикатора
{
for(int i=0;i<=rates_total-1;i++)
{
eeee[i]=EMPTY_VALUE;
}
//Print("!!!Обнулили все буферные массивы!!!");
}

Запускаю первый тест - выдает фигню, второй раз - еще фигню, с третьего раза начинает выдавать правдивый результат уже постоянно.
Не могу понять в чем дело.

Тестировал сегодня с 13.02.12 - 25.02.12 - всего один сигнал на продажу и один сигнал на закрытие продажи.
Как и говорил - с третьего раза начинает постоянно выдавать уже правдивый результат - а до этого ерунду выдает.
А теперь представьте, что вы запускаете оптимизацию - я же не могу по три раза оптимизацию запускать, - короче я не знаю что делать.
Могу конечно код индюка вставить в советник - но вызывать его удобнее из другого индюка.
Кто еще что скажет.

Выкладываю исходники - они уже настроены. 
Запустите тест на ЕвроБакс с 13.02.12 - 25.02.12 - правильный результат -35.20. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.

ファイル:
MQL5.zip  269 kb
 
1CMaster:
このようなニュアンスを考慮したiCustom()の正しい使い方へのリンクはないのでしょうか?だって、チェックしてどこが悪いか探すのに疲れちゃうんだもん。

MQL5のIndicator by Indicatorの 記事をご覧ください。

インジケーターバッファの初期化は必要ですか?

MQL5の配列は、デフォルトでいかなる値でも初期化されません。これは、SetIndexBuffer()を使用してインジケータ・バッファに割り当てられた配列にも確実に当てはまります。配列がインジケータバッファの場合、そのサイズは OnCalculate()ハンドラのrates_total パラメータに依存する。

例えばOnCalculate()の最初に一度、ArrayInitialize() 関数を使ってすべてのインジケータ・バッファを空のEMPTY_VALUE値で初期化したくなることがあるかもしれません。

...

 

親愛なるRosh - 私はこの記事を読みましたが、私はOnCalculateコールの2番目のフォームを使用しているため、それを適用することができませんでした。

理由は本当に、インジケーターバッファにゴミが入っているからです。なぜなら、テスターでは、新しいデータが現れると、インジケーターのバッファは自動的に大きくなり、最初は本当にゴミを含んでいるからです。

私のEAはタイマーで動いています。なぜかOnTick()よりもずっと速いんです。週末にテストできますしね。

各インジケーターのバッファに 何が入っているかを調べようとしています。複雑なのは、ある指標がその値に基づいて別の指標を呼び出すことです。

クリア期間の選択とバッファの大きさを設定してみる。テスターで誤検出の原因を究明します。え~テスターにデバッガがないのは残念ですね~みんな待ってましたよ。

Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
Усреднение ценовых рядов без дополнительных буферов для промежуточных расчетов
  • 2010.10.25
  • Nikolay Kositsin
  • www.mql5.com
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
 
1CMaster:

タイマーで動くEAがあるのですが、なぜかOnTick()よりもずっと速いんです。土日もテストできます。

MetaTrader 5の 記事テスターの基本が あり、そこに表示されています。

タイマーのパラメータ(タイマーイベント期間)の値を変えてテスト時間を測定しました。得られたデータに対して、試験時間TのPeriodicity値への依存性を示すグラフをプロットした。


EventSetTimer(timer)関数によるタイマ初期化時のタイマパラメータが小さいほど、OnTimer()ハンドラの呼び出し間隔が短く、同一条件でのテスト時間Tが長くなることがわかる。
 
1CMaster:

iCustom()で本当にゴミが出るようなら、間違いなく初期化に問題がある。

バッファの初期値はEmpty_Value ではなく 0 です。 新しいバーが表示されたら、対応するバッファのセルを 0 にすることを忘れないでください。

 
MoneyJinn:

iCustom()で本当にゴミが出るようなら、間違いなく初期化に問題がある。

Empty_Valueの 代わりにバッファをゼロで初期化する。 新しいバーが表示されたら、対応するバッファのセルをゼロにすることを忘れないでください。

はい、そうです。どの指標でも、まず値をゼロにすることで、ゴミを取り除くようにしています。

for(i=first;i<rate_total-1 && !IsStopped();i++)

{
EnterBuffer[i]=0;
EditBuffer[i]=0;

ExitBuffer[i]=0;

....

}

今は分足チャートでテストしています。時間足チャートでは、全てが時計仕掛けのように動いています))))1分足チャートのEAについて、いくつか質問があります。

 

予想通り、初期化なし。FBインジケーターに

まず、OnCalculate関数の 最初に、配列の初期化を追加します。

   if(prev_calculated==0)
     {
      ArrayInitialize(SignalBuyBuffer,0);
      ArrayInitialize(SignalSellBuffer,0);
      ArrayInitialize(HighBuffer,0);
      ArrayInitialize(LowBuffer,0);
      ArrayInitialize(OpenBuffer,0);
      ArrayInitialize(CloseBuffer,0);
      ArrayInitialize(ColorBuffer,0);
      ArrayInitialize(TrendBuffer,0);
     }

初期化がうまくいかないことがあるからです。

第二に、メイン計算サイクルの一番最初に、配列のゼロ要素の初期化を追加します(チャートに新しいバーが追加されると、インジケータ配列が自動的に増加し、これらの新しい要素は、prev_calculated>0という理由で明示的にも、暗黙的にも、いかなる方法によっても初期化されません)。

//---- основной цикл расчета
   for(i=first; i<rates_total && !IsStopped(); i++)
     {     
       SignalBuyBuffer[i]=0;
        SignalSellBuffer[i]=0;
        HighBuffer[i]=0;
        LowBuffer[i]=0;
        OpenBuffer[i]=0;
        CloseBuffer[i]=0;
        ColorBuffer[i]=0;
        TrendBuffer[i]=0;

        if(i == 88366 )
        {
         Print(""+DoubleToString(maxHigh,5)+": "+DoubleToString(minLow,5));
        }

        maxHigh=high[iHighest(high,period,i-1)];
        minLow=low[iLowest(low,period,i-1)];        
        if(open[i-1] > close[i-1]) {

また、CustomOptimisation.mqhのTBalanceSlopeCriterionクラスにデストラクタを追加する必要があります(結果には影響しませんが、テスト時にメモリリークを引き起こします)。

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
皆さん、ありがとうございました。さらにテストする予定です。
 

私もテスターで奇跡を起こしました。

ある名前のEAをテストする:テスターはオブジェクトを描画する

...EAを別の名前で保存してコンパイルしてみた::no objects

しかし、端末を別のドライブに移動してしまったことに気がつきました

 
最適化とシングルパスの結果が一致しない(サービスデスク - #329165 + EA)。