资源加载中... loading...

使用Pine语言编写一个半自动的交易工具

Author: 发明者量化-小小梦, Created: 2022-09-29 14:36:32, Updated: 2023-09-15 20:53:45

img

使用Pine语言编写一个半自动的交易工具

虽然编写程序做全自动交易的交易者越来越多,但是更大的群体还是手动交易者。其实手动主观交易者也可以通过编写一些小工具来辅助自己的主观交易。例如有时候发现了一个不错的入场位置,计划设置初始仓位的固定止损、跟踪止盈。然后免去后续盯盘之类的比较耗费精力的事情,完全按照自己的既定止损止盈计划,让程序去帮自己盯盘。赌输了止损,赌赢了跟踪止盈辅助人工交易。

参数设计

使用Pine语言设计此类需求的策略十分简单,根据需求实现功能需要设计以下几个参数:

1、offset:触发跟踪止盈时,偏移最高价、最低价来划定止盈线的偏移距离。 2、limit:参数用来控制–A.初始底仓直接买入、B.指定价格等待买入、C.什么都不做。 3、amount:底仓开仓时下单量。 4、loss:止损点数。 5、targetOffset:触发跟踪止盈时偏移开仓价位的价格差。 6、minTick:价格一跳。 7、direction:底仓开仓方向。

设计策略

/*backtest
start: 2022-09-24 00:00:00
end: 2022-09-27 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["v_input_1",20],["v_input_2",0],["v_input_4",50],["v_input_5",20],["RunMode",1,358374],["ZPrecision",0,358374],["XPrecision",3,358374]]
*/

strategy("跟踪止损止盈委托", 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", "direction", 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, "移动止损触发线")

策略设计也并不复杂,使用的时候一般需要设置成「实时价模型」,因为要每时每刻检测价格嘛。

img

注意参数里止损loss是以点(价格一跳)表示的,offset跟踪止盈偏移也是以点(价格一跳)表示。targetOffset跟踪止盈触发线的偏移是以价格距离表示的(例如设置30,就是30元距离)。当价格一跳是1的时候30跳也就是30元距离。

这个委托策略不仅设计为可以初始底仓做多,也可以初始底仓做空。那么止损和跟踪止盈就按照做空方向去处理了。

下面让我们来演示一下设计实现的功能:

1、让这个策略运行时立即底仓开仓入场,后续按照参数设置止损、跟踪止盈。

img

direction设置为long,limit参数设置为0,即让策略运行时立即入场做多,amount设置1,策略开仓1张合约。

img

2、指定limit参数,指定价格入场

其它参数设置不变,只是指定limit参数价格为:1276

img

3、默认limit参数为-1,什么都不操作,防止误开仓

img

THE END

在使用Pine语言策略时,要格外注意价格一跳这个数据。系统的价格一跳具体是多少是和参数中「定价货币精度」有关的。

img

「定价货币精度」这个参数设置为0,即表示价格数据数值精确到个位(即小数位是0个)。那么价格最小变动单位就是1。因为有些参数是和价格一跳具体是多少相关的,所以这个地方需要格外注意。

OK,以上就是这个半自动委托策略的全部设计内容,虽然我也拿来实盘使用。但是此类工具还务必根据自己交易习惯去理解使用,具体可以自行修改、优化。这里这个策略代码仅仅是公开分享,交流学习设计方式、逻辑。

可见Pine语言是十分好用、方便的,并且易于学习。我们可以使用Pine语言快速设计出自己想要的工具,不必为复杂的程序设计而烦恼了,在FMZ量化使用Pine语言让量化交易更加轻松简单。


Related

More