这是Tradingview上面策略代码pine的第3篇简单教程,离上一篇已经过去半年多了。写这一篇的目的,是想把最近这3个月,在pine上写策略,收货的一些小的经验分享出来,也当做是对这个小系列的收尾,希望对大家都有帮助,如果是已经比较熟悉的朋友可以直接略过。

1.

当我们策略写好之后,需要调试一些参数,那么就需要让这些参数暴露出来,这样我们就可以直接在配置里面改参数,然后查看对应的策略回测数据,很简单,这样写。

InputParam = input(10)

之后可以直接在配置里面修改参数

2.

获取当前仓位信息 strategy.position_size,该变量等于0.0,说明空仓,大于0.0多头仓位,小于0.0空头仓位。但是有一点需要注意,后面会解释。

3.

当前资产 strategy.equity,拿它做什么用呢?比如开仓不想全仓梭哈,或者是想手动加杠杆,那么我们可以通过 strategy.equity / close[0] 来获取当前资产可以开多少单。比如

具体代码就不解释了,很简单,这样做,我就可以控制开多和开空的仓位大小了。

4.

设置止损。一个策略,我的观念里面一定要有个止损,简单来说,就是承认判断错误,在亏损可控的情况下,退出这笔交易。那么pine里面怎么设置止损呢?

StopOpenPercent就是止损的百分比,StopPrice是个全局变量,记录的开单时候的开单价格,那么strategy.exit 就是退出方法了,详细介绍请查看pine文档,不想动脑袋就照着我这样写即可。有几点注意事项

如上图所示,当开单的同时,就挂出了止损,那么只要满足止损的价格条件,这笔交易就会退出,所以就会出现一种情况,当前K开单,当前K止损。那么这有什么问题呢?问题就在于前文(2)所说的这个变量这。当出现这种情况,你的仓位变量strategy.position_size是记录不到你曾经开了单的这个信号的。比如当前开单了,如果不止损,下一根K,这个变量就会 != 0.0,但是当前K止损了,这个变量还是等于0.0。如果你需要检测这种信号,那么你就检测不到了,这里我提供一种方法。

LastDidOpenPosition这个变量,就记录了开单的这个动作,各位理下这个逻辑吧,很简单,就不介绍了。

然后,比如说你的止损是一直在变动的,那么你就需要去更新你的止损条件,也很简单,加两行代码即可

5.

加仓“梭哈”,加仓的指令也很简单,如下

这样你就能在原有的仓位上进行加仓了,当然,你也可以指定的推出你的加仓仓位,比如如图所示的多单,标记是“L Add”,那么,strategy.exit就退出这个标记就行了,具体什么条件加仓,各位自己想怎么加就怎么加吧。

同时如果嫌一个一个仓位退出麻烦,也可以直接 strategy.close_all() 来退出你的所有仓位。

6.

海龟交易法都听说过吧,该策略需要找到多少天内最高和最低点,pine当然也有这个功能,也算是常用功能吧,而且功能蛮强大的。

lowest(close, 20):获取当前20根K线周期内的收盘最低价

highest(close, 20):获取当前20根K线周期内的收盘最高价

你也可以把参数close,改成high,open,low,hl2,hlc3等,其实就是获取对应长度的当前K线价格序列的最高最低价。

并且,这种价格序列可以加索引,比如 lowest(close[1], 20),这个就表示从上一根K线起,往前20根K线收盘的最低价(不会囊括当前K,当前K收盘价是close[0])。

7.

debug,在这上面写策略怎么debug呢?很简单,pine里面支持plot来画图,举个例子,比如你设置了你的止损退出价格,但是策略跑出来的止损价格不太对,那么很简单,把它打印出来,就能在K线图上看到了。

比如我写一段这样的代码 plot(StopPrice)

那么图表上,就能画出中间那根蓝线,简单明了。

当然了,也可以改变这根线的颜色,比如改成红色 plot(StopPrice, color = color.red)。更多画线功能请查看pine文档。

最后

感觉也就这些了,这是我自己写策略比较常用的一些东西,之后如果用到其它的还会添加上来。

然后呢,这2个月,自己在本地实现了程序自动化交易,除了一些最最基础的接口,整个软件从零开始搭建起来,有点感觉是自己在造轮子。包括对交易所常用API的本地封装,交易所数据更新逻辑模块,本地策略模块,执行交易模块,ui模块,调试模块等,中间走过不少坑,也写到一半重新推倒重来过,目前已经稳定运行,解放了自己的时间,这五一节不出意外,会相继分享制作过程中的心得体会。

 

原文 https://zhuanlan.zhihu.com/p/137626485