EA를 생성하는 동안 이동 평균 문제를 연결했습니다.. - 페이지 3

 
angreeee :
2009년부터 현재 날짜(2014년 4월 4일)에 실행해도 차트의 MA와 백테스트의 ima의 차이가 여전히 0.10이라는 것을 다시 알아차렸으므로 문제가 지속되는 것 같습니다. 다른 모든 것이 실패하면 나는 내 iMa 교체 기능을 수행할 것입니다. icustom은 2009년에 시작하여 H4 차트에서 제대로 작동하는 경우에도 D1 차트에서 여전히 0만 반환합니다.
이전에 SMMA 모드에 문제가 있음을 확인했는데 이미 서비스 데스크에 보고한 것 같습니까? 다른 모드는 괜찮은 것 같습니다.
 

사용자 정의 이동 평균 표시기가 어떻게 작동하는지 분석하면서 왜 그런 문제가 있는지 이해합니다.

모든 이동 평균은 방정식에 필요한(이 경우 370) 프레임을 계산하는 대신 이전 이동 평균 프레임에서 이동 평균의 다음 프레임을 계산하는 단순하지 않은 방식으로 계산됩니다. 그렇게 하면 MA의 1 프레임이 올바르지 않으면 뒤따르는 모든 프레임도 올바르지 않습니다. 오류 프레임에서 멀어질수록 오류가 작아집니다. 처음부터 모든 프레임이 제대로 계산되면 제대로 작동할 수도 있지만 시작 시 iMA가 0을 보고하는 경우가 있습니다(나는 잘못된 ma 판독값을 폐기하는 절차가 있지만 iMA 자체는 그렇지 않음). iMA의 이전 프레임에서 iMA의 다음 프레임을 계산할 때.
그렇기 때문에 2013년에 백 테스트를 시작했을 때 차이가 가장 컸고, 2012년에는 2013년에 시작할 때보다 더 작았고, start=2011은 훨씬 더 작아졌습니다. 2009년부터 백테스트를 시작했는데도 그 차이가 눈에 띄어서 심각한 문제입니다.

 
angevoyageur :
이전에 SMMA 모드에 문제가 있음을 확인했는데 이미 서비스 데스크에 보고한 것 같습니까? 다른 모드는 괜찮은 것 같습니다.

나는 완전히 문서화하고 문제를 이해할 수 있도록 내 자신의 iMA 교체 절차 작성을 마쳤습니다. (이 스레드에서 수행한 것과 같이 시각적 비교를 통해서가 아닙니다).

ima, my ima 교체 및 사용자 정의 이동 평균 결과는 비교를 위해 로그에서 사용할 수 있습니다.

추신. 오류를 확인하면 지금 보고하겠습니다. (문제가 보고되면 이 스레드에 새 의견을 추가하겠습니다.) 사이트(또는 내 인터넷)는 현재 매우 느리게 작동하므로 서비스 데스크 페이지에 액세스하는 데 문제가 있습니다.
 
확인 보고되었습니다.
 

다른 MA 유형도 영향을 받는다고 생각했지만 더 많은 테스트를 수행했으며 말씀하신 것처럼 SSMA만 영향을 받는 것 같습니다.

하지만 iCustom 문제를 발견했습니다. SSMA 및 iCustom 문제를 테스트하는 스크립트:

#property version      "1.1"
#property description "MA TEST"

#include <Trade/Trade.mqh>

   #define MAGICMA   20131002

double Bid;
double Ask;

   int ma_temp;
   int custom_ma_temp;
   double ma_buffer[ 20 ];
   double ima2_buffer[ 510 ];
   double ima2[ 510 ];

input int ma_period = 370 ;
input ENUM_TIMEFRAMES ma_tf = PERIOD_D1 ;
input ENUM_MA_METHOD ma_method = MODE_SMMA ;
input ENUM_APPLIED_PRICE ma_price = PRICE_OPEN ;
   
   
   
double OnTester ()
{
     double custommax = TesterStatistics ( STAT_EQUITY_DDREL_PERCENT );
     return (custommax);
}
   CTrade  trade;
   
   void OnTick ()
  {
   MqlTick last_tick;
   if ( SymbolInfoTick ( Symbol (),last_tick))
     {
      Bid = last_tick.bid;
      Ask = last_tick.ask;
     }
   start();
  }
  
int OnInit ()
  {
   trade.SetExpertMagicNumber(MAGICMA);
   int deviation= 99 ;
   trade.SetDeviationInPoints(deviation);
   trade.SetAsyncMode( false );

   return ( 0 );
  }  
  
      
      
      
void trend1()
{

   double ma;

   ma_temp= iMA ( Symbol (),ma_tf,ma_period, 0 ,ma_method,ma_price);
   CopyBuffer (ma_temp, 0 , 0 , 1 ,ma_buffer);
   ma=ma_buffer[ 0 ];
   Alert ( "ma=" , ma);

   custom_ma_temp= iCustom ( Symbol (),ma_tf, "Examples\\Custom Moving Average" , ma_period, 0 , ma_method,ma_price);
   CopyBuffer (custom_ma_temp, 0 , 0 , 1 ,ma_buffer);
   ma=ma_buffer[ 0 ];  
   Alert ( "custom ma=" , ma);

}

      


void start()
{
         trend1();
}
파일:
 
angreeee :

사용자 정의 이동 평균 표시기가 어떻게 작동하는지 분석하면서 왜 그런 문제가 있는지 이해합니다.

모든 이동 평균은 방정식에 필요한(이 경우 370) 프레임을 계산하는 대신 이전 이동 평균 프레임에서 이동 평균의 다음 프레임을 계산하는 단순하지 않은 방식으로 계산됩니다. 그렇게 하면 MA의 1 프레임이 올바르지 않으면 뒤따르는 모든 프레임도 올바르지 않습니다. 오류 프레임에서 멀어질수록 오류가 작아집니다. 처음부터 모든 프레임이 제대로 계산되면 제대로 작동할 수도 있지만 시작 시 iMA가 0을 보고하는 경우가 있습니다(나는 잘못된 ma 판독값을 폐기하는 절차가 있지만 iMA 자체는 그렇지 않음). iMA의 이전 프레임에서 iMA의 다음 프레임을 계산할 때.
그렇기 때문에 2013년에 백 테스트를 시작했을 때 차이가 가장 컸고, 2012년에는 2013년에 시작할 때보다 더 작았고, start=2011은 훨씬 더 작아졌습니다. 2009년부터 백테스트를 시작했는데도 그 차이가 눈에 띄어서 심각한 문제입니다.

문제가 보이지 않습니다. iMA는 성능에 대해 잘 코딩되어 있습니다. iMA가 0을 보고하면 데이터(또는 충분한 데이터)가 없기 때문입니다. 그건 그렇고 SMMA에만 문제가 있습니다. 이유는 모르겠지만 다른 모드에서 잘 작동하기 때문에 이 "증분" 구현 때문일 수 없습니다.
 
angevoyageur :
I don't see the problem. iMA is well coded for performance. If an iMA report a 0 it's because you don't have data (or enough data). By the way there is only a problem with SMMA, I don't know why, but it cannot be due to this "incremental" implementation as it's working well for other mode.

예, 훨씬 느릴 것입니다. 그러나 사실은 이러한 계산 방식에 처음에 빈 프레임(0)을 더하면 이와 같은 문제가 발생한다는 것입니다. (그래서 iMA SSMA는 실제 SSMA보다 크지 않고 항상 더 작습니다.) 필요한 정보 부족을 적절하게 처리하는 대신 시작 시 0을 얻는 이유를 iMA가 반환하는 내용을 확인하지 않는다는 것을 알고 있습니다. 하지만 그건 다른 문제입니다.

더 작은 TF를 사용하면 훨씬 더 많은 프레임이 분석되고 문제는 시간이 지남에 따라 희석될 수 있습니다. 새 프레임마다 ima SSMA가 실제 SSMA에 점점 더 가까워지므로 막대가 많을수록 문제가 덜 눈에 띄기 때문에 이전에는 아무도 눈치채지 못했다고 생각합니다. 370 SSMA 및 PERIOD_12H PERIOD_8H 등에서 발견한 것과 동일한 문제입니다.

시간이 되시면 iCustom 기능을 살펴보십시오. 쉽게 테스트해볼 수 있도록 소스코드를 첨부 했습니다. PERIOD_D1 - iCustom이 제대로 작동하고 iMA와 동일한 값을 반환하는 하위 TF를 확인합니다. PERIOD_D1에서 iCustom의 경우 항상 0이지만 iMA는 여전히 일부 값을 보고합니다.

흥미로운 점은 최대 PERIOD_H12에서 SSMA를 사용할 때 iMA와 iCustom "맞춤 이동 평균" 표시기가 잘못된 값을 보고한다는 것입니다. (차이를 확인하기 위해 2014.01부터 테스트)

오류는 여기 어딘가에 있어야 합니다: (맞춤 이동 평균 양식)

 void CalculateSmoothedMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 )
     {
      limit=InpMAPeriod+begin;
       //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for (i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit;i<rates_total && ! IsStopped ();i++)
      ExtLineBuffer[i]=(ExtLineBuffer[i- 1 ]*(InpMAPeriod- 1 )+price[i])/InpMAPeriod;
//---
  }


firstValue는 SMA 절차와 동일하게 계산됩니다.

 void CalculateSimpleMA( int rates_total, int prev_calculated, int begin, const double &price[])
  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 ) // first calculation
     {
      limit=InpMAPeriod+begin;
       //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;
       //--- calculate first visible value
       double firstValue= 0 ;
       for (i=begin;i<limit;i++)
         firstValue+=price[i];
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;
     }
   else limit=prev_calculated- 1 ;
//--- main loop
   for (i=limit;i<rates_total && ! IsStopped ();i++)
      ExtLineBuffer[i]=ExtLineBuffer[i- 1 ]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

첫 번째 값 = (x1 + x2 + x3 + ... + xn) / n

단순 이동 평균의 "조잡한" 방정식이지만 평활 이동 평균은 아닙니다.

아마도 그것이 문제의 이유입니까?

 

해당 사이트에서:

https://mahifx.com/indicators/smoothed-moving-average-smma

평활 이동 평균의 첫 번째 값은 단순 이동 평균(SMA)으로 계산됩니다.

SUM1=SUM(닫기, N)

SMMA1 = SUM1/N

두 번째 및 후속 이동 평균은 다음 공식에 따라 계산됩니다.

SMMA(i) = (SUM1 – SMMA1+CLOSE(i))/ N

어디에:

SUM1 – N 기간의 종가 합계입니다.
SMMA1 – 첫 번째 막대의 평활 이동 평균입니다.
SMMA(i) – 현재 막대의 평활 이동 평균입니다(첫 번째 막대 제외).
CLOSE (i) – 현재 종가입니다.
N - 평활 기간입니다.

그래서 iMa와 맞춤 이동 평균이 올바른 방식으로 작동한다고 생각합니다. 그러나 이와 같은 계산은 우리가 경험한 것과 같은 오류를 생성하여 테스트 기간에 따라 큰 차이가 발생합니다. 이동 평균을 기반으로 거래를 하는 EA에게는 완전히 용납될 수 없습니다. 백테스팅하는 동안 잘못된 결과를 생성하므로 그런 이유로 Smooth MA를 EA에서 제거해야 할 것 같습니다. 2000년부터 테스트해서 맞더라도 고객은 2013년부터 테스트하고 "계정이 지워진다"고 말할 수 있습니다. 왜냐하면 그들은 나보다 다른 SSMA를 얻을 것이기 때문입니다.

또 하나의 인용문:
SMMA는 최근 가격에 역사적 가격과 동일한 가중치를 부여합니다. 계산은 고정된 기간을 참조하는 대신 사용 가능한 모든 데이터 시리즈를 고려합니다.

이것이 백 테스트 기간이 변경될 때마다 달라지는 이유입니다.

Indicators
Indicators
  • mahifx.com
Moving averages are commonly used to identify trends and reversals as well as identifying support and resistance levels. Moving averages such the WMA and EMA, which are more sensitive to recent prices (experience less lag with price) will turn before an SMA. They are therefore more suitable for dynamic trades, which are reactive to short term...
 
angreeee :

견적서 안에 답장하지 마세요. 보시다시피, 내가 당신을 인용하고 싶을 때 그것은 지금 비어 있습니다.

알고리즘은 SMMA에 적합합니다. 어딘가에서 시작해야 합니다. 그러나 SMMA는 이전 값을 기반으로 하므로 시작 조건에 민감하므로 문제의 원인을 지적합니다. 라이브 차트와 다른 값을 설명하는 전략 테스터 에 동일한 시작 촛불이 없기 때문입니다.

두 번째 확인(D1에서) 후 EMA의 경우에도 마찬가지입니다. 이제 SMMA의 경우에도 다른 값을 갖게 되었습니다.

 
angreeee :

해당 사이트에서:

https://mahifx.com/indicators/smoothed-moving-average-smma

평활 이동 평균의 첫 번째 값은 단순 이동 평균(SMA)으로 계산됩니다.

SUM1=SUM(닫기, N)

SMMA1 = SUM1/N

두 번째 및 후속 이동 평균은 다음 공식에 따라 계산됩니다.

SMMA(i) = (SUM1 – SMMA1+CLOSE(i))/ N

어디에:

SUM1 – N 기간의 종가 합계입니다.
SMMA1 – 첫 번째 막대의 평활 이동 평균입니다.
SMMA(i) – 현재 막대의 평활 이동 평균입니다(첫 번째 막대 제외).
CLOSE (i) – 현재 종가입니다.
N - 평활 기간입니다.

그래서 iMa와 맞춤 이동 평균이 올바른 방식으로 작동한다고 생각합니다. 그러나 이와 같은 계산은 우리가 경험한 것과 같은 오류를 생성하여 테스트 기간에 따라 큰 차이가 발생합니다. 이동 평균을 기반으로 거래를 하는 EA에게는 완전히 용납될 수 없습니다. 백테스팅하는 동안 잘못된 결과를 생성하므로 그런 이유로 Smooth MA를 EA에서 제거해야 할 것 같습니다. 2000년부터 테스트해서 맞더라도 고객은 2013년부터 테스트하고 "계정이 지워진다"고 말할 수 있습니다. 왜냐하면 그들은 나보다 다른 SSMA를 얻을 것이기 때문입니다.

링크 주셔서 감사합니다. 그것은 내 이전 게시물을 확인합니다. 나는 그런 것들에 전혀 관심을 두지 않기 때문에 매우 흥미 롭습니다.

EMA의 알고리즘을 확인하면 그러한 문제에도 민감합니다. 첫 번째 테스트에서 동일한 값을 얻은 이유를 모르겠습니다.