💡 快速搜索提示:使用
Ctrl + F键打开页面搜索,输入关键字(如"托管者")即可定位相关内容。
目录
API接口相关
Q: 为何 GetTicker 和 GetDepth 得到的买一价和卖一价会不同?
GetTicker 和 GetDepth 可能不是同时获取,存在一定延迟,数据会有变化。一般来说 GetTicker 数据更快,因为数据量较少。
Q: exchange.GetOrders 得到的是未成交挂单,已成交的单子在哪里获取?
查询订单还有一个API:exchange.GetOrder,根据订单 ID 查询所有类型的订单。获取成交订单需要看交易所是否提供相应接口,每个交易所提供的接口可能不同。
Q: JavaScript 策略时间字符串转时间戳的结果不对?
需要考虑系统时间设置中的时区问题。
Q: 为什么打印出来的开盘价、收盘价都一样?
可能原因:
- 交易所该时刻确实没有交易,该BAR的高开低收本身就一样
- 观察的是最后一个BAR,在最后一个BAR生成的瞬间,高开低收是一样的
Q: 出现 Signature not valid: Invalid submission time or incorrect time format 错误?
该问题多见于 Windows 2000/2003/XP 等旧操作系统。
建议:使用 Linux 服务器,或在 Windows 系统安装时间同步软件,高频率同步时间。
Q: 为什么麦语言的 ATR(TR)计算出的数值和 TA/talib 库计算出来的有差异?
原因是麦语言指标的计算方式和 TA/talib 库底层算法不一致。两者都对,只是算法不同。类似 MACD:有的用一倍的 DIF-DEA,有的用两倍的 DIF-DEA,都是正确的。
Q: 交易所名称 Futures_Esunny 代表什么?
代表易盛协议的交易所对象,可由 exchange.GetName() 函数返回。
⚠️ 目前FMZ国际站仅支持数字货币业务。
Q: 麦语言多周期引用数据时,在 #EXPORTTEST...#END 代码块内声明变量后,使用 REF 引用数据和预期不符?
所有需要的多周期数据,应在 #EXPORTTEST...#END 中处理好,在外部只直接使用处理后的结果。
Q: 找不到FMZ API文档?
方式一:直接访问 https://www.fmz.com/api
方式二:如图点击链接
Q: 为啥 MACD 跟交易所算出来的值不一样?
对比时需要确认以下条件一致:
- K线周期
MACD指标参数- 时间段
- 品种
此外,MACD 的量柱算法有多种:有的是 DIF-DEA,有的是 2*(DIF-DEA)。DIF 和 DEA 应当是一致的。
Q: 获取历史K线数据时,获得的K线数量跟什么有关?
调用 exchange.GetRecords 接口获取K线数据时,返回的K线数量由交易所决定,每家交易所返回的数量可能不一致。
💡 部分交易所没有提供K线接口,托管者会调用交易历史数据接口根据交易历史合成K线。托管者接收到的K线会持续累计,需要保持一定频率访问
exchange.GetRecords接口,否则可能影响数据的连续性。
Q: API文档说 exchange.Buy 只返回 ID,为什么实际返回那么多信息?
FMZ的可产生日志输出的API函数(如 Log、exchange.Buy、exchange.CancelOrder 等)都可以在必要参数后添加附带输出参数。
示例:
javascript
exchange.CancelOrder(orders[i].Id, orders[j]) // 取消订单时附带输出订单信息
Q: 实盘如何微信推送信息?
在 Log 函数最后加上字符 '@' 即可推送该条日志信息。
详见API文档:https://www.fmz.com/api#Log
⚠️ 仅实盘有效,目前FMZ国际站仅支持数字货币业务。
Q: exchange.GetAccount 获取信息会不会因网络问题失败?FMZ系统底层有做处理吗?
会失败,需要用户自行容错处理。FMZ底层不处理数据,反馈给用户的是未加工的数据。
具体容错方式(过滤错误、重试等)由策略制定,FMZ不做预处理是为了不影响用户决策。
Q: OKEX合约下单量的单位是什么?
OKEX合约交易在FMZ下单时按合约张数计算。
示例:
javascript
exchange.Buy(1000, 1) // 下价格为1000,量为1张合约的订单
Q: 在FMZ上调用 exchange.Sell 和 exchange.Buy 是下普通限价单吗?
取决于传入的第一个参数(价格):
- 价格不是
-1:限价单 - 价格传入
-1:市价单(部分交易所支持)
⚠️ 市价单注意事项:
- 现货市价买单的下单量通常是金额而非币数
- 期货市价单的下单量一般为合约张数(整数)
参考文档:
Q: Mail 函数发送邮件超时?
javascript
Mail("smtp.qq.com", "[email protected]", "xxx", "[email protected]", "test title", "test body")
访问QQ的SMTP(203.205.232.7)超时,原因是绝大多数云服务器屏蔽了25端口。
解决办法:
- 使用实体服务器(运营商一般不屏蔽25端口)
- 申请云服务器解封25端口
Q: Pine语言、麦语言的模板参数「变量最长周期数」会影响指标计算?
默认「变量最长周期数」为 600。如果指标参数设置过大(如计算 MA(1000)),由于系统只保留了600个数据,无法计算出1000个数据的均值。
报错处理
InternalError: arg1 type error
触发场景:
javascript
function main() {
_G(11212, "123")
}
原因:_G 函数的键名不能为数值类型,必须是字符串。
signal arrived during external code execution
特征:Exception 0xc00000fd
Exception 0xc00000fd 0x1 0x5cdd203f40 0x1ee5955
PC=0x1ee5955
signal arrived during external code execution
原因:无限递归调用导致栈溢出。
实盘页面控制台输出内存溢出错误
示例(Python):
python
def create_large_list():
large_list = []
while True:
large_list.append(" " * 1024)
print(f"Current list size: {len(large_list)}")
def main():
create_large_list()
SyntaxError: variable name expected
排查方向:
- 检查策略代码编辑区是否有错误提示
- 检查是否
var name = "a"时忘记写变量名 - 检查策略界面参数是否使用了编程语言关键字
⚠️ 不建议使用编程语言常见关键字命名变量,容易引起冲突。
BITMEX 429错误:Rate limit exceeded
json
{"error":{"message":"Rate limit exceeded retry in 1 seconds……"}}
原因:访问交易所接口频率过高。
解决办法:增加轮询间隔,降低访问接口频率。
Bittrex 报错:NOT_ALLOWED
json
{"success":false,"message":"NOT_ALLOWED","result":null}
原因:交易所限制了权限。
解决办法:登录 Bittrex 交易所网站,查看是否需要勾选用户协议。
TypeError: value has no property
💡 回测和实盘的报错信息可能不一样,该错误在回测中可能测不出来。
unable to open database
可能原因:
- Mac OS 系统权限问题
- 设备硬盘空间已满,无法创建实盘数据库文件
不支持该功能
原因:回测时添加的是数字货币现货交易所对象,但代码中调用了期货的API函数。
OSError: exception: access violation reading
in SetCurrency OSError: exception: access violation reading 0x000000FCF25F0000
场景:数字货币期货 Python 策略,回测使用私有托管者,代码中切换了交易对。
原因:回测系统不支持数字货币期货回测切换交易对。
decrypt 报错
原因:修改了FMZ账号密码,导致配置的API KEY失效。
解决办法:
- 重新配置交易所API KEY
- 停止托管者
- 重新启动托管者
- 重新运行实盘
Python本地回测引擎报 EOFError
EOF 错误是回测结束的正常信号,捕获异常即可:
python
# encoding: utf-8
'''backtest
start: 2021-08-30 00:00:00
end: 2022-09-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
'''
from fmz import *
task = VCtx(__doc__)
def main():
while not exchange.IO("status"):
Sleep(1000)
exchange.SetContractType("swap")
while True:
bars_1min = _C(exchange.GetRecords, PERIOD_M1)
print(len(bars_1min))
_CDelay(2000)
try:
main()
except:
print(task.Join(False))
麦语言指标计算出 N/A 值
原因:计算周期参数超出数据范围。
处理办法:
麦语言报错「解析错误」,报错行数位置异常
可能原因:早期麦语言模板问题。
处理办法:
- 导出策略为xml文件
- 创建一个新的空麦语言策略
- 将xml文件导入到新策略中
- 创建实盘测试
fatal error: unexpected signal during runtime execution
fatal error: unexpected signal during runtime execution
go routine 11[syscall, locked to thread]
可能原因:C++ 策略使用了空指针。
建议:用容错模式回测检验。
SetMarginLevel 报错 403
Futures_OP 0:403:{"error":{"message":"Access Denied","name":"HTTPError"}}
原因:交易所申请的API KEY相关权限未开启。
回测错误:symbol not set
原因:期货交易所回测代码中没有设置合约。
参考:API文档中 exchange.SetContractType 函数。
ERR_INVALID_POSITION
原因:在没有持仓或持仓数量不足时尝试下单平仓。
排查:检查是否有未成交订单导致的仓位冻结。
ERR_INVALID_ORDER
排查方向:
- 下单价格是否正确(回测系统数字货币期货暂不支持市价单)
- 下单量是否为0、负数或小数(期货合约张数必须为整数)
ERR_INSUFFICIENT_ASSET
原因:可用资产数量不足当前下单所需,即没有资金下单了。
Cannot pass non-string to std::string
原因:策略代码中某个属性名使用错误(使用了未定义的属性)。
timestamp is out of range
json
{"status":6004,"msg":"timestamp is out of range"}
原因:服务器时间戳偏差过大。
解决办法:更新服务器时间,保持与标准时间同步。
timeout 错误
原因:访问交易所接口超时,通常是网络问题或交易所接口问题。
解决办法:使用海外地区服务器运行托管者。
syntax error invalid label
问题根源:
javascript
function main(){
if(1){
continue // 错误!
}
}
原因:continue 语句必须用于循环中!
Nonce is not increasing
json
{"error":{"message":"Nonce is not increasing. This nonce:1523891993165, last nonce:1523891993165","name":"HTTPError"}}
原因:时间戳校验不通过。
解决办法:同步托管者所在系统的时间。
Secretkey decrypt failed
原因:API KEY解析失败,可能是配置API KEY后修改过FMZ账号密码。
解决办法:
- 重新配置交易所API KEY
- 重启托管者
- 重新运行实盘
GetOrder 报错:invalid order id or order cancelled
原因:
- 订单已取消(部分交易所会清除已取消订单的信息)
- 查询的订单ID本身错误
rate limit, 429 Too Many Requests
原因:访问交易所接口频率过高。
解决办法:降低访问频率。
Invalid order price/amount
原因:调用 exchange.Buy 或 exchange.Sell 时传入的价格或下单量数值错误(如负数、0)。
排查方法:下单前用 Log 函数输出价格和数量参数。
Invalid symbol
json
{"code":-1121,"msg":"Invalid symbol."}
原因:交易对设置错误。
实盘运行
Q: Pine语言、麦语言实盘收益曲线何时打印?
根据模板参数设置定时打印,策略完全平仓时也会打印。
Q: 麦语言实盘打印了信号触发行数,但没有下单操作?
可能原因:麦语言模板参数设置不合适(如精度、最小下单量精度等)。
信号触发层判断成功,但交易执行层因参数问题判定为不可下单。
参考:
Q: 设置好TradingView的webhook url,为什么实盘收不到信号?
排查清单:
- webhook url中的API KEY是否正确(FMZ扩展API KEY,在账号设置中配置)
- webhook url中的实盘ID是否正确
- FMZ扩展API KEY权限是否正确(默认是
*即所有权限,不要在*后面直接写函数名)
Q: 创建实盘时为什么只有有限的几种货币对?
可以使用自定义控件设置交易对(仅实盘支持,回测数据有限):
Q: 服务器上运行FutuOpenD(富途)获取不到行情?
原因:富途对海外IP有限制,检查服务器是否是海外IP地址。
Q: 麦语言策略运行一直不动,只更新行情?
检查是否使用了收盘价模型(在麦语言模板参数中设置)。
Q: BITMEX 交易所K线时间戳为什么比其它交易所多一个周期时间?
原因:BITMEX 的K线时间戳以当前Bar的结束时间作为时间戳(部分周期除外)。
回测系统
Q: 报错 Exception catching is disabled?
Exception catching is disabled, this exception cannot be caught.
Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.
可能原因:使用「自定义数据源」功能时,数据源提供的数据异常。
Q: 如何测试手续费是taker/maker?
javascript
/*backtest
start: 2022-11-08 00:00:00
end: 2023-02-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
function main() {
var t = exchange.GetTicker()
exchange.Buy(t.Last - 10, 100/(t.Last - 10))
while(1){
t = exchange.GetTicker()
Sleep(1000)
}
}
Q: 币安期货、BITMEX回测,资金费率是否算入盈亏曲线?
是的,资金费率会算入回测系统生成的盈亏曲线。
Q: 回测按钮显示不可点击?
排查:检查是否开了代理导致页面文件加载不完整,查看页面控制台是否有报错。
Q: 实盘级Tick为什么有50MB限制?
实盘级Tick包含逐秒行情、盘口快照、订单流数据,数据量非常大。50MB限制意味着回测范围最多几个小时,主要用于测试高频策略。
Q: 修改了回测手续费为什么不起作用?
界面上设置手续费只对新添加的交易所对象生效,已添加的交易所对象无法直接修改。
Q: 怎么让回测自定义画图显示的数据多一点?
自定义图表画图时(Chart 函数),显示的数据量与回测设置上的图表参数有关(控制图表显示最大条数)。
💡 注意检查是否使用了
chart.reset函数清空了部分旧数据。
Q: C++ 回测什么都不显示,也没有报错信息?
C++ 策略一些异常不抛出错误,需用排除法逐级检查代码可能的运行时错误。
常见原因:指标计算时K线数量不足导致指标算出 NAN,后与数值类型做比较判断引起程序崩溃。
Q: Python 回测卡死?
不能在 try 异常检测里面写 Sleep 函数,这种写法会导致卡死:
Q: 为什么回测的时候只有几个交易所和有限的交易对?
交易所的交易对太多,回测系统只选择了几种有代表性的交易对用来测试。
💡 可以选择情况相近的交易对回测,实盘时可以用自定义控件设置交易所支持的交易对。
Q: 回测系统为什么不支持更多交易对?
回测系统暂时只支持主流交易所的主流币种。如果策略有效,哪怕是其它币种行情,都应该有基本正向收益的表现——这就是策略的普适性。
如果只能拟合一段历史数据或者某个品种表现不错,这种策略实际上有潜藏风险或缺陷。
Q: 回测系统中「平仓盈亏」「持仓盈亏」「保证金」「预估收益」「当前可用USDT」的概念?
| 概念 | 说明 |
|---|---|
| 平仓盈亏 | 当前持仓之前所有交易开仓、平仓产生的累计盈亏 |
| 持仓盈亏 | 当前持仓的盈亏(无持仓则为0) |
| 保证金 | 当前持仓占用的保证金数额 |
| 预估收益 | 假设当前持仓按当前价格平仓产生的盈亏 + 平仓累计盈亏 |
| 当前可用USDT | 当前可用于开仓的USDT数额 |
Q: 回测系统胜率如何计算?
javascript
for (var i = 0; i < profits.length; i++) {
if (i == 0) {
if (profits[i][1] > 0) {
winningResult++
}
} else {
if (profits[i][1] > profits[i - 1][1]) {
winningResult++
}
}
// ... 最大回撤计算
}
计算方式:回测系统定时计算浮动盈亏后,统计出一条浮动盈亏曲线。从第一个点开始对比下一个点,高于则记录为胜,低于记录为负,然后继续往后对比。
托管者部署
Q: FMZ平台上托管者显示离线,服务器上托管者程序被停止?
在Linux操作系统,可能因内存不足导致托管者被系统停止。
触发原因:
- 策略过度使用硬件资源
- 策略Log输出了非常大的内容
- 托管者所在设备上运行了过多的策略实盘
- 其它原因(补充中)
Q: MAC电脑运行托管者报错 dyld: cannot load?
dyld: cannot load (load command is unknown)
原因:操作系统版本太低。
Q: Linux系统托管者部署视频在哪儿?
B站链接:
Q: 更新托管者是否必须停止旧托管者后重新运行?
可以不停止托管者,直接删除旧的 robot 程序文件,然后下载新的压缩包解压出新的 robot 程序文件放在原来的位置。
⚠️ 此时托管者已更新,但运行中的实盘在内存使用的还是旧版本,只有重启实盘才会使用最新版本。
Q: 使用 screen 运行托管者时出现 command not found?
Linux系统没有安装 screen 软件。
CentOS安装命令:
bash
yum install screen
💡 当前托管者已支持SSH断开转入后台运行,可以不使用
screen。直接使用命令:bash./robot -s node.fmz.com/xxxxxxx输入FMZ账号密码后显示
Login OK即为部署成功。
注意:xxxxxxx 是每个FMZ账号唯一的识别码,在托管者页面点击添加托管者可以看到。
Q: 托管者运行时实盘的日志在哪?
在托管者程序所在目录 logs 文件夹内的 DB3 数据库文件中,数据库文件名为实盘的 id,扩展名为 db3。
Q: Linux系统下 ./robot -l 查看托管者支持的交易所名称,exchange 是什么交易所?
名字为 exchange 的交易所对象代指通用协议接入的交易所。
通用协议详情:https://www.fmz.com/api#通用协议
Q: 托管者页面托管者无法按列表显示?
添加的托管者超过5个会出现按列表显示的控件。
Q: 创建实盘时托管者选择下拉框里有不是自己部署的托管者?
平台提供的公共托管者为初学者增加的快速上手工具,学习时不用部署托管者。
⚠️ 真正实盘测试推荐使用私有托管者,公共托管者的硬件资源、网络都是共享的,平台可能不定期维护。
Q: 部署托管者时那一串地址是每个用户唯一的吗?
是的。./robot -s node.fmz.com/1234567 中的 /1234567 部分是每个用户唯一的地址标识。
从控制中心 → 点击添加托管者按钮 → 添加托管者页面,可以看到这个地址,直接复制粘贴使用。
Q: 托管者所在系统添加了Python2.7环境变量,为什么还提示找不到?
原因:Windows系统初次安装Python,设置环境变量后需要重启才能生效。
研究环境
Q: 研究环境出现EOF错误?
Python回测靠EOF异常结束回测(因为有时策略可能是死循环)。提示EOF异常是正常情况。
平台功能
Q: 一个托管者可以跑几个实盘?
并不限制数量,具体看服务器配置和策略复杂程度。
需要考虑:
- 多个实盘是否都访问相同的交易所接口(实盘越多频率越高)
- 一般5-6个实盘没问题
Q: 托管者、实盘等基础概念理解?
参考:https://www.fmz.com/digest-topic/7542
Q: 实盘、托管者页面内容全部消失?
实盘在正常运行,托管者在服务器正常运行,但页面内容消失。
可能原因:浏览器插件引起的全局变量污染问题。
处理办法:卸载浏览器插件,或使用没有安装任何插件的浏览器登录FMZ。
Q: 租用的官方策略、一键部署租用的服务器,会自动续费吗?
- 租用的策略:不会自动续费
- 一键部署的托管者服务器:会自动续费(需账户余额足够)
Q: 模板功能在哪里?
参考FMZ API文档:https://www.fmz.com/api#模板类库
Q: FMZ模拟盘 wexApp 只能选 BTC_USDT 吗?如何自定义其它交易对?
wexApp 模拟盘暂时只支持几个主流交易对,并非所有交易对都有模拟。
Q: 扩展API并发调用时总是报nonce校验错误?
可以创建多个FMZ平台的扩展API KEY,用于并发请求。
Q: 使用调试工具时,在托管者上创建的调试线程会记录状态吗?
调试工具执行时,如果第二次什么都没有修改会保留之前创建的交易所对象,不会释放。所以一些状态会记录(如交易所对象当前为币币模式还是杠杆模式)。
Q: 注册了 wexApp 模拟交易所,为什么没有资产?
注册后需要验证邮箱激活账户,在个人中心激活账户即可。
Q: 日志信息被截断显示...,如何查看完整数据结构?
解决办法:使用控制中心的调试工具,调试工具中使用 return 语句返回需要显示的内容,不会截断内容显示。
Q: JavaScript策略中 $. 开头的函数是什么意思?
$. 开头的函数是模板的导出函数,类似模块的接口函数。
参考API文档:https://www.fmz.com/api#模板类库
💡 Python版策略的导出函数开头是以
ext.声明的。
Q: 如何在回测结果的行情数据图上绘制直线?
回测时最终显示的图表分2种:
- 系统生成的:策略无法控制
- 策略代码绘制的:用FMZ的API接口
Chart函数画的
参考:https://www.fmz.com/api#chart...
Q: 误删了谷歌验证器,如何重置谷歌验证?
可以用另外的浏览器登录FMZ平台,在需要输入谷歌验证码时,点击「解除绑定」跳转到使用邮箱解除绑定的页面。
其它问题
Q: 交易所API KEY安全如何保障?
用户的API KEY在浏览器端加密上传,FMZ不保存用户交易所账户的明文信息,并且使用Https协议。
Q: 策略的安全性问题?
参考:https://www.fmz.com/bbs-topic/1657
Q: FMZ平台计费系统、计费机制?
实盘计费标准:
- 一个实盘一小时计费一次(0.05 USD/小时),买断一小时使用时间
- 一小时内停止、重启实盘不会重复计费
- 已经停止的实盘,下一个小时不会触发计费
- 新创建的实盘会立即计费一小时
💡 计费时间为计费操作处理时间,处理操作会耗时,扣费时间可能往后延迟。例如当前计费时间为9:00,处理时间可能为9:02,会在下一次扣费操作时矫正。
Q: talib库处理数据精度有限?
如果数据特别小会被截断,最终显示为0。
参考:https://github.com/TA-Lib/ta-lib-python/issues/157
Q: 计费项目中实盘扣费,一次性扣除超过一小时计费(0.05USD)?
可能原因:托管者和FMZ平台长时间通信断开(期间实盘直接和交易所交互,执行策略正常),扣费累积、延迟,一次性结算扣费导致。
Q: 如何重置注册时的邮箱?
如果邮箱丢失等原因需要重置绑定邮箱,需要:
- 使用该FMZ账号提交工单
- 提交历史充值记录截图等信息验证
- 人工审核后重置邮箱地址
Q: 登录验证码邮件、密码重置邮件延迟或无法收到?
可能原因:邮箱运营商本身问题。
建议:使用 Gmail 邮箱。
💡 经测试,QQ邮箱有延迟邮件显示的问题,有时延迟20分钟才显示。
Q: 平台账户密码找回失败?
请确保找回密码操作输入的内容100%正确。
⚠️ 注意:使用浏览器自动填入邮箱可能填入错误,请确保手动正确输入。
Q: 用户名如何获取?
使用密码找回功能,在找回密码邮件中可以看到用户名。
反馈与支持
如有其他问题,可通过以下方式获取帮助:
- 提交工单
- 社区论坛发帖
- 查阅API文档:https://www.fmz.com/api
本文档持续更新中,欢迎反馈补充!
我试了两种exit的方式,一种是直接在开单时挂进去,代码如下,回测图一
if strategy.position_size >= 0 and Trend < 0 and TCI_bear
strategy.entry("SHORT", strategy.short, qty= rolling == true ? roll_size : size, comment='OP-S@')
strategy.exit("CL-S", "SHORT", xxxxxx)
state := -1
trading_1:=0
另一种是入场后采用查找订单的方式exit,代码如下(奇怪的是用这种方式exit直接不起作用了(回测图二),查找订单的函数是直接从文章里复制的)
if barstate.isrealtime and findOrderIdx("SHORT") >= 0 and state == -1
state := 0
strategy.exit("CL-S", "SHORT", xxxxxx)

还有一点,不知道为什么同一信号连续开了3次,代码如下
if trading_1 == 0 and Trend == -1 and TCI_bear and strategy.position_size < 0
strategy.entry("IP-S1", strategy.short, qty=size)
trading_1 := -1
梦总帮忙看一下是怎么回事
- 1
- 2
- 3
- 4






















