테스터와 함께하는 기적. - 페이지 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의 표시기에서 표시기 기사를 참조하십시오.

표시기 버퍼를 초기화해야 합니까?

MQL5의 배열은 기본적으로 어떤 값으로도 초기화되지 않으며 이는 SetIndexBuffer() 함수에 의해 표시기 버퍼에 할당된 배열에 확실히 적용됩니다. 배열이 표시기 버퍼인 경우 작동 중 배열의 크기는 OnCalculate() 핸들러의 Rates_total 매개변수에 따라 달라집니다.

ArrayInitialize() 함수를 사용하여 빈 EMPTY_VALUE 값으로 모든 표시기 버퍼를 초기화하고 싶을 수 있습니다(예: OnCalculate() 시작 부분에서 한 번).

...

 

친애하는 Rosh - 이 기사를 읽었지만 가격뿐만 아니라 각 막대의 시간이 필요하기 때문에 OnCalculate 호출의 두 번째 형식을 사용하기 때문에 적용할 수 없었습니다.

그 이유는 실제로 표시 버퍼에 쓰레기가 나타나기 때문입니다. 그리고 빈 값으로 버퍼를 초기화하면 아무 것도 제공되지 않습니다. 테스터에서 새 데이터가 나타날 때 표시기 버퍼가 자동으로 커지고 처음에는 실제로 가비지가 있고 표시기의 버퍼가 각각 채워지지 않은 경우 바, 그러면 쓰레기가 거기에 남아 있습니다.

내 고문은 타이머로 작업합니다. 어떤 이유로 OnTick() 함수보다 훨씬 빠릅니다. 예, 주말에 테스트할 수 있습니다.

이제 각 표시기 버퍼 에 무엇이 있는지 알아보려고 합니다. 어려움은 한 지표로 인해 다른 지표가 해당 값을 기반으로 계산된다는 사실에 있습니다.

나는 명확한 기간을 강조하고 버퍼의 크기를 설정하려고 노력할 것입니다. 테스터의 오탐의 원인을 판별하겠습니다. 어 - 테스터에 디버거가 없다는 것이 유감입니다. 그렇지 않으면 모두가 그것을 기다리고 기다리고 있습니다.

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

내 고문은 타이머로 작업합니다. 어떤 이유로 OnTick() 함수보다 훨씬 빠릅니다. 예, 주말에 테스트할 수 있습니다.

다음을 보여주는 MetaTrader 5의 기본 테스트 기사가 있습니다.

테스트 시간의 측정은 타이머 매개변수(타이머 이벤트의 주기성)의 다양한 값에 대해 이루어졌습니다. 얻은 데이터를 기반으로 기간 값에 대한 테스트 시간 T의 의존성 그래프를 구성했습니다.


EventSetTimer 함수(timer)에 의해 타이머가 초기화될 때 timer 매개변수가 작을수록 OnTimer() 핸들러에 대한 호출 사이의 기간(Period)은 더 짧고 동일한 다른 핸들러에서 테스트 시간 T는 더 길다는 것을 분명히 알 수 있습니다. 정황.
 
1CMaster :

iCustom()에 실제 쓰레기가 나타나면 문제는 확실히 초기화에 있습니다.

Empty_Value가 아닌 0으로 버퍼를 초기화합니다. 새로운 막대가 나타날 때마다 해당 버퍼 셀을 재설정하는 것을 잊지 마십시오.

 
MoneyJinn :

iCustom()에 실제 쓰레기가 나타나면 문제는 확실히 초기화에 있습니다.

Empty_Value가 아닌 0으로 버퍼를 초기화합니다. 새로운 막대가 나타날 때마다 해당 버퍼 셀을 재설정하는 것을 잊지 마십시오.

네, 그랬습니다. 각 표시기에서 나는 항상 값을 먼저 0으로 재설정합니다. 쓰레기를 제거하는 데 도움이되었습니다.

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

{
EnterBuffer[i]=0;
편집버퍼[i]=0;

ExitBuffer[i]=0;

....

}

이제 분 차트를 확인하고 있습니다. 시계에는 모든 것이 이미 시계처럼 작동합니다.)) 그리고 분당에는 고문의 작업에 대해 여전히 질문이 있습니다.

 

예상대로 - 초기화가 부족합니다. 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 );
     }

가지고 있는 초기화가 항상 작동하는 것은 아니기 때문에

둘째, 메인 계산 주기에서 맨 처음에 배열의 요소가 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 ]) {

또한 TBalanceSlopeCriterion 클래스의 CustomOptimization.mqh에 소멸자를 추가해야 합니다(결과에는 영향을 미치지 않지만 테스트 중 메모리 누수가 발생함).

                    ~TBalanceSlopeCriterion() { delete(balance_Ptr); }
 
감사합니다. 더 테스트하겠습니다.
 

나도 테스터와 함께 기적을 일으켰다.

같은 이름으로 Expert Advisor 테스트: 테스터가 개체를 그립니다.

...EA를 다른 이름으로 저장하고 컴파일했습니다::객체를 볼 수 없습니다

하지만 터미널을 다른 디스크로 옮겼습니다.

 
최적화 중 패스 결과와 싱글 패스 결과가 일치하지 않습니다. (서비스 데스크 - #329165 + 같은 자리에 있는 어드바이저)