虽然编写程序做全自动交易的交易者越来越多,但是更大的群体还是手动交易者。其实手动主观交易者也可以通过编写一些小工具来辅助自己的主观交易。例如有时候发现了一个不错的入场位置,计划设置初始仓位的固定止损、跟踪止盈。然后免去后续盯盘之类的比较耗费精力的事情,完全按照自己的既定止损止盈计划,让程序去帮自己盯盘。赌输了止损,赌赢了跟踪止盈辅助人工交易。
在商品期货市场里,小编入门的时候也被市场教育的很惨。是否各位大佬有和我一样的经历:
一开多就跌,一止损就涨。一开空就涨,一止损就跌。感觉整个市场都在恶意针对我这个小韭菜。被反复折腾几个回合之后心态越来越差,交易越来越乱。各种不服输、扛单、幻想,最终被市场狠狠的教训。
后来想了很久,交易本身就应该有既定的规则,有止损、有止盈、有计划。盈利和亏损都是交易中不可分割的一部分。在自己心态没有那么强大时,与其胡乱操作。不如制定一个计划,排除心理上的干扰。
简单说就是:
在商品期货市场,让交易变得纯粹一些(比自己瞎猜、乱操作靠谱)。
那么就需要一个辅助工具,在找到比较好的趋势因子之前,程序化工具辅助手动交易也不失为一个方法。本文就用Trading View的Pine语言,在FMZ上实现一个功能丰富,代码简单的半自动工具。
策略思路
我的想法是,让程序可以以当前价格/指定价格(指定价格需要等待价格到位)入场,然后让程序自己计划止损、计划跟踪止盈。这样如果达到止损线,就认亏出场(控制风险)。达到跟踪止盈就监控最高价,跟踪止盈(尽可能的拿到最大利润)。这样也省去了盯盘的烦恼,也控制好了风险,也不耽误学习、生活。
参数设计
使用Pine语言设计此类需求的策略十分简单,根据需求实现功能需要设计以下几个参数:
1、offset:触发跟踪止盈时,偏移最高价、最低价来划定止盈线的偏移距离。
2、limit:参数用来控制--A.初始底仓直接买入、B.指定价格等待买入、C.什么都不做。
3、amount:底仓开仓时下单量。
4、loss:止损点数。
5、targetOffset:触发跟踪止盈时偏移开仓价位的价格差。
6、minTick:价格一跳。
7、direction:底仓开仓方向。
设计策略
/*backtest
start: 2022-09-14 09:00:00
end: 2022-09-16 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
args: [["RunMode",1,360008],["ContractType","rb2301",360008]]
*/
// via : https://www.fmz.cn/strategy/372446
strategy("futures", overlay = true)
varip targetPrice = na
varip high_lowPrice = na
varip isTrade = false
varip isAlert = false
varip isAlertMinTick = false
varip isAlertFinished = false
varip offset = input(30, "offset", "跟踪止损止盈偏移")
varip limit = input(-1, "limit", "初始开仓价格,-1为不开仓,0为立即开仓,其它具体数值为限价价格")
varip amount = input(1, "amount", "开仓量")
varip loss = input(30, "loss", "止损")
varip targetOffset = input(30, "targetOffset", "触发跟踪止盈止损偏移量")
varip minTick = input(1, "minTick", "价格一跳")
tradeType = input.string("long", "下单方向", tooltip="下单方向,long做多,short做空", options=["long", "short"])
if not barstate.ishistory and not isAlertMinTick
runtime.log("检查syminfo.mintick是否正确!syminfo.mintick:", syminfo.mintick, "#FF0000")
if syminfo.mintick < minTick
runtime.error("系统syminfo.mintick < minTick参数", "#FF0000")
isAlertMinTick := true
if not barstate.ishistory and limit == -1 and not isAlert
runtime.log("没有设置开仓价格,当前limit为-1(防止误开仓,初始默认limit为-1),禁止开仓", "#FF0000")
isAlert := true
if isTrade and strategy.position_size == 0 and not isAlertFinished
runtime.log("所有委托流程执行完毕,仓位为0", "#FF0000")
isAlertFinished := true
if not barstate.ishistory and not isTrade and limit != -1
if limit == 0
strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount)
else if limit > 0
strategy.entry("open", tradeType == "long" ? strategy.long : strategy.short, amount, limit=limit)
if tradeType == "long"
targetPrice := (limit == 0 ? close : limit) + targetOffset
else
targetPrice := (limit == 0 ? close : limit) - targetOffset
strategy.exit("exit", "open", amount, loss=loss, trail_price=targetPrice, trail_offset=offset)
runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close)
isTrade := true
if ((close > targetPrice and strategy.position_size > 0) or (close < targetPrice and strategy.position_size < 0)) and not barstate.ishistory
high_lowPrice := na(high_lowPrice) ? close : high_lowPrice
if strategy.position_size > 0
high_lowPrice := close > high_lowPrice ? close : high_lowPrice
else
high_lowPrice := close < high_lowPrice ? close : high_lowPrice
plot(targetPrice, "trail_price 触发线")
plot(strategy.position_size!=0 ? high_lowPrice : na, "当前最高价/最低价")
plot(strategy.position_size!=0 ? (strategy.position_size > 0 ? high_lowPrice-syminfo.mintick*offset : high_lowPrice+syminfo.mintick*offset) : na, "移动止损触发线")
策略设计也并不复杂,使用的时候一般需要设置成「实时价模型」,因为要每时每刻检测价格嘛。
image.png注意参数里止损loss是以点(价格一跳)表示的,offset跟踪止盈偏移也是以点(价格一跳)表示。targetOffset跟踪止盈触发线的偏移是以价格距离表示的(例如设置30,就是30元距离)。当价格一跳是1的时候30跳也就是30元距离。
这个委托策略不仅设计为可以初始底仓做多,也可以初始底仓做空。那么止损和跟踪止盈就按照做空方向去处理了。
下面让我们来演示一下设计实现的功能:
1、让这个策略运行时立即底仓开仓入场,后续按照参数设置止损、跟踪止盈。
image.pngdirection设置为long,limit参数设置为0,即让策略运行时立即入场做多,amount设置1,策略开仓1张合约。
image.png2、指定limit参数,指定价格入场
其它参数设置不变,只是指定limit参数价格为:3706
image.png3、默认limit参数为-1,什么都不操作,防止误开仓
image.pngTHE END
在使用Pine语言策略时,要格外注意价格一跳这个数据。系统的价格一跳具体是多少是和参数中「定价货币精度」有关的。
image.png「定价货币精度」这个参数设置为0,即表示价格数据数值精确到个位(即小数位是0个)。那么价格最小变动单位就是1。因为有些参数是和价格一跳具体是多少相关的,所以这个地方需要格外注意。
OK,以上就是这个半自动委托策略的全部设计内容,虽然我也拿来实盘使用。但是此类工具还务必根据自己交易习惯去理解使用,具体可以自行修改、优化。这里这个策略代码仅仅是公开分享,交流学习设计方式、逻辑。
可见Pine语言是十分好用、方便的,并且易于学习。我们可以使用Pine语言快速设计出自己想要的工具,不必为复杂的程序设计而烦恼了,在FMZ量化使用Pine语言让量化交易更加轻松简单。
实盘小试
image.png反正设置好了止盈、止损,既定的交易计划自己去执行吧!(盯盘真的很难受,太影响心情,克服不聊T_T)
这些就是我的半自动工具设计的心得、经验。仅用于分享、交流。
网友评论