Banyak pengembang yang menulis strategi di Python ingin menempatkan file kode strategi secara lokal, khawatir tentang keamanan strategi.
Keamanan Strategi
Strategi dikembangkan di platform FMZ, dan strategi hanya terlihat oleh pemegang akun FMZ. Dan di platform FMZ, kode strategi dapat sepenuhnya dilokalisasi, misalnya, strategi dikemas dalam paket Python dan dimuat dalam kode strategi, sehingga lokalisasi strategi direalisasikan.
Untuk informasi lebih lanjut, silakan kunjungi:https://www.fmz.com/api
Sebenarnya, kekhawatiran semacam ini tidak perlu, tetapi karena ada kebutuhan seperti itu, kami akan memberikan contoh implementasi yang lengkap.
Mari kita cari strategi Python sederhana untuk demonstrasi, menggunakan klasikDual Thrust
strategi, alamat strategi:https://www.fmz.com/strategy/21856Kami berusaha untuk tidak mengubah bagian mana pun dari kode strategi, mengkapsulkan strategi ke dalam file yang dapat dipanggil oleh kode strategi di platform FMZ, dan hasil eksekusi persis sama dengan menjalankan strategi secara langsung. Masalah terbesar dengan enkapsulasi adalah bahwa objek global, fungsi global, dan nilai konstan yang dipanggil oleh kode strategi di platform FMZ tidak dapat diakses di file yang kita bungkus, jadi kita harus menemukan cara untuk melewati objek, fungsi, variabel, dan konstanta ini ke file yang dikapsulkan. mari lakukan langkah demi langkah.
testA
.Tempelkan ke dalam filetestA
dibuka oleh editor lokal.
Tambahkan beberapa kode, dan menjaga bagian kode strategi disalin dan ditempel utuh
# 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
Fungsi utama kode di atas adalah untuk menyatakan fungsi global dan variabel yang digunakan dalam file saat ini.SetExchanges
, SetParams
, SetFunc
Strategi di platform FMZ memanggil fungsi ini dan melewati beberapa fungsi dan objek yang digunakan.
Strategi startup sangat sederhana, sebagai berikut:
Ada hanya beberapa baris kode yang ditulis pada platform FMZ. Harus dicatat bahwa parameter strategi startup ini persis sama dengan strategi kami dikemasVersi Python dari kode strategi berjangka OKCoin Dual ThrustBahkan, Anda dapat langsung menyalinVersi Python dari kode strategi berjangka OKCoin Dual ThrustStrategi, maka hanya menghapus kode strategi, tempelkan.
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()
Dengan cara ini, kita merangkum tubuh utama logika strategi dalamtestA
file dan letakkan secara lokal pada perangkat di mana docker berada. pada platform FMZ, kita hanya perlu menyimpan strategi startup. robot yang membuat strategi startup ini dapat langsung memuat file lokal kita dan menjalankannya secara lokal.
testA
file secara lokal untuk backtestMuat file langsung untuk eksekusi.
Kali ini kita mempersiapkantestB
file dengan kode untukVersi Python dari kode strategi berjangka 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': {
...
Jika strategi terlalu panjang, maka strategi tersebut akan dihilangkan dan kode strategi tidak perlu diubah sama sekali.
Lalu persiapkanVersi Python dari kode strategi berjangka OKCoin Dual Thrust(memulai strategi, langsung melaksanakantestB
file), yang merupakan strategi kami pada platform FMZ, membuat robot, langsung memuattestB
Perlu dicatat bahwa strategi startup juga harus memiliki pengaturan parameter strategi yang sama persis (parameter antarmuka strategi) sebagai versi asli dariVersi Python dari kode strategi berjangka 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)
Lakukan backtest:
Hasil backtest konsisten dengan tes di atas.
Jelas metode kedua di atas lebih sederhana, disarankan untuk digunakan.