1分K策略語法問題

  •   691 
  • 最後發表   xxx  2024 八月 15
xxx 發文於   2024/08/10

以下是我用交易腳本寫的當沖策略,但在執行回測時卻一筆成交紀錄都沒有,且許多個股都出現嘗試除以0的錯誤訊息
回去檢查被放在分母的數值應該都不太可能是0,想請問小幫手是哪裡有問題呢?謝謝

if date<>date[1] then begin

    condition1=false;
    condition2=false;

end;

input:r1(100000,"下單金額");
var:_amount(0);                         {變數紀錄下單量,最多10萬}
_amount=Floor(r1/(closeD(1)*1000));


if time>093000 and time<123000 then begin

    if volume/volume[1]>15 
    and close/close[1]<1.01 
    and close/close[1]>1                     {符合條件則記錄當下的high、close}
    and high/closeD(1)<1.06 then begin           {邏輯是找出爆量但漲不兇的1分K}
        value1=close;                                                                                               
        value2=high;
    end                                             
    else return;                                    

end;


if value1<>0 and value2<>0 and close<value1 then begin

    condition1=true;                {進場條件:跌破value1}
    condition2=false;

end;

if condition1=true and close>=value2 then begin

    condition1=false;               {出場條件:突破value2}
    condition2=true;

end;



if position=0 and condition1 then setposition(-_amount, close);
if position=-_amount and condition2 then setposition(_amount, Market);

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2024/08/10

若你使用1分鐘頻率,則流動性差的個股,很有可能存在1分鐘內沒有成交量的情況,這時候就會有嘗試除以0的錯誤。

xxx 發文於   2024/08/10

謝謝教授回覆,嘗試除以0錯誤的部分我大概能理解了,不過回測報告沒有出現任何交易紀錄,我是否在進出場條件的語法有那裡弄錯了?

虎科大許教授 發文於   2024/08/11

符合條件時,你讓value1=close; 但要設定condition1時,條件卻是value1<close,這樣的話,condition1永遠不可能為true。

xxx 發文於   2024/08/11

想請教虎科大教授,因為XS是每根K棒跑一次程式碼,因此我自己對這個策略的理解是如此的

1.假如093001的1分K符合條件,則這跟K棒的close、high會被記錄下來,且此時進出場條件都不會執行(因為不符合

2.若後續有K棒的close符合進場條件,則condition1=true,此時出場條件同樣不會執行(同樣不符合

3.同理,若後續有K棒的close符合出場條件,則condition2=true

4.另外在出場條件的地方我似乎應該把value1、value2歸零,不然會有完成一次交易但value1、value2還是不變的問題

會這麼認為是因為我用同樣的概念寫日K策略(符合條件1用變數紀錄,後續有K棒符合條件2則ret=1....),確實可以跑出如我預期的結果,但以教授您回覆的意思似乎是所有條件只能在單根K棒中運作,想請問是不是我有地方理解錯誤了?

虎科大許教授 發文於   2024/08/11

若你需要符合條件一直更新value1及value2,則需要使用加intrabarpersist宣告的變數。另外,避免分母為零,可用IFF函數處理。

var: intrabarpersist va1(0), intrabarpersist va2(0);

if IFF(volume[1]>0,volume/volume[1],0)>15 

    and close/close[1]<1.01 

    and close/close[1]>1                     {符合條件則記錄當下的high、close}

    and high/closeD(1)<1.06 then begin           {邏輯是找出爆量但漲不兇的1分K}

        va1=close;                                                                                               

        va2=high;

    end                                             

    else return;                                    

end;

xxx 發文於   2024/08/11

請問虎科大教授,使用intrabarpersist的目的是為什麼呢?這邊所要記錄的high、close應該不會因為1分K逐筆洗價而有所變動?

虎科大許教授 發文於   2024/08/12

沒加的話,若該K最後一筆成交價不符合條件,則不會計算value1,value2,它們在每筆洗價時,原本的數值會恢復到前根K的值。

XS小編 發文於   2024/08/15

Hello xxx,

 

小編補充,您可以參考 intrabarpersist 的說明,若腳本是使用逐筆洗價在執行,當變數需要在條件符合時保存數值的話會比較適合以此宣告。

另外可以使用 print 函數將相關數值印出,會比較容易找到問題原因。

 

感謝 虎科大許教授 的熱心回覆。

發表回覆
Close