पिछले लेख में, एक बहुत ही सरल पायथन रणनीति को लागू किया गया थाः"पायथन संस्करण के लिए शिकार और गिरने की रणनीति"यह रणनीति एक खाते को एक ट्रेडिंग जोड़ी पर व्यवस्थित ट्रेडिंग करने के लिए संचालित कर सकती है, सिद्धांत बहुत सरल है, यह है कि हम एक ही ट्रेडिंग तर्क का उपयोग करके विभिन्न ट्रेडिंग जोड़े को संचालित करना चाहते हैं। कई रोबोट बनाए जा सकते हैं, विभिन्न मुद्राओं में ट्रेडिंग करने के लिए विभिन्न ट्रेडिंग जोड़े सेट कर सकते हैं। यदि रणनीति बहुत जटिल नहीं है, तो आविष्कारक को क्वांटिफाइड ट्रेडिंग प्लेटफॉर्म की मजबूत लचीलापन को देखते हुए। एक रणनीति को कई रणनीतियों में बदलना आसान है, इसलिए केवल एक रोबोट बनाने के लिए कई ट्रेडों को सही करना आसान है।
नीति के लिए संशोधित स्रोत कोडः
'''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":[]
}
इस तरह के डिजाइन में, प्रत्येक लेन-देन जोड़ी के पास अपने स्वयं के पैरामीटर हो सकते हैं, क्योंकि प्रत्येक लेनदेन में संभावित कीमतों में बहुत बड़ा अंतर हो सकता है, पैरामीटर में भी भिन्नता हो सकती है, और कभी-कभी भेदभाव सेटिंग्स की आवश्यकता होती है।
इसके विपरीत, इस फ़ंक्शन का परिवर्तन। यह फ़ंक्शन केवल कोड को थोड़ा सा संशोधित करता है, और फिर सोचता है कि इस तरह के संशोधन का इरादा क्या है।
स्टेटस टैब में मार्केट डेटा और अकाउंट एसेट डेटा दिखाने के लिए चार्ट जोड़े गए हैं, जिससे प्रत्येक एक्सचेंज के ऑब्जेक्ट के लिए संबंधित संपत्ति और बाजार को वास्तविक समय में दिखाया जा सकता है।
और अगर आप इन डिजाइन विचारों को समझते हैं, तो क्या एक पायथन रणनीति को कई प्रकारों में बदलना इतना आसान नहीं है?
यह रणनीति केवल संदर्भ सीखने, पुनः परीक्षण और उन्नयन को अनुकूलित करने में रुचि रखने वाले लोगों के लिए है।रणनीतिक पते
बीबीडब्ल्यूड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 मिनट पर सेट किया जाता है।