奇狐社區論壇
在這個頁面顯示本主題全部的 10 個文章

奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- 收盤價陣列寫法 (http://www.chiefox.com.tw/bbs/showthread.php?threadid=21190)


由 一心不亂 在 2017-12-18 13:58 發表:

收盤價陣列寫法

請問版主:

MAXKBAR:= 1000; //設定運算近期1000根
StPos:=datacount-MAXKBAR+1;
x:=c;
if StPos<1 then StPos:=1;
for i=datacount downto StPos do begin
x[i]:=close[i]; //將每根K棒收盤價存入X陣列中
end;


但是編譯不通過請問怎麼改?

謝謝


由 cgjj 在 2017-12-18 14:12 發表:

回覆: 收盤價陣列寫法

引用:
最初由 一心不亂 發表
請問版主:

MAXKBAR:= 1000; //設定運算近期1000根
StPos:=datacount-MAXKBAR+1;
x:=c;
if StPos<1 then StPos:=1;
for i=datacount downto StPos do begin
x[i]:=close[i]; //將每根K棒收盤價存入X陣列中
end;


但是編譯不通過請問怎麼改?

謝謝



Close 是系統函數,不能直接用 [n] 處理
必須先指定給一個變數,才能以變數[n]存取

不需這麼麻煩,這樣處理就可:
MAXKBAR:=1000;
X:Close;
if datacount>=MAXKBAR then tmp:=SETLBOUND(X,datacount-MAXKBAR+1);


由 一心不亂 在 2017-12-18 14:33 發表:

謝謝版主,
這樣改正後自當前K棒算起1000根K棒的收盤價都存在tmp陣列中是嗎?
如果我要調用自當前K棒算起第M根的收盤價是用 y:=datacount-M+1
tmp[Y] 就是我要的收盤價嗎?


由 cgjj 在 2017-12-18 14:40 發表:

引用:
最初由 一心不亂 發表
謝謝版主,
這樣改正後自當前K棒算起1000根K棒的收盤價都存在tmp陣列中是嗎?
如果我要調用自當前K棒算起第M根的收盤價是用 y:=datacount-M+1
tmp[Y] 就是我要的收盤價嗎?



不是,是在 X 陣列中
tmp 是數列下界

這個問題,您實際跑公式看就知結果了
程式碼不要僅用看的,要實際去跑~~


由 一心不亂 在 2017-12-19 18:49 發表:

lambda:=100;
MAXKBAR:= 50;
x:h;Z:=0;H4:=0;H1:=0;HH5:=0;HH2:=0;H2:=0;HH3:=0;H3:=0;HB:=0;H5:=0;
a:=x*0;b:=x*0;c1:=x*0;
if datacount>=MAXKBAR then tmp:=SETLBOUND(X,datacount-MAXKBAR+1);
StPos:=DATACOUNT;

a[tmp]:=1.0+lambda;
b[tmp]:=-2.0*lambda;
c1[tmp]:=lambda;

FOR i=tmp to i<StPos-2 do begin
a[i]=6.0*lambda+1.0;
b[i]=-4.0*lambda;
c1[i]=lambda;
end;

a[tmp]:=5.0*lambda+1;
a[StPos-1]:=1.0+lambda;
a[StPos-2]:=5.0+lambda+1.0;
b[StPos-2]:=-2.0+lambda;
b[StPos-1]:=0.0;
c1[StPos-2]:=0.0;
c1[StPos-1]:=0.0;

//Forward
FOR i=tmp to i<StPos do begin
Z:=a[i]-H4*H1-HH5*HH2;
HB:=b[i];
HH1:=H1;
H1:=(HB-H4*H2)/Z;
b[i]:=H1;
HC:=c1[i];
HH2:=H2;
H2:=HC/Z;
c1[i]:=H2;
a[i]:=(x[i]-HH3*HH5-H3*H4)/Z;
HH3:=H3;
H3:=a[i];
H4:=HB-H5*HH1;
HH5:=H5;
H5:=HC;
end;

//BACKWARD

H2:=0;
H1:=a[StPos-1];
y[StPos-1]:=H1;
for i=StPos-2 downto i<=tmp do begin
y[i]:=a[i]-b[i]*H1-c1[i]*H2;
H2:=H1;
H1:=y[i];
end;

partline(1,y);


出現指標數組下標越界或超出有效數據區間


由 cgjj 在 2017-12-19 20:46 發表:

引用:
最初由 一心不亂 發表
lambda:=100;
MAXKBAR:= 50;
x:h;Z:=0;H4:=0;H1:=0;HH5:=0;HH2:=0;H2:=0;HH3:=0;H3:=0;HB:=0;H5:=0;
a:=x*0;b:=x*0;c1:=x*0;
if datacount>=MAXKBAR then tmp:=SETLBOUND(X,datacount-MAXKBAR+1);
StPos:=DATACOUNT;

a[tmp]:=1.0+lambda;
b[tmp]:=-2.0*lambda;
c1[tmp]:=lambda;

FOR i=tmp to i<StPos-2 do begin
a[i]=6.0*lambda+1.0;
b[i]=-4.0*lambda;
c1[i]=lambda;
end;

a[tmp]:=5.0*lambda+1;
a[StPos-1]:=1.0+lambda;
a[StPos-2]:=5.0+lambda+1.0;
b[StPos-2]:=-2.0+lambda;
b[StPos-1]:=0.0;
c1[StPos-2]:=0.0;
c1[StPos-1]:=0.0;

//Forward
FOR i=tmp to i<StPos do begin
Z:=a[i]-H4*H1-HH5*HH2;
HB:=b[i];
HH1:=H1;
H1:=(HB-H4*H2)/Z;
b[i]:=H1;
HC:=c1[i];
HH2:=H2;
H2:=HC/Z;
c1[i]:=H2;
a[i]:=(x[i]-HH3*HH5-H3*H4)/Z;
HH3:=H3;
H3:=a[i];
H4:=HB-H5*HH1;
HH5:=H5;
H5:=HC;
end;

//BACKWARD

H2:=0;
H1:=a[StPos-1];
y[StPos-1]:=H1;
for i=StPos-2 downto i<=tmp do begin
y[i]:=a[i]-b[i]*H1-c1[i]*H2;
H2:=H1;
H1:=y[i];
end;

partline(1,y);


出現指標數組下標越界或超出有效數據區間



前面您貼的這段程式
根本就還沒有機會跑到 "指標數組下標越界或超出有效數據區間"

因為根本就無法編譯通過,更不用說執行了
請貼上您實際跑的公式!!! 否則難以協助


由 一心不亂 在 2017-12-19 20:57 發表:

我這裡可以編譯通過,附圖是執行時出現的錯誤訊息


由 cgjj 在 2017-12-19 21:45 發表:

引用:
最初由 一心不亂 發表
我這裡可以編譯通過,附圖是執行時出現的錯誤訊息


@@ 您用的是 v5.1 版,我是用 v5.0 測試的

v5.1 編譯檢查的有遺漏

這三行是錯的!!!
a[i]=6.0*lambda+1.0;
b[i]=-4.0*lambda;
c1[i]=lambda;

應該是
a[i]:=6.0*lambda+1.0;
b[i]:=-4.0*lambda;
c1[i]:=lambda;

另外一個看到的問題是
當 datacount<MAXKBAR 時 tmp 這個變數不存在

您先修正這兩部分後,再跑跑


由 一心不亂 在 2017-12-19 23:16 發表:

謝謝總版主幫忙,已經修正上述錯誤,但是還是出現下標越界的問題,雖然再三檢查程式,實在看不出錯在哪裡?還請總版主幫忙除錯一下! 謝謝


由 cgjj 在 2017-12-19 23:44 發表:

引用:
最初由 一心不亂 發表
謝謝總版主幫忙,已經修正上述錯誤,但是還是出現下標越界的問題,雖然再三檢查程式,實在看不出錯在哪裡?還請總版主幫忙除錯一下! 謝謝


迴圈 to xx
和迴圈 downto xx

xx 都寫錯了

xx 是應該是指定要計數到哪個值

而您帶入的 xx,卻都是 邏輯判斷式
判斷式只有成立和不成立(1或0)

因而變成是計數到 1 或 0
故會產生下標越界的問題


全部時間均為台灣時間, 現在時間為20:37
在這個頁面顯示本主題全部的 10 個文章


Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.

簡愛洋行 製作 Copyright 2003-. All Rights Reserved.