
পূর্ববর্তী নিবন্ধে, একটি খুব সহজ পাইথন কৌশল প্রয়োগ করা হয়েছিল:“পাইথন সংস্করণ ধাওয়া এবং মেরে ফেলার কৌশল”, এই কৌশলটি একটি নির্দিষ্ট ট্রেডিং পেয়ারে প্রোগ্রাম করা ট্রেডিং পরিচালনা করতে পারে নীতিটি খুবই সহজ, যা হল উত্থানকে তাড়া করা এবং পতনকে হত্যা করা। কখনও কখনও আমরা একই ট্রেডিং লজিক ব্যবহার করতে চাই বিভিন্ন ট্রেডিং পেয়ার পরিচালনা করতে। আপনি একাধিক রোবট তৈরি করতে পারেন এবং বিভিন্ন মুদ্রায় লেনদেন করার জন্য বিভিন্ন ট্রেডিং জোড়া সেট আপ করতে পারেন। কৌশলটি খুব জটিল না হলে, উদ্ভাবকের পরিমাণগত ট্রেডিং প্ল্যাটফর্মের দুর্দান্ত নমনীয়তা দেওয়া। একটি কৌশলকে বহু-বিচিত্র কৌশলে রূপান্তর করা সহজ, যাতে আপনি শুধুমাত্র একটি রোবট তৈরি করে একাধিক ট্রেডিং জোড়া চালাতে পারেন।
পরিবর্তিত কৌশল সোর্স কোড:
'''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)
কোড তুলনা করুন আপনি কি এটি আগের নিবন্ধের কোড থেকে খুব আলাদা? প্রকৃতপক্ষে, ট্রেডিং লজিক কোন পরিবর্তন ছাড়াই ঠিক এই যে আমরা কৌশলটিকে একাধিক বৈচিত্র্যের জন্য পরিবর্তন করেছি অ্যারে হিসাবে প্যারামিটার, অ্যারের প্রতিটি অবস্থানের সূচক যোগ করা ট্রেডিং জোড়ার সাথে মিলে যায়।

তারপর কোডের ট্রেডিং লজিক অংশটিকে একটি ফাংশনে এনক্যাপসুলেট করুন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":[]
}
এই ডিজাইনটি প্রতিটি ট্রেডিং পেয়ারের নিজস্ব প্যারামিটার থাকতে দেয়, কারণ প্রতিটি ট্রেডিং পেয়ারের খুব আলাদা মূল্য এবং বিভিন্ন প্যারামিটার থাকতে পারে এবং কখনও কখনও আলাদা সেটিংসের প্রয়োজন হয়।
আপনি এই ফাংশন পরিবর্তন তুলনা করতে পারেন. এই ফাংশনটি কোডটিকে একটু পরিবর্তন করে এবং তারপরে এই পরিবর্তনের উদ্দেশ্য সম্পর্কে চিন্তা করুন।
স্ট্যাটাস বারে বাজারের তথ্য এবং অ্যাকাউন্ট সম্পদের ডেটা প্রদর্শনের জন্য একটি চার্ট যোগ করা হয়েছে এবং প্রতিটি বিনিময় বস্তুর সাথে সম্পর্কিত সম্পদ এবং বাজার মূল্যগুলি রিয়েল টাইমে প্রদর্শিত হতে পারে।
উপরের নকশা ধারণাগুলি আয়ত্ত করার পর, একটি পাইথন কৌশলকে বহু-বৈচিত্র্যপূর্ণ কৌশলে রূপান্তর করা কি খুব সহজ নয়?



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