您好,我在策略雷達使用進出場策略各一個,多空設定上不察皆設成"多"方。不曉得會不會對觸發結果有影響? 因為我發現某檔股票我今天才收到出場策略(今天剛好除息),但我好奇地用同一組進出場策略做近三年回測,發現該檔股票最近一次出場日卻是7/3而非雷達給的今天7/6。這會是出場策略設成多方造成的嗎? 先謝謝回答。
策略雷達多空方向設定
- 793
- 最後發表 查理布朗 2018 一月 18
Hi 查理布朗,
Q1 多空設定上不察皆設成"多"方。不曉得會不會對觸發結果有影響?
A1 請您提供策略雷達【內容】與【下單設定】以便小幫手分析,如下兩圖,


會優先以策略雷達【下單設定】的觸發動作為優先。預設是依照【內容】的多空設定,不過觸發動作若設定與【內容的多空設定】不同,則觸發下單時會以【下單設定】的觸發動作為主。例如下單設定設為多方,但內容多空方向設定為空方,則下單時會送出多方部位的委託單。
若沒有使用下單設定,則會以策略雷達【內容】多空方向為設定,若警示腳本所設定的條件皆達成,則會觸發訊號。例如多空方向為空方,此時達成條件,就會觸發訊號,在警示提示視窗中會看到方向為空方的提示。
Q2 我好奇地用同一組進出場策略做近三年回測,發現該檔股票最近一次出場日卻是7/3而非雷達給的今天7/6。這會是出場策略設成多方造成的嗎?
A2 這部分小幫手需要查看您的回測設定,如下圖,與腳本中的程式碼,才能確定原因為何,

若您的回測設定中,有勾選模擬洗價,那回測結果會與策略雷達觸發不同;若沒有勾選,但還是不同,則要查看您的程式碼腳本、策略雷達內容設定 以及回測設定,較能查明原因,謝謝。
您好,我的雷達設定已更改多空方向為空方如下圖。但昨天之前,多空方向不小心設為多方。

因為我沒有連接下單,所以下單內容為空白如下圖

==============================================================================================
以下是回測設定

出場策略程式碼如下

回測鉅邁(8435) 20150101-now 的回測結果之交易分析如下

我檢查過雷達的紀錄,鉅邁的確在07/05除息那天才通知我要出場。另,是否可以幫我解惑一下何以模擬洗價會導致同一腳本的回測結果和雷達觸發結果不盡相同。如果真如此,我是否不該相信回測結果。先謝謝回覆。
Hi 查理布朗,
謝謝您提供相關資訊,
這個問題,主要是您有使用模擬逐筆洗價來進行回測,
由於模擬逐筆洗價,不同於實際上的逐筆洗價,
所以跑出來的結果會與策略雷達有落差,
至於模擬逐筆洗價,也就是模擬K棒是怎麼模擬出來的,小幫手再詳細說明如下:
當您勾選模擬逐筆洗價功能時,系統會依照這根K棒所對應的歷史成交資料來產生多筆 O/H/L/C/V 的序列,並且依照此序列一一判斷是否需要進場以及停損/停利。
資料頻率為【日線】:
根據此頻率的 【5分鐘】的資料,模擬當時K棒的 O/H/L/C 形成順序,每筆K棒執行至多 4 次,讓每次執行時的 close 價可以碰觸到 O/H/L/C 這四個價位,模擬這一筆 K 棒的發展順序。
如果這這一筆 K棒 的資料順序是O,H,L,C的話:
第一次洗價:O/O/O/O,假設此時 close = O
第二次洗價:O/H/O/H,假設此時 close = H
第三次洗價:O/H/L/L ,假設此時 close = L
第四次洗價:O/H/L/C ,假設此時 close = C
如果這一筆 K棒 的資料順序是 O,L,H,C的話:
第一次洗價:O/O/O/O,假設此時 close = O
第二次洗價:O/O/L/L ,假設此時 close = L
第三次洗價:O/H/L/H ,假設此時 close = H
第四次洗價:O/H/L/C ,假設此時 close = C
若H/L在同一根 1 分鐘 K棒出現的話,則依照這一根 K棒是紅棒(Close > Open) 或是黑棒(C > O)而有所不同。如果是紅棒,則順序為O,L,H,C,反之則順序為 O,H,L,C。
若 H or L 價位與 Close 價或是 Open 價相同時,則可以省略其中部分洗價時機點。
成交量則平均分布到每一次洗價的時機點。例如如果這筆 K棒 洗三次,則第一次成交量 = 1/3V ,第二次成交量= 2/3V, 最後一次則是V。
由於系統端沒有這個商品的 1 分鐘對應資料時,則模擬 O/H/L/C 的方式會改成依照 High - Open 根 Open - Low 的比較決定:
如果 High - Open < Open - Low 的話,則假設K棒的發展為O,H,L,C
反之則假設K棒的發展為O,L,H,C
您可以試試看,將回測資料頻率調至1分鐘,並且進出場策略皆別勾選模擬逐筆洗價,
跑出來的結果,應該會較接近策略雷達跑出來的結果。
或者您若方便,也可以將您進場腳本策略程式碼,貼給小幫手查看,以便小幫手查看與分析,謝謝。
感謝詳盡回覆。我的進場策略如下圖,

即使進出場都不勾選模擬洗價,回測結果告訴我鉅邁(8435)應該在7/4出場,也就是除息前一天。但我是在7/5收到雷達訊號。
如果我回測頻率選用1分鐘,用我的進出場策略回測 8435,結果是失敗。如下圖

再請教幾個問題,
1. 根據您的回覆,是否意謂著使用者回測策略時不要勾選洗價較好?
2. 我該多相信回測的結果?
感謝
Hi 查理布朗,
呈請複製您的進場策略程式碼,並貼至此,以便小幫手對照,感激不盡,謝謝。
Hi, 小幫手, 現進場策略如下
input: day(14, "DMI計算區間"), DI_Growth(1.00, "DI成長率"), ADX_growth(1.04, "ADX成長率"), TXT1("適用日線");
value1 = xf_directionmovement("W", day,value4,value5,value6);//以輸入天數計算DMI,並輸出週頻率的DI,-DI,ADX
value40 = xf_getvalue("W", value4, 0);//本週DI值
value41 = xf_getvalue("W", value4, 1);//上週DI值
value50 = xf_getvalue("W", value5, 0);//本週-DI值
value51 = xf_getvalue("W", value5, 1);//上週-DI值
value60 = xf_getvalue("W", value6, 0);//本週ADX值
value61 = xf_getvalue("W", value6, 1);//上週ADX值
value92 = GetField("成交量","D");//日成交量
condition41 = value40 > value41 * DI_Growth;
condition51 = value50 < value51 and value50 < value40;
condition61 = value60 > value61 * ADX_growth;
//condition62 = value92 >= 500;
ret = condition41 and condition51 and condition61;
另外今天雷達叫我牧德(3563)要出場。這跟我的出場策略完全不吻合,因為周頻率的ADX指標並沒有下彎。不知是哪裡出問題。謝謝解惑~
Hi 查理布朗,
謝謝您提供相關資訊,待小幫手查看後,再向您說明,謝謝。
Hi 查理布朗,
回測的部分,小幫手查看後,再向您說明,
而雷達部分,小幫手查看後,發現您的警示腳本有問題,
因為您沒有設資料讀取筆數,故計算出來的數值不正確,
小幫手依照您的策略雷達屬性設定,調整進場與出場警示腳本如下說明,
進場警示腳本請改為以下範例:
input: day(14, "DMI計算區間"), DI_Growth(1.00, "DI成長率"), ADX_growth(1.04, "ADX成長率"), TXT1("適用日線");
settotalbar(maxlist(day,6) * 13 * 7 + 8);
value1 = xf_directionmovement("W", day,value4,value5,value6);//以輸入天數計算DMI,並輸出週頻率的DI,-DI,ADX
value40 = xf_getvalue("W", value4, 0);//本週DI值
value41 = xf_getvalue("W", value4, 1);//上週DI值
value50 = xf_getvalue("W", value5, 0);//本週-DI值
value51 = xf_getvalue("W", value5, 1);//上週-DI值
value60 = xf_getvalue("W", value6, 0);//本週ADX值
value61 = xf_getvalue("W", value6, 1);//上週ADX值
value92 = GetField("成交量","D");//日成交量
condition41 = value40 > value41 * DI_Growth;
condition51 = value50 < value51 and value50 < value40;
condition61 = value60 > value61 * ADX_growth;
//condition62 = value92 >= 500;
ret = condition41 and condition51 and condition61;
出場警示腳本請改為以下範例:
settotalbar(maxlist(14,6) * 13 * 7 + 8);
value1 = xf_directionmovement("W",14,value2,value3,value4);
value40 = xf_getvalue("W",value4,0);//本週ADX值
value41 = xf_getvalue("W",value4,1);//本週ADX值
ret = value40 < value41;
print(date,value40,value41);
這樣計算出來的數值才會與週線的ADX技術指標相同。
有關資料讀取範圍與腳本執行的關係,請參考以下連結文章
而各常見技術指標的資料讀取筆數設置,在各個腳本類型中,有資料讀取筆數設定程式碼,可供參考
例如:ADX趨勢成形(警示)
settotalbar(maxlist(Length,6) * 13 + 8);
然後,若您有設置跨頻率取值,例如您有設置
xf_directionmovement("W",14,value2,value3,value4)
則須再以您現在目前的資料頻率( 您策略雷達屬性設定的資料頻率為日 ),乘以組合成週K的數字,
也就是1週有7天,則資料筆數須約再乘以7,跨頻率計算才會正確
settotalbar(maxlist(14,6) * 13 * 7 + 8);
若您覺得太複雜,只要將策略雷達屬性設定上的資料讀取筆數調高即可,
預設為200筆,調高至2000筆,計算出來的數值也會是正確的 ( 若不正確,再調整至計算出正確的數值即可 )
以上說明,呈請您試試看,若修改後,策略雷達執行盤中洗價仍有問題,再請通知,謝謝。
再請教小幫手,頻率AM應是還原月對吧?!
我的兩個腳本如下,我不清楚為何回測的結果不盡相同,不知可否指導一下
腳本一(回測日頻率;逐筆洗價)
input: period(3, "DMI計算區間"), DI_Growth(1.00, "DI成長率"), ADX_growth(1.00, "ADX成長率"), TXT1("適用日線");
settotalbar(maxlist(period,6) * 13 * 30 + 8);//by XQ小幫手
ret = 0;
value1 = xf_directionmovement("AM", period,value4,value5,value6);//以輸入天數計算DMI,並輸出週頻率的DI,-DI,ADX
value40 = xf_getvalue("AM", value4, 0);//本週DI值
value41 = xf_getvalue("AM", value4, 1);//上週DI值
value50 = xf_getvalue("AM", value5, 0);//本週-DI值
value51 = xf_getvalue("AM", value5, 1);//上週-DI值
value60 = xf_getvalue("AM", value6, 0);//本週ADX值
value61 = xf_getvalue("AM", value6, 1);//上週ADX值
condition41 = value40 > value41 * DI_Growth;//本周DI大於上周DI
condition51 = value50 < value51 and value50 < value40;//本周-DI小於上周-DI,且DI > -DI
condition61 = value60 > value61 * ADX_growth;//本周ADX大於上周ADX
ret = condition41 and condition51 and condition61;
腳本二(回測日頻率;逐筆洗價)
input: period(3, "DMI計算區間"), DI_Growth(1.00, "DI成長率"), ADX_growth(1.00, "ADX成長率"), TXT1("適用日線");
settotalbar(maxlist(period,6) * 13 * 30 + 8);
ret = 0;
value1 = xf_directionmovement("AM", period,value4,value5,value6);//以輸入天數計算DMI,並輸出週頻率的DI,-DI,ADX
value40 = xf_getvalue("AM", value4, 0);//本週DI值
value41 = xf_getvalue("AM", value4, 1);//上週DI值
value50 = xf_getvalue("AM", value5, 0);//本週-DI值
value51 = xf_getvalue("AM", value5, 1);//上週-DI值
value60 = xf_getvalue("AM", value6, 0);//本週ADX值
value61 = xf_getvalue("AM", value6, 1);//上週ADX值
value62 = xf_getvalue("AM", value6, 2);
condition41 = value40 > value41 * DI_Growth;
condition51 = value50 < value51 and value50 < value40;
condition61 = value61 <= value62 and value60 > value61 * ADX_growth;
ret = condition41 and condition51 and condition61;
10 評論