EasyTrader - ArtNo 009
在上一篇期貨指數與未平倉量關係Part1有提到了Tscore的公式與價格運動的相關性,本範例程式以此為基礎針對 Tscore指標觀察的70, 50, 30 的數字作策略模型開發與歷史回測基本設定 -日K
測試商品:台指期
交易模型:波段留倉
回測時間:2013/09/30 往前 3000 日
回測成本設定:$1200/來回
回測軟體:TS2000i
成交口數的影響呢 ?
基本設定 -60分K
測試商品:台指期
交易模型:波段留倉
回測時間:2013/09/30 往前 3000 日
回測成本設定:$1200/來回
回測軟體:TS2000i
程式碼如下
inputs: Type(1) ,TscoreHigh(70),TscoreMid(50),TscoreLow(30) ,TBar(10),TradeStopLoss(0.02),TradeProfit(0.04);
Vars: Zscore(0),Tscore(0),MP(0),ISBalanceDay(false) ;
MP = MarketPosition ;
{結算日判定}
if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;
{ Value1 可以選用 收盤價 , 成交量 , 其他商品(未平倉量) , 甚至 RSI , KD , 都可以測試}
Value1 = Close {Ticks} {Close of Data2} { RSI , SlowK ...} ;
if StdDev(Value1,TBar) <> 0 then Zscore = (Value1
- Average(Value1,TBar))/StdDev(Value1,TBar);
TScore = 10*Zscore + 50 ;
{ 設立不同的條件 ,讀者有興趣也可以將 Cross over 改為 >= , Cross under 改為 < 交易次數可以增加一些 }
{ 向上下關卡突破}
Condition1 = Tscore Cross over TscoreHigh ;
Condition2 = Tscore Cross under TscoreLow ;
{以中關值作多空基準}
Condition3 = Tscore Cross over TscoreMid ;
Condition4 = Tscore Cross under TscoreMid ;
{反向的逆勢思考}
Condition5 = Tscore Cross under TscoreHigh ;
Condition6 = Tscore Cross over TscoreLow ;
{ 為了回測方便 用 Type 代表不同進場方式}
if Type = 1 then Begin
if Condition1 then Buy next bar at Market ;
if Condition2 then Sell next bar at Market ;
end;
if Type = 2 then Begin
if Condition1 then Buy next bar Highest(High,3) stop;
if Condition2 then Sell next bar at Lowest(Low,3) stop ;
end;
if Type = 3 then Begin
if Condition3 then Buy next bar at Market ;
if Condition4 then Sell next bar at Market ;
end;
if Type = 4 then Begin
if Condition3 then Buy next bar Highest(High,3) stop;
if Condition4 then Sell next bar at Lowest(Low,3) stop ;
end;
inputs: Type(1) ,TscoreHigh(70),TscoreMid(50),TscoreLow(30) ,TBar(10),TradeStopLoss(0.02),TradeProfit(0.04);
Vars: Zscore(0),Tscore(0),MP(0),ISBalanceDay(false) ;
MP = MarketPosition ;
{結算日判定}
if DAYofMonth(Date) > 14 and DAYofMonth(Date) < 22 and DAYofWeek(Date)= 3 then isBalanceDay = True else isBalanceDay =False ;
{ Value1 可以選用 收盤價 , 成交量 , 其他商品(未平倉量) , 甚至 RSI , KD , 都可以測試}
Value1 = Close {Ticks} {Close of Data2} { RSI , SlowK ...} ;
if StdDev(Value1,TBar) <> 0 then Zscore = (Value1
- Average(Value1,TBar))/StdDev(Value1,TBar);
TScore = 10*Zscore + 50 ;
{ 設立不同的條件 ,讀者有興趣也可以將 Cross over 改為 >= , Cross under 改為 < 交易次數可以增加一些 }
{ 向上下關卡突破}
Condition1 = Tscore Cross over TscoreHigh ;
Condition2 = Tscore Cross under TscoreLow ;
{以中關值作多空基準}
Condition3 = Tscore Cross over TscoreMid ;
Condition4 = Tscore Cross under TscoreMid ;
{反向的逆勢思考}
Condition5 = Tscore Cross under TscoreHigh ;
Condition6 = Tscore Cross over TscoreLow ;
{ 為了回測方便 用 Type 代表不同進場方式}
if Type = 1 then Begin
if Condition1 then Buy next bar at Market ;
if Condition2 then Sell next bar at Market ;
end;
if Type = 2 then Begin
if Condition1 then Buy next bar Highest(High,3) stop;
if Condition2 then Sell next bar at Lowest(Low,3) stop ;
end;
if Type = 3 then Begin
if Condition3 then Buy next bar at Market ;
if Condition4 then Sell next bar at Market ;
end;
if Type = 4 then Begin
if Condition3 then Buy next bar Highest(High,3) stop;
if Condition4 then Sell next bar at Lowest(Low,3) stop ;
end;
if Type = 5 then Begin
if Condition6 then Buy next bar at Market ;
if Condition5 then Sell next bar at Market ;
end;
if Condition6 then Buy next bar at Market ;
if Condition5 then Sell next bar at Market ;
end;
if Type = 6 then Begin
if Condition6 then Buy next bar Highest(High,3) stop;
if Condition5 then Sell next bar at Lowest(Low,3) stop ;
end;
{ 固定百分比停損出場 }
if MP > 0 and Low < EntryPrice*(1-TradeStopLoss) then ExitLong at EntryPrice*(1-TradeStopLoss) stop ;
if MP < 0 and High > EntryPrice*(1+TradeStopLoss) then ExitShort at EntryPrice*(1+TradeStopLoss) stop ;
{ 結算日出場 }
if IsBalanceDay then SetExitonClose ;
Zscore /Tscore 是由統計標準差的變異轉化來的 ( 一般技術指標所提到的包寧傑帶 或是 天羅地網指標皆是標準差演化而成),讀者可依此範例程式作延伸測試,相信能開發更多的交易策略模型
保留字與函數說明
1. DayofMonth(date) 傳回當月第幾天
2. DayofWeek(date) 傳回當週第幾天
因為台指結算日為每月第三個星期三 , 日期會發生在 15 ~ 21這幾天 , 所以用上述方式來作計算判斷
3. Average(Price , Len) 傳回指定K 棒數量的數值平均值
Price 可為 Open/High/Low/Close 也可以是其他可運算的序列數據
4.StdDev(Price , Len) 傳回指定K 棒數量的數值標準差
5.Condition1 ~ Condition99 系統不需宣告即可使用的條件變數(接收 true/false
)的傳回值 , 另外 Value1 ~ Value99系統不需宣告即可使用的一般變數
6.Highest(Price,Len) 傳回指定區段的最大值
Lowest(Price,Len) 傳回指定區段的最大值
Price 可為 Open/High/Low/Close 也可以是其他可運算的序列數據
延伸使用
MaxList = 傳回數值列中最大值
MaxList(45, 72, 86, 125, 47) 傳回 125.
MaxList(18, 67, 98, 24, 65, 19) 傳回 98.
MinList = 傳回數值列中最小值
MinList(45, 72, 86, 125, 47) 傳回 45.
MinList(18, 67, 98, 24, 65, 19) 傳回 18.
NthMaxList = 傳回數值列中第N個最大值
NthMaxList(N, num1, num2, num3, num4, num5)
NthMaxList(3, 45, 72, 86, 125, 47) 傳回 72.
NthMinList = 傳回數值列中第N個最小值
NthMinList(N, num1, num2, num3, num4, num5)
NthMinList(4, 18, 67, 98, 24, 65, 19) 傳回24.
7. EntryPrice 傳回目前部位進場價格
EntryPrice(0) 目前的 // EntryPrice(1) 前一個// EntryPrice(2) 前二個
延伸使用
ExitPrice 傳回指定部位出場價格
ExitPrice(1) 前一個// ExitPrice(2) 前二個
8. SetExitonClose 日內交易的收盤出場
if Condition6 then Buy next bar Highest(High,3) stop;
if Condition5 then Sell next bar at Lowest(Low,3) stop ;
end;
{ 固定百分比停損出場 }
if MP > 0 and Low < EntryPrice*(1-TradeStopLoss) then ExitLong at EntryPrice*(1-TradeStopLoss) stop ;
if MP < 0 and High > EntryPrice*(1+TradeStopLoss) then ExitShort at EntryPrice*(1+TradeStopLoss) stop ;
{ 結算日出場 }
if IsBalanceDay then SetExitonClose ;
Zscore /Tscore 是由統計標準差的變異轉化來的 ( 一般技術指標所提到的包寧傑帶 或是 天羅地網指標皆是標準差演化而成),讀者可依此範例程式作延伸測試,相信能開發更多的交易策略模型
保留字與函數說明
1. DayofMonth(date) 傳回當月第幾天
2. DayofWeek(date) 傳回當週第幾天
因為台指結算日為每月第三個星期三 , 日期會發生在 15 ~ 21這幾天 , 所以用上述方式來作計算判斷
3. Average(Price , Len) 傳回指定K 棒數量的數值平均值
Price 可為 Open/High/Low/Close 也可以是其他可運算的序列數據
4.StdDev(Price , Len) 傳回指定K 棒數量的數值標準差
5.Condition1 ~ Condition99 系統不需宣告即可使用的條件變數(接收 true/false
)的傳回值 , 另外 Value1 ~ Value99系統不需宣告即可使用的一般變數
6.Highest(Price,Len) 傳回指定區段的最大值
Lowest(Price,Len) 傳回指定區段的最大值
Price 可為 Open/High/Low/Close 也可以是其他可運算的序列數據
延伸使用
MaxList = 傳回數值列中最大值
MaxList(45, 72, 86, 125, 47) 傳回 125.
MaxList(18, 67, 98, 24, 65, 19) 傳回 98.
MinList = 傳回數值列中最小值
MinList(45, 72, 86, 125, 47) 傳回 45.
MinList(18, 67, 98, 24, 65, 19) 傳回 18.
NthMaxList = 傳回數值列中第N個最大值
NthMaxList(N, num1, num2, num3, num4, num5)
NthMaxList(3, 45, 72, 86, 125, 47) 傳回 72.
NthMinList = 傳回數值列中第N個最小值
NthMinList(N, num1, num2, num3, num4, num5)
NthMinList(4, 18, 67, 98, 24, 65, 19) 傳回24.
7. EntryPrice 傳回目前部位進場價格
EntryPrice(0) 目前的 // EntryPrice(1) 前一個// EntryPrice(2) 前二個
延伸使用
ExitPrice 傳回指定部位出場價格
ExitPrice(1) 前一個// ExitPrice(2) 前二個
8. SetExitonClose 日內交易的收盤出場
0 留言:
張貼留言
如果有私人問題想請教,請透過網站右方『與站長聯絡』之表單,謝謝!