MT4 EA에서 범위를 벗어난 어레이 오류 수정
페이지 1 중 912 12 마지막마지막
결과 1 - 10 / 13

실: MT4 EA에서 범위를 벗어난 어레이 오류 수정

  1. #1
    나는 다음과 같이 EA를 만들었습니다 ...

    외부 int IntIndTF1 = 4;
    외부 정수 IntInd1S1 = 2;
    외부 정수 IntInd1S2 = 14;

    외부 정수 IntIndTF2 = 1;
    외부 int IntInd2S1 = 3;
    외부 정수 IntInd2S2 = 9;
    삽입된 코드 PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,IntInd1S1)#93; PerL1 = 낮음#91;iLowest(SymbolToManage,IntIndTF1,MODE_LO W,IntInd1S2,IntInd1S1)#93; PerM1 = NormalizeDouble((PerH1 PerL1)/2,자리수); PerH2 = 높음#91;iHighest(SymbolToManage,IntIndTF2,MODE_H IGH,IntInd2S2,IntInd2S1)#93; PerL2 = 낮음#91;iLowest(SymbolToManage,IntIndTF2,MODE_LO W,IntInd2S2,IntInd2S1)#93; PerM2 = NormalizeDouble((PerH2 PerL2)/2,자리수);
    다른 기호를 테스트하기 시작할 때까지 훌륭하게 작동했지만 두려운 배열이 범위를 벗어남 오류가 발생하여 다음과 같이 변경했습니다.
    삽입된 코드 int BarCount = 막대; if (BarCount lt; 1) BarCount = 1; for (int i=0; igt;Bars; i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,i IntInd1S1)#93; PerL1 = 낮음#91;iLowest(SymbolToManage,IntIndTF1,MODE_LO W,IntInd1S2,i IntInd1S1)#93; PerM1 = NormalizeDouble((PerH1 PerL1)/2,자리수); PerH2 = 높음#91;iHighest(SymbolToManage,IntIndTF2,MODE_H IGH,IntInd2S2,i IntInd2S1)#93; PerL2 = 낮음#91;iLowest(SymbolToManage,IntIndTF2,MODE_LO W,IntInd2S2,i IntInd2S1)#93; PerM2 = NormalizeDouble((PerH2 PerL2)/2,자리수); } 범위를 벗어난 배열 오류가 줄어든 것 같습니다. 그러나 지금은 잘하고 있던 이전 설정을 시뮬레이션하도록 얻을 수 없습니다 ...

    외부 int IntIndTF1 = 4;
    외부 정수 IntInd1S1 = 2;
    외부 정수 IntInd1S2 = 14;

    외부 정수 IntIndTF2 = 1;
    외부 int IntInd2S1 = 3;
    외부 정수 IntInd2S2 = 9;

    1 및 -1 범위를 테스트했지만 EA는 이제 동일한 막대에 대해 동일한 계산 값으로 반환되지 않습니다. 오류를 제거하면서도 이전에 테스트한 값과 결과를 유지하도록 코드를 어떻게 변경할 수 있습니까?

    이것은 지표를 사용하지 않는 EA에 있습니다. HHLL의 값은 EA 자체에 있습니다. 신호를 트리거하는 막대의 extern 변수를 읽고 동일한 결과를 얻을 수 있기를 바랍니다.

  2. #2
    제한 막대 수에 -1을 추가했는데 결과 변경에 영향을 주지 않고 작동하는 것 같으므로 괜찮습니다. iLowest/iHighset이 -1을 반환하지 않는지 확인하기 위해 이 작업을 수행했습니다. 결과가 끔찍할 정도로 올바른 방법이 아님을 확신합니다... Inserted Code int BarsCounted1 = TFBars1-MathMax(IntInd1S2,IntInd1S1 1); if (BarsCounted1 lt; 0) {return;} int LimitBars1 = TFBars1-BarsCounted1; for (BarCount1 = LimitBars1-1; BarCount1 gt;= 0; BarCount1--) { if ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntI nd1S2,BarCount1 IntInd1S1) lt; 0) || ,IntInd1S2,BarCount1 IntInd1S1) lt;0)) 반환; if ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntI nd1S2,BarCount1 IntInd1S1)gt; -1) (iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1 S2,BarCount1 IntInd1S1) gt; PerH1 = 높음#91;iHighest(SymbolToManage,IntIndTF1,MODE_H IGH,IntInd1S2,BarCount1 IntInd1S1)#93; PerL1 = 낮음#91;iLowest(SymbolToManage,IntIndTF1,MODE_LO W,IntInd1S2,BarCount1 IntInd1S1)#93;/PerM1 = NormalizeDouble((PerH1 PerL1)/2,자리수); }

  3. #3

    Quote 원래에 의해 게시 됨 ;
    네 위의 복사 붙여넣기 오류였습니다. 17번째 막대 개념 이후의 실행과 이를 구현하는 방법 또는 작동하는 이유를 잘 모르겠습니다. 그동안 저는 이것으로 해결했습니다... ea 내의 두 번째 지표에 대한 두 번째 변수 세트로 두 번째 반복했습니다. 에서 언급한 시간 이동이 있는 막대는 모든 TF에 대해 테스트하지만 4시간 차트에 배치되기 때문에 MT4 컴파일러의 테스트를 보다 제어하고 덜 변덕스럽게 만들었습니다. 결국 나는 ea가 TF 차트에 관계없이 동일한 결과로 동일하게 실행되기를 원합니다.
    크기에서 위치 BarCount1=LimitBars1-1로 변환할 때 (-1)을 잊지 말고 iLowest/iHighest가 -1을 반환하지 않는지 확인하십시오.

  4. #4
    네 위의 복사 붙여넣기 오류였습니다. 17번째 막대 개념 이후의 실행과 이를 구현하는 방법 또는 작동하는 이유를 잘 모르겠습니다. 그동안 저는 이것으로 해결했습니다... ea 내의 두 번째 지표에 대한 두 번째 변수 세트로 두 번째 반복했습니다. Beerrun이 언급한 시간 이동이 있는 막대는 모든 TF에 대해 테스트하지만 4시간 차트에 배치되기 때문에 MT4 컴파일러의 테스트를 더 제어하고 덜 변덕스럽게 만들었습니다. 결국 나는 ea가 TF 차트에 상관없이 동일한 결과로 동일하게 실행되기를 원합니다. Bars()에서 TF를 읽는 것이 솔루션의 일부라고 생각합니다. 범위를 벗어난 배열 오류는 여전히 문제입니다. 17번째 막대의 중요성은 무엇이며 17번째 막대 이후에 ea를 실행하려면 어떻게 해야 합니까? 삽입된 코드 int BarCount1; int TFBars1 = 막대(SymbolToManage,IntIndTF1); int BarsCounted1 = TFBars1-MathMax(IntInd1S2,IntInd1S1 1); if (BarsCounted1 lt; 0) {return;} int LimitBars1 = TFBars1-BarsCounted1; for (BarCount1 = LimitBars1; BarCount1 gt;= 0; BarCount1--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,BarCount1 IntInd1S1)#93; 등... }

  5. #5

    Quote 원래에 의해 게시 됨 ;
    나는 변수를 전달하고 이전 결과를 매우 가깝게 시뮬레이션할 수 있었습니다... int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntIn d1S1,IntInd2S1)); for(int i=바 개수 계산된_바-1;igt;0;i--) { PerH1 = 높음[iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd 1S2,i IntInd1S1)]; PerL1 = 낮음[iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S 2,i IntInd1S1)]; PerM1 = NormalizeDouble((PerH1 PerL1)/2,자리수); PerH2 = 높음[iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd 2S2,i IntInd2S1)]; PerL2 = 낮음[iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S 2,i IntInd2S1)];...
    위의 오류가 확실합니까? 이것은 배열을 채우지 않기 때문에 마지막 i의 값을 double에 할당하고 불필요한 주기를 수행합니다. 안녕! 범위를 벗어나 높음 또는 낮음에 도달할 수 있습니다. 이를 위해 ea가 17번째 마디 이후에 실행되도록 설정하십시오.

  6. #6

    Quote 원래에 의해 게시 됨 ;
    글쎄, 나는 이것으로 테스트하는 동안 다른 기호에 대한 범위를 벗어난 배열 오류가 계속 발생합니다. 틱 확인으로 틱을 벗어나게 하면 더 빨라지지만 원래 문제가 해결되지는 않습니다. 다시 레슬링으로 돌아갑니다.
    아마도 현재 차트 기호와 기간으로 제한된 Bars 변수 대신 기호와 기간을 매개변수로 사용하는 Bars() 함수를 사용하십시오. 고려해야 할 추가 사항은 iLowest/Highest가 오류를 반환하면 Low[-1]를 수행하는 것입니다.

  7. #7
    그래도 변수를 전달하고 이전 결과를 이와 매우 밀접하게 시뮬레이션할 수 있었습니다... Inserted Code int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntIn d1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,i IntInd1S1)#93; PerL1 = 낮음#91;iLowest(SymbolToManage,IntIndTF1,MODE_LO W,IntInd1S2,i IntInd1S1)#93; PerM1 = NormalizeDouble((PerH1 PerL1)/2,자리수); PerH2 = 높음#91;iHighest(SymbolToManage,IntIndTF2,MODE_H IGH,IntInd2S2,i IntInd2S1)#93; PerL2 = 낮음#91;iLowest(SymbolToManage,IntIndTF2,MODE_LO W,IntInd2S2,i IntInd2S1)#93; PerM2 = NormalizeDouble((PerH2 PerL2)/2,자리수); IntInd1S2,i IntInd1S1은 이전에 2와 14로 설정되었으며 이제는 1과 13에서 작동하므로 의미가 있습니다. 그래도 배열이 범위를 벗어남 오류가 발생합니다.

  8. #8
    글쎄, 나는 이것으로 테스트하는 동안 다른 기호에 대한 범위를 벗어난 배열 오류가 계속 발생합니다. 틱 확인으로 틱을 벗어나게 하면 더 빨라지지만 원래 문제가 해결되지는 않습니다. 다시 레슬링으로 돌아갑니다. 삽입된 코드 int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIG H,IntInd1S2,IntInd1S1)#93; PerL1 = 낮음#91;iLowest(SymbolToManage,IntIndTF1,MODE_LO W,IntInd1S2,IntInd1S1)#93; PerM1 = NormalizeDouble((PerH1 PerL1)/2,자리수); PerH2 = 높음#91;iHighest(SymbolToManage,IntIndTF2,MODE_H IGH,IntInd2S2,IntInd2S1)#93; PerL2 = 낮음#91;iLowest(SymbolToManage,IntIndTF2,MODE_LO W,IntInd2S2,IntInd2S1)#93; PerM2 = NormalizeDouble((PerH2 PerL2)/2,자리수); }

  9. #9

    Quote 원래에 의해 게시 됨 ;
    예, 작동해야 합니다. 그렇지 않은 경우 실행 횟수를 유지하기 위해 변수를 만듭니다. 그렇지 않으면 모든 틱에서 모든 막대에 대해 루프를 실행합니다.
    이것이 내가 한 일입니다... 삽입된 코드 int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { etc. etc. etc. } 범위를 벗어난 배열을 처리한 것 같습니다. 테스트할 다른 ​​기호를 확인해야 합니다. . 그러나 진드기에 의한 테스트는 영원히 걸렸습니다. 그래서 이 코드가 호출되는 시기와 위치를 검토하고 void OnInit의 맨 위 섹션에서 빼서 Inserted Code 뒤에 넣었습니다. static datetime prevtime = Time#91;0#93; if (prevtime == Time#91;0#93 return; prevtime = 시간#91;0#93; OnInit 하단 근처에 있는 것입니다. 틱 단위로 체크할 필요가 없고 막대 단위로만 확인할 수 있습니다. 반면에 출구 전략의 다른 부분은 틱 단위로 모니터링해야 합니다. 나는 그것이 지금 작동해야한다고 생각합니다. 문제를 일으키는 다른 기호와 비교하여 확인해야 하지만 틱 확인을 통해 코드를 틱에서 빼면 당연히 훨씬 더 빠르게 실행됩니다.

  10. #10

    Quote 원래에 의해 게시 됨 ;
    {quote} 코드는 ea 내부에만 있고 IndicatorCounted()는 ea 내부에서 계속 작동합니까?
    예, 작동해야 합니다. 그렇지 않은 경우 실행 횟수를 유지하기 위해 변수를 만듭니다. 그렇지 않으면 모든 틱에서 모든 막대에 대해 루프를 실행합니다.

게시 권한

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
쿠키 정책
쿠키 정책: koreaforex 웹사이트는 쿠키를 사용하며, 웹사이트를 사용자는 쿠키 사용에 동의하는 것입니다. 자세한 정보는 '쿠키 공개' 를 읽어주십시오.