您好,
其實我之前想的和實作的, 應該跟小幫手說的差不多,
把A選到的股, 丟進B判斷, 然後BC是跑同一份腳本沒錯,
不過呢~實際執行結果和Log印出的, 好像不是這樣.
做策略回測時的資料切齊,
(1)若有用B進場腳本,BC腳本的close[0]是當日K棒,A腳本的close[0]則是昨日K棒。
(2)若沒用B進場腳本,C腳本的close[0]是當日K棒,A腳本的close[0]也是當日K棒。
我是第(1)種情況,
那先假設我的A選股腳本: 營收YoY需>10%,
BC同份腳本: 會在突破60日季線時進場, 並記錄進場價, 然後移動停利出場.
然後碰到以下幾個問題
第1個問題是:
我發現,就算A明明沒有選出該股,但B腳本因突破季線,變數就記錄為進場並設Ret=1,
B區警示腳本在執行過程中,其實跟本不知A到底有沒有選出該股,
當我的B警示腳本發現突破季線時,我不能直接下ret=1,
而需多做一個判斷=> IF (昨天選股A選中了) THEN ret = 1;
這樣進場點才會正確,然後再看UI那是勾選當期或下期進場.
第2個問題是:
假設只勾同時進場1次,我原以為你們背後的邏輯是:
for 日期開始 to 日期結束 {
A腳本取得上個交易日選股名單;
foreach A腳本中選名單 {
if 未持股 {
if B腳本成立 then 進場;
}
}
if 持股中 {
計算該日淨值;
if C腳本成立 then 出場並算損益;
}
}
但你可以試著都Print到同一份Log,
依Log顯示順序(雖然實務上Log顯示順序也不一定代表實際執行順序),
邏輯比較像是:
for 日期開始 to 日期結束 {
SeriesResultA = A腳本上個交易日所有中選的股票清單;
SeriesResultB = B腳本結果;
SeriesResultC = C腳本結果;
}
for 日期開始 to 日期結束 {
foreach 中選名單SeriesResultA[DateOffset] {
if 未持股 {
if SeriesResultB[DateOffset]成立 then 進場;
}
}
if 持股中 {
計算該日淨值;
if SeriesResultC[DateOffset]成立 then 出場並算損益;
}
}
有點像是拆成二段For迴圈來做的,因此我才會提出最上面Q1的問題,
這二種邏輯,在B腳本裡有存變數的話,做出來的結果會不同。
第3個問題:
BC是同份腳本同份Log情況下,同Date同Symbol,
會在Log中印出了超過2次以上,這樣就蠻怪了,
我用日線頻率且沒有勾逐筆洗價,邏輯上Log只會印出0~2次,而不會超過2次,
超過代表BC腳本在同1根K,有人重覆跑。
第4個(不算問題):
我看Log感覺,BC雖是同一份腳本, 邏輯可以共用(因此可知進場點),
但變數無法真的共用,他們在記憶體中仍是不同的二個變數,對吧?
------
不好意思, 問了很多RD相關的問題,
但對背後的執行邏輯仍然沒弄懂的情況下,
有點不知道怎麼繼續寫下去Orz..
再麻煩您協助確認了
41 評論