Nhiều nhà phát triển viết các chiến lược trong Python muốn đặt các tập tin mã chiến lược tại địa phương, lo lắng về sự an toàn của chiến lược.
An ninh chiến lược
Chiến lược được phát triển trên nền tảng FMZ, và chiến lược chỉ hiển thị cho chủ tài khoản FMZ. Và trên nền tảng FMZ, mã chiến lược có thể được định vị hoàn toàn, ví dụ, chiến lược được đóng gói vào một gói Python và tải vào mã chiến lược, do đó việc định vị chiến lược được thực hiện.
Để biết thêm chi tiết, vui lòng truy cập:https://www.fmz.com/api
Thực tế, những lo lắng như vậy không cần thiết, nhưng vì có những nhu cầu như vậy, chúng tôi sẽ cung cấp một ví dụ thực hiện đầy đủ.
Hãy tìm một chiến lược Python đơn giản để chứng minh, sử dụng cácDual Thrust
chiến lược, địa chỉ chiến lược:https://www.fmz.com/strategy/21856Chúng tôi cố gắng không thay đổi bất kỳ phần nào của mã chiến lược, đóng gói chiến lược vào một tập tin có thể được gọi bởi mã chiến lược trên nền tảng FMZ, và kết quả thực thi chính xác giống như chạy chiến lược trực tiếp. Vấn đề lớn nhất với đóng gói là các đối tượng toàn cầu, các hàm toàn cầu và các giá trị hằng số được gọi bởi mã chiến lược trên nền tảng FMZ không thể truy cập trong các tập tin chúng tôi đóng gói, vì vậy chúng tôi phải tìm cách để truyền các đối tượng, hàm, biến và hằng số này sang tập tin đóng gói. hãy làm từng bước.
testA
.Ghi vào tệptestA
được mở bởi biên tập viên địa phương.
Thêm một số mã, và giữ cho phần mã chiến lược sao chép và dán nguyên vẹn
# Function, object
exchanges = None
exchange = None
Log = None
Sleep = None
TA = None
Chart = None
LogProfitReset = None
LogStatus = None
_N = None
_C = None
LogProfit = None
# Strategy parameters
ContractTypeIdx = None
MarginLevelIdx = None
NPeriod = None
Ks = None
Kx = None
AmountOP = None
Interval = None
LoopInterval = None
PeriodShow = None
# constant
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
Chức năng chính của mã trên là để tuyên bố các hàm toàn cầu và biến được sử dụng trong tệp hiện tại.SetExchanges
, SetParams
, SetFunc
Các chiến lược trên nền tảng FMZ gọi các hàm này và chuyển qua một số hàm và đối tượng được sử dụng.
Chiến lược khởi nghiệp rất đơn giản, như sau:
Chỉ có một vài dòng mã được viết trên nền tảng FMZ.Phiên bản Python của mã chiến lược tương lai OKCoin Dual ThrustTrong thực tế, bạn có thể trực tiếp sao chépPhiên bản Python của mã chiến lược tương lai OKCoin Dual ThrustChiến lược, sau đó chỉ xóa mã chiến lược, dán nó.
import sys
# Here I wrote the path where I put the testA file myself. I replaced it with xxx. To put it simply, I set the path of my testA file.
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA
def main():
# Passing Exchange Object
testA.SetExchanges(exchanges)
# Pass global function SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
# Passing strategy parameters SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
# Execute the main strategy function in the encapsulated testA file
testA.main()
Bằng cách này, chúng tôi tóm tắt cơ thể chính của chiến lược logic trongtestA
trên nền tảng FMZ, chúng ta chỉ cần lưu một chiến lược khởi động. robot tạo ra chiến lược khởi động này có thể tải trực tiếp tệp địa phương của chúng tôi và chạy nó tại địa phương.
testA
tệp cục bộ cho backtesttải tập tin trực tiếp để thực hiện.
Lần này chúng tôi chuẩn bị mộttestB
file với mã choPhiên bản Python của mã chiến lược tương lai OKCoin Dual Thrust strategy.
import time
class Error_noSupport(BaseException):
def __init__(self):
Log("Only OKCoin futures are supported!#FF0000")
class Error_AtBeginHasPosition(BaseException):
def __init__(self):
Log("There is a futures position at startup!#FF0000")
ChartCfg = {
'__isStock': True,
'title': {
'text': 'Dual Thrust Top and bottom rail map'
},
'yAxis': {
...
Nếu chiến lược quá dài, nó sẽ bị bỏ qua và mã chiến lược không cần phải được thay đổi.
Vậy chuẩn bị đi.Phiên bản Python của mã chiến lược tương lai OKCoin Dual Thrust(bắt đầu chiến lược, thực hiện trực tiếptestB
file), đó là chiến lược của chúng tôi trên nền tảng FMZ, tạo ra một robot, trực tiếp tảitestB
cần lưu ý rằng chiến lược khởi động cũng phải có chính xác các thiết lập tham số chiến lược (các tham số giao diện chiến lược) như phiên bản gốc củaPhiên bản Python của mã chiến lược tương lai OKCoin Dual Thrust.
if __name__ == '__main__':
Log("run...")
try:
# The file path is processed, you can write the actual path of your testB file
f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
code = f.read()
exec(code)
except Exception as e:
Log(e)
Thực hiện backtest:
Kết quả backtest phù hợp với thử nghiệm trên.
Rõ ràng phương pháp thứ hai ở trên là đơn giản hơn, nó được khuyến cáo sử dụng.