修復 MT4 EA 中的數組超出範圍錯誤
1 頁面的第 562 頁 12 上一個上一個
Results 1 to 10 of 13

Thread: 修復 MT4 EA 中的數組超出範圍錯誤

  1. #1
    我用以下內容製作了一個 EA...

    外部 int IntIndTF1 = 4;
    外部 int IntInd1S1 = 2;
    外部 int IntInd1S2 = 14;

    外部 int IntIndTF2 = 1;
    外部 int IntInd2S1 = 3;
    外部 int IntInd2S2 = 9;
    插入代碼 PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd1S2,IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd2S2,IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S2,IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits);
    它工作得很好,直到我開始用它測試其他符號,然後出現可怕的 Array out of range 錯誤,所以我把它改成了這個......
    插入代碼 int BarCount = Bars; if (BarCount lt; 1) BarCount = 1; for (int i=0; igt;Bars; i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd1S2,i IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,i IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = 高#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd2S2,i IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S2,i IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits);數組超出範圍的錯誤似乎已經減少。但是,現在我無法讓它模擬以前運行良好的設置...

    外部 int IntIndTF1 = 4;
    外部 int IntInd1S1 = 2;
    外部 int IntInd1S2 = 14;

    外部 int IntIndTF2 = 1;
    外部 int IntInd2S1 = 3;
    外部 int IntInd2S2 = 9;

    我已經測試了 1 和 -1 範圍,但 EA 現在沒有返回到相同柱的相同計算值。如何更改代碼以消除錯誤,同時保持先前測試的值和結果。

    這是在不使用指標的 EA 中。 HHLL 的值在 EA 本身中。我希望它能夠讀取並獲得觸發信號欄上的 extern 變量的相同結果。

  2. #2
    我將 -1 添加到限制條數中,它似乎可以在不影響結果的任何更改的情況下工作,所以這很好。為了確保 iLowest/iHigheset 不返回 -1 我這樣做了,很確定這不是正確的方式 b/c 結果很糟糕... 插入代碼 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,IntInd1S2,BarCount1 IntInd1S1) lt; 0) || (iLowest(SymbolToManage,IntIndTF1,MODE_LOW ,IntInd1S2,BarCount1 IntInd1S1) lt; 0)) 返回; if ((iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd1S2,BarCount1 IntInd1S1) gt;-1) (iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,BarCount1 IntInd1S1) gt;-1)) 繼續; PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd1S2,BarCount1 IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,BarCount1 IntInd1S1)#93;;/PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); }

  3. #3

    Quote Originally Posted by ;
    是的,這是上面的複制和粘貼錯誤。不確定我是否理解第 17 條之後的運行概念以及如何實現它或它為什麼起作用。與此同時,我已經解決了這個問題……重複第二次,為 ea 中的第二個指標使用第二組變量。提到的帶有時移的柱形圖使測試更受控制,並且對 MT4 編譯器的心血來潮更少,因為它正在測試任何 TF,但放在 4 小時圖表上。最終,我希望 ea 以相同的結果運行相同的結果,而不管它是什麼 TF 圖表......
    Don#8217;不要忘記 (-1) 從大小轉換為位置 BarCount1=LimitBars1-1 並確保 iLowest/iHighest 不返回 -1

  4. #4
    是的,這是上面的複制和粘貼錯誤。不確定我是否理解第 17 條之後的運行概念以及如何實現它或它為什麼起作用。與此同時,我已經解決了這個問題……重複第二次,為 ea 中的第二個指標使用第二組變量。 Beerrun 提到的帶有時移的條形圖使測試更受控制,並且更少受 MT4 編譯器的突發奇想,因為它正在測試任何 TF,但放在 4 小時圖表上。最終,我希望 ea 以相同的結果運行相同的結果,而不管它在哪個 TF 圖表上。我認為從 Bars() 讀取 TF 是解決方案的一部分。數組超出範圍錯誤,仍然是一個問題,第 17 根柱的意義是什麼?如何讓 ea 在第 17 根之後運行?插入代碼 int BarCount1; int TFBars1 = Bars(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_HIGH,IntInd1S2,BarCount1 IntInd1S1)#93;; ETC... }

  5. #5

    Quote Originally Posted by ;
    我已經設法讓變量通過並用這個非常接近地模擬以前的結果...... int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntInd1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High[iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd1S2,i IntInd1S1)]; PerL1 = Low[iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,i IntInd1S1)]; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High[iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd2S2,i IntInd2S1)]; PerL2 = Low[iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S2,i IntInd2S1)];...
    你確定你從上面得到錯誤嗎?因為這沒有填充任何數組,它只是將最後一個 i 的值分配給雙精度數並執行不必要的循環。你好! ofc 它可能會超出範圍內的一些高或低。為此,只需將 ea 設置為在第 17 根柱之後運行。

  6. #6

    Quote Originally Posted by ;
    好吧,在測試期間,我仍然在其他符號上遇到數組超出範圍的錯誤。通過刻度檢查將其置於刻度之外使其更快是一個優點,但它並不能解決原始問題。回到摔跤吧。
    或許使用 Bars() 函數,該函數將交易品種和時間框架作為參數,而不是限制為當前圖表交易品種和時間框架的 Bars 變量。需要考慮的額外事項是,如果 iLowest/Highest 返回錯誤,您#8217;d 正在執行 Low[-1]

  7. #7
    我已經設法讓變量通過並用這個非常接近地模擬以前的結果......插入代碼 int counted_bars=Bars-MathMax(MathMax(IntInd1S2,IntInd2S2),MathMax(IntInd1S1,IntInd2S1)); for(int i=Bars-counted_bars-1;igt;0;i--) { PerH1 = High#91;iHighest(SymbolToManage,IntIndTF1,MODE_HIGH,IntInd1S2,i IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,i IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = 高#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd2S2,i IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S2,i IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits); 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_HIGH,IntInd1S2,IntInd1S1)#93;; PerL1 = Low#91;iLowest(SymbolToManage,IntIndTF1,MODE_LOW,IntInd1S2,IntInd1S1)#93;; PerM1 = NormalizeDouble((PerH1 PerL1)/2,Digits); PerH2 = High#91;iHighest(SymbolToManage,IntIndTF2,MODE_HIGH,IntInd2S2,IntInd2S1)#93;; PerL2 = Low#91;iLowest(SymbolToManage,IntIndTF2,MODE_LOW,IntInd2S2,IntInd2S1)#93;; PerM2 = NormalizeDouble((PerH2 PerL2)/2,Digits); }

  9. #9

    Quote Originally Posted by ;
    {quote} 是的,它應該工作。如果沒有,則創建一個變量以保持運行計數。否則,它將在每個刻度上為每個柱運行循環。
    這就是我所做的... 插入代碼 int counted_bars=IndicatorCounted(); for(int i=Bars-counted_bars-1;igt;0;i--) { etc. etc. etc. } 似乎它可能已經處理了超出範圍的數組,我需要檢查其他符號來測試.然而,tick 的測試需要永遠進行。因此,我查看了調用此代碼的時間和地點,並將其從 void OnInit 的頂部取出,並將其放在 Inserted Code static datetime prevtime = Time#91;0#93;; 之後。 if (prevtime == Time#91;0#93 返回; prevtime = 時間#91;0#93;;我在 OnInit 的底部附近有它不需要逐個逐個檢查,只需按柱,而退出策略的其他部分需要逐個監視。我認為它現在應該可以工作了。我必須對照其他給我帶來問題的符號來檢查它,但是通過刻度檢查將代碼從刻度中取出可以讓它運行得更快。

  10. #10

    Quote Originally Posted by ;
    {quote} 代碼僅在 ea 內,不是指標,IndicatorCounted() 仍可在 ea 內工作嗎?
    是的,它應該工作。如果沒有,則創建一個變量以保持運行計數。否則,它將在每個刻度上為每個柱運行循環。

發布權限

  • 您不可發布新主題
  • 您不可回复
  • 您不可發布附件
  • 您不可編輯您的帖子
  •  
  • BB代碼是打開的
  • 表情符號是打開的
  • [IMG]代碼是打開的
  • [視頻]代碼是打開的
  • HTML代碼是關閉的
forex-pedia網站使用cookie 文字跟蹤
forex-pedia.com網站使用cookie 文字跟蹤,某些設定已經固定。您可以點擊此處閱讀我們的Cookie使用說明。 請點擊右鍵接受我們的cookies。如果您選擇繼續使用forex-pedia.com網站,我們將認為您接受我們的cookies。