FMZ পাইথন লোকাল ব্যাকটেস্টিং ইঞ্জিন প্রকাশ করেছে
FMZ backtest engine python package
এফএমজেড ফিডব্যাক ইঞ্জিন পাইথন লাইব্রেরি
support python2 and python3, support Windows, Linux, Mac
পাইথন 2 এবং পাইথন 3 সমর্থন করে উইন্ডোজ, লিনাক্স, অ্যাপল ম্যাক ওএস সিস্টেম সমর্থন করে
install
ইনস্টল করুন
কমান্ড লাইনে নিম্নলিখিত কমান্ড লিখুনঃ
pip install https://github.com/fmzquant/backtest_python/archive/master.zip
- বিজ্ঞপ্তি:
অ্যাপল ম্যাক সিস্টেম ইনস্টল করার সময়, যদি কোনও সুরক্ষা সীমাবদ্ধতা থাকে তবে পাইপ কমান্ডের আগে sudo কমান্ড যুক্ত করা প্রয়োজন, পুরো ইনস্টলেশন কমান্ডটি কার্যকর করার আগে সিস্টেম পাসওয়ার্ডটি প্রবেশের জন্য অনুরোধ করা হবে।
simple example
সহজ উদাহরণ
python
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import *
task = VCtx(__doc__) # initialize backtest engine from __doc__
print exchange.GetAccount()
print exchange.GetTicker()
print task.Join() # print backtest result
The config string can be generated automatically by saving the backtest configuration in the strategy edit page.
কনফিগারেশন স্ট্রিং স্বয়ংক্রিয়ভাবে নীতি সম্পাদনা ইন্টারফেসে সংরক্ষিত পুনরাবৃত্তি কনফিগারেশন দ্বারা উত্পন্ন করা যেতে পারে

documentation
এপিআই ডকুমেন্টেশন: (যেমন GetAccount ইত্যাদি ফাংশন কল করার জন্য ডকুমেন্টেশন)
পাইথন কোডের সংক্ষিপ্ত বিবরণঃ
python
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from fmz import * # 引用 发明者量化 库
task = VCtx(__doc__) # initialize backtest engine from __doc__ # 调用 VCtx 函数 根据 __doc__初始化。
print exchange.GetAccount() # 测试 GetAccount 函数,并打印 回测系统测试交易所账户信息
print exchange.GetTicker() # 测试 GetTicker 函数,并打印 回测系统 行情信息
print task.Join() # print backtest result # 调用 初始化后的 task 对象 显示回测结果
-
doc
是两个下划线。__doc__用来访问模块,类声明或者函数的声明中第一个未被赋值的字符串, 可以是被""" ""","" "",' ',括起来的,作用就是把 代码中 '''backtest ... ''' 的回测配置信息 传入 VCtx 类构造函数构造对象。 -
এই কোডটি সংশোধন করে দেখুন কিভাবে Log, GetTicker ফাংশনটি ডাকা হয়।
# coding=UTF-8 '''backtest start: 2018-02-19 00:00:00 end: 2018-03-22 12:00:00 period: 15m exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}] ''' from fmz import * # 引用 发明者量化 库 task = VCtx(__doc__) # initialize backtest engine from __doc__ # 调用 VCtx 函数 根据 __doc__初始化。 print exchange.GetAccount() # 测试 GetAccount 函数,并打印 回测系统测试交易所账户信息 Log("\n 调用Log") Log("调用 exchange.GetTicker() : ", exchange.GetTicker()) print task.Join() # print backtest result # 调用 初始化后的 task 对象 显示回测结果- print exchange.GetAccount () কোড আউটপুট দেখায়ঃ
{'Balance': 3.0, 'Stocks': 0.0, 'FrozenBalance': 0.0, 'FrozenStocks': 0.0}- Log (("\n কল লগ"), Log (("কল এক্সচেঞ্জ.গেট টিকার):", exchange.গেট টিকার))
print task.Join () আউটপুট ডেটা কাঠামোর মধ্যেঃ
{ "Chart": { "Cfg": "", "Datas": [] }, "Elapsed": 42000000, "Finished": true, "Indicators": {}, "LoadBytes": 441845, "LoadElapsed": 24000000, "LogsCount": 2, "Profit": 0.0, "ProfitLogs": [], "Progress": 100.0, "RuntimeLogs": [ # 调用输出内容在此处 [1, 1518969600200, 5, "", 0, 0.0, 0.0, "\n 调用Log", "", ""], [2, 1518969600400, 5, "", 0, 0.0, 0.0, "调用 exchange.GetTicker() : {'Sell': 0.02113476, 'Volume': 519.6953, 'Buy': 0.02113474, 'Last': 0.02113475, 'High': 0.02113476, 'Time': 1518969600000L, 'Low': 0.02113474}", "", ""] ], "Snapshort": [{ "Balance": 3.0, "BaseCurrency": "LTC", "Commission": 0.0, "FrozenBalance": 0.0, "FrozenStocks": 0.0, "Id": "OKEX", "QuoteCurrency": "BTC", "Stocks": 0.0, "Symbols": { "LTC_BTC_OKEX": { "Last": 0.01893785 } }, "TradeStatus": {} }], "Status": "", "Task": { "Args": null, "Exchanges": [{ "Balance": 3, "BaseCurrency": "LTC", "BasePeriod": 300000, "BasePrecision": 4, "DepthDeep": 5, "FaultTolerant": 0, "FeeDenominator": 5, "FeeMaker": 75, "FeeMin": 0, "FeeTaker": 80, "Id": "OKEX", "Label": "OKEX", "PriceTick": 1e-08, "QuoteCurrency": "BTC", "QuotePrecision": 8, "SlipPoint": 0, "Stocks": 0 }], "Options": { "DataServer": "q.botvs.net", "MaxChartLogs": 800, "MaxProfitLogs": 800, "MaxRuntimeLogs": 800, "NetDelay": 200, "Period": 900000, "RetFlags": 189, "SnapshortPeriod": 300000, "TimeBegin": 1518969600, "TimeEnd": 1521691200, "UpdatePeriod": 5000 } }, "TaskStatus": 1, "Time": 1521691200000 } -
কিভাবে একটি কৌশল ব্যবহার করে একটি স্থানীয় রিটার্ন ইঞ্জিনের মধ্যে রিটার্ন করা যায়
python
# !/usr/local/bin/python
# -*- coding: UTF-8 -*-
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD","balance":10000,"stocks":3}]
'''
import sys
sys.path.append("/usr/local/lib/python2.7/site-packages") # 测试时添加了路径,如不需要可以删除
from fmz import *
import math
import talib
task = VCtx(__doc__) # initialize backtest engine from __doc__
# ------------------------------ 策略部分开始 --------------------------
print exchange.GetAccount() # 调用一些接口,打印其返回值。
print exchange.GetTicker()
def adjustFloat(v): # 策略中自定义的函数
v = math.floor(v * 1000)
return v / 1000
def onTick(e):
Log("onTick")
# ....
#
# ...
#
# 此处省略 自定义函数实现等代码。
def main():
InitAccount = GetAccount()
while True:
onTick(exchange)
Sleep(1000)
# ------------------------------ 策略部分结束 --------------------------
try:
main() # 回测结束时会 raise EOFError() 抛出异常,来停止回测的循环。所以要对这个异常处理,在检测到抛出的异常后调用 task.Join() 打印回测结果。
except:
print task.Join() # print backtest result , 打印回测结果。
/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py:793: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
warnings.warn(FSADeprecationWarning(
Traceback (most recent call last):
File "/Users/taoxing/Desktop/quant/trading_api_study/fmz/fmz_extend_api_demo/app.py", line 152, in <module>
db.create_all()
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 963, in create_all
self._execute_for_all_tables(app, bind, 'create_all')
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 955, in _execute_for_all_tables
op(bind=self.get_engine(app, bind), **extra)
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 896, in get_engine
return connector.get_engine()
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 556, in get_engine
self._sa.apply_driver_hacks(self._app, info, options)
File "/Users/taoxing/opt/anaconda3/envs/ai4f/lib/python3.8/site-packages/flask_sqlalchemy/init.py", line 861, in apply_driver_hacks
info.database = os.path.join(app.root_path, info.database)
AttributeError: can't set attribute
错在什么地地方了,求大神指导!!!
这个一键部署租用的服务器是其它另外的计费。和机器人实盘费用无关,使用wexApp模拟盘只是说机器人运行免费(数字货币机器人添加了任意一个非WexApp模拟盘交易所对象都会计费)。
一件部署托管者,是部署在阿里云服务器上,是付费的,会从你的账号余额中计费。 机器人运行,只操作wexApp模拟盘,机器人费用是不计费的,和一件部署托管者服务器费用无关。
您好,我想使用火币现货husd/usdt交易对, 我试了exchange.IO("currency", "HUSD_USDT"),exchange.IO("currency", "HUSD/USDT"),exchange.IO("currency", "HUSDUSDT"),不是运行退出就是品种订阅失败,请问正确的写法是什么?谢谢
from fmz import *
task = VCtx('''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
''')
# 创建回测环境
这样初始化一下,就好比在线回测的时候配置上了 交易所 、交易对 等信息。
这段代码我在.py文件运行时,需要导入ccxt,否则exchange无法识别。
在 Python Consle编辑,则可以正常运行。
A5:=MA(C,5);
A10:=MA(C,10);夹角:IF(CROSS(A5,A10),ATAN((A5/REF(A5,1)-1)*100)-ATAN((A10/REF(A10,1)-1)*100),0)*180/3.1416;
找到了这个公式,就是不知道REF如何实现
请问,在策略编辑器里面import statsmodels 无效,请问在那里可以导入第三方库?我在pycharm里可以导入,但是在编辑器里如何导入?
/*backtest
start: 2019-09-21 00:00:00
end: 2019-10-20 00:00:00
period: 1h
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
mode: 1
*/
通过配置信息中的,mode 设置,可以在回测页面上设置,然后在策略编辑页面上直接保存回测设置获取到配置信息字符串。
main()里是正常的
在class里call exchange会报错,原因是?
File "D:/workspace/strategy/strategy_001.py", line 101, in main
account = self._exchange.GetAccount()
File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botvs.py", line 716, in GetAccount
EOF()
File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\botvs.py", line 569, in EOF
raise EOFError()
def GetAccount(self):
r = _ACCOUNT()
ret = self.lib.api_Exchange_GetAccount(self.ctx, self.idx, ctypes.byref(r))
if ret == API_ERR_SUCCESS:
return r.toObj()
elif ret == API_ERR_FAILED:
return None
EOF()
看了下代码 好像 api_Exchange_GetAccount 这个是一个 DLL 的接口, 您上面报错信息 显示 没有返回 调用成功 也没有返回调用失败, 然后就去执行 EOF 了。您 使用回测引擎 时 有配置 回测账户 数据么?
回测账户数据,是下面几行吗?
有喔,在global function main里正常引用。
可是在class里却报错
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from botvs import *
task = VCtx(doc) # initialize backtest engine from doc
会有 通信,回测时是有数据请求的,不过运行是在本地跑的回测系统。
'''backtest
start: 2018-02-19 00:00:00
end: 2018-03-22 12:00:00
period: 15m
exchanges: [{"eid":"OKEX","currency":"LTC_BTC","balance":3,"stocks":0}]
'''
from botvs import *
task = VCtx(__doc__) # initialize backtest engine from __doc__
print exchange.GetAccount()
print exchange.GetTicker()
print task.Join() # print backtest result
这个段代码 就类似 一个 策略, 回测系统 被封装成一个 库了, 测试 运行的时候 调用回测系统的功能。
上面的 '''backtest ... ''' 内的 就是 回测参数设置, 可以在BotVS 策略回测页面生成。
- 1











