이런 짓을 했는데...

 

어느 날 갑자기 간단한 사실을 깨달았습니다. 최소 제곱 근사는 본질적으로 벡터의 선형 조합을 최소화하는 것으로 요약됩니다. 즉, 어떤 보편적인 함수 근사기를 생성하는 것이 가능합니다. 다음은 함수 헤더입니다.

 //+------------------------------------------------------------------+
//  Аппроксимация методом наименьших квадратов                       |
//+------------------------------------------------------------------+
bool LSA( double & V[], int M, int N, double & A[], double & C[]) {
// Имеется N векторов размером M
// и вектор их линейной комбинации Y размером естестственно тоже M.
// На вход функции они подаются в виде матрицы V[0..M-1][0..N],
// где Y размещён в столбце N 
// На выходе мы должны получить вектор коэффициентов C размером M.
// Нам нужна также матрица A[N][N+1] для размещения коэффициентов системы уравнений

중요한 세부 사항은 모든 배열 V와 A는 실제로 1차원이지만 배열 A는 순수하게 작동하지만 배열 V는 올바르게 채워져야 합니다.

일을 하려면 선형 방정식 시스템을 푸는 함수도 필요합니다. 내가 이것을 썼을 때 나는 MQL에서 오직 하나의 구현만을 알고 있었다. 가우스 다항식 회귀를 위한 ANG3110 . 당연히 나는 저항이 가장 적은 경로를 택했고 이 특정 알고리즘을 함수에 사용했습니다. 즉, 특히 행렬이 대칭인 것으로 밝혀졌기 때문에 더 효율적인 알고리즘이 있지만 참조하지 않았습니다.

사용 방법:

먼저 어떤 함수를 근사화할지 결정합니다. 예를 들어 선형 회귀가 될 것입니다. 즉, 선형 조합 A* 1 + B* X , 단 두 개의 벡터, 단위 및 인수 자체를 갖게 됩니다.

작업 배열을 만들고 init() 어딘가에 메모리를 할당합시다.

 double V[];
double A[],С[];

...

  ArrayResize (A, 6 );   // размер N*(N+1)
   ArrayResize (C, 2 );   // размер N
   ArrayResize (V,M* 3 );   // M*(N+1) , M - не что иное как размер выборки

배열 V를 올바르게 채우고 계수를 계산해야 합니다. 이것은 다음과 같이 할 수 있습니다.

    ind = 0 ;
    Stop = Start + M;
// Заполняем векторы
     for (pos = Start; i < Stop; i++) {
     V[ind] = 1.0 ;
     ind++;
     V[ind] = pos;
     ind++;
     V[ind] = Close[pos];   
     ind++;
    }
// Считаем коэффициенты
   LSA(V, M, N, A, C);

작업이 완료되고 선형 회귀 C[0] + C[1]*pos가 준비되었습니다.

우선 알고리즘을 테스트해야 합니다. 이렇게 하려면 표시기 ang_PR(Din)-v1.mq4( ANG3110 ) LSA를 이용하여 다항회귀지표를 작성하고 결과를 비교하였다. 결과는 시각적으로 일치했고 테스트의 끝이었습니다. :). LSA_PR.mq4 표시기가 첨부되어 있습니다.

파일:
pr_lsa.mq4  7 kb
 

그것은 모두 꽤 오래전 일이었고 최근에 나는 그것에 대해 기억하고 내가 만든 도구를 다시 사용하기로 결정했습니다.

가장 먼저 떠오른 생각은 시세 차트에서 주기성을 찾는 것이었습니다. 왜 고조파를 검색하기 위한 이산 푸리에 변환(DFT)이 있습니까? 그러나 DFT는 샘플 길이보다 짧은 주기의 고조파만 제공합니다. 이제 차트에 샘플 길이보다 긴 기간의 하모니카 가격을 맞추려고 할 수 있습니다. 물론, 성공적인 피팅은 그것의 실제 존재를 지지하는 "철의" 주장이 아닐 것입니다. 특정 근사치에 대한 신뢰 정도에 대한 문제는 별도로 다루어야 합니다.

첨부된 LSA_SinLRR.mq4 표시기에서 고조파를 시도하기 전에 선형 추세를 뺍니다. 이전 지평에 따라 계산됩니다. 특정 범위에서 가능한 모든 샘플 길이가 분류되고 샘플 샘플(기본 샘플의 1/4 크기로 취함)에서 최소 평균 제곱 오차가 있는 샘플 길이가 선택됩니다.

고조파 주기는 주어진 인수를 곱하여 샘플 길이에 연결됩니다. 예를 들어 2와 같으면 고조파 주기의 절반이 샘플에 들어맞습니다. 예를 들어 0.5이면 두 주기입니다. 표본 길이 자체는 선형 회귀 와 동일한 방식으로 결정되며, 열거형만 더 젊은 지평 내부로 들어갑니다.

계산량을 줄이기 위해 각 지평에는 고유한 이산화 단계가 있습니다.

벡터 행렬은 다음과 같이 채워집니다.

   for (i = IntShift; i < Frame; i++) {
    pos = HShift+i*Step;
    VT[ind] = MathSin (AFreq*pos);
    ind ++;
    VT[ind] = MathCos (AFreq*pos);
    ind ++;
    VT[ind] = Resid[i];   
    ind ++;
  }   //  for(i = IntShift; i < Frame; i++)

Resid는 가격과 이전 추세의 차이입니다.

표시 매개변수:

 extern double kPer = 4.0;   // Коэффициент для определения периода
extern int LRRank = 1;      // Номер старшего горизонта, больше 3-х не ставить
extern int FShift = 120;    // Расстояние в барах, на которое производится экстраполяция в будущее
extern int HShift = 1;      // Сдвиг текущего времени индикатора в прошлое в барах, бары правее него тоже будут проэктраполированы
extern double PointFactor = 0.1;  // Масштабирование гистограммы ошибок аппроксимации, 0.1 подойдёт для минуток на пятизнаке 
extern bool PriceClose = true; // Если false, то будет считаться по HL/2


휴, 왠지 쓰기 지겹네요 :)

간단히 말해서 핵심은 다음과 같습니다. 이 기능은 최적이라고 주장하지 않습니다. 단순히 팬케이크와 같은 근사치를 스탬프 처리하고 팬에서 바로 시도할 수 있도록 합니다. :) . 따라서 지표는 이러한 방식으로 함께 붙어 있습니다. 즉, 스타일과 효율성 측면에서 아무 것도 가장하지 않습니다.

이 경우는 너무 빨리 작동하지 않으므로 이력이 계산되지 않습니다. 즉, 시각화 도우미에서 공부하는 것이 좋습니다. 그러나 그것은 빨리 지루해집니다 :). 그러나 인내심이 있는 사람이 혜택을 받을 방법을 찾을 수 있다는 점을 배제할 수 없습니다. :).


일반적으로 나는 명확한 설명을 할 수 없다는 것을 알고 있습니다. 누군가가 이것에 관심이 있다면 설명에 의존할 수 있을 것입니다.


원칙적으로 하나 이상의 지표에 대해 이야기해야하며 제시된 지표보다 더 아름답게 근사하고 외삽합니다. 즉, 나는 너무 감명을 받아 마침내 가격의 조각별 결정론의 입장을 취한 것 같습니다. 이 조각의 길이를 아직 결정할 수 없기 때문에 진실이 안도감을 주지는 않습니다. :) .

하지만 더 이상 글을 쓸 힘이 없어 사진 몇 장만 드릴 수 있어요 :)

성공적인 외삽을 사용한 근사의 예

모멘텀에 의해 "찢어진" 외삽을 사용한 근사의 예

파일:
lsa_sinlr.mq4  14 kb
 
Candid :

HShift가 설정되지 않고 첫 번째 줄의 실제 위치에 따라 결정되도록 코드를 추가할 수 있습니까? 더 정확하게는, <0으로 설정하면 두 메커니즘이 모두 작동하고 차트를 따라 차트를 기록으로 깊숙이 끌어서 해당 시점의 예측이 그 이후에 일어난 일과 어떻게 일치했는지 분석할 수 있습니다. 흥미로울 것입니다 ;)

 
ForexTools :

HShift가 설정되지 않고 첫 번째 줄의 실제 위치에 따라 결정되도록 코드를 추가할 수 있습니까? 보다 정확하게는, <0으로 설정하면 두 메커니즘이 모두 작동하고 차트를 따라 차트를 깊숙이 끌어다 놓을 수 있으며 해당 시점의 예측이 그 이후에 일어난 일과 어떻게 일치했는지 분석할 수 있습니다. 흥미로울 것입니다 ;)

예, 매우 편리합니다. 버전을 제공합니다. 나는 특히 그래픽 컨트롤을 좋아하지 않는다는 것을 예약할 것이며 모든 것이 원활할 것이라는 보장은 하지 않습니다.


그건 그렇고, 오른쪽 하단 모서리의 히스토그램이 기본 샘플에서 근사 오차를 표시하고 샘플 외부에서 외삽 오차를 보여줍니다. 이 정보가 상황 평가와 관련이 있다고 가정하는 것이 합리적입니다.


PS 네, 한 줄 추가하는 것을 잊었습니다. 11:50에 표시등 교체

파일:
 

몇 마디 더. 이전 추세가 정확히 선형으로 나타나는 이유는 무엇입니까? 어쨌든 실제 추세는 선형으로 보입니다. 가정은 사람이 무의식적으로 그러한 하락세를 일으킬 수 있다는 것입니다. 그러면 현실이 하모니카 뒤에 설 수 있다는 희망이 있습니다.

원칙적으로 다항식의 차수를 높이는 것은 문제가 되지 않으며, 사실 저는 포물선 변형으로 시작했습니다. 이것은 기본적인 방법으로 수행되며 몇 가지 추가 및 수정된 줄만 있으면 누구나 연습으로 직접 수행할 수 있습니다.

 

안녕하세요.

사진을 설명해주세요. Interisuyut 수직선 . 예측 데이터가 파란색 선 사이의 간격에 있다는 것을 올바르게 이해 했습니까? 빨간색은 무슨 뜻인가요? - 예보와 어긋난 순간은? 빨간색(파란색) 예측 라인에 구분선이 있는 이유는 무엇입니까?

코드를 보지 않았기 때문에 당신의 MQL 프로그래밍 수준은 저에게 도달할 수 없습니다. 적어도 이 수준에 가까워지는 것은 꿈과 같습니다.

 

Prival :

사진을 설명해주세요. Interisuyut 수직선. 예측 데이터가 파란색 선 사이의 간격에 있다는 것을 올바르게 이해 했습니까? 빨간색은 무슨 뜻인가요? - 예보와 어긋난 순간은? 빨간색(파란색) 예측 라인에 구분선이 있는 이유는 무엇입니까?


예, 실제 근사는 파란색 선 사이에서 수행됩니다. 파란색과 빨간색 외삽 RMS가 계산됩니다. 빨간색의 오른쪽 - 최소한 지표의 경우 미래일 뿐입니다. HShift로 이동하고(이제 차트를 따라 선을 드래그하여) 보이지 않는 것을 보는 것은 우리의 힘입니다.

간격은 "낭비"이고 표시기의 작업 창은 시간이 지남에 따라 이동하고 꼬리는 뒤에 남아 있습니다. 이것은 일정한 창으로 쉽게 고칠 수 있지만 적응하기 때문에 아직 정리할 저렴한 방법이 생각나지 않았습니다.

나는 선을 다시 칠한 버전을 제공합니다.

파일:
 

새 코드가 예상대로 작동하지 않는 것 :(

여기서 나는 내 권리를 박탈할 수 있었다. ft.AutoRefresh와 함께 사용할 때 특히 잘 작동합니다.

파일:
lsa_sinlr_1.mq4  16 kb
 

ForexTools :

여기서 나는 내 권리를 박탈할 수 있었다. ft.AutoRefresh와 함께 사용할 때 특히 잘 작동합니다.

글쎄, 나는 당신의 버전이 더 간섭 방지라고 생각하지만 HShift도 추가해야 할 것입니다. 그래서 사용자 작업이 없을 때 창이 시간에 따라 이동합니다. 하지만, 흠, 어쩌면 이것이 당신이 피하고 싶었던 것일 수도 있습니다.
 
물론이죠! 히스토리를 분석할 때 차트는 아무데도 가지 않고 내가 선을 놓은 곳에 '세워야' 한다.
 
ForexTools :
물론이죠! 히스토리를 분석할 때 차트는 아무데도 가지 않고 내가 선을 놓은 곳에 '세워야' 한다.

글쎄, 처음에는 고정 버전을 만든 다음 교체했습니다. :). 나는 주로 다시 그리기의 역학에 관심이 있었습니다. 유형 매개변수를 추가하는 것은 실제로 쉽습니다.

 if (ModeMoving) HShift--;
그러나 너무 좋은 것도 좋지 않습니다. 옵션이 성숙하도록 두십시오.