前几篇文章我们已经了解过所谓程序化、量化交易就是一个脚本程序根据从交易所获取到的数据,经过一系列的计算、判断、触发做出一些操作,操作交易所账户进行交易。这些获取数据、操作账户的行为都是通过交易所API接口进行的。简单说就是脚本程序和交易所交互,既然是交互那么就肯定有正常的交互、异常的交互。当发生异常交互时接口便返回了异常信息。
当然市面上的程序化、量化交易系统,是或自行开发的程序都会有各种各样的错误提示、报错信息。这些错误信息并非局限于交易所API接口的报错信息。还有诸如:程序运行时异常错误、配置错误、程序语法错误等。
在发明者量化交易平台上,错误信息也大概分为几个大类:

代码少写了括号之类的字符。此类错误通常在编辑策略页面就能看到错误提示,并且策略也是运行不起来的(运行时会直接报错,如下图)。

![]()
所以写完策略,在平台策略编辑页面习惯性的搂一眼,看看有没有红色小XX,有就肯定是有明显错误了。


![]()
此类错误都会导致程序异常,程序会停止运行。
X_Y这样的格式,X代表交易币的名称,Y代表计价币的名称(期货币本位合约交易对的计价币通常用USD表示,在前几篇文章中有介绍)。例如BTC_USDT,如果我胡乱写交易对,写成BTC-USDT。

![]()
在FMZ平台回测系统中报错:

![]()
实盘中报错:

![]()
再者,萌新经常遇到的一种错误:

![]()
此类错误是由于修改了FMZ平台账号的密码,导致配置的交易所对象中的API KEY失效(用户的API KEY都是在浏览器端加密后配置在FMZ平台),策略无法启动,进而报错。
这里列举几个产生网络请求的接口报错信息:

萌新们经常遇到的报错信息之一,原因是使用了国内网络的设备(自己的电脑或者国内的服务器)。由于大部分交易所都被墙,所以国内网络基本上很多交易所都访问不到,访问接口都会报超时。(前几篇文章中有提及)
经典报错信息之一,原因是调用交易所接口过于频繁,超过交易所限制的频率。(前几篇文章中有提及)
有的萌新同学可能会说,我多申请几个交易所的API KEY或者我多申请几个交易所账号不就行了。我们需要知道,交易所限制接口访问频率通常是基于IP地址的,简单说就是只要在一个IP地址发送的请求全部统计在这个IP地址上,超过了限制这个IP再发送请求交易所服务器就拒绝访问了。

![]()
调试工具执行结果,调试工具执行和实盘执行并无区别。
![]()
Huobi 错误 GetTicker: Invalid ticker: {\"Info\":{\"err-code\":\"invalid-parameter\",\"err-msg\":\"invalid symbol\",\"status\":\"error\",\"ts\":1620872079355},\"High\":0,\"Low\":0,\"Sell\":0,\"Buy\":0,\"Last\":0,\"Volume\":0,\"OpenInterest\":0,\"Time\":0}
这里的报错信息意思就是说交易对无效(从这里看出\"err-msg\":\"invalid symbol\")。
例如此类和业务相关的报错还有很多,比如设置杠杆时某些交易所不支持带小数部分的杠杆值,此时杠杆值如果带有小数部分也会导致接口调用报错。
列举一个不产生网络请求的接口调用

但是参数传错,或者乱写也是会报错的。

![]()
但是不论哪种类型的错误,显示出的报错信息都是查找问题的关键信息,通常都能从报错信息中看出问题所在。可以使用翻译工具,翻译报错信息,提取关键信息。例如上例中的\"err-msg\":\"invalid symbol\",翻译:“err msg”:“无效符号”。大概就知道是交易对设置错了,因为通常都用英文symbol代表交易代码、交易对。
关于报错信息我们就简单探讨这些,对于常见问题有个帖子会持续收集用于查询:https://www.fmz.com/bbs-topic/1427
回测系统也是一个量化工具中的重点,回测系统可以方便的测试策略原型,初步测试策略中潜在的BUG、逻辑问题等。对于回测系统需要理性看待。回测系统在一定程度上是可以反映出策略的一些问题的。
下面先简单的从FMZ支持的不同策略语言层面说明一下FMZ平台上的回测系统。(关于回测系统的一些介绍,前几篇文章中有所提及)
发明者量化交易平台的回测系统回测模式分为两种(这个不分策略语言,这个是回测设置,各种语言的策略回测都一样)。

![]()
关于回测系统的说明可以参看平台教程中的资料:
https://www.fmz.com/bbs-topic/4158#策略回测
K线中一根柱子不是有高开低收么,构成了一个价格框架,在这个K线代表的时间范围内,价格都在这个价格框架内,所以只要生成的价格在这个K线高开低收框架范围内,这个模拟出来的价格就是合理的。
就好比如图这样模拟:
![]()
当然实际回测系统实现这个模拟的时候情况比图上略微复杂,这里不做深究,理解模拟级别回测机制即可。
知道了这个原理,就需要注意模拟级别回测的弊端了,虽然模拟级别回测速度很快(因为模拟生成的价格,并非真实的逐秒的价格一个个放出)。但是如果策略拟合了模拟的tick变动趋势就会让策略表现的非常优秀(但是实际情况中价格可能不是这种走势,虽然价格都在这个K线柱的框架内)。
这里用于生成模拟tick数据的K线叫做底层K线,这个K线的周期叫做底层K线周期,在策略设置页面如图设置:

![]()
这里设置1分钟,意思就是使用周期为1分钟的K线数据作为生成模拟tick的数据源。
还有一点就是对于高频策略,使用模拟级别回测显然不太合适。但是对于趋势策略,使用模拟级别回测还是能一定程度反映出策略的绩效的。

发明者量化交易平台回测系统的数据来源是何处呢?回测系统默认使用的是FMZ平台的数据中心的数据,FMZ平台数据中心自动收集设置好的各个交易所各个币种的行情数据,提供给平台上的回测系统。

关于自定义数据源FMZ API文档中也有一些说明:
https://www.fmz.com/api#自定义数据源
FMZ文库中也有一些方案:
![]()
有兴趣的萌新们可以研究参考。
做程序化、量化交易离不开学习、测试、思考。
思考问题这个并不能凭空思考,那样是低效的。解决问题、思考问题最行之有效的就是查找资料、然后动手试下、思考分析,问题如果没解决请往复以上动作。
但是通常萌新遇到问题,就会感觉:
“哎呀~程序化、量化、写策略太难了”。
“看了半天,还是懵懵的!”
“没入门到想放弃!”
….
在FMZ平台上入门其实很简单,首先要善于查找资料。发明者量化交易平台策略广场、社区、文库中有不少资料可以查阅。

![]()
然后就是动手能力,使用回测系统、调试工具可以很方便的测试,这里并不是说要测试一个完整的策略。其实你如果是完全0基础,甚至你可以在FMZ量化的回测系统上学习JavaScript程序基础。
这个是我经常学习JS的教程网站:https://www.runoob.com/js/js-loop-for.html 不仅限于JS,各种IT知识这里都能查询、学习。
比如我JS的正则表达式不知道怎么用,怎么办?
当然先查阅资料,然后动手试下咯~
我看到这样一个例子:
![]()
我想测试下,甚至就可以用FMZ平台的回测系统测试学习。
回测系统上随便设置一个交易所
![]()
测试以下代码:
function IsEmail(str) {
var reg=/^\\w+@[a-zA-Z0-9]{2,10}(?:\\.[a-z]{2,4}){1,3}$/;
return reg.test(str);
}
function main() {
var strEmailAddress1 = \"13512345678\"
Log(strEmailAddress1, \" 是邮件地址么 ? \", \" 回答:\", IsEmail(strEmailAddress1))
var strEmailAddress2 = \"123456789@qq.com\"
Log(strEmailAddress2, \" 是邮件地址么 ? \", \" 回答:\", IsEmail(strEmailAddress2))
}

![]()
看~多好的一个学习工具!
比如我想学习JavaScript语言的循环逻辑怎么写,动手试下:
按数组中的顺序,循环打印一个数组变量中的各个元素:
function main() {
var arr = [{coinName: \"BTC\", price: 10000}, {coinName: \"LTC\", price: 100}, {coinName: \"ETH\", price: 2000}, {coinName: \"ETC\", price: 500}]
for (var i = 0 ; i < arr.length ; i++) {
Log(arr[i])
}
}

![]()
瞬间是不是感觉学习有动力了呢!
其实在FMZ上,完全可以边看JavaScript教程,边在回测系统上动手学习JavaScript基础。JavaScript语法掌握的差不多了,进入下一个阶段需要实际使用交易所接口获取数据测试了,还可以使用FMZ平台的调试工具进行真实的接口测试。
然后就是多思考,举一反三,测试验证,对比分析等。这样学习入门就非常快了。
买好币上币库:https://www.kucoin.com/r/1f7w3