奇狐社區論壇
在這個頁面顯示本主題全部的 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=18072)


由 Touareg_Smart 在 2013-10-15 18:47 發表:

動態行情

版主您好:

在以下的程式可取得特定板塊中每支股票今日的漲跌幅
for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);
漲跌幅:=DYNAINFO2(14,UseStk)*100;
end

但由於是用DYNAINFO,所以是動態行情沒有歷史資料,所以我將其改成非動態行情 : 漲跌幅:= "UseStk$Close" - Ref("UseStk$Close",1) 但一直語法錯誤,所以請問是否有可以解決的方法。

謝謝


由 cgjj 在 2013-10-16 09:05 發表:

回覆: 動態行情

引用:
最初由 Touareg_Smart 發表
版主您好:

在以下的程式可取得特定板塊中每支股票今日的漲跌幅
for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);
漲跌幅:=DYNAINFO2(14,UseStk)*100;
end

但由於是用DYNAINFO,所以是動態行情沒有歷史資料,所以我將其改成非動態行情 : 漲跌幅:= "UseStk$Close" - Ref("UseStk$Close",1) 但一直語法錯誤,所以請問是否有可以解決的方法。

謝謝



原作法存在兩個問題:
1.雙引號內不可有變數存在, 故會語法錯誤
2.相同東西被引用了2次, 多耗費許多效能

請改用 STKINDI 函數來做
將算漲幅的部分, 寫在子公式中, STKINDI直接引用算完的結果
如此只需引用一次就可得到結果
註: STKINDI 函數的第一個參數可帶入 UseStk 變數


由 Touareg_Smart 在 2013-10-16 21:04 發表:

回覆: 回覆: 動態行情

引用:
最初由 cgjj 發表
原作法存在兩個問題:
1.雙引號內不可有變數存在, 故會語法錯誤
2.相同東西被引用了2次, 多耗費許多效能

請改用 STKINDI 函數來做
將算漲幅的部分, 寫在子公式中, STKINDI直接引用算完的結果
如此只需引用一次就可得到結果
註: STKINDI 函數的第一個參數可帶入 UseStk 變數



版主您好:

我更改了程式寫,但仍是語法錯誤,請幫忙看一下是那出錯了,謝謝...
for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);
//漲跌幅:=DYNAINFO2(14,UseStk)*100;
漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6);
end


由 cgjj 在 2013-10-16 23:45 發表:

回覆: 回覆: 回覆: 動態行情

引用:
最初由 Touareg_Smart 發表
版主您好:

我更改了程式寫,但仍是語法錯誤,請幫忙看一下是那出錯了,謝謝...
for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);
//漲跌幅:=DYNAINFO2(14,UseStk)*100;
漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6);
end



UseBlk 這變數, 您有指定內容給它嗎?


由 Touareg_Smart 在 2013-10-17 13:44 發表:

回覆: 回覆: 回覆: 回覆: 動態行情

引用:
最初由 cgjj 發表
UseBlk 這變數, 您有指定內容給它嗎?


有! 若我改回原來的DYNAINFO2,整段是沒問題的,若改成STKINDI會有語法錯誤


由 cgjj 在 2013-10-17 13:54 發表:

回覆: 回覆: 回覆: 回覆: 回覆: 動態行情

引用:
最初由 Touareg_Smart 發表
有! 若我改回原來的DYNAINFO2,整段是沒問題的,若改成STKINDI會有語法錯誤


試過ok唷, 若仍不行請把整段程式貼上來, 比較好協助您


由 Touareg_Smart 在 2013-10-17 16:51 發表:

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 動態行情

引用:
最初由 cgjj 發表
試過ok唷, 若仍不行請把整段程式貼上來, 比較好協助您


版主您好:

我剛才也試了一下,若是原來的程式碼確實是可以的,但如果加入對"漲跌幅"做條件的判斷的程式碼,就不可以了,我想應該是DYNAINFO2是返回常數,而STKINDI是返回序列吧 ?如果是該如何解決呢?

程式如下:
A:=0;
for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);
//漲跌幅:=DYNAINFO2(14,UseStk)*100;
漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6);
if 漲跌幅 > 0 then A : A + 漲跌幅;
end


由 cgjj 在 2013-10-17 17:10 發表:

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 動態行情

引用:
最初由 Touareg_Smart 發表
版主您好:

我剛才也試了一下,若是原來的程式碼確實是可以的,但如果加入對"漲跌幅"做條件的判斷的程式碼,就不可以了,我想應該是DYNAINFO2是返回常數,而STKINDI是返回序列吧 ?如果是該如何解決呢?

程式如下:
A:=0;
for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);
//漲跌幅:=DYNAINFO2(14,UseStk)*100;
漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6);
if 漲跌幅 > 0 then A : A + 漲跌幅;
end



if 條件式 then .....
其中的 條件式 , 不可為數列

需如此處理
原碼:
A:=C*0; for i= 1 to STKCOUNT(UseBlk) do begin UseStk:=STKFROMBLK(UseBlk,i); //漲跌幅:=DYNAINFO2(14,UseStk)*100; 漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6); if lbound(漲跌幅)>0 then begin A:=A+if(barpos>=lbound(漲跌幅),漲跌幅,0); end; end;


由 Touareg_Smart 在 2013-10-18 08:33 發表:

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 動態行情

引用:
最初由 cgjj 發表
if 條件式 then .....
其中的 條件式 , 不可為數列

需如此處理
原碼:
A:=C*0; for i= 1 to STKCOUNT(UseBlk) do begin UseStk:=STKFROMBLK(UseBlk,i); //漲跌幅:=DYNAINFO2(14,UseStk)*100; 漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6); if lbound(漲跌幅)>0 then begin A:=A+if(barpos>=lbound(漲跌幅),漲跌幅,0); end; end;



版主您好:

雖然lbound可取得序列的最下值,但對A變數仍是有不同的反應。若用原來的DYNAINFO2的寫法,會得到A的正確值(但只有一日)。但是若用StkInDI + lbound的寫法,A值一直不是正確的值,且也不會隨著變化,請問是那出錯了?

for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);

漲跌幅:=DYNAINFO2(14,UseStk)*100;
if 漲跌幅 >0 then begin
A : A + 1;

// 漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6);
//if lbound(漲跌幅)>0 then begin
// A : A + 1;
end;
end;


由 cgjj 在 2013-10-18 08:47 發表:

回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 回覆: 動態行情

引用:
最初由 Touareg_Smart 發表
版主您好:

雖然lbound可取得序列的最下值,但對A變數仍是有不同的反應。若用原來的DYNAINFO2的寫法,會得到A的正確值(但只有一日)。但是若用StkInDI + lbound的寫法,A值一直不是正確的值,且也不會隨著變化,請問是那出錯了?

for i= 1 to STKCOUNT(UseBlk) do begin
UseStk:=STKFROMBLK(UseBlk,i);

漲跌幅:=DYNAINFO2(14,UseStk)*100;
if 漲跌幅 >0 then begin
A : A + 1;

// 漲跌幅:= STKINDI(UseStk, '今日漲跌幅.漲跌幅',0, 6);
//if lbound(漲跌幅)>0 then begin
// A : A + 1;
end;
end;



if lbound(漲跌幅)>0 then begin
這一行是用於避開無效數列
某些股票尚無K線或K線不足時, 會傳回無效數列
無效數列就跳過不計算

它與 if 漲跌幅 >0 then begin 意義大不相同

若您只要累算 漲跌幅 >0 的部分

請把
A:=A+if(barpos>=lbound(漲跌幅),漲跌幅,0);

改為
A:=A+if(barpos>=lbound(漲跌幅),if(漲跌幅>0,漲跌幅,0),0);


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


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

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