हाथ से हाथ मिलाकर आपको सिखाया जाता है कि आप एक ही प्रकार की नीति को कई प्रकार की नीति में कैसे बदल सकते हैं।

लेखक:छोटे सपने, बनाया गयाः 2020-01-20 17:33:36, अद्यतन किया गयाः 2023-10-17 21:18:46

img

एक, हाथ से हाथ मिलाकर आपको सिखाया जाएगा कि आप एक ही प्रकार की पायथन रणनीति को कई प्रकार की रणनीति में कैसे बदल सकते हैं।

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

नीति के लिए संशोधित स्रोत कोडः

'''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)

दूसरा, अलग खोजें

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

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":[]
    }
    

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

  • CancelAll फ़ंक्शन

    इसके विपरीत, इस फ़ंक्शन का परिवर्तन। यह फ़ंक्शन केवल कोड को थोड़ा सा संशोधित करता है, और फिर सोचता है कि इस तरह के संशोधन का इरादा क्या है।

  • स्टेटस बार चार्ट डेटा

    स्टेटस टैब में मार्केट डेटा और अकाउंट एसेट डेटा दिखाने के लिए चार्ट जोड़े गए हैं, जिससे प्रत्येक एक्सचेंज के ऑब्जेक्ट के लिए संबंधित संपत्ति और बाजार को वास्तविक समय में दिखाया जा सकता है।

और अगर आप इन डिजाइन विचारों को समझते हैं, तो क्या एक पायथन रणनीति को कई प्रकारों में बदलना इतना आसान नहीं है?

तीसरा, पुनः परीक्षण

img

img

img

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


संबंधित

अधिक

बीबीडब्ल्यूड2009मेन, आप इस नीति के लिए एक विकल्प के रूप में सेट करने की आवश्यकता नहीं है, तो आप एक विकल्प के रूप में सेट करने की आवश्यकता नहीं है, और एक विकल्प के रूप में आप एक विकल्प के रूप में सेट करने की आवश्यकता नहीं है, और एक विकल्प के रूप में आप एक विकल्प के रूप में सेट करने की आवश्यकता नहीं है।

सिक्के के घेरे का बड़ा काला घोड़ाइस रणनीति के लिए न्यूनतम पूंजी क्या है?

सिक्के के घेरे का बड़ा काला घोड़ाएक बार जब आप एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से एक बार फिर से।

सिक्के के घेरे का बड़ा काला घोड़ाठीक है, ठीक है, ठीक है, ठीक है, मैंने सिक्का बनाया है, कोई आश्चर्य नहीं।

सिक्के के घेरे का बड़ा काला घोड़ा/upload/asset/164f3fe6e84331d800583.png अब ठीक है, लेकिन मेरे खाते में पैसा है, आपकी रणनीति में न्यूनतम पूंजी कितना है, क्या मेरे खाते में पैसा पर्याप्त नहीं है?

सिक्के के घेरे का बड़ा काला घोड़ा/upload/asset/16495fcb1185338f8af27.png जोड़ा गया होस्ट आई पी है, ठीक है।

सिक्के के घेरे का बड़ा काला घोड़ाGetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"} IP मैं भी एपीआई में जोड़ा है, लेकिन मैं गलत हूँ.

सिक्के के घेरे का बड़ा काला घोड़ा/upload/asset/164330beccf32fc55e7b6.png यह कैसे हल होता है

सिक्के के घेरे का बड़ा काला घोड़ारोबोट के लाइन चक्र कितना सेट करता है

छोटे सपनेयह रणनीति शिक्षण रणनीति के लिए है, मुख्य रूप से सीखने के लिए है, और इसे स्वयं संशोधित, विस्तारित और अनुकूलित किया जा सकता है।

छोटे सपनेइस रणनीति के स्रोत कोड को देख सकते हैं, रणनीति खुला है, रणनीति का तर्क बहुत सरल है; ध्यान दें, यह एक डिजिटल मुद्रा नकदी रणनीति है, जो वायदा नहीं चला सकती है, जिसे आप स्वयं वायदा में बदल सकते हैं।

छोटे सपनेजब आप API KEY का अनुरोध करते हैं, तो आपके द्वारा सेट किया गया IP पता एक श्वेतसूची का पता है जिसे एक्सेस करने की अनुमति दी जाती है, और जब आप इसे सेट करते हैं, तो केवल यह आईपी पता आपके API KEY का उपयोग करके एपीआई इंटरफ़ेस तक पहुंच सकता है। क्या आप अपने होस्ट के आईपी पते को सेट करते हैं?

छोटे सपनेपायलटों के लिए, यह बहुत आसान है कि आप अपने सर्वर पर पाइथन स्थापित करें।

छोटे सपनेयह नीति K लाइन की परवाह नहीं करती है, किसी भी सेटिंग के साथ चलती है, क्योंकि रीसेट शब्द टिक कणों को प्रभावित करता है, इसे 1 मिनट पर सेट किया जाता है।