指標函數用for迴圈抓group資料問題

  •   33 
  • 最後發表   瞧瞧  18 小時前
瞧瞧 發文於   2026/02/05

您好,

我想尋找每根5分k當時最接近價平的call/put price。

想法是先定義一個group(如: TX2N02的所有選擇權),然後在每根k棒跑group的for迴圈尋找最接近價平的call/put price。

 

執行商品&程式碼如下:

函數:指標函數

執行商品:TX2N0232500C

執行頻率:5分k

Group Input:TX2N02所有選擇權

(圖表的)XS指標計算範圍:選分鐘+近7日

*******************************************************************************

input: OPGroup(Group);

variable:

i(0),

iSpotPrice(0),

CC(0),PP(0),SS(0),KK(0);

 

iSpotPrice = GetSymbolField("FITMN*1.TF", "收盤價");

KK = Round(iSpotPrice*0.01,0)*100; //ATM Strike

For i = 1 to GroupSize(OPGroup)

Begin

If GetSymbolInfo(OPGroup[i],"買賣權")="Call" and GetSymbolInfo(OPGroup[i],"履約價") = KK then CC = GetSymbolField(OPGroup[i],"close"); //ATM Call Price

If GetSymbolInfo(OPGroup[i],"買賣權")="Put" and GetSymbolInfo(OPGroup[i],"履約價") = KK then PP = GetSymbolField(OPGroup[i],"close"); //ATM Put Price

End;

 

print(date,time,iSpotPrice,KK,CC,PP);

*******************************************************************************

 

但print出來的結果好像是抓到一個數列的感覺,而且會一直跑不完。(附件是print出的結果,因為跑不完我中途就先中斷了)

這個做法在過去幾次試過都是可行的,但這週就失敗。(不確定是不是執行的商品1/28完全無成交價的關係?)

再請協助解惑了,感謝!

 (補充:試過若把程式碼裡的KK設為定值(如KK = 33000),就不會無限跑不完,但這結果不是價平,不是我要的)

 

附加文件

排序方式: 標準 | 最新
虎科大許教授 發文於   2026/02/05

從你Print的內容看來,程式應該沒問題。你會感覺迴圈跑不完,是因為每根5分K都要針對群組裡面的商品逐一比對,運算比較慢。2月份第2週到期的選擇權,買賣權加起來的商品數有兩百多檔,全日盤每天有228根5分K,若要算7天,則迴圈數為200*228*7。要提升運算效率,你可以考慮:

(1)找到價平的商品時,用Break跳脫迴圈,不要花時間繼續跑後面不會符合條件的商品。

(2)迴圈中先判斷履約價(不要判斷是買權或賣權),符合才繼續判斷是買權或賣權,接著才將價格賦予變數。

瞧瞧 發文於   2026/02/06

感謝說明~ 想再確認一下

(1) Break跳脫的作法,那我應該input group要分兩群(call put分開)? 才不會因為先找到call,break後就沒有put

(2) 迴圈先判斷履約價,再賦予變數 -> 這部分不太了解,能有個簡單的例子嗎?

非常感謝!!

(不過我仍然疑惑的是....附件output的結果從1/28 15:00開始有每根5分k結果,但跑到1/29後又跳回1/28,他就一直在1/28-1/29來回產生結果...一直跑不完...)

虎科大許教授 發文於   2026/02/06

(1)跳回1/28,應該是你中斷策略之後,並沒有把Log檔刪除。重新啟動策略後,新的Print指令會在同一個檔案裡面往下寫。

(2)請參考下列的程式碼(腳本沒有經過驗證,請自行驗證):

input: OPGroup(Group);
variable:
i(0),
iSpotPrice(0),
CC(0),PP(0),SS(0),KK(0);
iSpotPrice = GetSymbolField("FITMN*1.TF", "收盤價");
KK = Round(iSpotPrice*0.01,0)*100; //ATM Strike
//每根K棒還原變數預設值
condition1=false;
condition2=false;
For i = 1 to GroupSize(OPGroup)
    if GetSymbolInfo(OPGroup[i],"履約價") = KK then
        begin
            If GetSymbolInfo(OPGroup[i],"買賣權")="Call" then
                begin
                    CC = GetSymbolField(OPGroup[i],"close"); //ATM Call Price
                    condition1=true;
                end
            else
                begin
                    PP = GetSymbolField(OPGroup[i],"close"); //ATM Put Price
                    condition2=true;
                end;
            if condition1 and condition2 then break;
        end;
print(date,time,iSpotPrice,KK,CC,PP);

瞧瞧 發文於   2026/02/06

虎科大許教授好~

有確定刪掉Log檔後重跑,一樣是會在1/28-1/29之間反覆產出數字。

 (附件是用你提供的程式碼跑的,一樣會在1/28-1/29之間一直產出數字)

原本的程式碼已經跑了好幾個月都正常,只有遇過一次同樣的情況(那時候以為只是當掉就當沒事),但這週又遇到。

 

我是用副圖指標跑的,商品是"TX2N02C32500.TF",group則用TX2N02全商品(共218個)

還是感謝你提供的程式碼(速度上應該會節省很多),但希望還是可以解決這個問題~~

謝謝!!

附加文件

虎科大許教授 發文於   2026/02/06

你的問題應該是任何商品洗價都會Print所造成。請將最後一行,亦即26行的Print指令與第25行的End;對調。

瞧瞧 發文於   2026/02/06

25、26兩行對調後結果一樣XD

發現可能的問題好像是出在 KK = Round(iSpotPrice*0.01,0)*100; //ATM Strike

若把它改為定值(如: KK = 30000),print出來的時間就是順的不會一直重複跑。

但我要的是即時的價平,所以需要是變數

只是想不到定值跟變數導致結果不同的原因差在哪...

 

瞧瞧 發文於   2026/02/06

推測有可能是group裡面的選擇權流動性太低(有些甚至一整天沒成交),以致for loop的過程一直重複....?

後來直接卡特定的時間後再開始計算(最外層加上 If date >= 20260205 then begin...end),就正常了。

謝謝以上的幫忙!

虎科大許教授 發文於   2026/02/07

這個問題與你的程式無關。看起來應該是1月28日130500之後沒有價格,而系統進行補K的洗價造成。

瞧瞧 發文於   2026/02/07

了解,謝謝!

發表回覆
Close