💡 快速搜索提示:使用
Ctrl + F键打开页面搜索,输入关键字(如”托管者”)即可定位相关内容。
GetTicker 和 GetDepth 得到的买一价和卖一价会不同?GetTicker 和 GetDepth 可能不是同时获取,存在一定延迟,数据会有变化。一般来说 GetTicker 数据更快,因为数据量较少。
exchange.GetOrders 得到的是未成交挂单,已成交的单子在哪里获取?查询订单还有一个API:exchange.GetOrder,根据订单 ID 查询所有类型的订单。获取成交订单需要看交易所是否提供相应接口,每个交易所提供的接口可能不同。
需要考虑系统时间设置中的时区问题。

可能原因: 1. 交易所该时刻确实没有交易,该BAR的高开低收本身就一样 2. 观察的是最后一个BAR,在最后一个BAR生成的瞬间,高开低收是一样的
Signature not valid: Invalid submission time or incorrect time format 错误?该问题多见于 Windows 2000/2003/XP 等旧操作系统。
建议:使用 Linux 服务器,或在 Windows 系统安装时间同步软件,高频率同步时间。
ATR(TR)计算出的数值和 TA/talib 库计算出来的有差异?原因是麦语言指标的计算方式和 TA/talib 库底层算法不一致。两者都对,只是算法不同。类似 MACD:有的用一倍的 DIF-DEA,有的用两倍的 DIF-DEA,都是正确的。
Futures_Esunny 代表什么?代表易盛协议的交易所对象,可由 exchange.GetName() 函数返回。
⚠️ 目前FMZ国际站仅支持数字货币业务。
#EXPORTTEST...#END 代码块内声明变量后,使用 REF 引用数据和预期不符?所有需要的多周期数据,应在 #EXPORTTEST...#END 中处理好,在外部只直接使用处理后的结果。
方式一:直接访问 https://www.fmz.com/api
方式二:如图点击链接

MACD 跟交易所算出来的值不一样?对比时需要确认以下条件一致:
- K线周期
- MACD 指标参数
- 时间段
- 品种
此外,MACD 的量柱算法有多种:有的是 DIF-DEA,有的是 2*(DIF-DEA)。DIF 和 DEA 应当是一致的。
调用 exchange.GetRecords 接口获取K线数据时,返回的K线数量由交易所决定,每家交易所返回的数量可能不一致。
💡 部分交易所没有提供K线接口,托管者会调用交易历史数据接口根据交易历史合成K线。托管者接收到的K线会持续累计,需要保持一定频率访问
exchange.GetRecords接口,否则可能影响数据的连续性。
exchange.Buy 只返回 ID,为什么实际返回那么多信息?FMZ的可产生日志输出的API函数(如 Log、exchange.Buy、exchange.CancelOrder 等)都可以在必要参数后添加附带输出参数。
示例:
exchange.CancelOrder(orders[i].Id, orders[j]) // 取消订单时附带输出订单信息
在 Log 函数最后加上字符 '@' 即可推送该条日志信息。
详见API文档:https://www.fmz.com/api#Log
⚠️ 仅实盘有效,目前FMZ国际站仅支持数字货币业务。
exchange.GetAccount 获取信息会不会因网络问题失败?FMZ系统底层有做处理吗?会失败,需要用户自行容错处理。FMZ底层不处理数据,反馈给用户的是未加工的数据。
具体容错方式(过滤错误、重试等)由策略制定,FMZ不做预处理是为了不影响用户决策。
OKEX合约交易在FMZ下单时按合约张数计算。
示例:
exchange.Buy(1000, 1) // 下价格为1000,量为1张合约的订单
exchange.Sell 和 exchange.Buy 是下普通限价单吗?取决于传入的第一个参数(价格):
- 价格不是 -1:限价单
- 价格传入 -1:市价单(部分交易所支持)
⚠️ 市价单注意事项: - 现货市价买单的下单量通常是金额而非币数 - 期货市价单的下单量一般为合约张数(整数)
参考文档: - https://www.fmz.com/api#exchange.buyprice-amount - https://www.fmz.com/api#exchange.sellprice-amount
Mail 函数发送邮件超时?Mail("smtp.qq.com", "[email protected]", "xxx", "[email protected]", "test title", "test body")
访问QQ的SMTP(203.205.232.7)超时,原因是绝大多数云服务器屏蔽了25端口。
解决办法: - 使用实体服务器(运营商一般不屏蔽25端口) - 申请云服务器解封25端口
默认「变量最长周期数」为 600。如果指标参数设置过大(如计算 MA(1000)),由于系统只保留了600个数据,无法计算出1000个数据的均值。
InternalError: arg1 type error触发场景:
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):
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排查方向:
1. 检查策略代码编辑区是否有错误提示
2. 检查是否 var name = "a" 时忘记写变量名
3. 检查策略界面参数是否使用了编程语言关键字
⚠️ 不建议使用编程语言常见关键字命名变量,容易引起冲突。
BITMEX 429错误:Rate limit exceeded{"error":{"message":"Rate limit exceeded retry in 1 seconds……"}}
原因:访问交易所接口频率过高。
解决办法:增加轮询间隔,降低访问接口频率。
Bittrex 报错:NOT_ALLOWED{"success":false,"message":"NOT_ALLOWED","result":null}
原因:交易所限制了权限。
解决办法:登录 Bittrex 交易所网站,查看是否需要勾选用户协议。
TypeError: value has no property
💡 回测和实盘的报错信息可能不一样,该错误在回测中可能测不出来。
unable to open database
可能原因: - Mac OS 系统权限问题 - 设备硬盘空间已满,无法创建实盘数据库文件
不支持该功能原因:回测时添加的是数字货币现货交易所对象,但代码中调用了期货的API函数。
OSError: exception: access violation readingin SetCurrency OSError: exception: access violation reading 0x000000FCF25F0000
场景:数字货币期货 Python 策略,回测使用私有托管者,代码中切换了交易对。
原因:回测系统不支持数字货币期货回测切换交易对。
decrypt 报错
原因:修改了FMZ账号密码,导致配置的API KEY失效。
解决办法: 1. 重新配置交易所API KEY 2. 停止托管者 3. 重新启动托管者 4. 重新运行实盘
EOFErrorEOF 错误是回测结束的正常信号,捕获异常即可:
# 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 值
原因:计算周期参数超出数据范围。
处理办法:

可能原因:早期麦语言模板问题。
处理办法: 1. 导出策略为xml文件 2. 创建一个新的空麦语言策略 3. 将xml文件导入到新策略中 4. 创建实盘测试
fatal error: unexpected signal during runtime executionfatal error: unexpected signal during runtime execution
go routine 11[syscall, locked to thread]
可能原因:C++ 策略使用了空指针。
建议:用容错模式回测检验。

SetMarginLevel 报错 403Futures_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{"status":6004,"msg":"timestamp is out of range"}
原因:服务器时间戳偏差过大。
解决办法:更新服务器时间,保持与标准时间同步。
timeout 错误原因:访问交易所接口超时,通常是网络问题或交易所接口问题。
解决办法:使用海外地区服务器运行托管者。
syntax error invalid label问题根源:
function main(){
if(1){
continue // 错误!
}
}
原因:continue 语句必须用于循环中!
Nonce is not increasing{"error":{"message":"Nonce is not increasing. This nonce:1523891993165, last nonce:1523891993165","name":"HTTPError"}}
原因:时间戳校验不通过。
解决办法:同步托管者所在系统的时间。
Secretkey decrypt failed
原因:API KEY解析失败,可能是配置API KEY后修改过FMZ账号密码。
解决办法: 1. 重新配置交易所API KEY 2. 重启托管者 3. 重新运行实盘
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{"code":-1121,"msg":"Invalid symbol."}
原因:交易对设置错误。
根据模板参数设置定时打印,策略完全平仓时也会打印。
可能原因:麦语言模板参数设置不合适(如精度、最小下单量精度等)。
信号触发层判断成功,但交易执行层因参数问题判定为不可下单。
参考: - https://www.fmz.com/digest-topic/5789 - https://www.fmz.com/digest-topic/5768
排查清单:
1. webhook url中的API KEY是否正确(FMZ扩展API KEY,在账号设置中配置)
2. webhook url中的实盘ID是否正确
3. FMZ扩展API KEY权限是否正确(默认是 * 即所有权限,不要在 * 后面直接写函数名)
可以使用自定义控件设置交易对(仅实盘支持,回测数据有限):

原因:富途对海外IP有限制,检查服务器是否是海外IP地址。
检查是否使用了收盘价模型(在麦语言模板参数中设置)。
BITMEX 交易所K线时间戳为什么比其它交易所多一个周期时间?原因:BITMEX 的K线时间戳以当前Bar的结束时间作为时间戳(部分周期除外)。

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.
可能原因:使用「自定义数据源」功能时,数据源提供的数据异常。
/*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)
}
}
是的,资金费率会算入回测系统生成的盈亏曲线。

排查:检查是否开了代理导致页面文件加载不完整,查看页面控制台是否有报错。
实盘级Tick包含逐秒行情、盘口快照、订单流数据,数据量非常大。50MB限制意味着回测范围最多几个小时,主要用于测试高频策略。

界面上设置手续费只对新添加的交易所对象生效,已添加的交易所对象无法直接修改。
自定义图表画图时(Chart 函数),显示的数据量与回测设置上的图表参数有关(控制图表显示最大条数)。
💡 注意检查是否使用了
chart.reset函数清空了部分旧数据。
C++ 策略一些异常不抛出错误,需用排除法逐级检查代码可能的运行时错误。
常见原因:指标计算时K线数量不足导致指标算出 NAN,后与数值类型做比较判断引起程序崩溃。
不能在 try 异常检测里面写 Sleep 函数,这种写法会导致卡死:

交易所的交易对太多,回测系统只选择了几种有代表性的交易对用来测试。
💡 可以选择情况相近的交易对回测,实盘时可以用自定义控件设置交易所支持的交易对。
回测系统暂时只支持主流交易所的主流币种。如果策略有效,哪怕是其它币种行情,都应该有基本正向收益的表现——这就是策略的普适性。
如果只能拟合一段历史数据或者某个品种表现不错,这种策略实际上有潜藏风险或缺陷。
| 概念 | 说明 |
|---|---|
| 平仓盈亏 | 当前持仓之前所有交易开仓、平仓产生的累计盈亏 |
| 持仓盈亏 | 当前持仓的盈亏(无持仓则为0) |
| 保证金 | 当前持仓占用的保证金数额 |
| 预估收益 | 假设当前持仓按当前价格平仓产生的盈亏 + 平仓累计盈亏 |
| 当前可用USDT | 当前可用于开仓的USDT数额 |
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++
}
}
// ... 最大回撤计算
}
计算方式:回测系统定时计算浮动盈亏后,统计出一条浮动盈亏曲线。从第一个点开始对比下一个点,高于则记录为胜,低于记录为负,然后继续往后对比。
在Linux操作系统,可能因内存不足导致托管者被系统停止。
触发原因: 1. 策略过度使用硬件资源 2. 策略Log输出了非常大的内容 3. 托管者所在设备上运行了过多的策略实盘 4. 其它原因(补充中)
dyld: cannot load?dyld: cannot load (load command is unknown)
原因:操作系统版本太低。
B站链接:https://www.bilibili.com/video/BV1eZ4y1c73v?share_source=copy_web
可以不停止托管者,直接删除旧的 robot 程序文件,然后下载新的压缩包解压出新的 robot 程序文件放在原来的位置。
⚠️ 此时托管者已更新,但运行中的实盘在内存使用的还是旧版本,只有重启实盘才会使用最新版本。
screen 运行托管者时出现 command not found?Linux系统没有安装 screen 软件。
CentOS安装命令:
yum install screen
💡 当前托管者已支持SSH断开转入后台运行,可以不使用
screen。直接使用命令:./robot -s node.fmz.com/xxxxxxx输入FMZ账号密码后显示
Login OK即为部署成功。
注意:xxxxxxx 是每个FMZ账号唯一的识别码,在托管者页面点击添加托管者可以看到。
在托管者程序所在目录 logs 文件夹内的 DB3 数据库文件中,数据库文件名为实盘的 id,扩展名为 db3。
./robot -l 查看托管者支持的交易所名称,exchange 是什么交易所?名字为 exchange 的交易所对象代指通用协议接入的交易所。
通用协议详情:https://www.fmz.com/api#%E9%80%9A%E7%94%A8%E5%8D%8F%E8%AE%AE
添加的托管者超过5个会出现按列表显示的控件。

平台提供的公共托管者为初学者增加的快速上手工具,学习时不用部署托管者。
⚠️ 真正实盘测试推荐使用私有托管者,公共托管者的硬件资源、网络都是共享的,平台可能不定期维护。
是的。./robot -s node.fmz.com/1234567 中的 /1234567 部分是每个用户唯一的地址标识。
从控制中心 → 点击添加托管者按钮 → 添加托管者页面,可以看到这个地址,直接复制粘贴使用。

原因:Windows系统初次安装Python,设置环境变量后需要重启才能生效。

Python回测靠EOF异常结束回测(因为有时策略可能是死循环)。提示EOF异常是正常情况。
并不限制数量,具体看服务器配置和策略复杂程度。
需要考虑: - 多个实盘是否都访问相同的交易所接口(实盘越多频率越高) - 一般5-6个实盘没问题
参考:https://www.fmz.com/digest-topic/7542
实盘在正常运行,托管者在服务器正常运行,但页面内容消失。
可能原因:浏览器插件引起的全局变量污染问题。
处理办法:卸载浏览器插件,或使用没有安装任何插件的浏览器登录FMZ。
参考FMZ API文档:https://www.fmz.com/api#%E6%A8%A1%E6%9D%BF%E7%B1%BB%E5%BA%93
wexApp 只能选 BTC_USDT 吗?如何自定义其它交易对?wexApp 模拟盘暂时只支持几个主流交易对,并非所有交易对都有模拟。
可以创建多个FMZ平台的扩展API KEY,用于并发请求。
调试工具执行时,如果第二次什么都没有修改会保留之前创建的交易所对象,不会释放。所以一些状态会记录(如交易所对象当前为币币模式还是杠杆模式)。
wexApp 模拟交易所,为什么没有资产?注册后需要验证邮箱激活账户,在个人中心激活账户即可。
解决办法:使用控制中心的调试工具,调试工具中使用 return 语句返回需要显示的内容,不会截断内容显示。
$. 开头的函数是什么意思?$. 开头的函数是模板的导出函数,类似模块的接口函数。
参考API文档:https://www.fmz.com/api#%E6%A8%A1%E6%9D%BF%E7%B1%BB%E5%BA%93
💡 Python版策略的导出函数开头是以
ext.声明的。
回测时最终显示的图表分2种:
1. 系统生成的:策略无法控制
2. 策略代码绘制的:用FMZ的API接口 Chart 函数画的
参考:https://www.fmz.com/api#chart...
可以用另外的浏览器登录FMZ平台,在需要输入谷歌验证码时,点击「解除绑定」跳转到使用邮箱解除绑定的页面。
用户的API KEY在浏览器端加密上传,FMZ不保存用户交易所账户的明文信息,并且使用Https协议。
参考:https://www.fmz.com/bbs-topic/1657
实盘计费标准: 1. 一个实盘一小时计费一次(0.05 USD/小时),买断一小时使用时间 2. 一小时内停止、重启实盘不会重复计费 3. 已经停止的实盘,下一个小时不会触发计费 4. 新创建的实盘会立即计费一小时

💡 计费时间为计费操作处理时间,处理操作会耗时,扣费时间可能往后延迟。例如当前计费时间为9:00,处理时间可能为9:02,会在下一次扣费操作时矫正。
如果数据特别小会被截断,最终显示为0。
参考:https://github.com/TA-Lib/ta-lib-python/issues/157
可能原因:托管者和FMZ平台长时间通信断开(期间实盘直接和交易所交互,执行策略正常),扣费累积、延迟,一次性结算扣费导致。
如果邮箱丢失等原因需要重置绑定邮箱,需要: 1. 使用该FMZ账号提交工单 2. 提交历史充值记录截图等信息验证 3. 人工审核后重置邮箱地址
可能原因:邮箱运营商本身问题。
建议:使用 Gmail 邮箱。
💡 经测试,QQ邮箱有延迟邮件显示的问题,有时延迟20分钟才显示。
请确保找回密码操作输入的内容100%正确。
⚠️ 注意:使用浏览器自动填入邮箱可能填入错误,请确保手动正确输入。
如有其他问题,可通过以下方式获取帮助: - 提交工单 - 社区论坛发帖 - 查阅API文档:https://www.fmz.com/api
本文档持续更新中,欢迎反馈补充!