XQ自動交易不採坑: 進出場價的設定

2Shares
Image


自動交易不採坑系列,主要在分享開發自動交易策略時需要注意的事情,避免開發出回測好看,但與實際交易落差很大的策略來。而本篇文章將會討論setposition的用法,很基礎但超級重要,一定要了解。

1. 前言

當我們開發XQ自動交易策略,肯定都會用到回測的功能來看看策略在過去的表現,並且會嘗試不同的條件、參數,來提升過去的績效表現。

而在回測的設定內,買進賣出價格可以是市場價,也可以是觸發價,而使用觸發價時,還可以選擇要用觸發價讓幾個tick,當做是買進賣出價,而這些設定,用XS函數Setposition也是可以達到同樣的效果,那該如何做才會比較好呢?

2. 用回測報表設定買進賣出價的缺點

首先,我們要知道,在回測設定畫面所做的設定,只會影響到回測的結果,對於實際交易上,買進賣出價的決定,是根據Setposition的,所以,如果我們用回測的設定畫面來調整買進賣出價,會產生幾個問題

回測設定

2.1 可能導致回測與實際交易的落差

由於回測設定的調整,只會在回測的時候發生作用,並不會影響到實際的交易,而實際交易的進出場價,是根據Setposition的寫法而決定,如果兩邊不一致,就很容易發生回測與實際交易有落差的情況。

2.2 無法查到原本的回測設定

回測介面的買賣價方式與讓價幾檔的設定,在回測報表內並沒有提供這樣的資訊,未來想要重新回測時,因無法得知原本的設定,很容易造成回測的不一致。

回測報表

2.3 不容易比較設定的差異

這個問題是問題2.2的延伸,因為無法查到回測的買賣價與讓價設定,優化時,如是調整了買賣價與讓價設定,會很難對不同報表間的參數差異做比較。

對於上面的三個問題,又該如何才能解決呢?

3. 用Setposition來決定買賣價與讓價檔數

雖然用Setposition跟回測都可以決定回測的買賣價方式,但兩者是有優先等級的,Setposition的優先等級是大於回測內的設定的,如果Setposition已經定義了買賣價方式與讓價檔數,則回測頁面內不管如何調整設定,對回測結果都不會造成任何影響。

而Setposition的使用方式,可以參考官方網站的說明,而我們建議的方式就是在使用Setposition時,完整的設定都寫入,如以下的程式碼,當使用收盤價進場時,可以加Addspread做讓價的設定,而當使用市價進場,就不用加入Addspread

//用收盤價進出場
SetPosition(目標部位,AddSpread(Close, 1),label:="指令標記")

//用市價進出場
SetPosition(目標部位,market,label:="指令標記")

當我們使用了上面其中一種寫法,回測設定頁面的買賣價與讓價檔數就可以不用在理他了。

4. 用input指令來做進出場與讓價設定

上面把進出場與讓價方式寫在Setposition裡面的方式解決了2.1的問題,但是卻沒有解決2.2跟2.3的問題,要看到回測的進出場與讓價方式,只能查看交易程式碼,這在開發過程中,是非常沒效率也很容易出錯的,要解決這樣的方式,就是把相關的設定用input指令寫出來,這樣不只在回測或實際交易時,可以直接設定,而回測報告也能看到相關設定值,另外,因為不用一直改程式碼,也能加速策略開發優化的效率。

4.1 回測設定與回測報告畫面

以下為我將進出場與讓價方式寫到input的範例,在回測時,只要調整左邊交易腳本下的input值就可以了,下方右側紅色框之內的設定則完全可以忽略不管

inputinput
用input值的回測設定畫面

在採用了input值來做進出場與讓價檔數設定後,回測報告的腳本設定那,就可以清楚的看到設定的數值,可以很方便的做紀錄與比較

inputinput
回測報告input值

4.2 自動交易策略設定畫面

將XS腳本變成自動交易策略的時候,之前的input條件一樣都會出現,方便做參數的調整設定,通常這個設定值,會跟回測時的最佳參數同步。

inputinput
自動交易策略input值設定

5. 自動交易程式碼

以下為上面範例的程式碼,主要提供將Setposition內參數變成input值的寫法,沒有加入進場或出場條件,讀者如果有進出場條件,可以加在condition1~3或是condition101~103的地方,如果條件太多,可以自行增加condition應該就可以很容易的變成一個自動交易策略


input: section1("--------","-------進出場基本設定");

input: entrydir("做多","做多還做空?",inputkind:=dict(["做多","做多"],["做空","做空"]));
input: entryoption("每筆買固定金額","固定金額或固定張數購買?",inputkind:=dict(["每次只買1張","每次買1張"],["每筆買固定金額","每筆買固定金額"]));
input: entryfund(10,"每次購買幾萬元(固定張數無作用)");
input: entrymethod("收盤價","進場價格",inputkind:=dict(["收盤價","收盤價"],["市價","市價"]));
input: entryspread(0,"進場讓價(市價無作用)",inputkind:=dict(["+5檔",5],["+4檔",4],["+3檔",3],["+2檔",2],["+1檔",1],["0檔",0],["-1檔",-1],["-2檔",-2],["-3檔",-3],["-4檔",-4],["-5檔",-5]));
input: exitmethod("市價","出場價格",inputkind:=dict(["收盤價","收盤價"],["市價","市價"]));
input: exitspread(0,"出場讓價(市價無作用)",inputkind:=dict(["+5檔",5],["+4檔",4],["+3檔",3],["+2檔",2],["+1檔",1],["0檔",0],["-1檔",-1],["-2檔",-2],["-3檔",-3],["-4檔",-4],["-5檔",-5]));

//進場條件

condition1 = true; //自行加入條件
condition2 = true; //自行加入條件
condition3 = true; //自行加入條件

condition99 = condition1 and condition2 and condition3;  //進場條件通常會是幾個條件都符合,所以用and

//出場條件

condition101 = true;  //自行加入條件如停利
condition102 = true;  //自行加入條件如停損
condition103 = true;  //自行加入條件如時間到出場

condition199 = condition101 or condition102 or condition103;  //出場條件通常會是符合一個就執行,所以通常用or

vars: v_entrydir(0);
if entrydir = "做多" then v_entrydir = 1 else v_entrydir = -1;

vars: v_entrycount(0);
if entryoption = "每次買1張" then v_entrycount = 1 else v_entrycount = intPortion(entryfund*10/close);

//進場
if position=0 and filled=0 and condition99 then begin 
	if entrymethod = "收盤價" then begin 
		SetPosition(v_entrydir*v_entrycount, AddSpread(close, entryspread), label:= "進場名稱");
	end;
	
	if entrymethod = "市價" then begin
		SetPosition(v_entrydir*v_entrycount, market, label:= "進場名稱");
	end;
end;

//出場

if position <> 0 and filled <> 0 and condition99 then begin 
	if exitmethod = "收盤價" then begin
		SetPosition(0, AddSpread(close, exitspread), label:= "出場名稱");
	end;
	
	if exitmethod = "市價" then begin
		SetPosition(0, market, label:= "出場名稱");
	end;
end;

6. 結語

這篇本來是要簡單寫的,沒想到還是寫了一長串,希望讀者能夠了解進出場與讓價方式,用XS腳本寫跟在回測時設定上的差異,避免未來回測與實際執行時產生巨大的落差

另外,本篇的程式碼雖然不完整,但可以是一個簡易的模組架構,只要在相對應的地方加入進出場條件,就可以馬上變成一個自動交易策略。

2Shares


發佈留言

在〈XQ自動交易不採坑: 進出場價的設定〉中有 7 則留言

  1. 「好韭」的個人頭像

    收盤價進場和出場的setposition用到addspread應該是寫成 addspread(Close,entryspread) ~?

    1. 「A+管理員」的個人頭像

      謝謝通知,你是對的,修正程式碼了

  2. 「stone77」的個人頭像

    謝謝! 請問這一行 Input: Section1(“——–“,”——進出場基本設定”);是不是要mark掉

    1. 「A+管理員」的個人頭像

      那行只是我想當做分隔線之用,沒有作用,可以mark掉

      1. 「stone77」的個人頭像

        謝謝!提供下載嗎?

        1. 「A+管理員」的個人頭像

          程式碼就文章裡面那段,只是用來取代回測內的進出場方式與讓價檔數的設定,但主要的進出場邏輯還是要能自己添加進去

          1. 「stone77」的個人頭像

            謝謝!
            想下載你原始樣式回來套自己的多空條件.

相關文章

如何運用AI修正XS程式碼錯誤

現在很多人都在用AI來寫程式,使用XQ的你,是不是超級羨慕也去嘗試讓AI撰寫XS程式碼了呢? 相信你試過之後的結果都會很失望吧,你以為他給你的是XS程式碼,但常常都是其他軟體的語法。

[AI] 定期定額投資績效計算頁面

定期定額投資的績效表現在XQ上並不容易回測,本文將會介紹我如何運用量化交易實驗室的AI,在短時間內就寫出一個可以計算定期定投入績效的XQ看盤頁面。

[VIP] 投資節目老師報明牌行不行

如果還沒看到前一篇的文章,可以先閱讀下,這篇主要是說明頁面我做了那些調整,跟我觀察到的心得分享,希望對大家有幫助。

投資節目老師報明牌行不行

前幾天在搜薄碩士論文的時候,看到一篇有趣的研究,研究標題是-投資理財節目異常推介有價證券與投資人行為及報酬率檢視-以上櫃公司為例,相信很多人都會跟我一樣想要知道老師報的明牌到底有沒有用吧,結論是大部分情況是有用,不過研究只有一年,到底現在還能不能用呢?用了個頁面讓大家自己研究研究

最近發文

加入我們

Categories

最新留言