পাইথন একক প্রজাতির কৌশলকে মাল্টি-প্রজাতির কৌশলতে রূপান্তর করতে শেখান

লেখক:লিডিয়া, তৈরিঃ ২০২২-১২-২০ ১৭ঃ২৬ঃ২৭, আপডেটঃ ২০২৩-০৯-২০ ০৯ঃ৪৫ঃ২৮

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)

২. পার্থক্য খুঁজে বের করুন

এই কোডের তুলনা করে, আপনি কি দেখেছেন যে এটি পূর্ববর্তী নিবন্ধের কোড থেকে অনেকটাই আলাদা? প্রকৃতপক্ষে, ট্রেডিং লজিকটি ঠিক একই রকম, কোনও পরিবর্তন ছাড়াই। আমরা কেবল কৌশলটিকে একাধিক প্রজাতির একটিতে সংশোধন করি, আমরা একক পরিবর্তনশীলকে কৌশল প্যারামিটার হিসাবে ব্যবহার করতে পারি না। একটি আরও যুক্তিসঙ্গত সমাধান হ'ল প্যারামিটারটিকে একটি অ্যারেতে তৈরি করা, এবং অ্যারেতে প্রতিটি অবস্থানের সূচক যুক্ত ট্রেডিং জোড়ার সাথে মিলে যায়।

img

তারপর একটি ফাংশন ট্রেডিং লজিক কোড encapsulateprocess. মূল কৌশল লুপে, যোগ করা ট্রেডিং জোড়া অনুযায়ী এই ফাংশনটি পুনরাবৃত্তিভাবে কল করুন, এবং প্রতিটি ট্রেডিং জোড়া একবার ট্রেডিং লজিক কোডটি কার্যকর করতে দিন।

  • পুনরাবৃত্তিমূলক (ট্র্যাভার্সাল) কলঃ
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

কৌশলটি শুধুমাত্র শেখার এবং ব্যাকটেস্টিংয়ের উদ্দেশ্যে এবং আপনি যদি আগ্রহী হন তবে এটিকে অপ্টিমাইজ এবং আপগ্রেড করতে পারেন।কৌশলগত ঠিকানা


সম্পর্কিত

আরো