存取陣列超過範圍

  •   243 
  • 最後發表   Y0  2023 八月 10
Y0 發文於   2023/08/05

var: i(0);
array: _switch1[](false);

if symbolType=2 then settotalBar(270)
else if symbolType=3 then settotalBar(1140);

if symbolType=2 then begin
   if date<>date[1] then begin 
      array_SetMaxIndex(_switch1,5);

      for i=1 to 5 begin 
         _switch1[i]=false;
      end;
   end;
   _switch1[1]=true;
end;

指標腳本如上,用在股票的1分K上都會顯示存取陣列超過範圍

else if symbolType=3 then settotalBar(1140);

但如果把上面這行刪掉就不會報錯,想請問是什麼原因

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/08/08

Hello Y0,

 

settotalbar函數比較特別,並不會因為if判斷來決定要使用270還是1140,而會是腳本上最後一個成立。

您這邊的狀況就是settotalBar(1140)。

而設為1140的話,1分鐘頻率第一根Bar不會符合date<>date[1],故_switch1不會被設定陣列大小,因此在_switch1[1]=true;執行時出錯。

建議您可以把 array_SetMaxIndex(_switch1,5); 放在 if date <> date[1] 前面,確保使用陣列時一定會先設定陣列大小。

Y0 發文於   2023/08/08

那如果我只想在date<>date[1]的時間點初始化陣列的話,該如何改寫

Y0 發文於   2023/08/08

再問一個問題

settotalBar(2);
setBackBar(20);
plot1(ATR(20)[1]);

這個顯示前一天ATR的值會不太正常

settotalBar(2);
setBackBar(20);
plot1(average(c,20)[1]);

但這前一日20日平均就可以正常顯示

 

可以講解一下這其中的原理嗎?

 

XQ小幫手 發文於   2023/08/10

Hello Y0,

 

只想在date<>date[1]的時間點初始化陣列

=> 那您可以用變數控制,確保取用陣列資訊 (_switch1[1]=true;) 時該陣列已經初始化。

 

ATR的值會不太正常

=> ATR計算時要使用 TR,TR是用函數計算出來,故要取用前期值時需要腳本運算過。

所以資料讀取筆數要足夠才行。

 

average(c,20) 是使用收盤價。

收盤價是已存在的資料,不需經過腳本計算即可取用。

發表回覆
Close