可视化编程一直是软件工具开发者们的一个向往的目标,即使在量化交易领域也是一样。 因为可视化这种“所见即所得”的方式大大降低了编程开发的技术门槛。 用户再也不用面对一堆枯燥的编码,只用开动脑筋,发挥自己的想象力和逻辑思维,着力于业务本身。 就可以实现一个自己想要的程序,是不是很神奇!
那我们一起来进入量化交易策略的可视化编程领域吧!
在登录 https://www.fmz.com 之后,注册账户(如果已经注册直接登录),依次点击:控制中心->策略库->新建策略。
我们可以看到一个初始的可视化策略。 作用仅仅是输出默认配置的交易所(回测或者机器人上,添加的第一个交易所对象)的账户资产信息。 (如下图)
细心观察可以发现,模块都是有榫(凹)和 卯(凸)的,即模块都可以「连接」和「被连接」。 如果两个模块代表的功能代码可以连接,那么在你将两个模块的榫和卯靠近的时候就会吸附在一起。
一些模块有一些特殊可设置的地方,例如:
就可以拖动左侧的「项目」模块 到「加入」模块,这样就可以增加一个榫(凹)位置,从而增加一个拼接文本的位置。 这样就可以通过,点击小齿轮,对模块进行一些调整和设置。
一些模块需要输入一些参数,可能是数值、或者 字符串等。 如果不添加变量作为模块的输入参数,模块即按照默认的输入参数执行。
类似这样的求平方根的计算模块,输出一下这个模块的计算结果。 可以看到,如果输入参数这个位置缺省,就按照默认的数值9作为输入参数,计算9的平方根。
当然,如果希望用一个变量模块作为输入参数,可以直接把变量模块拼接入榫(凹)位置。
模块可以用鼠标左键点住,拖动。 模块可以用ctrl + c 键复制,ctrl + v 键粘贴,就如同复制粘贴代码或者文本一样方便。 操作区可以用鼠标滑轮缩放大小,所有模块会缩放变大或者变小。 在操作区点住空白位置拖动,可以移动操作区域。 右侧垃圾桶,记录最近删除的模块。 最重要的,拼接好了模块策略,不要忘记点「保存」。
可以看到可视化编辑区左侧有很多模块分类,每种分类项目中有很多可以用的可视化模块。
一共分为 11 个类别。
该模块通常是和文本类的模块一起组合使用,如下图: 可以在文本类模块中输入字符串,这样运行「输出信息」这个模块时,就会打印文本模块中的字符串内容。 回测:
如同 JavaScript 语言代码:
function main(){
Log("你好,可视化编程!")
}
该模块和「输出信息」外观一样,区别为输出信息的同时推送信息到当前账号绑定的微信上。
如同 JavaScript 语言代码:
function main () {
Log("微信推送!@")
}
抛出异常模块让程序发出一个错误,然后程序停止执行(在不写异常处理代码的情况下)。
类似在JavaScript策略中 main 函数中直接执行了 throw “要输出的字符串” 函数。
function main () {
throw "第一句就抛出异常,让程序停止!"
}
回测结果: 一般在调试的时候用的比较多,例如希望程序在某个条件下停止,打印当时的一些数据便于观察。 或者是在可能发生问题的代码流程放置抛出异常模块,让程序报错,发现一些错误。
休眠模块 如同JavaScript 策略中:
function main () {
Sleep(1000 * 5)
}
测试休眠模块: 回测结果:
该模块如同 发明者量化交易平台 API 函数 LogProfit 的作用,打印收益日志,并且自动根据输入的参数绘制收益曲线。
例如: 回测执行如图: 对应的JavaScript策略代码如下:
function main () {
LogProfit(1)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(3)
Sleep(1000 * 5)
LogProfit(2)
Sleep(1000 * 5)
LogProfit(5)
}
可以拼接在任何想要输出收益信息的位置。
循环模块可以包裹住一系列拼接起来的模块组合,让这个模块组合循环执行。
测试: 回测结果: 可以看到让循环模块包裹住 打印收益 和 休眠组成的 模块组合后,会不停执行模块组合。
该模块和循环模块用法基本一致,唯一区别就是该模块自带了休眠。
变量模块或者数值需要控制精度时可以用这个模块处理,输入参数部分的数值,会按照设置,输出为指定小数位的数值。
例如,对数值 3.1415926535897 进行精度处理。
回测显示:
用于清空日志,根据输入参数,可以保留一部分日志。 如同 API文档中:
LogReset()
用于清空收益日志,根据输入参数,可以保留一部分日志。 如同 API文档中:
LogProfitReset()
此工具模块需要和「交易模块类型」中的行情模块搭配使用,如图:
使用输出信息模块输出 最新 ticker 行情的最新成交价:
回测显示:
如同JavaScript 策略代码:
function main () {
Log(exchange.GetTicker().Last)
}
该模块也是需要和「交易模块类型」中的获取K线数据模块一起使用。
先创建一个变量模块,取名: K线。 然后获取K线数据,使用K线数据模块获取,赋值给变量模块:「K线」。 接着使用「列表模块类型」中的列表长度模块,获取K线变量模块的长度,用于指定获取K线哪个Bar上的数据。 拼接在一起,如图: 回测运行,即打印出了,最后一根K线Bar 的时间戳。
同样是要和「交易模块类型」中的获取深度数据模块一起使用。
索引设置0 ,设置卖单,获取的就是 卖一 这个订单的信息。
如同 JavaScript 策略代码:
function main () {
Log(exchange.GetDepth().Asks[0])
}
该模块 需要和 获取资产信息模块一起使用。
例如:打印当前账户可用币数
回测显示:
如同JavaScript 策略:
function main () {
Log(exchange.GetAccount().Stocks)
}
该模块用于获取订单数据中某个属性的值,例如 订单薄 中卖一的 价格或者数量(序号13的 范例)。
回测结果: 如同JavaScript 策略:
function main () {
Log(exchange.GetDepth().Asks[0].Price)
}
还可以用来获取「查询订单详细信息模块」返回的订单信息中的某个属性(将在进阶篇中讲解)。
同样,要和「获取期货持仓模块」一起使用,要注意的是,获取期货持仓模块返回的持仓数据是一个数组(列表),是包含不同合约、不同方向的仓位的数据结构。所以具体使用时要指明索引。
学习了这么多,接下来,我们一起来组合一个对冲操作,即同时在近期和远期合约做对冲。 我们做一个正向套利对冲,即远期合约开空,1张合约,近期开多1张合约。
回测结果:
可视化范例策略:
更多策略尽在:https://www.fmz.com/square
本系列其它文章
15650463856 指标里没有cci,我如果要用cci是不是就不能用这个可视化去创建
墨色 请问可视化中的指标模块是怎么使用的
发明者量化-小小梦 https://www.fmz.com/digest-topic/6182
15650463856 除了深入,初识,进阶这三个还有本系列其他的文章吗,为什么我没找到自定义模块和指标模块用法呢
发明者量化-小小梦 这个系列里的文章有讲如何实现自定义的模块。
墨色 好的,谢谢。找到了
发明者量化-小小梦 这个系列文章可以看完,又讲。