目前不清退的交易所推荐:
1、全球第二大交易所OKX欧意
国区邀请链接: https://www.myts3cards.com/cn/join/1837888 币种多,交易量大!
国际邀请链接:https://www.okx.com/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!
2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183
全球最大交易所币安,国区邀请链接:https://accounts.binance.com/zh-CN/register?ref=16003031 币安注册不了IP地址用香港,居住地选香港,认证照旧,邮箱推荐如gmail、outlook。支持币种多,交易安全!
买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3 CoinMarketCap前五的交易所,注册友好操简单快捷!
FMZ量化交易平台邀请链接:https://www.fmz.com/
手把手教你把一个Python策略封装成本地文件
有不少使用Python语言编写策略的开发者希望把策略代码文件放在本地,担心策略安全性。正如FMZ API
文档中提出的一种方案:
策略安全性
在发明者量化交易平台上开发策略,策略仅发明者量化账户持有者可见。并且在发明者量化交易平台上可以实现策略代码完全本地化,例如把策略封装成一个Python包,在策略代码中加载,这样就实现了策略本地化。
https://www.fmz.com/api#策略安全性
其实这种担心大可不必,不过既然有这种解决方案,那么就提供一个完整的实现例子。
封装一个策略
我们找一个简单的Python策略做示范,使用经典的Dual Thrust
策略,策略地址:https://www.fmz.com/strategy/21856
我们力求不改动任何策略部分代码,将策略封装成一个可由FMZ平台上策略代码调用的文件,并且执行结果和直接运行该策略完全一致。封装最大的问题在于FMZ平台上的策略代码调用的全局对象,全局函数,常量值,在我们封装的文件中无法访问,这样就必须想个办法把这些对象、函数、变量、常量传递到封装的文件。那接下来我们按部就班的处理。
- 复制python版 Dual Thrust OKCoin 期货策略的代码,粘贴进本地的Python文件,本地Python文件命名为testA。
粘贴进本地编辑器打开的文件testA。
- 增加一些代码,对于复制粘贴进的策略代码部分保持原封不动
# 函数、对象exchanges = Noneexchange = NoneLog = NoneSleep = NoneTA = NoneChart = NoneLogProfitReset = NoneLogStatus = None_N = None_C = None LogProfit = None # 策略参数ContractTypeIdx = NoneMarginLevelIdx = NoneNPeriod = NoneKs = NoneKx = NoneAmountOP = NoneInterval = NoneLoopInterval = NonePeriodShow = None # 常量ORDER_STATE_PENDING = 0ORDER_STATE_CLOSED = 1ORDER_STATE_CANCELED = 2ORDER_STATE_UNKNOWN = 3ORDER_TYPE_BUY = 0 ORDER_TYPE_SELL = 1PD_LONG = 0PD_SHORT = 1 def SetExchanges(es): global exchanges, exchange exchanges = es exchange = es[0] def SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit): global Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit Log = pLog Sleep = pSleep TA = pTA Chart = pChart LogStatus = pLogStatus LogProfitReset = pLogProfitReset _N = p_N _C = p_C LogProfit = pLogProfit def SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow): global ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow ContractTypeIdx = pContractTypeIdx MarginLevelIdx = pMarginLevelIdx NPeriod = pNPeriod Ks = pKs Kx = pKx AmountOP = pAmountOP Interval = pInterval LoopInterval = pLoopInterval PeriodShow = pPeriodShow
以上代码主要作用是,声明当前文件内用到的全局函数、变量。然后预留导入这些函数的接口SetExchanges
,SetParams
,SetFunc
。在FMZ平台上的策略调用这些函数,把一些用到的函数、对象等传递过来。
FMZ平台上的启动策略
启动策略就很简单了,如下:
在FMZ平台上写的代码就只有这几行,需要注意的是这个启动策略的参数是要和我们封装的策略python版 Dual Thrust OKCoin 期货一模一样的,其实可以直接复制一下「python版 Dual Thrust OKCoin 期货」策略,然后把策略代码清空就可以了,粘贴上
import sys
# 这里我写的是自己放置testA文件的路径,具体我替换为xxx了,简单说就是设置自己的testA文件路径就可以了
sys.path.append(\"/Users/xxx/Desktop/pythonPlayground/\")
import testA
def main():
# 传递交易所对象
testA.SetExchanges(exchanges)
# 传递全局函数 SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
# 传递策略参数 SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
# 执行封装的testA文件中的策略主函数
testA.main()
这样我们就把策略逻辑主体封装在testA文件,放在托管者所在设备本地,FMZ平台上只用保存一个启动策略,创建这个启动策略的机器人,就可以直接加载我们的本地文件在托管者本地运行了。
回测对比
- 本地加载testA文件回测
- 原版策略,在公共服务器上回测
另一种更加简单的方式
直接将文件载入执行。
这次我们准备一个testB文件,放置「python版 Dual Thrust OKCoin 期货」策略的代码。
import time
class Error_noSupport(BaseException):
def __init__(self):
Log(\"只支持OKCoin期货!#FF0000\")
class Error_AtBeginHasPosition(BaseException):
def __init__(self):
Log(\"启动时有期货持仓! #FF0000\")
ChartCfg = {
\'__isStock\': True,
\'title\': {
\'text\': \'Dual Thrust 上下轨图\'
},
\'yAxis\': {
...
策略太长,就省略了,策略代码完全不用改动。
然后准备「python版 Dual Thrust OKCoin 期货 (启动策略,直接执行testB文件)」,就是我们在FMZ平台上的策略,创建机器人,直接加载testB文件,并且直接执行。需要注意的是启动策略必须也有和「python版 Dual Thrust OKCoin 期货」原版一摸一样的策略参数设置(策略界面参数)。
if __name__ == \'__main__\':
Log(\"run...\")
try:
# 文件路径做了处理,可以写入自己testB文件放置的实际路径
f = open(\"/Users/xxx/Desktop/pythonPlayground/testB.py\", \"r\")
code = f.read()
exec(code)
except Exception as e:
Log(e)
执行回测:
回测结果和以上测试一致。
显然以上第二种方法更加简单,推荐使用,如果有更好的方法,欢迎大神留言。
FMZ量化交易平台邀请链接:https://www.fmz.com/
全球最大交易所币安,国区邀请链接:https://accounts.binance.com/zh-CN/register?ref=16003031 币安注册不了IP地址用香港,居住地选香港,认证照旧,邮箱推荐如gmail、outlook。支持币种多,交易安全!
买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3 CoinMarketCap前五的交易所,注册友好操简单快捷!
目前不清退的交易所推荐:
1、全球第二大交易所OKX欧意,邀请链接:https://www.myts3cards.com/cn/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!。
2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183
买好币上币库:https://www.kucoin.com/r/1f7w3
火必所有用户现在可用了,但是要重新注册账号火币:https://www.huobi.com
全球最大交易所币安,
国区邀请链接:https://accounts.suitechsui.mobi/zh-CN/register?ref=16003031 支持86手机号码,网页直接注册。
FMZ API
文档中提出的一种方案:策略安全性
在发明者量化交易平台上开发策略,策略仅发明者量化账户持有者可见。并且在发明者量化交易平台上可以实现策略代码完全本地化,例如把策略封装成一个Python包,在策略代码中加载,这样就实现了策略本地化。
https://www.fmz.com/api#策略安全性
Dual Thrust
策略,策略地址:https://www.fmz.com/strategy/21856我们力求不改动任何策略部分代码,将策略封装成一个可由FMZ平台上策略代码调用的文件,并且执行结果和直接运行该策略完全一致。封装最大的问题在于FMZ平台上的策略代码调用的全局对象,全局函数,常量值,在我们封装的文件中无法访问,这样就必须想个办法把这些对象、函数、变量、常量传递到封装的文件。那接下来我们按部就班的处理。
粘贴进本地编辑器打开的文件testA。
# 函数、对象exchanges = Noneexchange = NoneLog = NoneSleep = NoneTA = NoneChart = NoneLogProfitReset = NoneLogStatus = None_N = None_C = None LogProfit = None # 策略参数ContractTypeIdx = NoneMarginLevelIdx = NoneNPeriod = NoneKs = NoneKx = NoneAmountOP = NoneInterval = NoneLoopInterval = NonePeriodShow = None # 常量ORDER_STATE_PENDING = 0ORDER_STATE_CLOSED = 1ORDER_STATE_CANCELED = 2ORDER_STATE_UNKNOWN = 3ORDER_TYPE_BUY = 0 ORDER_TYPE_SELL = 1PD_LONG = 0PD_SHORT = 1 def SetExchanges(es): global exchanges, exchange exchanges = es exchange = es[0] def SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit): global Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit Log = pLog Sleep = pSleep TA = pTA Chart = pChart LogStatus = pLogStatus LogProfitReset = pLogProfitReset _N = p_N _C = p_C LogProfit = pLogProfit def SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow): global ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow ContractTypeIdx = pContractTypeIdx MarginLevelIdx = pMarginLevelIdx NPeriod = pNPeriod Ks = pKs Kx = pKx AmountOP = pAmountOP Interval = pInterval LoopInterval = pLoopInterval PeriodShow = pPeriodShow
以上代码主要作用是,声明当前文件内用到的全局函数、变量。然后预留导入这些函数的接口SetExchanges
,SetParams
,SetFunc
。在FMZ平台上的策略调用这些函数,把一些用到的函数、对象等传递过来。
import sys
# 这里我写的是自己放置testA文件的路径,具体我替换为xxx了,简单说就是设置自己的testA文件路径就可以了
sys.path.append(\"/Users/xxx/Desktop/pythonPlayground/\")
import testA
def main():
# 传递交易所对象
testA.SetExchanges(exchanges)
# 传递全局函数 SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
# 传递策略参数 SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
# 执行封装的testA文件中的策略主函数
testA.main()
这次我们准备一个testB文件,放置「python版 Dual Thrust OKCoin 期货」策略的代码。
import time
class Error_noSupport(BaseException):
def __init__(self):
Log(\"只支持OKCoin期货!#FF0000\")
class Error_AtBeginHasPosition(BaseException):
def __init__(self):
Log(\"启动时有期货持仓! #FF0000\")
ChartCfg = {
\'__isStock\': True,
\'title\': {
\'text\': \'Dual Thrust 上下轨图\'
},
\'yAxis\': {
...
然后准备「python版 Dual Thrust OKCoin 期货 (启动策略,直接执行testB文件)」,就是我们在FMZ平台上的策略,创建机器人,直接加载testB文件,并且直接执行。需要注意的是启动策略必须也有和「python版 Dual Thrust OKCoin 期货」原版一摸一样的策略参数设置(策略界面参数)。
if __name__ == \'__main__\':
Log(\"run...\")
try:
# 文件路径做了处理,可以写入自己testB文件放置的实际路径
f = open(\"/Users/xxx/Desktop/pythonPlayground/testB.py\", \"r\")
code = f.read()
exec(code)
except Exception as e:
Log(e)
买好币上KuCoin:https://www.kucoin.com/r/af/1f7w3 CoinMarketCap前五的交易所,注册友好操简单快捷!
目前不清退的交易所推荐:
1、全球第二大交易所OKX欧意,邀请链接:https://www.myts3cards.com/cn/join/1837888 注册简单,交易不需要实名,新用户能开合约,币种多,交易量大!。
2、老牌交易所比特儿现改名叫芝麻开门 :https://www.gate.win/signup/649183
买好币上币库:https://www.kucoin.com/r/1f7w3