資料讀取問題

  •   263 
  • 最後發表   richardchien6  2023 八月 10
richardchien6 發文於   2023/07/31

最近要寫計算買賣家數的程式

碰到資料讀取方式不同時,資料讀取結果似乎不太對的問題

程式如下

input: ratio(20,"賣家家數比買家家數多的比例"),datecount(20,"幾天的工作日");

var:countbuy(0),countsell(0),i(0);//累計家數

 

 

while i < datecount

begin

countbuy = countbuy + GetField("買家數", "D")[i];

countsell = countsell + GetField("賣家數", "D")[i];

 

print("==========up===");

print("當日買:",GetField("買家數", "D")[i]);

print("當日賣:",GetField("賣家數", "D")[i]);

print("當日買賣差額:",GetField("買家數", "D")[i] - GetField("賣家數", "D")[i]);

print("累加買:",countbuy);

print("累加賣:",countsell);

print("日期:",date[i]);

print(i);

//print(i > 5);

print("========down==");

i = i + 1;

end;

 

value5 = getField("營業毛利率", "Q");

value6 = getField("營業毛利率", "Q")[1];

value7 = getField("營業毛利率", "Q")[2];

condition1 = minlist(value5, value6, value7) > 30;

 

print("總共買:",countbuy);

print("總共賣:",countsell);

 

if countbuy * (1 + (ratio/100)) < countsell  and volume > 500 and condition1 then ret = 1; 

目前遇到的問題是

如果資料讀取使用日期,那程式運行結果是對的

但如果資料讀取使用資料筆數,那程式運行結果是錯的

我執行的時間是2023/7/30

但print出來的日期第一個時間點是2023/6/26 (疑似正好是我執行的時間減去我的資料讀取筆數 => 2023/7/30 - 25工作天)

接著是2023/6/21,2023/6/20....
我想要的資料應該是從2023/7/28(五),2023/7/27(四)....

請問若我想要使用資料讀取筆數來跑此程式,程式碼應該做何修改?

附加文件

排序方式: 標準 | 最新
XQ小幫手 發文於   2023/08/02

Hello richardchien6,

 

小幫手認為您想要的跟資料讀取筆數沒有關係。

因為您在腳本使用 while 將運算開始的日期往前20天的數值加總印出,而設定資料讀取筆數的話則是告訴腳本要往前幾根Bar開始運算。

所以會變得從資料讀取筆數開始運算時向前加總。

關於資料讀取筆數的說明可參考資料讀取範圍與腳本執行的關係

 

若只要計算在最新的Bar上的話,可以在 while 外面包一層 if islastbar then begin ... end;

這樣就可以讓這段裡面的腳本只執行在最新的Bar上。

if isLastBar then begin 

    while i < datecount begin

countbuy = countbuy + GetField("買家數", "D")[i];

countsell = countsell + GetField("賣家數", "D")[i];

print("==========up===");

print("當日買:",GetField("買家數", "D")[i]);

print("當日賣:",GetField("賣家數", "D")[i]);

print("當日買賣差額:",GetField("買家數", "D")[i] - GetField("賣家數", "D")[i]);

print("累加買:",countbuy);

print("累加賣:",countsell);

print("日期:",date[i]);

print(i);

//print(i > 5);

print("========down==");

i = i + 1;

        end;

    end;

richardchien6 發文於   2023/08/02

小幫手您好,先謝謝您的解答

這裡我有兩個問題想請教

(1)根據你們資料讀取筆數的教學

我的理解是:

假設資料讀取筆數為10

那他就是抓從11天前到昨天的K棒作為資料讀取
並從11天前開始往右執行程式碼
假設在執行第11天前的K棒時,如果執行close,close[1]。意涵就是:close => 第11天前的收盤價,close[1] => 第12天前的收盤價

請問這樣的理解是否正確?

(2)根據小幫手給的程式碼加入的if isLastBar then begin ....

程式無法運行

我print出來只會執行到前一天的日期(執行當天2023/8/2),所以不會觸發islastbar。

可能是因為資料讀取只會讀取到前一個K棒

請問該如何解決?
在請小幫手或大神回復了

XQ小幫手 發文於   2023/08/04

Hello richardchien6,

 

1.是的,你理解的沒錯。

所以 while i < datecount 只會運作在第一次執行腳本的時候,依您的例子就會是第11天前的那一根Bar。

此之後 i 就會因維持在等於 datecount 所以不再執行。

 

2.小幫手不知道您是怎麼操作的,如果可以的話麻煩更詳細的描述。(ex. 回測還是即時、回測和策略設定)

如果您希望印出特定日期向前N天的資訊的話,可以把 if isLastBar then begin .... 改成 if date = 想要的特定日期 then begin ....

 

如果希望每根Bar都向前印出N天的話,可以在 while i < datecount begin 前面加上

i = 0;

countbuy = 0;

countsell = 0;

來將累積值重置,這樣每次腳本運算時就會向前印出N天資訊,也不會發生 countbuy/countsell 跨Bar持續累加的狀況。

richardchien6 發文於   2023/08/07

很抱歉,這陣子比較忙,比較晚回復

問題解決了,感謝小幫手的回覆,前一次之所以會無法執行可能是當天XQ資料還沒進來,導致當天沒有資料可以撈

這邊有些問題想請教小幫手及各位大神

1. 請問小幫手上面回答說的"此之後 i 就會因維持在等於 datecount 所以不再執行。"是甚麼意思呢?
不是應該是 i 從 0 開始,並隨著迴圈的執行而往上加嗎?

2. 請問你們的官方教學內容範例為

"資料讀取範圍=10筆, 不包含當日即時K棒"

下方又寫道 "假設資料讀取範圍是10的話,則表示選股腳本總共要跑10筆資料,同時判斷第10筆資料是否ret=1。"

這兩句是否有矛盾? 理論上跑10筆資料只會跑到昨日K棒而已
還是是我理解錯誤呢?

再請小幫手解答,感謝

XQ小幫手 發文於   2023/08/09

Hello richardchien6,

 

1.小幫手指的是這一段。

while i < datecount begin

......

i = i + 1;

end;

由於您的i並沒有重置,所以腳本只會在第一次腳本運算時計算時進入 while 迴圈,並將i累加到等於 datecount。

第二次運算時 i 已經等於 datecount 了,所以不會進入while會圈。

 

2.選股不會有當日即時K棒,因為選股只提供日頻率或以上完整的Bar。

所以資料讀取筆數設為10的話,就會是最新的10根完整K棒來運算,並在最新的那根判斷ret = 1是否成立。

richardchien6 發文於   2023/08/10

好的理解,感謝小幫手的回答

發表回覆
Close