आपको सिखाता है कि पाइथन की एक प्रजाति की रणनीति को बहु-प्रजाति की रणनीति में कैसे बदलना है

लेखक:लिडिया, बनाया गयाः 2022-12-20 17:26:27, अद्यतन किया गयाः 2023-09-20 09:45:28

img

आप एक बहु मुद्रा रणनीति में एक पायथन एकल मुद्रा रणनीति बदलने के लिए सिखाना

I. आप एक बहु मुद्रा रणनीति में एक एकल मुद्रा रणनीति पायथन बदलने के लिए सिखाने के लिए

पिछले लेख में, एक बहुत ही सरल पायथन रणनीति लागू किया गया थाःपायथन संस्करण के विजेताओं को खरीदने की रणनीति, यह रणनीति एक निश्चित ट्रेडिंग जोड़ी पर प्रोग्राम ट्रेडिंग करने के लिए एक खाते का संचालन कर सकती है। सिद्धांत बहुत सरल है, अर्थात, बढ़ने के बाद पीछा करना और घटने के बाद मारना। कभी-कभी हम विभिन्न ट्रेडिंग जोड़े संचालित करने के लिए एक ही ट्रेडिंग तर्क का उपयोग करना चाहते हैं। आप कई रोबोट बना सकते हैं और विभिन्न मुद्राओं में लेनदेन करने के लिए विभिन्न ट्रेडिंग जोड़े सेट कर सकते हैं। यदि रणनीति बहुत जटिल नहीं है, तो एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म की मजबूत लचीलापन के मद्देनजर, एक रणनीति को मल्टी-स्पेस रणनीति में बदलना आसान है, ताकि आप केवल एक रोबोट बनाकर कई ट्रेडिंग जोड़े चला सकें।

परिवर्तन के बाद रणनीति स्रोत कोडः

'''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": ["Account information"], 
            "rows": []
        }        

        tblTick = {
            "type" : "table",
            "title": "ticker",
            "cols": ["Market information"], 
            "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)

II. अंतर खोजें

क्या आपको लगता है कि यह कोड पिछले लेख के कोड से बहुत अलग है? वास्तव में, ट्रेडिंग तर्क बिल्कुल समान है, बिना किसी परिवर्तन के। हम केवल रणनीति को कई प्रजातियों में संशोधित करते हैं, हम एक चर के पिछले रूप का उपयोग रणनीति पैरामीटर के रूप में नहीं कर सकते हैं। एक अधिक उचित समाधान पैरामीटर को एक सरणी में बनाना है, और सरणी में प्रत्येक स्थिति का सूचकांक जोड़ा व्यापार जोड़ी के अनुरूप है।

img

फिर एक फ़ंक्शन में ट्रेडिंग तर्क के कोड को कैप्सूल करें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":[]
}

यह डिजाइन प्रत्येक ट्रेडिंग जोड़ी को अपने स्वयं के पैरामीटर रखने की अनुमति देता है, क्योंकि प्रत्येक ट्रेडिंग जोड़ी में एक बड़ा मूल्य अंतर हो सकता है, और पैरामीटर भी अलग हो सकते हैं, कभी-कभी अंतर सेटिंग्स की आवश्यकता होती है।

  • सभी फ़ंक्शन रद्द करें आप इस फ़ंक्शन के परिवर्तन की तुलना कर सकते हैं. यह फ़ंक्शन केवल थोड़ा कोड संशोधित करता है, और फिर इस तरह के संशोधन के इरादे के बारे में सोचो.

  • स्थिति पट्टी चार्ट डेटा स्थिति पट्टी में बाजार डेटा और खाता परिसंपत्ति डेटा प्रदर्शित करने के लिए एक चार्ट जोड़ा जाता है, ताकि प्रत्येक विनिमय वस्तु की संबंधित परिसंपत्तियों और बाजार को वास्तविक समय में प्रदर्शित किया जा सके। उपरोक्त डिजाइन विचारों में महारत हासिल करने के बाद क्या पायथन रणनीति को बहु-प्रजाति रणनीति में बदलना आसान है?

III. बैकटेस्ट

img img img

यह रणनीति केवल सीखने और बैकटेस्टिंग के उद्देश्यों के लिए है, और आप यदि रुचि रखते हैं तो इसे अनुकूलित और अपग्रेड कर सकते हैं।रणनीतिक पता


संबंधित

अधिक