
이 글에서는 두 가지 해결책을 논의합니다. 글의 마지막에 있는 다른 해결책은 더 간단합니다(권장).
Python을 사용하여 전략을 작성하는 많은 개발자는 전략 코드 파일을 로컬에 저장하고 싶어하지만, 전략의 보안에 대해 우려합니다. 처럼FMZ API문서에서 제안된 한 가지 해결책:
정책 보안 Inventor Quantitative Trading Platform에서 전략을 개발하세요. 전략은 Inventor Quantitative 계정 보유자에게만 표시됩니다. 또한, 전략 코드는 Inventor Quantitative Trading Platform에서 완전히 현지화될 수 있습니다. 예를 들어, 전략은 Python 패키지에 캡슐화되어 전략 코드에 로드되어 전략 현지화를 달성할 수 있습니다. https://www.fmz.com/api#%E7%AD%96%E7%95%A5%E5%AE%89%E5%85%A8%E6%80%A7
사실, 이에 대해 걱정할 필요는 전혀 없지만 그러한 솔루션이 있으므로 완전한 구현 예를 제공합니다.
고전적인 Python 전략을 사용하여 간단한 Python 전략을 시연해 보겠습니다.Dual Thrust전략, 전략 주소: https://www.fmz.com/strategy/21856
우리는 전략 코드의 어떤 부분도 변경하지 않으려고 노력하며, 전략을 FMZ 플랫폼에서 전략 코드로 호출할 수 있는 파일에 캡슐화합니다. 실행 결과는 전략을 직접 실행하는 것과 정확히 같습니다. 캡슐화의 가장 큰 문제는 FMZ 플랫폼의 전략 코드에서 호출되는 전역 객체, 전역 함수 및 상수 값을 캡슐화된 파일에서 액세스할 수 없기 때문에 이러한 객체, 함수 및 변수를 전달하는 방법을 찾아야 한다는 것입니다. , 그리고 캡슐화된 문서에 대한 상수입니다. 그러면 단계적으로 처리해 보겠습니다.

로컬 편집기에서 열린 testA 파일에 붙여넣습니다.

# 函数、对象
exchanges = None
exchange = None
Log = None
Sleep = None
TA = None
Chart = None
LogProfitReset = None
LogStatus = None
_N = None
_C = None
LogProfit = None
# 策略参数
ContractTypeIdx = None
MarginLevelIdx = None
NPeriod = None
Ks = None
Kx = None
AmountOP = None
Interval = None
LoopInterval = None
PeriodShow = None
# 常量
ORDER_STATE_PENDING = 0
ORDER_STATE_CLOSED = 1
ORDER_STATE_CANCELED = 2
ORDER_STATE_UNKNOWN = 3
ORDER_TYPE_BUY = 0
ORDER_TYPE_SELL = 1
PD_LONG = 0
PD_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 플랫폼에 작성된 코드는 몇 줄에 불과합니다. 이 스타트업 전략의 매개변수는 우리가 캡슐화한 전략과 동일하다는 점에 유의해야 합니다.Dual Thrust OKCoin Futures의 파이썬 버전정확히 동일합니다. 사실, “Dual Thrust OKCoin Futures의 Python 버전” 전략을 직접 복사한 다음 전략 코드를 지우고 붙여넣을 수 있습니다.
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 플랫폼에서는 시작 정책을 하나만 저장하면 됩니다. 이 시작 정책을 만드는 로봇은 로컬 파일을 직접 로드할 수 있습니다. 호스트에서 로컬로 실행합니다.


파일을 직접 로드하여 실행합니다. 이번에는 “Dual Thrust OKCoin Futures의 Python 버전” 전략의 코드를 넣기 위해 testB 파일을 준비합니다.
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': {
...
전략이 너무 길기 때문에 생략했으며, 전략 코드는 전혀 변경할 필요가 없습니다. 그런 다음 FMZ 플랫폼에서의 전략인 “Dual Thrust OKCoin Futures의 Python 버전(전략을 시작하고 testB 파일을 직접 실행)“을 준비하고, 로봇을 생성하고, testB 파일을 직접 로드하여 직접 실행합니다. 시작 전략은 또한 “Python 버전 Dual Thrust OKCoin Futures”의 원래 버전과 동일한 전략 매개변수 설정(전략 인터페이스 매개변수)을 가져야 한다는 점에 유의하세요.

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)
백테스트를 수행하려면:

백테스트 결과는 위의 테스트와 일치합니다.
분명히 위의 두 번째 방법이 더 간단하고 권장됩니다. 더 나은 방법이 있다면 메시지를 남겨주세요.