8.3 KiB
8.3 KiB
策略说明
创建策略项目
创建策略项目可以直接使用模板,也可以全部手动创建
直接使用模板
git clone https://git.qtrade.icu/coin-quant/strategy
cd strategy
# 添加自定义策略
手动创建项目
mkdir strategy
cd strategy
go mod init strategy
# 复制 helper.go,并且修改package
cp $SRC/pkg/helper/helper.go ./define.go
# 创建新的策略
touch demo.go
策略
没一个策略,都是一个go的struct,这个struct一般长这个样子:
package strategy
import (
. "https://git.qtrade.icu/coin-quant/trademodel"
)
type Demo struct {
engine Engine // 这个是和引擎交互用的
position float64 //仓位
strParam string
intParam int
floatParam float64
}
// 这个是策略的创建函数,必须是下面这种格式: func New{struct}() *{struct}
func NewDemo() *Demo {
return new(Demo)
}
// 这个函数提供策略需要的参数列表,供trade引擎调用
// trade 可以通过在命令行直接输入参数的方式,来传递参数
func (d *Demo) Param() []Param {
return []Param{
// 这个函数有 5个参数:
// 1. 这个Param的key
// 2. 这个Param的中文简称
// 3. 这个Param的具体解释
// 4. 这个Param的默认值
// 5. 这个Param对应的变量的的指针
StringParam("str", "字符串参数", "只是一个简单的参数", "15m", &d.strParam),
IntParam("intparam", "数字参数", "一个简单的数字参数 ", 12, &d.intParam),
FloatParam("floatparam", "浮点参数", "简单的浮点参数", 1, &d.floatParam),
}
}
// 这个函数是在策略初始化的时候调用的
// engine就是trade引擎的接口
// params是传入的参数信息
func (d *Demo) Init(engine Engine, params ParamData) {
// 这里 d.strParam,d.intParam,d.floatParam已经自动解析了,无需再次解析
d.engine = engine
// 合并K线,第一个参数是原始K线级别,第二个参数是目标级别,第三个参数是K线合并完成后的回调函数
engine.Merge("1m", "30m", d.OnCandle30m)
// 合并K线,第一个参数是原始K线级别,第二个参数是目标级别,第三个参数是K线合并完成后的回调函数
engine.Merge("1m", "1h", d.OnCandle1h)
}
// 1m K线回调函数
// 在回测中,candle.ID是数据库中的ID
// 在实盘中 candle.ID=-1表示是历史数据,非-1表示正常的实时K线
func (d *Demo) OnCandle(candle *Candle) {
}
// 仓位同步函数, pos 表示仓位, 正数表示多仓,负数表示空仓,price是开仓的价格
func (d *Demo) OnPosition(pos, price float64) {
d.position = pos
}
// 自己的订单成交时候的回调函数
func (d *Demo) OnTrade(trade *Trade) {
}
// 交易所中实时的成交信息
func (d *Demo) OnTradeMarket(trade *Trade) {
}
// 交易所中实时推送的深度信息,根据交易所限制不同,深度信息也不同
func (d *Demo) OnDepth(depth *Depth) {
}
// Init函数中定义的 30m K线回调函数
// 在回测中,candle.ID是数据库中的ID
// 在实盘中 candle.ID=-1表示是历史数据,非-1表示正常的实时K线
func (d *Demo) OnCandle30m(candle *Candle) {
}
// Init函数中定义的 1h K线回调函数
// 在回测中,candle.ID是数据库中的ID
// 在实盘中 candle.ID=-1表示是历史数据,非-1表示正常的实时K线
func (d *Demo) OnCandle1h(candle *Candle) {
// 自定义判断逻辑
//...
// 可以在策略启动后的任何地方调用交易函数
// OpenLong,CloseLong,OpenShort,CloseShort,StopLong,StopShort...
d.engine.OpenLong(candle.Close, 1)
}
Engine说明
Engine的定义如下:
const (
// 策略运行中
StatusRunning = 0
// 策略成功
StatusSuccess = 1
// 策略失败
StatusFail = -1
)
type Engine interface {
// 开多,返回order id
OpenLong(price, amount float64) string
// 平多,返回order id
CloseLong(price, amount float64) string
// 开空,返回order id
OpenShort(price, amount float64) string
// 平空,返回order id
CloseShort(price, amount float64) string
// 发送 多单止损 订单,返回order id
StopLong(price, amount float64) string
// 发送 空单止损 订单,返回order id
StopShort(price, amount float64) string
// 取消某个订单,参数是order id
CancelOrder(string)
// 取消所有订单
CancelAllOrder()
// 执行订单,一般调用上面的就可以了,不用调用这个
DoOrder(typ trademodel.TradeType, price, amount float64) string
// 添加指标,指标具体文档在下面
AddIndicator(name string, params ...int) (ind indicator.CommonIndicator)
// 获取当前的仓位
Position() (pos, price float64)
// 获取当前的余额
Balance() float64
// 日志
Log(v ...interface{})
// 添加新的订阅事件,当前无需调用
Watch(watchType string)
// 发送消息通知,需要添加消息类型的processer才会生效
SendNotify(title, content, contentType string)
// 合并K线,src是原始级别,这里固定是1m,dst是目标级别,fn是回调函数
Merge(src, dst string, fn common.CandleFn)
// 设置余额,仅在回测时有用
SetBalance(balance float64)
// 更新状态,一般无需调用,状态说明见上面的定义
UpdateStatus(status int, msg string)
}
指标说明
trade内置了一些常见的指标,代码详见 indicator
名称 | 说明 | 参数 | 例子 |
---|---|---|---|
EMA | 只有一个参数表示是一根EMA | 数字 | AddIndicator("EMA", 9) 长度为9的EMA |
EMA | 两个参数表示EMA交叉指标 | 两个数字:快线、慢线 | AddIndicator("EMA", 9, 26) 长度为9的EMA和长度为26的EMA |
MACD | 标准的MACD | 三个数字:快线、慢线、dea | AddIndicator("macd",12,26,9) |
SMAMACD | 使用SMA代替EMA计算的MACD | 三个数字:快线、慢线、dea | AddIndicator("macd",12,26,9) |
SMA | 只有一个参数表示一根SMA | 数字 | AddIndicator("SMA", 9) 长度为9的SMA |
SMA | 两个参数表示SMA交叉指标 | 两个数字:快线、慢线 | AddIndicator("SMA", 9, 26) 长度为9的SMA和长度为26的SMA |
SSMA | 只有一个参数表示一根SSMA | 数字 | AddIndicator("SSMA", 9) 长度为9的SSMA |
SSMA | 两个参数表示SSMA交叉指标 | 两个数字:快线、慢线 | AddIndicator("SSMA", 9, 26) 长度为9的SSMA和长度为26的SSMA |
STOCHRSI | 随机相对强弱指数 | 4个参数:STOCH窗口长度、RSI窗口长度、平滑k、平滑d | AddIndicator("STOCHRSI", 14,14,3,3) |
RSI | 只有一个参数表示一根RSI | 数字 | AddIndicator("RSI", 9)表示一根长度是9的RSI |
RSI | 两个参数表示RSI交叉指标 | 两个数字:快线、慢线 | AddIndicator("RSI", 9, 26)长度为9的RSI和长度为26的RSI |
BOLL | BOLL指标 | 两个参数:长度、多元 | AddIndicator("BOLL", 20,2) |
返回值 CommonIndicator 说明
- 如果是单根指标线,Result()返回当前的值,如果是两个指标线,则返回的是快线的当前值
- Indicator() 返回一个map 针对有两根线的 EMA/SMA/SSMA/RSI
result: 同Result()的值
fast: 快线的值
slow: 慢线的值
crossUp: 1 表示金叉, 0表示没有金叉
crossDown: 1 表示死叉, 0 表示没有死叉
boll指标
result: 同Result()的值,表示中间的均线的值
top: 上边线的值
bottom: 下边线的值
MACD/SMAMACD/STOCHRSI用这种方法只能获取到Result的值,建议直接使用 NewMACD/NewMACDWithSMA/NewSTOCHRSI方法