이 글은 두 가지 방법을 소개하고, 다른 방법은 더 간단합니다.
파이썬 언어를 사용하는 많은 개발자들이 정책 보안을 우려하여 정책 코드 파일을 로컬로 보관하기를 원합니다.FMZ API
이 문서에서 제안하는 한 가지 방안은:
전략적 안전 발명가 양적 거래 플랫폼에서 개발 정책을 개발하고, 정책은 발명가 양적 계정 소유자에게만 표시됩니다. 그리고 발명가 양적 거래 플랫폼에서 정책 코드를 완전히 현지화 할 수 있습니다. 예를 들어, 정책을 파이썬 패키지로 포장하고 전략 코드 안에 로드하여 정책 현지화를 구현합니다.https://www.fmz.com/api#策略安全性
이런 걱정은 불필요하지만, 이런 해결책이 있다면 완전한 실현 사례를 제시한다.
우리는 간단한 파이썬 전략을 가지고 있습니다.Dual Thrust
이 모든 것은 우리가 할 수 있는 일입니다.https://www.fmz.com/strategy/21856우리는 어떤 정책 부분 코드도 변경하지 않고, FMZ 플랫폼에서 정책 코드가 호출할 수 있는 문서로 정책을 포괄하고, 실행 결과와 직접 실행하는 정책에 완전히 일치합니다. 포괄의 가장 큰 문제는 FMZ 플랫폼에서 전략 코드가 호출되는 범체적인 객체, 범체적인 함수, 변수 값이 우리의 포괄 파일에서 액세스 할 수 없다는 것입니다. 따라서 이러한 객체, 함수, 변수, 변수를 포괄 문서로 전달하는 방법을 찾아야 합니다. 다음으로 우리는 분과별로 처리합니다.
복제파이썬 버전 듀얼 스러스트 OKCoin 선물테스트A라고 불리는 로컬 파이썬 파일에 붙여진 정책 코드입니다.
로컬 에디터에서 열리는 파일 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 플랫폼에 쓰인 코드는 이 몇 줄에 불과합니다. 이 시작 정책의 매개 변수는 우리가 포장하는 정책과 같다는 것입니다.파이썬 버전 듀얼 스러스트 OKCoin 선물같은 방식으로, 바로 "Python 버전의 듀얼 스러스트 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 버전의 듀얼 스러스트 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)
리코드를 실행합니다:
이 실험의 결과들은 위의 실험과 일치합니다.
두 번째 방법은 분명히 더 간단하고 더 나은 방법이 있다면, 더 좋은 방법을 사용하는 것이 좋습니다.
qq89520그리고 저는 셀레늄이 더 많은 기능을 할 수 있다는 것을 깨달았습니다.
qq89520배우기
발명가들의 수량화 - 작은 꿈哈哈, 어떤 아이디어가 나오면 함께 토론해 봅시다.