![]() |
在這個頁面顯示本主題全部的 10 個文章 |
奇狐社區論壇 (http://www.chiefox.com.tw/bbs/index.php)
- 問題交流 (http://www.chiefox.com.tw/bbs/forumdisplay.php?forumid=28)
-- BARSLAST 查詢不存在 (http://www.chiefox.com.tw/bbs/showthread.php?threadid=23799)
BARSLAST 查詢不存在
用過 LBOUND(BARSLAST(x))=0 但看起來不對.也不會是 BARSLAST(x)=0, 這是 THIS BAR. 查了一些資料, 說會回 NO VALUE, 但甚麼是 NO VALUE?
回覆: BARSLAST 查詢不存在
引用:
最初由 seychen 發表
用過 LBOUND(BARSLAST(x))=0 但看起來不對.也不會是 BARSLAST(x)=0, 這是 THIS BAR. 查了一些資料, 說會回 NO VALUE, 但甚麼是 NO VALUE?
回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 cgjj 發表
LBOUND(Y)=0 代表Y為無效數列
若 BARSLAST(X) 結果為無效數列
代表 X 無任何一個位置成立,或 X 為無效數列
例如:
barslast(barpos=0) 此為無效數列
因為沒有K棒barpos值會等於0
BARSLAST(x)=0 是代表當根x成立,並非無效數列
與 LBOUND(BARSLAST(x))=0 狀況大不同
回覆: 回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 seychen 發表
我的原碼如下,我該怎麼辦?
FOR I=1 TO 10 DO BEGIN
// PP:= SUMBARS(持有空手<>0,I);
IF LBOUND(BARSLAST(REF(持有空手<>0,PP+1)))=0 THEN BREAK;
PP:= PP+1+BARSLAST(REF(持有空手<>0,PP+1));
有空:=REF(持有空手,PP);
持有檔數:=持有檔數+if(REF(持有空手,PP)>0, 1, 0);
空手檔數:=空手檔數+if(REF(持有空手,PP)<0, 1, 0);
漲跌幅:=(C - ref(C,PP))/ref(C,PP)*100;
績效:=績效+(有空/100*漲跌幅);
持有績效:=持有績效+(if(有空>0,有空,0)/100*漲跌幅);
空手績效:=空手績效+(if(有空<0,有空,0)/100*漲跌幅);
相對漲跌幅:= ((C-ref(C,PP))/ref(C,PP)-(C100-REF(C100,PP))/REF(C100,PP))*100;
相對績效:=相對績效+(有空/100*相對漲跌幅);
持有相對績效:=持有相對績效+(if(有空>0,有空,0)/100*相對漲跌幅);
空手相對績效:=空手相對績效+(if(有空<0,有空,0)/100*相對漲跌幅);
END;
回覆: 回覆: 回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 cgjj 發表
這只有片段的程式,僅從片段來看
// PP:= SUMBARS(持有空手<>0,I);
這一行被註解掉了,相當於不存在
也就是 PP 實際上並沒有被定義
PP沒有被定義就不應該帶入後面的程序
如此可能會造成無法預期的結果
回覆: 回覆: 回覆: 回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 seychen 發表
這是一個做中短期汰弱擇強的績效驗證程式. 其運作方法是將150檔的追蹤股依照其強弱勢分別買進或賣出以希望取得比大盤好的成績。
此一驗證程式分為主程式及子程式,主程式有一大迴圈以加總所要統計的股票,而子程式則是用一小迴圈希望依據時間將買進, 賣出的時點抓出,並依買進, 賣出的多空來計算出個股績效及相對大盤的績效。
在子程式中, 我原本是用 SUMBARS 來抓多空的進場點,但有一問題,即我的游標只能在第一筆之後的日期,我無法看到日期比較前面的資料。故後來我改程用 BARSLAST,不過依舊是碰到問題,這才來向總版主求救。
//
// 中短期之價格變化及比較
//
//
//======================================================================
NOS:=0;
相對年化報酬率:=0;
持有檔數:=0;
空手檔數:=0;
無效檔數:=0;
合計持有空手:=0;
合計持有:=0;
合計空手:=0;
績效:=0;
合計績效:=0;
相對績效:=0;
合計相對績效:=0;
累積相對績效:=0;
持有合計績效:=0;
持有合計相對績效:=0;
空手合計績效:=0;
空手合計相對績效:=0;
C100:="TW100$Close";
DateStart:=121228;
//==================================================================================================================
UseBlk:='自選-汰弱擇強';
UseBlk:='自選-1.穩定成長追蹤股';
//UseBlk:='自選-2.指數ETF追蹤股';
//UseBlk:='自選-5.循環投資追蹤股';
//UseBlk:='自選-8.波段投資追蹤股';
UseBlk:='自選-剔除';
UseBlk:='自選-5.循環投資追蹤股';
UseBlk:='自選-汰弱擇強';
STKC:= STKCOUNT(UseBlk);
for i=1 to STKC do begin
UseStk:=STKFROMBLK(UseBlk,i);
持有檔數:=Stkindi(UseStk, '汰弱擇強-持有空手子程式.持有檔數',0,6);
空手檔數:=Stkindi(UseStk, '汰弱擇強-持有空手子程式.空手檔數',0,6);
績效:=Stkindi(UseStk, '汰弱擇強-持有空手子程式.績效',0,6);
相對績效:= Stkindi(UseStk, '汰弱擇強-持有空手子程式.相對績效',0,6);
持有績效:=Stkindi(UseStk, '汰弱擇強-持有空手子程式.持有績效',0,6);
持有相對績效:= Stkindi(UseStk, '汰弱擇強-持有空手子程式.持有相對績效',0,6);
空手績效:=Stkindi(UseStk, '汰弱擇強-持有空手子程式.空手績效',0,6);
空手相對績效:= Stkindi(UseStk, '汰弱擇強-持有空手子程式.空手相對績效',0,6);
合計持有:=合計持有+持有檔數;
合計空手:=合計空手+空手檔數;
合計績效:=合計績效+績效;
合計相對績效:=合計相對績效+相對績效;
持有合計績效:=持有合計績效+持有績效;
持有合計相對績效:=持有合計相對績效+持有相對績效;
空手合計績效:=空手合計績效+空手績效;
空手合計相對績效:=空手合計相對績效+空手相對績效;
end;
//==============================================================================================================
//
NOS: STKC;
H1: 合計持有,LINETHICK0;
S: 合計空手,LINETHICK0;
P: 合計績效,linethick0;
CP: 合計相對績效,linethick0;
HP: 持有合計績效,LINETHICK0;
HCP: 持有合計相對績效,LINETHICK0;
SP: 空手合計績效,LINETHICK0;
SCP: 空手合計相對績效,LINETHICK0;
CARR: POW(合計持有/STKC/100+1, 1/10) -1,LINETHICK1,COLORWHITE;
//=======================================================================
// 汰弱擇強-持有空手子程式
// STRTONUM(STKLABEL);
I:=0;
LBPP:=0;
BP:=0;
PP:=0;
PP1:=0;
PP2:=0;
PP3:=0;
持有空手2:=0;
持有空手:=0;
持有1:=0;
空手1:=0;
持有2:=0;
空手2:=0;
持有檔數:=0;
空手檔數:=0;
績效:=0;
相對績效:=0;
持有績效:=0;
持有相對績效:=0;
空手績效:=0;
空手相對績效:=0;
STRTONUM(STKLABEL),LINETHICK0;
C100:="TW100$Close";
月比較MA:=((MA(C,5)-ref(MA(C,5),20))/REF(MA(C,5),20) - (MA(C100,5)-REF(MA(C100,5),20))/REF(MA(C100,5),20) )*100;
MCMM:=月比較MA;
季比較MA:=((MA(C,5)-ref(MA(C,5),60))/REF(MA(C,5),60) - (MA(C100,5)-REF(MA(C100,5),60))/REF(MA(C100,5),60) )*100;
MCMQ:=季比較MA;
半年比較MA:=( (MA(C,5)-ref(MA(c,5),120))/ref(MA(c,5),120) - (MA(C100,5)-REF(MA(C100,5),120))/REF(MA(c100,5),120) )*100;
MCMH:=半年比較MA;
半年大盤MA:= ( (MA(C100,5)-ref(MA(c100,5),120) )/( REF(MA(C100,5),120)) )*100;
INH:=半年大盤MA,COLORYELLOW,linethick0;
持有:= IF( (MCMM > 0 AND MCMQ > 0 AND MCMH > 0) AND (MCMM < MCMQ AND MCMQ < MCMH) AND (MCMM+MCMQ+MCMH) < 50 AND (半年大盤MA < -10), 10, 0),COLORGREEN,LINETHICK0;
空手:= IF( (MCMM < 0 AND MCMQ < 0 AND MCMH < 0) AND (MCMM > MCMQ AND MCMQ > MCMH) AND (MCMM+MCMQ+MCMH > -50) AND (半年大盤MA > 20), -10,0),COLORGREEN,LINETHICK0;
持有2:=IF(持有=10 AND REF(持有,1)<>10, 20, 0),COLORRED,LINETHICK1;
空手2:=IF(空手=-10 AND REF(空手,1)<>-10,-20,0),COLORGREEN,LINETHICK1;
持有空手2:=(持有2+空手2)/20*100;
持有空手:=持有空手2;
持有空手:=if(持有空手<>0 and ( (持有空手 <> ref(持有空手,barslast(ref(持有空手,1) <>0)+1) or barslast(ref(持有空手,1)<>0)>120 )),持有空手2,0);
HS:持有空手;
FOR I=1 TO 10 DO BEGIN
// PP:= SUMBARS(持有空手<>0,I);
IF LBOUND(BARSLAST(REF(持有空手<>0,PP+1)))=0 THEN BREAK;
PP:= PP+1+BARSLAST(REF(持有空手<>0,PP+1));
有空:=REF(持有空手,PP);
持有檔數:=持有檔數+if(REF(持有空手,PP)>0, 1, 0);
空手檔數:=空手檔數+if(REF(持有空手,PP)<0, 1, 0);
漲跌幅:=(C - ref(C,PP))/ref(C,PP)*100;
績效:=績效+(有空/100*漲跌幅);
持有績效:=持有績效+(if(有空>0,有空,0)/100*漲跌幅);
空手績效:=空手績效+(if(有空<0,有空,0)/100*漲跌幅);
相對漲跌幅:= ((C-ref(C,PP))/ref(C,PP)-(C100-REF(C100,PP))/REF(C100,PP))*100;
相對績效:=相對績效+(有空/100*相對漲跌幅);
持有相對績效:=持有相對績效+(if(有空>0,有空,0)/100*相對漲跌幅);
空手相對績效:=空手相對績效+(if(有空<0,有空,0)/100*相對漲跌幅);
END;
H1: 持有檔數,linethick0;
S: 空手檔數,linethick0;
P: 績效,linethick0;
CP: 相對績效,linethick0;
HP: 持有績效,linethick0;
HCP: 持有相對績效,linethick0;
SP: 空手績效,linethick0;
SCP: 空手相對績效,linethick0;
IF I=1 THEN BEGIN
PP1:=PP;
END;
IF I=2 THEN BEGIN
PP2:=PP;
END;
IF I=3 THEN BEGIN
PP3:=PP;
END;
I: I;
PP1: PP1,COLORWHITE,LINETHICK1;
PP2: PP2,COLORWHITE,LINETHICK1;
PP3: PP3,COLORWHITE,LINETHICK1;
;
//=======================================================================
原碼:
累計SS:0; SS:=STKINDI(UseStk,'公式名稱.變數名',0,6); if lbound(SS)>0 then begin //判斷是否為無效數列,若非無效數列才進行累加作業,否則跳過 //累加前,先將數列開頭無效區域補零,讓數列自首根歷史K棒即開始有效 SS:=if(barpos>=lbound(SS),SS,0); 累計SS:=累計SS+SS; end;
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 cgjj 發表
處理的方式大有問題!!!
因為每個股票數據長短不一(有效範圍不同),且不一定都有買賣訊
以 Stkindi 搭配迴圈依序引用指定板塊所有股票的指標值
您需要注意幾件事
1.當 Stkindi 返回結果為無效數列時,需要有相應的處置
2.每個股票 Stkindi 返回的結果,數列有效起點未必一致
若要累計,需先將數列有效起點轉為一致,才能正常累加
3.執行這樣的動作,請在加權或櫃台指數中跑(因為大盤必有交易)
處理範例如下:
原碼:
累計SS:0; SS:=STKINDI(UseStk,'公式名稱.變數名',0,6); if lbound(SS)>0 then begin //判斷是否為無效數列,若非無效數列才進行累加作業,否則跳過 //累加前,先將數列開頭無效區域補零,讓數列自首根歷史K棒即開始有效 SS:=if(barpos>=lbound(SS),SS,0); 累計SS:=累計SS+SS; end;
另外,有些地方可以優化!
例如:
持有檔數:=持有檔數+if(REF(持有空手,PP)>0, 1, 0);
可以直接簡化為:
持有檔數:=持有檔數+(REF(持有空手,PP)>0);
不需要用 if(條件,1,0)
因為 條件成立=1,條件不成立=0
再例如:
持有2:=IF(持有=10 AND REF(持有,1)<>10, 20, 0
可以直接簡化為:
持有2:=(持有=10 AND REF(持有,1)<>10)*20;
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 seychen 發表
版主真是洞若觀火. 我確實碰到了以上的問題,不過我是透過股票的篩選以避掉問題,基本上,我只選上市超過十年以上的公司。且我自訂了 1121228 為起點。
此外,我仍想知道我一開始所提的 barslast(X) no value 該如何撰寫的問題
回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: BARSLAST 查詢不存在
引用:
最初由 cgjj 發表
透過股票的篩選以避掉問題!!!
那是避不掉的啦!
就算資料等長,但條件成立位置不一定相同
故計算完的結果,有效起點未必會是一致!
故一定都需要有相應處理。
| 全部時間均為台灣時間, 現在時間為07:40 | 在這個頁面顯示本主題全部的 10 個文章 |
Powered by: vBulletin Version 2.3.0 - Copyright©2000-, Jelsoft Enterprises Limited.
簡愛洋行 製作 Copyright 2003-. All Rights Reserved.