Dalam artikel ini, kita akan membincangkan dua pilihan, yang lain adalah lebih mudah (rekomendasi).
Terdapat banyak pemaju yang menggunakan bahasa Python untuk menulis dasar yang ingin menyimpan fail kod dasar secara tempatan kerana bimbang keselamatan dasar; seperti:FMZ API
Salah satu cadangan yang dikemukakan dalam dokumen itu ialah:
Keselamatan Strategik Dalam platform perdagangan kuantitatif pencipta, strategi yang dibangunkan hanya dapat dilihat oleh pemegang akaun kuantitatif pencipta; dan dalam platform perdagangan kuantitatif pencipta, kod dasar boleh dilokalkan sepenuhnya, seperti membungkus strategi ke dalam pakej Python dan memuat dalam kod dasar.https://www.fmz.com/api#策略安全性
Walaupun kebimbangan ini tidak perlu, tetapi dengan penyelesaian seperti ini, ia memberikan contoh yang lengkap.
Kita cari satu strategi Python yang mudah untuk demonstrasi, menggunakan kaedah klasik.Dual Thrust
Strategi, alamat strategi:https://www.fmz.com/strategy/21856Kami berusaha untuk tidak mengubah mana-mana kod bahagian dasar, membungkus dasar ke dalam satu fail yang boleh dipanggil oleh kod dasar di platform FMZ, dan hasil pelaksanaan adalah sama dengan menjalankan dasar itu secara langsung. Masalah terbesar dengan pembungkus adalah bahawa objek global, fungsi global, nilai pelarasan yang dipanggil oleh kod dasar di platform FMZ tidak dapat diakses di dalam fail yang kami bungkus, jadi kami perlu mencari cara untuk menyampaikan objek, fungsi, pembolehubah, pelarasan ini ke dalam fail yang dibungkus. Kemudian kami akan mengolahnya mengikut bahagian.
MenyalinPython versi Dual Thrust OKCoin niaga hadapanKod untuk strategi, dilampirkan ke dalam fail Python tempatan, fail Python tempatan yang dinamakan testA.
Tempelkan file testA yang dibuka di editor tempatan.
Tambah beberapa kod untuk mengekalkan bahagian kod dasar yang disalin dan ditampal
# 函数、对象
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
Peranan utama kod di atas adalah untuk mengisytiharkan fungsi global atau pembolehubah yang digunakan dalam dokumen semasa; dan kemudian menyimpan antara muka untuk mengimport fungsi ini.SetExchanges
,SetParams
,SetFunc
◦ Strategi pada platform FMZ memanggil fungsi ini dan menghantar beberapa fungsi, objek, dan lain-lain yang digunakan.
Rancangan untuk memulakan adalah mudah, seperti berikut:
Hanya beberapa baris kod yang ditulis di platform FMZ, dan perlu diingat bahawa parameter untuk dasar permulaan ini adalah untuk membungkus dengan dasar yang kita tulis.Python versi Dual Thrust OKCoin niaga hadapanSama juga, anda boleh menyalin secara langsung strategi "Python versi Dual Thrust OKCoin futures", dan anda boleh mengosongkan kodnya, dan pastinya anda akan menempelkannya di atasnya.
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()
Dengan cara ini, kita membungkus subjek logik dasar dalam fail testA dan meletakkan ia di peranti hos, dan pada platform FMZ, hanya dengan menyimpan satu dasar permulaan, bot yang membuat dasar permulaan ini boleh memuat semula fail tempatan kita secara langsung di hos.
Mengunggah semula fail testA secara tempatan
Dasar Asli, Uji semula di pelayan awam
Untuk memuat turun fail secara langsung ke dalam pelaksanaan. Pada masa ini, kami menyediakan fail testB yang meletakkan kod untuk strategi "Python Dual Thrust OKCoin Futures".
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': {
...
Jika strategi terlalu panjang, ia akan diabaikan, dan kod strategi tidak perlu diubah sama sekali. Kemudian siapkan "Python Dual Thrust OKCoin Futures", iaitu strategi kami di platform FMZ, buat bot, muat turun fail testB secara langsung, dan jalankan secara langsung. Perlu diingat bahawa "Python Dual Thrust OKCoin Futures" mesti mempunyai tetapan parameter strategi yang sama seperti versi asal.
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)
Melakukan ujian semula:
Hasil ujian semula sepadan dengan ujian di atas.
Cara kedua jelas lebih mudah dan disyorkan untuk digunakan, jika ada cara yang lebih baik, selamat datang di blog saya.
qq89520Dan saya sangat terharu dengan selenium, dan saya rasa saya boleh melakukan banyak lagi dengan selenium.
qq89520Belajar
Pencipta Kuantiti - Impian KecilHahah, apa-apa idea yang boleh kita keluarkan, boleh kita bincangkan bersama-sama.