請問如何正確print出選股策略中的分鐘k棒資料

  •   414 
  • 最後發表   joE0403  2025 四月 09
joE0403 發文於   2025/03/30

我用交易腳本跑選股腳本,交易腳本程式如下,用1分鐘頻率或15分鐘頻率,開逐筆+觸發即成交,都印不出090000的k棒,請問問題在哪裡?謝謝
完整程式碼貼不上來,就是時間往後類推,想把選股策略中的分鐘k棒資料印出來

input: Capital(10, "每檔資金(萬)");

input: _side(1,inputkind:=Dict(["多單",1],["空單",-1]));

 

var: IDX(0), OrderQuantity(0);

 

IDX = FilledRecordCount;

 

IF (Filled = 0 AND (IDX = 0 OR FilledRecordDate(IDX) <> DATE)) then begin 

   if  _side = 1  

   then begin 

    OrderQuantity = Floor(Capital * 10000 / Close / 1000);

    SetPosition(OrderQuantity, Market);

   end else 

   if  _side = -1  

   then begin 

    if GetSymbolInfo("IsDayTrading") = true then

    OrderQuantity = Floor(Capital * 10000 / Close / 1000);

    SetPosition(-OrderQuantity, Market);

    end;

END;

 

if position <> 0 and filled <> 0 then begin

     if time = 090000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0),"昨天收盤價"+NumToStr(getField("參考價", "D"),2),"當天開盤價"+NumToStr(getField("Open"),2));

     if time = 091500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0));  

if time = 093000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0));

if time = 094500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0));

if time = 100000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0));

if time = 101500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0));

if time = 103000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"均價"+NumToStr(getField("均價"),2),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),

"15分鐘成交量" + NumToStr(getField("成交量", "15"),0));



 

end;

 

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/03/30

用交易腳本跑選股腳本?你可能要先搞清楚,這兩種腳本是無法通用的。選股腳本或選股策略最小的頻率是日資料,無法處理分鐘資料。

你的交易腳本,time=090000藏在position<>0 and filled<>0的條件裡面。若啟動策略時,沒有部位,則無法列印9點時的資訊。

joE0403 發文於   2025/03/31

抱歉教授我沒表達清楚,就是選股策略選出股票後用交易腳本去跑回測,我想看更小時間週期下的價格變化。

但是回測print出來都會包含最大讀取範圍的k棒,請問怎麼改才可以只取當天的完整數據,謝謝

虎科大許教授 發文於   2025/03/31

怎麼改才可以只取當天的完整數據?

if Date=CurrentDate then
    begin
        if time = 090000 then 
            print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,
            "進場日期"+NumToStr(DATE,0),
            "時間"+NumToStr(time,0),
            "均價"+NumToStr(getField("均價"),2),
            "開"+NumToStr(open,2),
            "高"+NumToStr(high,2),
            "低"+NumToStr(low,2),
            "收"+NumToStr(close,2),
            "15分鐘成交量" + NumToStr(getField("成交量", "15"),0),
            "昨天收盤價"+NumToStr(getField("參考價", "D"),2),
            "當天開盤價"+NumToStr(getField("Open"),2));
        if time = 091500 then 
            print(file("Print\print數據用.csv"),
            "商品代碼"+SYmbol,
            "進場日期"+NumToStr(DATE,0),
            "時間"+NumToStr(time,0),
            "均價"+NumToStr(getField("均價"),2),
            "開"+NumToStr(open,2),
            "高"+NumToStr(high,2),
            "低"+NumToStr(low,2),
            "收"+NumToStr(close,2),
            "15分鐘成交量" + NumToStr(getField("成交量", "15"),0)); 
    end;

 

joE0403 發文於   2025/03/31

這樣PRINT出來的資料還是不是回測報告"當天"的K棒資料,看起來從資料讀取範圍~今天(20250331)的K棒全部都PRINT出來了

虎科大許教授 發文於   2025/03/31

你的回測報告「當天」,指的是今天3/31?還是什麼?

joE0403 發文於   2025/03/31

選股策略觸發的日期

虎科大許教授 發文於   2025/03/31

若要限制只有在觸發訊號時Print,則將Print的陳述式寫在有訊號的地方即可。

input: Capital(10, "每檔資金(萬)");
input: _side(1,inputkind:=Dict(["多單",1],["空單",-1]));
var: IDX(0), OrderQuantity(0);
IDX = FilledRecordCount;
if (Filled = 0 and (IDX = 0 or FilledRecordDate(IDX) <> DATE)) then 
    begin 
        if  _side = 1 then 
            begin 
                OrderQuantity = Floor(Capital * 10000 / Close / 1000);
                SetPosition(OrderQuantity, Market);
                if time = 090000 then 
                    print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,
                    "進場日期"+NumToStr(DATE,0),
                    "時間"+NumToStr(time,0),
                    "均價"+NumToStr(getField("均價"),2),
                    "開"+NumToStr(open,2),
                    "高"+NumToStr(high,2),
                    "低"+NumToStr(low,2),
                    "收"+NumToStr(close,2),
                    "15分鐘成交量" + NumToStr(getField("成交量", "15"),0),
                    "昨天收盤價"+NumToStr(getField("參考價", "D"),2),
                    "當天開盤價"+NumToStr(getField("Open"),2));
                if time = 091500 then 
                    print(file("Print\print數據用.csv"),
                    "商品代碼"+SYmbol,
                    "進場日期"+NumToStr(DATE,0),
                    "時間"+NumToStr(time,0),
                    "均價"+NumToStr(getField("均價"),2),
                    "開"+NumToStr(open,2),
                    "高"+NumToStr(high,2),
                    "低"+NumToStr(low,2),
                    "收"+NumToStr(close,2),
                    "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
            end 
        else 
            if  _side = -1 then 
                begin 
                    OrderQuantity = Floor(Capital * 10000 / Close / 1000);
                    SetPosition(-OrderQuantity, Market);
                    if time = 090000 then 
                        print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,
                        "進場日期"+NumToStr(DATE,0),
                        "時間"+NumToStr(time,0),
                        "均價"+NumToStr(getField("均價"),2),
                        "開"+NumToStr(open,2),
                        "高"+NumToStr(high,2),
                        "低"+NumToStr(low,2),
                        "收"+NumToStr(close,2),
                        "15分鐘成交量" + NumToStr(getField("成交量", "15"),0),
                        "昨天收盤價"+NumToStr(getField("參考價", "D"),2),
                        "當天開盤價"+NumToStr(getField("Open"),2));
                    if time = 091500 then 
                        print(file("Print\print數據用.csv"),
                        "商品代碼"+SYmbol,
                        "進場日期"+NumToStr(DATE,0),
                        "時間"+NumToStr(time,0),
                        "均價"+NumToStr(getField("均價"),2),
                        "開"+NumToStr(open,2),
                        "高"+NumToStr(high,2),
                        "低"+NumToStr(low,2),
                        "收"+NumToStr(close,2),
                        "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
                end;         
    end;

joE0403 發文於   2025/03/31

這樣還是不行,我回測策略用很簡單的條件,昨天漲停+成交量>5萬張,選股腳本回測半年只有60次交易次數,卻PRINT出58萬列的資料

虎科大許教授 發文於   2025/04/01

我提供的寫法,確實可以只在有訊號的時候Print。若你仍然沒有得到正確的解答,需要提供完整的程式碼。

joE0403 發文於   2025/04/01

input: Capital(10, "每檔資金(萬)");

var: IDX(0), OrderQuantity(0);

IDX = FilledRecordCount;
//選股條件寫在這邊
/////////////////////////////////////////////////////////////////   
IF (Filled = 0 AND (IDX = 0 OR FilledRecordDate(IDX) <> DATE)) 
   and GetSymbolInfo("IsDayTrading") = true
   and getField("Close","d")[1]=getField("漲停價", "D")[1]
   and getField("Volume","d")[1]>50000 
/////////////////////////////////////////////////////////////////   
   then begin 
    OrderQuantity = Floor(Capital * 10000 / Close / 1000);
    SetPosition(OrderQuantity, Market);
    if time = 090000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0),"昨天收盤價"+NumToStr(getField("參考價", "D"),2),"當天開盤價"+NumToStr(getField("Open"),2));
     if time = 091500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));     
     if time = 093000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 094500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 100000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 101500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 103000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 104500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 110000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 111500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 113000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 114500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 120000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 121500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 123000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 124500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 130000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 131500 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
     if time = 133000 then print(file("Print\print數據用.csv"),"商品代碼"+SYmbol,"進場日期"+NumToStr(DATE,0),"時間"+NumToStr(time,0),"開"+NumToStr(open,2),"高"+NumToStr(high,2),"低"+NumToStr(low,2),"收"+NumToStr(close,2),
     "15分鐘成交量" + NumToStr(getField("成交量", "15"),0));
END;

if 
   Filled > 0 and Position > 0
   and Time >= 132000
then SetPosition(0, Market);

顯示更多回應 發表回覆
Close