1. आपको सिखाता है कि पायथन एकल-उत्पाद रणनीति को बहु-उत्पाद रणनीति में कैसे बदला जाए
पिछले लेख में, एक बहुत ही सरल पायथन रणनीति लागू की गई थी:「पीछा करके बेचने की रणनीति का पायथन संस्करण」यह रणनीति एक निश्चित ट्रेडिंग जोड़ी पर प्रोग्राम्ड ट्रेडिंग करने के लिए एक खाते का संचालन कर सकती है। सिद्धांत बहुत सरल है, जो कि वृद्धि का पीछा करना और गिरावट को बेचना है। कभी-कभी हम विभिन्न ट्रेडिंग जोड़ों को संचालित करने के लिए समान ट्रेडिंग तर्क का उपयोग करना चाहते हैं। आप कई रोबोट बना सकते हैं और विभिन्न मुद्राओं का व्यापार करने के लिए अलग-अलग ट्रेडिंग जोड़े सेट कर सकते हैं। यदि रणनीति बहुत जटिल नहीं है, तो आविष्कारक के मात्रात्मक व्यापार मंच के शक्तिशाली लचीलेपन को देखते हुए। किसी रणनीति को बहु-उत्पाद रणनीति में बदलना बहुत आसान है, जिससे आप केवल एक रोबोट बनाकर कई ट्रेडिंग जोड़े चला सकते हैं।
परिवर्तित रणनीति स्रोत कोड:
'''backtest
start: 2019-02-20 00:00:00
end: 2020-01-10 00:00:00
period: 1m
exchanges: [{"eid":"OKEX","currency":"BTC_USDT"},{"eid":"OKEX","currency":"ETH_USDT","stocks":30},{"eid":"OKEX","currency":"LTC_USDT","stocks":100}]
'''
import time
import json
params = {
"arrBasePrice": [-1, -1, -1], # -1
"arrRatio": [0.05, 0.05, 0.05], # 0.05
"arrAcc": [], # _C(exchange.GetAccount)
"arrLastCancelAll": [0, 0, 0], # 0
"arrMinStocks": [0.01, 0.01, 0.01], # 0.01
"arrPricePrecision": [2, 2, 2], # 2
"arrAmountPrecision": [3, 2, 2], # 2
"arrTick":[]
}
def CancelAll(e):
while True :
orders = _C(e.GetOrders)
for i in range(len(orders)) :
e.CancelOrder(orders[i]["Id"], orders[i])
if len(orders) == 0 :
break
Sleep(1000)
def process(e, index):
global params
ticker = _C(e.GetTicker)
params["arrTick"][index] = ticker
if params["arrBasePrice"][index] == -1 :
params["arrBasePrice"][index] = ticker.Last
if ticker.Last - params["arrBasePrice"][index] > 0 and (ticker.Last - params["arrBasePrice"][index]) / params["arrBasePrice"][index] > params["arrRatio"][index]:
params["arrAcc"][index] = _C(e.GetAccount)
if params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last > params["arrMinStocks"][index]:
e.Buy(ticker.Last, params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last)
params["arrBasePrice"][index] = ticker.Last
if ticker.Last - params["arrBasePrice"][index] < 0 and (params["arrBasePrice"][index] - ticker.Last) / params["arrBasePrice"][index] > params["arrRatio"][index]:
params["arrAcc"][index] = _C(e.GetAccount)
if params["arrAcc"][index].Stocks * params["arrRatio"][index] > params["arrMinStocks"][index]:
e.Sell(ticker.Last, params["arrAcc"][index].Stocks * params["arrRatio"][index])
params["arrBasePrice"][index] = ticker.Last
ts = time.time()
if ts - params["arrLastCancelAll"][index] > 60 * 5 :
CancelAll(e)
params["arrLastCancelAll"][index] = ts
def main():
global params
for i in range(len(exchanges)) :
params["arrAcc"].append(_C(exchanges[i].GetAccount))
params["arrTick"].append(_C(exchanges[i].GetTicker))
exchanges[i].SetPrecision(params["arrPricePrecision"][i], params["arrAmountPrecision"][i])
for key in params :
if len(params[key]) < len(exchanges):
raise "params error!"
while True:
tblAcc = {
"type" : "table",
"title": "account",
"cols": ["账户信息"],
"rows": []
}
tblTick = {
"type" : "table",
"title": "ticker",
"cols": ["行情信息"],
"rows": []
}
for i in range(len(exchanges)):
process(exchanges[i], i)
for i in range(len(exchanges)):
tblAcc["rows"].append([json.dumps(params["arrAcc"][i])])
tblTick["rows"].append([json.dumps(params["arrTick"][i])])
LogStatus(_D(), "\n`" + json.dumps([tblAcc, tblTick]) + "`")
Sleep(500)
2. अंतर ज्ञात करें
कोड की तुलना करें और पाएं कि यह पिछले लेख के कोड से बहुत अलग है?
वास्तव में, ट्रेडिंग लॉजिक बिल्कुल वैसा ही है, बिना किसी बदलाव के। बस इतना है कि हमने रणनीति को कई किस्मों में बदल दिया है, इसलिए हम "रणनीति पैरामीटर के रूप में एकल चर" के पिछले रूप का उपयोग नहीं कर सकते। एक अधिक उचित समाधान यह है पैरामीटर को Array बनाने के लिए, Array में प्रत्येक स्थिति का सूचकांक जोड़े गए ट्रेडिंग जोड़े से मेल खाता है।
फिर लेनदेन तर्क कोड को एक फ़ंक्शन में समाहित करेंprocessरणनीति के मुख्य लूप में, इस फ़ंक्शन को जोड़े गए ट्रेडिंग जोड़ों के अनुसार पुनरावृत्त रूप से बुलाया जाता है, ताकि ट्रेडिंग लॉजिक कोड प्रत्येक ट्रेडिंग जोड़े के लिए एक बार निष्पादित हो।
-
पुनरावृति (ट्रैवर्सल) कॉल:
for i in range(len(exchanges)): process(exchanges[i], i) -
रणनीति मापदंड:
params = { "arrBasePrice": [-1, -1, -1], # -1 "arrRatio": [0.05, 0.05, 0.05], # 0.05 "arrAcc": [], # _C(exchange.GetAccount) "arrLastCancelAll": [0, 0, 0], # 0 "arrMinStocks": [0.01, 0.01, 0.01], # 0.01 "arrPricePrecision": [2, 2, 2], # 2 "arrAmountPrecision": [3, 2, 2], # 2 "arrTick":[] }यह डिज़ाइन प्रत्येक ट्रेडिंग जोड़ी को अपने स्वयं के पैरामीटर रखने की अनुमति देता है, क्योंकि प्रत्येक ट्रेडिंग जोड़ी की कीमतें बहुत भिन्न हो सकती हैं और पैरामीटर भी भिन्न हो सकते हैं, इसलिए कभी-कभी विभेदित सेटिंग्स की आवश्यकता होती है।
-
कैंसलऑल फ़ंक्शन
आप इस फ़ंक्शन के परिवर्तनों की तुलना कर सकते हैं। यह फ़ंक्शन कोड का थोड़ा सा संशोधन करता है, और फिर इस संशोधन के उद्देश्य के बारे में सोचता है।
-
स्थिति बार चार्ट डेटा
स्टेटस बार में बाजार डेटा और खाता परिसंपत्ति डेटा प्रदर्शित करने के लिए चार्ट जोड़े गए, ताकि प्रत्येक एक्सचेंज ऑब्जेक्ट से संबंधित परिसंपत्तियां और बाजार डेटा वास्तविक समय में प्रदर्शित किया जा सके।
उपरोक्त डिज़ाइन विचारों में निपुणता प्राप्त करने के बाद, क्या पायथन रणनीति को बहु-विविधता रणनीति में संशोधित करना बहुत आसान नहीं है?
3. बैकटेस्टिंग
यह रणनीति केवल संदर्भ, बैकटेस्टिंग और परीक्षण के लिए है। यदि आप रुचि रखते हैं, तो आप इसे अनुकूलित और अपग्रेड कर सकते हैं।
नीति पता
孟总,请问为什么,你这个策略下单不用设置exchange.SetDirection("buy")方向,还有个e. 不是exchange.吗,我最近在学习策略
- 1








