Type/to search
8
Follow
1363
Followers
आपको बाजार कलेक्टर के बैकटेस्ट कस्टम डेटा स्रोत फ़ंक्शन को अपग्रेड करने के लिए चरण दर चरण सिखाएं
Original
Created 2020-05-07 17:43:54  Updated 2023-10-09 22:47:43
 15
 2844

img

आपको बाजार कलेक्टर के बैकटेस्ट कस्टम डेटा स्रोत फ़ंक्शन को अपग्रेड करने के लिए चरण दर चरण सिखाएं

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

इसलिए, हम "मार्केट कलेक्टर" को अपग्रेड कर सकते हैं! मार्केट कलेक्टर का उपयोग बैकटेस्टिंग सिस्टम को डेटा प्रदान करने के लिए कस्टम डेटा स्रोत के रूप में भी किया जा सकता है।

यदि आपकी कोई आवश्यकता है, तो कार्रवाई करें!

तैयार करना

तैयारियाँ पिछले लेख से अलग हैं। पिछली बार, मैंने अपने स्थानीय मैक कंप्यूटर पर होस्ट प्रोग्राम चलाया, मोंगोडब डेटाबेस स्थापित किया और डेटाबेस सेवा शुरू की। इस बार हमने ऑपरेटिंग वातावरण को VPS में बदल दिया और अपने प्रोग्राम को चलाने के लिए अलीबाबा क्लाउड लिनक्स सर्वर का उपयोग किया।

  • मोंगोडब डेटाबेस

    पिछले लेख की तरह, आपको उस डिवाइस पर MongoDB डेटाबेस स्थापित करना होगा जहां मार्केट कलेक्टर प्रोग्राम चलता है और सेवा शुरू करनी होगी। यह मूल रूप से मैक कंप्यूटर पर मोंगोडब स्थापित करने जैसा ही है। इंटरनेट पर कई ट्यूटोरियल हैं। आप उन्हें खोज सकते हैं। यह बहुत सरल है।

  • पायथन 3 स्थापित करें
    कार्यक्रम पायथन 3 का उपयोग करता है। ध्यान दें कि कुछ लाइब्रेरीज़ का उपयोग किया जाता है और यदि वे उपलब्ध न हों तो उन्हें स्थापित करने की आवश्यकता होती है।

    • pymongo
    • http
    • urllib
  • मेज़बान
    बस इन्वेंटर मात्रात्मक व्यापार मंच का एक संरक्षक चलाते हैं।

"बाजार सूचना संग्राहक" को संशोधित करें

बाजार कलेक्टररिकॉर्ड्स कलेक्टर (ट्यूटोरियल)यह रणनीति.
आइये इसमें कुछ बदलाव करें:
इससे पहले कि प्रोग्राम डेटा एकत्र करने के लिए while लूप में प्रवेश करे, एक मल्टी-थ्रेडेड लाइब्रेरी का उपयोग इन्वेंटर के क्वांटिटेटिव ट्रेडिंग प्लेटफॉर्म बैकटेस्टिंग सिस्टम से डेटा अनुरोधों को सुनने के लिए एक सेवा को समवर्ती रूप से शुरू करने के लिए किया जाता है।
(कुछ अन्य विवरणों को नजरअंदाज किया जा सकता है)

रिकॉर्ड्स कलेक्टर (कस्टम डेटा स्रोत फ़ंक्शन प्रदान करने के लिए अपग्रेड किया गया)

python
import _thread import pymongo import json import math from http.server import HTTPServer, BaseHTTPRequestHandler from urllib.parse import parse_qs, urlparse def url2Dict(url): query = urlparse(url).query params = parse_qs(query) result = {key: params[key][0] for key in params} return result class Provider(BaseHTTPRequestHandler): def do_GET(self): try: self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() dictParam = url2Dict(self.path) Log("自定义数据源服务接收到请求,self.path:", self.path, "query 参数:", dictParam) # 目前回测系统只能从列表中选择交易所名称,在添加自定义数据源时,设置为币安,即:Binance exName = exchange.GetName() # 注意,period为底层K线周期 tabName = "%s_%s" % ("records", int(int(dictParam["period"]) / 1000)) priceRatio = math.pow(10, int(dictParam["round"])) amountRatio = math.pow(10, int(dictParam["vround"])) fromTS = int(dictParam["from"]) * int(1000) toTS = int(dictParam["to"]) * int(1000) # 连接数据库 Log("连接数据库服务,获取数据,数据库:", exName, "表:", tabName) myDBClient = pymongo.MongoClient("mongodb://localhost:27017") ex_DB = myDBClient[exName] exRecords = ex_DB[tabName] # 要求应答的数据 data = { "schema" : ["time", "open", "high", "low", "close", "vol"], "data" : [] } # 构造查询条件:大于某个值{'age': {'$gt': 20}} 小于某个值{'age': {'$lt': 20}} dbQuery = {"$and":[{'Time': {'$gt': fromTS}}, {'Time': {'$lt': toTS}}]} Log("查询条件:", dbQuery, "查询条数:", exRecords.find(dbQuery).count(), "数据库总条数:", exRecords.find().count()) for x in exRecords.find(dbQuery).sort("Time"): # 需要根据请求参数round和vround,处理数据精度 bar = [x["Time"], int(x["Open"] * priceRatio), int(x["High"] * priceRatio), int(x["Low"] * priceRatio), int(x["Close"] * priceRatio), int(x["Volume"] * amountRatio)] data["data"].append(bar) Log("数据:", data, "响应回测系统请求。") # 写入数据应答 self.wfile.write(json.dumps(data).encode()) except BaseException as e: Log("Provider do_GET error, e:", e) def createServer(host): try: server = HTTPServer(host, Provider) Log("Starting server, listen at: %s:%s" % host) server.serve_forever() except BaseException as e: Log("createServer error, e:", e) raise Exception("stop") def main(): LogReset(1) exName = exchange.GetName() period = exchange.GetPeriod() Log("收集", exName, "交易所的K线数据,", "K线周期:", period, "秒") # 连接数据库服务,服务地址 mongodb://127.0.0.1:27017 具体看服务器上安装的mongodb设置 Log("连接托管者所在设备mongodb服务,mongodb://localhost:27017") myDBClient = pymongo.MongoClient("mongodb://localhost:27017") # 创建数据库 ex_DB = myDBClient[exName] # 打印目前数据库表 collist = ex_DB.list_collection_names() Log("mongodb ", exName, " collist:", collist) # 检测是否删除表 arrDropNames = json.loads(dropNames) if isinstance(arrDropNames, list): for i in range(len(arrDropNames)): dropName = arrDropNames[i] if isinstance(dropName, str): if not dropName in collist: continue tab = ex_DB[dropName] Log("dropName:", dropName, "删除:", dropName) ret = tab.drop() collist = ex_DB.list_collection_names() if dropName in collist: Log(dropName, "删除失败") else : Log(dropName, "删除成功") # 开启一个线程,提供自定义数据源服务 try: # _thread.start_new_thread(createServer, (("localhost", 9090), )) # 本机测试 _thread.start_new_thread(createServer, (("0.0.0.0", 9090), )) # VPS服务器上测试 Log("开启自定义数据源服务线程", "#FF0000") except BaseException as e: Log("启动自定义数据源服务失败!") Log("错误信息:", e) raise Exception("stop") # 创建records表 ex_DB_Records = ex_DB["%s_%d" % ("records", period)] Log("开始收集", exName, "K线数据", "周期:", period, "打开(创建)数据库表:", "%s_%d" % ("records", period), "#FF0000") preBarTime = 0 index = 1 while True: r = _C(exchange.GetRecords) if len(r) < 2: Sleep(1000) continue if preBarTime == 0: # 首次写入所有BAR数据 for i in range(len(r) - 1): bar = r[i] # 逐根写入,需要判断当前数据库表中是否已经有该条数据,基于时间戳检测,如果有该条数据,则跳过,没有则写入 retQuery = ex_DB_Records.find({"Time": bar["Time"]}) if retQuery.count() > 0: continue # 写入bar到数据库表 ex_DB_Records.insert_one({"High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]}) index += 1 preBarTime = r[-1]["Time"] elif preBarTime != r[-1]["Time"]: bar = r[-2] # 写入数据前检测,数据是否已经存在,基于时间戳检测 retQuery = ex_DB_Records.find({"Time": bar["Time"]}) if retQuery.count() > 0: continue ex_DB_Records.insert_one({"High": bar["High"], "Low": bar["Low"], "Open": bar["Open"], "Close": bar["Close"], "Time": bar["Time"], "Volume": bar["Volume"]}) index += 1 preBarTime = r[-1]["Time"] LogStatus(_D(), "preBarTime:", preBarTime, "_D(preBarTime):", _D(preBarTime/1000), "index:", index) # 增加画图展示 ext.PlotRecords(r, "%s_%d" % ("records", period)) Sleep(10000)

परीक्षा

रोबोट को कॉन्फ़िगर करें
img

रोबोट चलाओ और बाजार कलेक्टर चलाओ.
img

एक परीक्षण रणनीति खोलें और एक बैकटेस्ट करें, जैसे कि यह बैकटेस्ट रणनीति, और इसका परीक्षण करें।

javascript
function main() { Log(exchange.GetRecords()) Log(exchange.GetRecords()) Log(exchange.GetRecords()) Log(exchange.GetRecords()) Log(exchange.GetRecords()) Log(exchange.GetRecords()) Log(exchange.GetRecords().length) }

बैकटेस्टिंग विकल्पों को कॉन्फ़िगर करें और एक्सचेंज को Binance पर सेट करें क्योंकि कस्टम डेटा स्रोत फिलहाल खुद से एक्सचेंज का नाम सेट नहीं कर सकता है। आप कॉन्फ़िगरेशन के लिए सूची में मौजूद एक्सचेंज का ही इस्तेमाल कर सकते हैं। बैकटेस्टिंग के दौरान Binance प्रदर्शित होता है। यह डेटा है wexApp सिमुलेशन डिस्क की.

img

कस्टम डेटा स्रोत के रूप में मार्केट कलेक्टर पर आधारित बैकटेस्टिंग सिस्टम द्वारा उत्पन्न चार्ट और वेक्सऐप एक्सचेंज पेज पर 1-घंटे के कैंडलस्टिक चार्ट की तुलना करके देखें कि क्या वे समान हैं।

img

img

इस तरह, VPS पर रोबोट स्वयं K-लाइन डेटा एकत्र कर सकता है, और हम किसी भी समय एकत्रित डेटा प्राप्त कर सकते हैं और बैकटेस्टिंग सिस्टम में सीधे बैकटेस्ट कर सकते हैं।
यह सागर में एक बूँद के समान है। विशेषज्ञ इस पर विस्तार करना जारी रख सकते हैं, उदाहरण के लिए, वास्तविक समय बैकटेस्टिंग के लिए कस्टम डेटा स्रोतों का समर्थन करना, मल्टी-वेरिटी और मल्टी-मार्केट डेटा संग्रह और अन्य कार्यों का समर्थन करना।

संदेश छोड़ने के लिए आपका स्वागत है।

Related Recommendations
Comment
All comments (13)

    而且一直没有”自定义数据源服务接收到请求“这个日志的打印 这个是什么问题呢

    4 years ago

    这个实盘必须运行在服务器上具备外网IP,让回测系统页面能访问到。

    4 years ago

    都有的,现在自定义数据源地址填写后,下面回测数据没有显示出新的数据。是 vps需要起什么服务?

    4 years ago

    需要在服务器上运行这个帖子里说的「行情收集器」。作为给FMZ回测系统自定义数据源功能,提供数据。按照帖子上做就可以,这个测试过的。

    4 years ago

    回测时候 选择自定义数据 下面开始用勾选的交易对数据 这种情况怎么处理 我已经用自己的VPS把数据搞定了

    4 years ago

    使用自定义数据源功能之后,你还需要在右侧控件填写自定义数据源的服务地址。

    4 years ago

    如果收集到了上面没有提供的币对的数据,要回测一些小品种货币对,如DOT_USDT,回测时币种不能自定义,那么,要如何实现?

    5 years ago

    不用交易对名字 一样, 用个代替就行了数据价格是你收集的数据就可以了。

    5 years ago

    那需要在哪里替代呢,或者有没有相关的教程?

    5 years ago

    你还没明白我说的意思, 我是说你的自定义数据源提供的数据 比如实际是 EOS_USDT 的,但是FMZ上只能选择BTC_USDT这样的交易对,你就拿这个EOS_USDT的实际数据当做BTC_USDT的提供给FMZ回测系统。明白了么。回测的时候虽然显示的是BTC_USDT, 但是没什么关系,数据价格都是EOS的。

    5 years ago

    6 years ago

    回测选择自定义数据源的话,是不是只支持一个交易对?

    6 years ago

    可以给数据源提供的这个服务程序多写几个不同的交易对数据提供,回测系统会自己调用需要的。

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)