엘리엇 파동 이론에 기반한 거래 전략 - 페이지 58

 
인생에는 처음에는 중요하거나 그 반대로 중요하지 않은 것처럼 보이는 많은 것들이 있습니다. 이것은 Avals에 따르면 고유 한 아이디어가 직관적으로 정확하지만 먼저 입증해야 했던 원시 Expert Advisor의 결과와 동일합니다. 그러나 나는 그것을 논박하는 것보다 실생활에서 테스트하기 위해 그것을 두는 것이 더 쉬웠습니다. 올해 말까지 지속된다면 아마 테스터에서 테스트를 시작할 것입니다 :)


요약:
입출금: 5 000.00 신용한도: 0.00
마감 거래 P/L: 1,186.63 유동 P/L: 560.29 마진: 961.62
잔액: 6 186.63 자기자본: 6 746.92 자유 마진: 5 785.30

총 이익: 3 669.45 총 손실: 2 482.82 총 순이익: 1 186.63
이익 계수: 1.48 예상 수익: 23.27
절대 드로다운: 143.75 최대 드로우다운(%): 858.39(13.20%)

총 거래: 51 숏 포지션(원 %): 26(42.31%) 롱 포지션(원 %): 25(56.00%)
이익 거래(전체의 %): 25(49.02%) 손실 거래(전체의 %): 26(50.98%)
최대 이익 거래: 540.94 손실 거래: -292.62
평균 이익 거래: 146.78 손실 거래: -95.49
최대 연속 승리($): 6(1,099.13) 연속 패배($): 4(-744.95)
최대 연속 이익(개수): 1 099.13(6) 연속 손실(개): -744.95(4)
평균 연승: 2연패: 2
 
나는 시장 진입 조건을 완화하는 측면에서 내 Expert Advisor를 약간 조정하고 변수를 추가했습니다.
결과는 https://c.mql5.com/mql4/forum/2006/06/new_results.zip 에 있습니다.
로트 크기는 $5에서 $80 사이였습니다.
EURUSD를 보면 입출금 알고리즘이 날카로워졌기 때문에 Expert Advisor는 3년의 역사에서 눈에 띄는 결과를 보여주었다. 많은 계산으로 인해 예측 가능한 시간에 시스템의 추정치를 얻기 위해 채널이 계산되는 샘플을 300bar 크기로 제한했습니다. 즉, 시간상 12.5 거래일입니다. 사실 진입점의 신뢰성을 높이려면 훨씬 더 긴 샘플을 계산해야 합니다. 내 가정에 대한 실험적 증거를 얻기 위해 샘플 길이로 EA를 다시 실행하지만 특정 계산 시간이 필요합니다. 파일에 표시된 결과를 받은 후 동일한 매개변수를 사용하여 EURUSD에서 Expert Advisor를 실행했습니다(후행 중지 매개변수 포함!). 여기서 Expert Advisor는 EURUSD에서 GBPUSD 및 USDCAD 쌍으로 개선되었습니다. 당연히 나머지 2쌍에서는 눈에 띄는 결과를 얻을 수 없었지만 얻은 결과는 여전히 긍정적인 편향을 가지고 있다고 생각합니다. 그러므로 나는 2가지 결론을 내릴 수 있다. 첫 번째는 Vladislav가 제안한 시스템이 신중한 기술 구현으로 수익성이 있을 수 있다는 것입니다. 둘째, Vladislav가 수정 없이 모든 통화 쌍에서 작동하는 보편적인 기호를 찾을 수 있었지만 다른 통화 쌍의 경우 전문가의 매개변수를 선택해야 합니다. 이 3가지 통화쌍을 비교하면 다음과 같은 차이점을 찾을 수 있습니다. USDCAD 쌍은 EURUSD에 비해 더 자주 빠르게 움직입니다. 즉, EURUSD의 경우 예를 들어 1.5 수치를 전달하는 데 3시간이 걸린다면 USDCAD의 경우 때때로 1시간 내에 발생할 수 있으므로 적어도 결과가 발생한 H1 기간에는 심각한 지연 문제가 있습니다. 얻었다. 일반적으로 이 방향으로 연구를 계속할 것입니다. 이제 나는 합리적인 풀업 스톱을 고려하는 주요 작업입니다. 거래할 때 언제 그리고 얼마나 끌어올릴지. 표준 후행 정지가 많은 것을 허용하지 않는다는 것이 분명하기 때문입니다. 우리는 더 이해할 것입니다.
 
좋은 오후 Solandr !

어떤 조건을 완화했는지 말씀해 주시겠습니까?
 
어떤 조건을 완화했는지 말씀해 주시겠습니까?

Murrey 레벨 표시기의 계산 기간 뿐만 아니라 계산을 위한 샘플 크기를 줄였습니다. 샘플이 짧으면 진입점을 충족하는 더 많은 로컬 최고점과 최저점이 있습니다. 또한 머레이 레벨을 더 짧은 기간 동안 계산하면 서로 더 가깝게 위치하여 시장에 진입할 가능성이 높아집니다. 이전 파일의 31개 거래와 새 파일의 80개 거래를 비교합니다. 진입조건이 완화되면서 거래 건수는 늘었지만 그에 따라 거래의 질 자체는 하락했다. 그러나 Vladislav와 같은 가변 로트 크기를 도입하면 동일한 위험량에 대해 동일한 기간 동안 이전 파일에서 얻은 결과를 능가할 수 있었습니다.
 
Expert Advisor의 새로운 테스트 결과 게시 https://c.mql5.com/mql4/forum/2006/06/new_results2.zip
결과에는 채널이 검색되는 샘플 길이가 다른 EURUSD 쌍에서 얻은 데이터가 포함됩니다. 나는 H1 기간에 300개와 1000개 바의 길이로 경주했습니다. 예상대로 샘플이 길수록 EA 테스트 보고서의 성능이 향상되었습니다. 진실은 그다지 중요하지 않습니다. 샘플 길이를 3배 이상 늘리면 최종 이익이 4% 증가하는 데 그쳤습니다. 예상대로 더 긴 샘플(19%)에 대한 거래는 더 적었지만 수익성이 14% 증가한 것으로 입증된 것처럼 거래 자체의 품질은 향상되었습니다. 결과적으로 수익성 지표의 증가와 함께 거래 건수 감소는 여전히 최종 이익에 약간의 증가를 주었다.

지정된 파일에는 H1 기간의 샘플 300개에 대해 USDCHF 및 USDJPY 통화 쌍에서 EURUSD에 맞게 조정된 Expert Advisor를 실행한 결과도 포함되어 있습니다. USDCHF 통화 쌍에서 결과는 분명한 양의 편향을 나타냅니다. 그리고 USDJPY 쌍에서 결과는 전체 테스트 기간 동안 0 주위를 방황하는 것으로 나타났습니다. 동시에 완료된 거래 자체의 수는 다른 통화 쌍에서 동일한 기간 동안 테스트할 때보다 약 3배 적은 것으로 나타났습니다. 이를 바탕으로 USDJPY 쌍의 특성은 이미 테스트된 쌍과 상당한 차이가 있다는 결론을 내릴 수 있습니다. 따라서 내가 가지고 있는 전략 버전이 USDJPY 쌍에서 작동할 수 있다면 이를 위해 약간의 노력이 필요하며 이 쌍의 시장 진입/퇴장 알고리즘을 수정할 수 있습니다.
그건 그렇고, 어떤 이유로 Vladislav는 데모의 모든 쌍에서 거래하지 않지만 (원칙적으로 기술적인 어려움이 없거나 완전히 해결할 수 있음) EURUSD, USDCHF, GBPUSD의 3 쌍에서만 거래합니다. 그리고 나는 이것이 단지 그와 같은 것이 아니라 여기에는 어떤 이유가 있다고 생각합니다.
 
안녕하세요 ! MTSinka로 끝낸 것 같습니다.) - 며칠 동안 마크업이 진행되었으며 심각한 버그가 관찰되지 않았으므로 테스트의 두 번째 단계로 진행할 것입니다. 월요일에 말했듯이 직접 액세스를 닫을 것입니다. Lights에 대한 계정 - 이것은 제국으로 흐르는 계정입니다. 투자자 비밀번호를 변경하거나 아예 모니터링을 중단할 수도 있습니다. 컴퓨터를 헛되이 운전할 필요가 없습니다. 실제 테스트로 넘어가겠습니다. 다음에 일어날 일 - 우리는 보게 될 것입니다.
나는 많은 사람들이 실용적인 구현으로 발전하기를 바랍니다.

행운을 빕니다.
 
좋은 오후 블라디슬라프 !

이 스레드로 돌아와서 기쁩니다.
스레드에 참여하지 않은 동안 다음과 같은 몇 가지 문제가 활발하게 논의되었습니다.

하나.
쟈니 16.06.06 16:48

Vladislav, 몇 가지 질문에 답할 수 있습니까?
1) 채널 선택 기준의 중요도 수준이 귀하에게 동일하거나(즉, 이러한 기준의 최적 조합을 찾음) 더 중요한 기준에서 덜 중요한 기준으로 순차적으로 선택됩니다.
2) 스마트 북을 읽다가 무엇을 찾아야 하는지 잊어버렸습니다. :). 위치 에너지 기능의 개념이 의미하는 바를 올바르게 이해한다면 검색 결과가 궤적의 방정식(값이 아니라 함수!)이 될 것이기 때문에 우리가 그것을 찾는 이유가 명확하지 않습니다. 위치 에너지의 변화(움직이는 과정에서 발생하지만 끝점에 도달할 때는 아님)가 최소가 되는 이동이며, 내가 이해하는 바와 같이 가격은 바로 이 궤적을 따라 이동하며 우리는 이미 다음과 같은 방정식을 선택했습니다. 우리는 이 궤적을 근사화하기로 결정했습니다(이것은 회귀 방정식입니다). 즉, 이 궤적을 얼마나 잘 근사화했는지 결론을 내릴 수 있습니다. 그러나 여전히 그것을 찾는다면 이론상으로는 2차 함수만 있을 것입니다. 이제 방정식 Ax ^ 2 + Bx + C의 계수 B와 C가 회귀 계수와 같거나 매우 가깝다면 방정식, 그렇다면 이것은 아마도 필요한 채널 일 것입니다. 비록 막연한 의심으로 이미 조각났습니다. :)


2. 채널 유통에 대한 질문...

블라디슬라프 13.03.06 21:38

.... 또한 중심 극한 정리가 있습니다. 수렴 분포는 자유도가 증가하면 정규 분포로 수렴됩니다(그래서 수렴하는 한 내부에 무엇이 있는지는 중요하지 않습니다. )...

채널의 분포를 정규 분포로 받아들이고 정규 분포 함수를 사용하여 신뢰 구간을 계산하기 위해 이 구문을 이해했습니다. 그러나 논리적으로 정당화 된 다른 의견이있었습니다 ...


solandr 18.06.06 08:42

솔직히 말해서, 관심을 끄는 것은 N의 다른 값에 대한 차이일 뿐입니다. 스튜던트 분포는 형태가 질적으로 동일하게 유지되지만 다른 자유도에서 양적 매개변수를 변경합니다. 자유도가 매우 많으면 정규 분포와 일치해야 합니다. 적은 수의 자유도로 일반 자유도와 다릅니다.
다양한 자유도에 대한 학생 분포:
99% 확률:
q(30바)=2.750
q(100바)=2.626
q(300바)=2.593
q(1000바)=2.581
30개 막대와 1000개 막대에 대한 분위수 값 사이의 6% 차이가 추가 고통의 가치가 없다고 생각한다면 이것은 개인 선택입니다. 저는 조금 생각이 다릅니다.


3. 그리고 허스트 계수에 대한 또 다른 질문


쟈니 17.06.06 16:49

... 일반적으로 Hurst에 따르면 샘플이 약 80개 미만인 채널의 경우 표시기가 > 1이므로 어딘가에 오류가 있습니다...

그러나 페이지 http://www.xaoc.ru/index.php?option=com_forum&Itemid=0&page=viewtopic&p=2380 에는 이에 대한 설명이 있습니다.
선형 근사값으로 지표를 찾을 때 오류가 발생하므로 1로 간주하십시오.

이 진술이 사실로 간주될 수 있습니까? 아니면 내 알고리즘의 오류일 가능성이 가장 높습니까?

추신 : 이 질문에 너무 신경쓰지 마시고 답변을 기다리겠습니다.
 
좋은 오후 Vladislav !

이 스레드로 돌아와서 기쁩니다.
스레드에 참여하지 않은 동안 다음과 같은 몇 가지 문제가 활발하게 논의되었습니다.

하나.
쟈니 16.06.06 16:48

Vladislav, 몇 가지 질문에 답할 수 있습니까?
1) 채널 선택 기준의 중요도 수준이 귀하에게 동일하거나(즉, 이러한 기준의 최적 조합을 찾음) 더 중요한 기준에서 덜 중요한 기준으로 순차적으로 선택됩니다.

아니오, 동일하지 않습니다. 각각 고유한 가중치가 있습니다.

2) 스마트 북을 읽다가 무엇을 찾아야 하는지 잊어버렸습니다. :). 위치 에너지 기능의 개념이 의미하는 바를 올바르게 이해한다면 검색 결과가 궤적의 방정식(값이 아니라 함수!)이 될 것이기 때문에 우리가 그것을 찾는 이유가 명확하지 않습니다. 위치 에너지의 변화(움직이는 과정에서 발생하지만 끝점에 도달할 때는 아님)가 최소가 되는 이동이며, 내가 이해하는 바와 같이 가격은 바로 이 궤적을 따라 이동하며 우리는 이미 다음과 같은 방정식을 선택했습니다. 우리는 이 궤적을 근사화하기로 결정했습니다(이것은 회귀 방정식입니다). 즉, 이 궤적을 얼마나 잘 근사화했는지 결론을 내릴 수 있습니다. 그러나 여전히 그것을 찾는다면 이론상으로는 2차 함수만 있을 것입니다. 이제 방정식 Ax ^ 2 + Bx + C의 계수 B와 C가 회귀 계수와 같거나 매우 가깝다면 방정식, 그렇다면 이것은 아마도 필요한 채널 일 것입니다. 비록 막연한 의심으로 이미 조각났습니다. :)


나는 이미 이것에 대해 반복해서 썼습니다. 회귀 채널을 구축하기 위한 샘플을 찾을 때 이 샘플은 주어진 시간에 두 가지 이상의 방식으로 구축될 수 있음을 알 수 있습니다. 어떤 식으로든 선택을 해야 합니다. 나는이 기준을 주요 기준으로 선택했습니다. 정당성은 지점에서 위에서 언급했습니다. 알고리즘은 간단합니다. 우리는 극단적인 것을 만들고, 확인하고, 선택합니다.

2. 채널 유통에 대한 질문...

블라디슬라프 13.03.06 21:38

.... 또한 중심 극한 정리가 있습니다. 수렴 분포는 자유도가 증가하면 정규 분포로 수렴됩니다(그래서 수렴하는 한 내부에 무엇이 있는지는 중요하지 않습니다. )...

채널의 분포를 정규 분포로 받아들이고 정규 분포 함수를 사용하여 신뢰 구간을 계산하기 위해 이 구문을 이해했습니다. 그러나 논리적으로 정당화 된 다른 의견이있었습니다 ...


아니오 - 최악의 수렴이 고려됩니다. 나는 그것에 대해 썼고 solandr는 그것을 맞았습니다.

solandr 18.06.06 08:42

솔직히 말해 관심을 끄는 것은 N의 다양한 값에 대한 차이입니다. 스튜던트 분포는 형태가 질적으로 동일하게 유지되지만 다른 자유도에서 양적 매개변수를 변경합니다. 자유도가 매우 많으면 정규 분포와 일치해야 합니다. 적은 수의 자유도로 일반 자유도와 다릅니다.
다양한 자유도에 대한 학생 분포:
99% 확률:
q(30바)=2.750
q(100바)=2.626
q(300바)=2.593
q(1000바)=2.581
30개 막대와 1000개 막대에 대한 분위수 값 사이의 6% 차이가 추가 고통의 가치가 없다고 생각한다면 이것은 개인 선택입니다. 저는 조금 생각이 다릅니다.



3. 그리고 허스트 계수에 대한 또 다른 질문


쟈니 17.06.06 16:49

... 일반적으로 Hurst에 따르면 샘플이 약 80 미만인 채널의 경우 표시기가 > 1이므로 어딘가에 오류가 있습니다 ...

그러나 페이지 http://www.xaoc.ru/index.php?option=com_forum&Itemid=0&page=viewtopic&p=2380 에는 이에 대한 설명이 있습니다.
선형 근사값으로 지표를 찾을 때 오류가 발생하므로 1로 간주하십시오.

이 진술이 사실로 간주될 수 있습니까? 아니면 내 알고리즘의 오류일 가능성이 가장 높습니까?

추신 : 이 질문에 너무 신경쓰지 마시고 답변을 기다리겠습니다.



물론 계산에는 오류가 있습니다. 주요 기준은 0.5 위/아래의 값입니다(이는 0.5 배율의 공식 버전에 있으며, 0 또는 1로 이동한 경우 각각 시프트 매개변수를 기준으로 함). 알고리즘의 오류와 관련하여 - 그럴 수 있습니다.). 당신 외에 누가 확인할 수 있습니까?

행운을 빕니다.
 
블라디슬라프 감사합니다. 실례합니다 그리고 나는 이미 아무데도 너무 뻔뻔 해지고 있습니다 ...
그러나 나를 위한 기능에 대한 질문은 여전히 열려 있었습니다. 나 자신이 이 분야에서 뭔가를 발명할 것입니다. :). 다시 한번 감사합니다!
 
나는 오랫동안이 지점에 갔지만 여전히 가장 흥미로운 모든 것이 시작된 네 번째 주제가 없었습니다. 모든 참가자들 덕분에 저 스스로도 흥미로운 것들을 많이 배웠습니다. 그러나 그들이 말했듯이 많은 지식은 문제가 아니라 오히려 질문입니다.

허스트 지수 계산에 대한 추가 자료를 읽은 후 Feder의 연구를 접하게 되었습니다. 그는 경험적 법칙인 H=Log(R/S)/Log(0.5*N)가 오히려 제대로 작동하지 않고 작은 샘플에 대해서만 상대적으로 정확한 데이터를 제공한다고 주장했습니다(이 샘플의 크기에 대해서는 언급되지 않았습니다). 따라서 방법론적 자료에 따라 엄격하게 Hurst 지수 계산을 구현하기로 결정했습니다(Feder가 경고한 것보다 훨씬 더 나쁜 것으로 판명된 것 같습니다).

코드가 성능(많은 함수 호출 등) 면에서 가장 최적이 아닐 수 있다는 것을 이해하지만 가장 중요한 것은 다릅니다. 계산 논리를 올바르게 표현하는지 여부를 스스로 명확히 하고 싶습니다. 내가 얻은 결과가 의심스러운 것처럼 보였기 때문에 나는 아는 사람들에게 눈을 돌리기로 결정했습니다.

내 계산에서 나는 교육 매뉴얼의 공식에서만 시작했으며 그 이상은 아닙니다.

구현은 스크립트 형태로 매우 간단합니다. 총 8개의 기능이 있으며, 이에 대한 설명은 아래에 첨부되어 있으며, 소스 코드에도 주석이 있습니다. 다음과 같이 구현된 함수에서 계산된 데이터가 있는 배열 가져오기. 배열 double out[]이 각 함수에 전달되고 이 배열은 함수 본문에서 초기화되며 함수의 목적에 따라 계산된 데이터가 배열에 기록됩니다.

무효 GetVn(더블 아웃[], int N, int i)
"유입" 형성 - v[]. 유입으로서 종가를 취합니다. 결과는 배열 out[]에 기록됩니다.

무효 SetArrayMv(더블 v[], 더블 아웃[], int N)
모든 관찰에 대한 평균 유입량 - mv[]를 계산합니다. 유입은 함수에 전달되고 관찰 횟수는 N입니다.

무효 SetArrayDv(더블 v[], 더블 아웃[], 더블 mv[], int N)
누적 유입 편차 - dv[]를 계산합니다. 나는 배열 "inflow", "average inflow" 및 관찰 횟수를 전달합니다.

무효 SetArrayR(이중 dv[], int N, 이중 출력[])
나는 범위를 계산합니다 - r[]. 함수에 유입과 관찰 횟수를 전달합니다.

무효 SetArrayS(이중 v[], 이중 mv[], 이중 출력[], int N)
표준편차 s[]를 계산합니다 . 나는 "유입", "평균 유입"및 관찰 횟수를 전달합니다.

무효 SetArrayRS(더블 r[], 더블 s[], 더블 아웃[], int N)
정상 범위를 계산합니다. R/S 값을 rs[] 배열에 씁니다. 함수 "범위", "표준 편차" 및 관찰 횟수를 전달합니다.

무효 LogN(더블 아웃[], int N)
N의 로그 배열을 계산합니다.

무효 GetLine(더블 x[],더블 y[], int N)
나는 근사 직선의 계수를 계산합니다.

//+------------------------------------------------------------------+
//|                                                        HERST.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "grasn@rambler.ru"

int start()
{
   int i=0;
   int N=100;

   double v[];                         // Приток
   
   double mv[];                        // Средний приток
   double dv[];                        // Накопившееся отклонение
   
   double r[];                         // Размах
   double s[];                         // Стандартное отклонение
   
   double rs[];                        // Нормированный размах
   double logN[];                      // логарифм от N
   
   GetVn(v, N, i);
   SetArrayMv(v, mv, N);
   SetArrayDv(v, dv, mv, N);

   SetArrayR(dv, N, r);
   SetArrayS(v, mv, s, N);
   SetArrayRS(r, s, rs, N);
   
   LogN(logN, N);
            
   GetLine(logN, rs, N);
   
   return(0);
}

// Приток
// ________________________________________________________________________________________
// "Приток".....................................................................double out[]
// Длина выборки......................................................................int N
// номер бара с которого выполняется выборка..........................................int i

void GetVn(double out[], int N, int i)
{
   int n;
   int k;      

   double x[];

   ArrayResize(x, N);
   ArrayInitialize(x, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);

   k=i+N-1;
      
   for(n=0; n<=N-1; n++)
   {
      x[n]=Close[k];
      k=k-1;
   }

   ArrayCopy(out, x, 0, 0, WHOLE_ARRAY);
      
   return(0);
}

// Средний приток 
// ________________________________________________________________________________________
// Приток ........................................................................double v[]
// Средний приток ..............................................................double out[]
// Число наблюдений...................................................................int N

void SetArrayMv(double v[], double out[], int N)
{
   int n;
   int i;
   
   double SUM;
   double mv[];

   ArrayResize(mv, N);
   ArrayInitialize(mv, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);
      
   for(n=0; n<=N-1; n++)
   {
      SUM=0.0;   
      
      for(i=0; i<=n; i++)
      {
         SUM=SUM+v[i];
      }
      
      mv[n]=(1.0/(n+1))*SUM;
   }
   
   ArrayCopy(out, mv, 0, 0, WHOLE_ARRAY);
 
   return(0);
}

// Накопившееся отклонение притока от среднего
// ________________________________________________________________________________________
// Приток ........................................................................double v[]
// Накопившееся отклонение притока..............................................double out[]
// Средний приток................................................................double mv[]
// Число наблюдений...................................................................int N

void SetArrayDv(double v[], double out[], double mv[], int N)
{
   int n;
   int i;
   
   double dv[];
   double SUM;

   ArrayResize(dv, N);
   ArrayInitialize(dv, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);

   for(n=0; n<=N-1; n++)
   {
      SUM=0.0;
      
      for(i=0; i<=n; i++)
      {
         SUM=SUM+(v[i]-mv[i]);
      }
      
      dv[n]=SUM;
   }
   
   ArrayCopy(out, dv, 0, 0, WHOLE_ARRAY);
      
   return(0);   
}

// Размах
// ________________________________________________________________________________________
// Накопившееся отклонение притока от среднего...................................double dv[]
// Размах.......................................................................double out[]
// Число наблюдений...................................................................int N

void SetArrayR(double dv[], int N, double out[])
{
   int n;
   
   int idMax;
   int idMin;
   
   double rn[];
      
   double max;
   double min;

   ArrayResize(rn, N);
   ArrayInitialize(rn, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);   

   for(n=1; n<=N; n++)
   {
      idMax=ArrayMaximum(dv, n, 0);
      idMin=ArrayMinimum(dv, n, 0);
      
      max=dv[idMax];
      min=dv[idMin];
      
      rn[n]=MathAbs(max-min);
   }
   
   ArrayCopy(out, rn, 0, 0, WHOLE_ARRAY);
   
   return(0);
}

// Стандартное отклонение
// ________________________________________________________________________________________
// Приток.........................................................................double v[]
// Среднее приток................................................................double mv[]
// Стандартное отклонение.......................................................double out[]
// Число наблюдений...................................................................int N

void SetArrayS(double v[], double mv[], double out[], int N)
{
   int n;
   int i;
   
   double sn[];
   double SUM;

   ArrayResize(sn, N);
   ArrayInitialize(sn, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);   
   
   for(n=0; n<=N-1; n++)
   {
      SUM=0.0;
      
      for(i=0; i<=n; i++)
      {
         SUM=SUM+MathPow((v[i]-mv[i]), 2);
      }
     
      sn[n]=MathSqrt((1.0/(n+1))*SUM);
   }
   
   ArrayCopy(out, sn, 0, 0, WHOLE_ARRAY);
   
   return(0);
}

// Нормированный размах
// ________________________________________________________________________________________
// Размах.........................................................................double r[]
// Стандартное отклонение.........................................................double s[]
// Нормированный размах.........................................................double out[]
// Число наблюдений...................................................................int N
void SetArrayRS(double r[], double s[], double out[], int N)
{
   int n;
   
   double rs[];

   ArrayResize(rs, N);
   ArrayInitialize(rs, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);  
      
   for(n=3; n<=N-1; n++)
   {  
      if(s[n]==0)
      {
         rs[n]=0.0;
      }
      else 
      {
         rs[n]=MathLog(r[n]/s[n]);
//         Print("rs ", rs[n]);
      }
   }
   
   ArrayCopy(out, rs, 0, 0, WHOLE_ARRAY);
   
   return(0);
}

// Логарифм N
// ________________________________________________________________________________________
// Логарифм N...................................................................double out[]
// Число наблюдений...................................................................int N
void LogN(double out[], int N)
{
   int n;
      
   double logN[];
   
   ArrayResize(logN, N);
   ArrayInitialize(logN, 0.0);

   ArrayResize(out, N);
   ArrayInitialize(out, 0.0);   
   
   for(n=3; n<=N-1; n++)
   {
      logN[n]=MathLog(n);
//      Print("n ", logN[n]);
   }
   
   ArrayCopy(out, logN, 0, 0, WHOLE_ARRAY);
   
   return(0);   
}

// Расчет коэффициентов аппроксимирующей линии
// ______________________________________________________________
// log(R/S).......................................................................double x[]
// log(N)................................................................................y[]
// Число наблюдений...................................................................int N
void GetLine(double x[],double y[], int N)
{
   double m=0;
   double b=0;
   double tan = 0;
      
   int size=N;
   double sum_x=0.0;
   double sum_y=0.0;
   double sum_xy=0.0;
   double sum_xx=0.0;
      
   for (int i=3; i<size; i++)
   {
      sum_x=sum_x+x[i];
      sum_y=sum_y+y[i];
      sum_xy=sum_xy+(x[i]*y[i]);
      sum_xx=sum_xx+(x[i]*x[i]);
   }

   m = (size*sum_xy - sum_x*sum_y) / (size*sum_xx - sum_x*sum_x);
   b = sum_y/size - m * sum_x / size;

           
   Print("Аппроксимирующая прямая: y(x)=", m, "x+", b);
   Print("Показатель Херста= ", m);
   
   return(0);
}



나는 임의의 시리즈와 EURUSD 일일 시세에 대한 로그 좌표 log(R/S) 및 log(N)의 그래프를 제시합니다.
다음 매개변수와 함께 MathRand() 함수를 사용하여 생성된 랜덤 시리즈입니다.
N=100
결과:
H=0.5454
Y(x)=0.5454x+0.2653

N이 증가함에 따라 허스트 지수는 0.5에 접근합니다.


EURUSD D1 계산은 다음 매개변수로 수행되었습니다.
i=0(27.06부터)
N=100

계산 결과:
H=1.0107(그리고 왜 그렇게 거대한가?)
y(x)=1.0197x-0.5885



몇 가지 질문이 있습니다.
1. 유입을 위해 무엇을 취해야합니까? 전체 가격, 모듈러스 차이, 양수 차이만? 즉, 고려 중인 방법의 "유입" 개념이 데이터의 사전 준비에 영향을 미치는가? 또는 조사할 데이터를 받기 위해 유입을 따릅니다. 예를 들어, 나는 직관적으로 계산에서 종가를 취했습니다.

2. 범위 값, 특히 표준 편차가 0인 경우 정규화된 범위를 결정하는 방법. 이것은 작은 배열 인덱스에 거의 항상 존재합니다. 0이 감지되는 경우 정규화된 범위에 0을 할당합니다. 맞나요? 지금은 첫 번째 값 계산을 거부합니다.

3. 결과 자체도 마음에 들지 않는다. EURUSD에 대한 몇 가지 계산 옵션의 예를 보여 드리겠습니다.

모든 막대의 유입(닫기[] D1) 허스트 지수 0.9069
유입(닫기[] D1) i=0, N=200 허스트 지수 0.8264

수치는 고통스럽게 낙관적이며, 게다가 데이터는 Vladislava의 데이터(전체 시리즈에 대해 0.64)와 일치하지 않지만 매우 작은 값도 있습니다. 모든 막대의 가격 차이에 대해 Hurst 지수 0.5119의 값을 얻습니다.

4. 평균 유입량을 올바르게 계산하고 있습니까? 모든 반복에 대한 하나의 값 또는 현재 N에 따라 변경되어야 합니까?

5. 내가 모든 것을 섞어 지표가 완전히 다르게 계산될 가능성이 있습니다. 제가 어디서 잘못했는지 설명해 주세요 :o(

추신: 포럼 회원들이 이해하는 데 도움이 되기를 바랍니다. Vladislav가 저에게 시간을 내어 그러한 간단한 기술이 잘못된 부분을 설명해 주시면 대단히 감사하겠습니다.

사유: