푸리에 변환을 사용하여 미래 예측 - 페이지 5

 

다음은 일주일이 조금 넘는 기간 동안 두드러진 빈도입니다(일 단위로 표시).

4.58(거의 일주일)

2.58(반주)

1.63 (가장 강력함, 중간 그래프에서 볼 수 있음)

1.04(1일)

0.52(오늘의 첫 번째 고조파)

0.26(2차 고조파)


1.63일(주의 세 번째 고조파)이라는 기간이 발생하게 된 원인이 무엇인지 추측해 보셨습니까?

 

다음은 첫 번째 예측입니다.


계획한 많은 부분이 이루어지지 않음

ANG3110 , 당신의 내일은 어떻게 될까요?

 
m_keeper :

다음은 첫 번째 예측입니다.


계획한 많은 부분이 이루어지지 않음

ANG3110 , 당신의 내일은 어떻게 될까요?

특별한 예측은 하지 않았습니다. 도면만 드릴 수 있습니다.

그리고 그래프에 표시한 것을 더 자세히 기술하십시오.


 
누군가가 mq4에 비고속 푸리에 변환을 가지고 있습니까? C 또는 Pascal로 구현할 수도 있습니다.
 
vaa20003 :
누군가가 mq4에 비고속 푸리에 변환을 가지고 있습니까? C 또는 Pascal로 구현할 수도 있습니다.

두 번째 페이지 참조

 
m_keeper :
vaa20003 :
누군가가 mq4에 비고속 푸리에 변환을 가지고 있습니까? C 또는 Pascal로 구현할 수도 있습니다.

두 번째 페이지 참조

고마워, 놓쳤어...

 

글쎄, 여기까지 일어난 일이다.

시장의 주요 주파수를 검색하고 진폭과 위상을 결정하고 추세를 결정하고 전체를 합산하여 정규화합니다.

이제 나는 주기도에서 로컬 최대값 검색이 구현되는 방식이 정말 마음에 들지 않습니다. 검색은 조화 분포에 따라 수행됩니다.

그리고 그들은 거기에서 냄새를 맡지 않습니다. 물론 매개 변수를 가지고 놀면서 선택할 수 있지만 여전히 불안정하고 종종 완전히 미시적입니다.

최대가 강조 표시됩니다.

두 번째 단점은 모든 것이 하나의 창에 표시된다는 것입니다. 이 모든 즐거움을 기본 창에서 여러 그래프로 분할해야 합니다.

및 2-3개의 추가 창.


모든 계산이 한 곳에서 수행되고 나머지는 모두 결과(지표, 전문가)에 액세스할 수 있는지 확인하는 방법을 누가 압니까?

시장 변동의 적절한 빈도를 선택하는 것은 여전히 수동으로 이루어져야 합니다. ANG3110 과 같이 마우스나 선으로 고음을 선택하는 것이 매우 편리할 것입니다.


ANG3110 , 라인으로 작업을 어떻게 구현하셨나요? 스크립트를 통해?



방금 게시한 내용으로 무엇을 해야 하는지에 대한 몇 마디.

길이=560;// 창 크기를 막대로 설정합니다.
Period_count=2;// 각각 고려할 기간 수는 시장에서 본 것보다 길이가 Period_count 배 커야 합니다.
Harmonic=9;// 이 매개변수와 다음 매개변수는 끔찍한 적합의 불명예에 대한 방법에 의해 결정됩니다(이에 대해 더 자세히 쓸 것입니다)
고조파 제어=1.7;

iMAperiod=4;//피팅이 도움이 되지 않으면 차트를 약간 부드럽게 해보십시오.

Futur=100;// 예측할 막대 수
InPast=200;// 기존 데이터를 기반으로 예측을 평가하기 위해 과거 막대에 대한 작업

실제로 지표에서 무엇을 볼 수 있습니까 (그런데 오늘의 예측)

모든 그래프는 0에서 길이(음, +/- 5%) 범위에 있어야 합니다.

범위가 다르면 버그일 뿐입니다. 새로 고침을 클릭하면 모든 것이 통과됩니다(버그가 어디에 있는지 알 수 없습니다)

얇은 분홍색 차트는 준비된 시계열이며 코스처럼 보일 것입니다.

두꺼운 주황색 - 주기도, 주기 값은 파란색 선의 해당 값과 같습니다.

파란색 선을 지지하는 빨간색 막대의 위치와 개수는 Harmonic과 HarmonicControl에 의해 결정됩니다.

주기도를 지원하는 녹색 열 - 감지된 기간은 빨간색 선에 크게 의존하여 눈으로 가장 중요한 기간을 강조 표시하므로 결과가 달성될 때까지 고조파 조정을 시작해야 합니다.

가는 녹색 곡선은 phasogram입니다. 주파수가 안정되면 phasogram이 매끄럽고 변동하면 이 주파수의 진동이 최근에 교란되어 신뢰할 수 없는 것 같습니다. (0은 -pi/2에 해당 ; 길이 --- 3*pi/2)


글쎄, 사실 가장 중요한 것은 두꺼운 분홍색 선입니다. 이것은 예측입니다. 예측은 높이가 원래 그래프와 일치하고 먼 과거를 반복할 필요가 없습니다. 여기서 가장 중요한 것은 전환점과 가능한 강도(예상 회전 시간이 일치하지 않을 수 있음)입니다.


 
m_keeper :

시장 변동의 적절한 빈도를 선택하는 것은 여전히 수동으로 이루어져야 합니다. ANG3110 과 같이 마우스나 선으로 고음을 선택하는 것이 매우 편리할 것입니다.


ANG3110 , 라인으로 작업을 어떻게 구현하셨나요? 스크립트를 통해?

귀하의 경우 다음이 최선의 선택이라고 생각합니다.

지표를 제어하는 스크립트를 만듭니다.


 //==============================================================
#import " user32.dll "
int        PostMessageA ( int hWnd , int Msg , int wParam , int lParam ) ;
#import
#define WM_COMMAND    0x0111
//==============================================================
int i0 , ip , T ;
int t0 , tp , t0n , tpn ;
string Symb ;
int Per ;
//**************************************************************
int init () 
{ 
   Symb = Symbol () ;
   Per = Period () ;
   
   t0 = WindowTimeOnDropped () ;
   T = 64 ; 

   i0 = iBarShift ( Symbol () , Period () , t0 ) ;
   ip = i0 + T ;
   tp = Time [ ip ] ;
   t0n = t0 ;
   tpn = tp ;
   
   ObjectCreate ( " RCh " , 4 , 0 , tp , 0 , t0 , 0 ) ;
   ObjectSet ( " RCh " , OBJPROP_COLOR , DodgerBlue ) ; 
}
//**************************************************************
int start () 
{
   int hwnd = WindowHandle ( Symb , Per ) ;        
   if ( hwnd != 0 ) 
   {
       PostMessageA ( hwnd , WM_COMMAND , 33324 , 0 ) ; 
       GlobalVariableSet ( " gi0 " , i0 ) ;
       GlobalVariableSet ( " gip " , ip ) ;
   } else return ( 0 ) ;
   //---- 
   while ( IsStopped () == false ) 
   {
      t0 = ObjectGet ( " RCh " , OBJPROP_TIME2 ) ; 
       if ( t0 > Time [ 0 ]) t0 = Time [ 0 ] ; 
       tp = ObjectGet ( " RCh " , OBJPROP_TIME1 ) ; 
       i0 = iBarShift ( NULL , Per , t0 ) ;
       ip = iBarShift ( NULL , Per , tp ) ;
      
       T = ip - i0 ;
       if ( T < 2 ) { T = 2 ; ip = i0 + T ; tp = Time [ ip ] ; }
      
       if ( t0n != t0 || tpn != tp ) 
       {
         GlobalVariableSet ( " gi0 " , i0 ) ;
         GlobalVariableSet ( " gip " , ip ) ;
         PostMessageA ( hwnd , WM_COMMAND , 33324 , 0 ) ;
         t0n = t0 ;
         tpn = tp ;
       } 
      
       Sleep ( 200 ) ;
   }
   //=============================================
   return ( 0 ) ;
}
//**************************************************************
void deinit () 
{
   ObjectDelete ( " RCh " ) ; 
   GlobalVariableDel ( " gi0 " ) ;
   GlobalVariableDel ( " gip " ) ;
}
//**************************************************************

그리고 표시기에서 int start() 다음에 다음을 삽입합니다.

   if ( GlobalVariableCheck ( " gi0 " )) 
   {
       i0 = GlobalVariableGet ( " gi0 " ) ; 
       ip = GlobalVariableGet ( " gip " ) ;
       T = ip - i0 ;
       SetIndexShift ( 2 , T / 2 ) ;
       SetIndexShift ( 3 , T / 2 ) ;
   }
   else 
   {
       i0 = 0 ; T = T0 ; SetIndexShift ( 2 , T / 2 ) ; SetIndexShift ( 3 , T / 2 ) ;
   }


먼저 차트에 표시기를 넣은 다음 스크립트를 버리고 LR 채널로 차트를 이동합니다.

여분의 줄을 없애고 스스로 할 수 있기를 바랍니다. 또는 제안 할 수 있다면.

 

덕분에 라인을 알았습니다.


질문 하나 더 해도 될까요

나는 이제 3개의 차트에 정보를 퍼뜨렸습니다. 하나는 메인 창에, 다른 하나는 내 차트에 있습니다.

매개변수는 하나만 설정되고 전역 변수에 저장됩니다.

키 "PF_"+Symbol()+"_"+ DoubleToStr (Period(),0)+"_key" 포함

또한 전역 변수에 최대값에 대한 정보를 저장합니다.

문제는 각 그래프에 대해 계산을 세 번 수행해야 한다는 것입니다.

처음에는 아이커스텀으로 해봤는데 제 생각에는 사용하다보면 안걸리더라구요

이전에 추가한 차트의 데이터를 다시 계산하지만 최소한 초기화

다시 작동하고 이미 실행 중임을 확인합니다(전역 변수에 의해)

계산을 수행하지 않으며 iCustom은 비어 있음을 반환합니다.

배열을 전역으로 만드는 방법이 있습니까?

GlobalVariable에 수천 개의 값이 채워지면 훨씬 많을 것 같습니다.

더 느리게 작동하면 문자열에 검색이 있습니다.

 
m_keeper :

배열을 전역으로 만드는 방법이 있습니까?

무엇이 필요한지 잘 이해하지 못했지만 많은 데이터를 저장한 다음 다시 읽어야 할 때 중간 파일 항목을 사용하는 것이 더 쉽습니다. 예를 들면 다음과 같습니다.

int 핸들= FileOpen ("Test.dat",FILE_BIN|FILE_WRITE);

FileWriteArray(핸들, arr, 0, Narr);

그런 다음 다른 프로그램에서 다시 계산합니다.

int handle=FileOpen("테스트.dat",FILE_BIN|FILE_READ);

FileReadArray(핸들,arr,0,narr);

자세한 내용은 도움말 MT4를 참조하십시오.