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. А будет тестер выдавать первые разы короче хрень.
Я не вижу ошибки в коде - вот как бы в чем дело. Часть кода из статей, часть свой.
Хочеться конечно найти причину и доверять тестеру с первого раза - особенно это касается оптимизации.
Статья о традиционных и не совсем традиционных алгоритмах усреднения, упакованных в максимально простые и достаточно однотипные классы. Они задумывались для универсального использования в практических разработках индикаторов. Надеюсь, что предложенные классы в определенных ситуациях могут оказаться достаточно актуальной альтернативой громоздким, в некотором смысле, вызовам пользовательских и технических индикаторов.
このようなニュアンスを考慮したiCustom()の正しい使い方へのリンクはないのでしょうか?だって、チェックしてどこが悪いか探すのに疲れちゃうんだもん。
MQL5のIndicator by Indicatorの 記事をご覧ください。
インジケーターバッファの初期化は必要ですか?
MQL5の配列は、デフォルトでいかなる値でも初期化されません。これは、SetIndexBuffer()を使用してインジケータ・バッファに割り当てられた配列にも確実に当てはまります。配列がインジケータバッファの場合、そのサイズは OnCalculate()ハンドラのrates_total パラメータに依存する。
例えばOnCalculate()の最初に一度、ArrayInitialize() 関数を使ってすべてのインジケータ・バッファを空のEMPTY_VALUE値で初期化したくなることがあるかもしれません。
...
親愛なるRosh - 私はこの記事を読みましたが、私はOnCalculateコールの2番目のフォームを使用しているため、それを適用することができませんでした。
理由は本当に、インジケーターバッファにゴミが入っているからです。なぜなら、テスターでは、新しいデータが現れると、インジケーターのバッファは自動的に大きくなり、最初は本当にゴミを含んでいるからです。
私のEAはタイマーで動いています。なぜかOnTick()よりもずっと速いんです。週末にテストできますしね。
各インジケーターのバッファに 何が入っているかを調べようとしています。複雑なのは、ある指標がその値に基づいて別の指標を呼び出すことです。
クリア期間の選択とバッファの大きさを設定してみる。テスターで誤検出の原因を究明します。え~テスターにデバッガがないのは残念ですね~みんな待ってましたよ。
タイマーで動くEAがあるのですが、なぜかOnTick()よりもずっと速いんです。土日もテストできます。
MetaTrader 5の 記事テスターの基本が あり、そこに表示されています。
タイマーのパラメータ(タイマーイベント期間)の値を変えてテスト時間を測定しました。得られたデータに対して、試験時間TのPeriodicity値への依存性を示すグラフをプロットした。
EventSetTimer(timer)関数によるタイマ初期化時のタイマパラメータが小さいほど、OnTimer()ハンドラの呼び出し間隔が短く、同一条件でのテスト時間Tが長くなることがわかる。iCustom()で本当にゴミが出るようなら、間違いなく初期化に問題がある。
バッファの初期値はEmpty_Value ではなく 0 です。 新しいバーが表示されたら、対応するバッファのセルを 0 にすることを忘れないでください。
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関数の 最初に、配列の初期化を追加します。
初期化がうまくいかないことがあるからです。
第二に、メイン計算サイクルの一番最初に、配列のゼロ要素の初期化を追加します(チャートに新しいバーが追加されると、インジケータ配列が自動的に増加し、これらの新しい要素は、prev_calculated>0という理由で明示的にも、暗黙的にも、いかなる方法によっても初期化されません)。
また、CustomOptimisation.mqhのTBalanceSlopeCriterionクラスにデストラクタを追加する必要があります(結果には影響しませんが、テスト時にメモリリークを引き起こします)。
私もテスターで奇跡を起こしました。
ある名前のEAをテストする:テスターはオブジェクトを描画する
...EAを別の名前で保存してコンパイルしてみた::no objects
しかし、端末を別のドライブに移動してしまったことに気がつきました