4
ध्यान केंद्रित करना
1271
समर्थक

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

में बनाया: 2020-01-20 17:33:36, को अपडेट: 2023-10-17 21:18:46
comments   14
hits   4485

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

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. बैकटेस्टिंग

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

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

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

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