آپ کو اپ گریڈ کرنے کے لئے سکھانے کے لئے مارکیٹ جمع کرنے والے backtest اپنی مرضی کے مطابق ڈیٹا ماخذ

مصنف:نیکی, تخلیق: 2020-06-06 08:53:02, تازہ کاری: 2023-11-01 20:28:58

img

پچھلا مضمونآپ کو ایک مارکیٹ کی قیمتوں کا تعین جمع کرنے کے لئے لاگو کرنے کے لئے سکھانے کےہم نے ایک روبوٹ پروگرام لاگو کیا ہے جو مارکیٹ کی قیمتوں کا تعین ایک ساتھ جمع کرتا ہے۔

مارکیٹ کے اعداد و شمار کو جمع کرنے کے بعد اسے کیسے استعمال کیا جائے؟ یہ بیک ٹیسٹ سسٹم کے لئے استعمال ہوگا۔ ایف ایم زیڈ پلیٹ فارم بیک ٹیسٹ سسٹم کے کسٹم ڈیٹا سورس فنکشن پر انحصار کرتے ہوئے ، ہم جمع کردہ ڈیٹا کو براہ راست بیک ٹیسٹ سسٹم کے ڈیٹا سورس کے طور پر استعمال کرسکتے ہیں ، تاکہ ہم بیک ٹیسٹ سسٹم کو کسی بھی مارکیٹ میں استعمال کرنے دیں جہاں ہم تاریخی ڈیٹا کو بیک ٹیسٹ کرنا چاہتے ہیں۔

لہذا، ہم مارکیٹ کوٹ جمع کرنے والے ایک اپ گریڈ دے سکتے ہیں! مارکیٹ جمع کرنے والے کو بھی بیک ٹیسٹ سسٹم کو ڈیٹا فراہم کرنے کے لئے ایک اپنی مرضی کے مطابق ڈیٹا ماخذ کے طور پر کام کر سکتے ہیں.

تیار ہو جاؤ

یہ پچھلے مضمون میں تیاری کے کام سے مختلف ہے۔ آخری بار میرے مقامی میک کمپیوٹر پر چلنے والا ایک ڈوکر پروگرام تھا ، ڈیٹا بیس سروس کو شروع کرنے کے لئے منگودب ڈیٹا بیس انسٹال کر رہا تھا۔ اس بار ہم نے آپریٹنگ ماحول کو وی پی ایس میں تبدیل کیا اور اپنے پروگراموں کے سیٹ کو چلانے کے لئے علی بابا کلاؤڈ لینکس سرور کا استعمال کیا۔

  • Mongodb ڈیٹا بیس

پچھلے مضمون کی طرح ، ہمیں منگودب ڈیٹا بیس کو اس ڈیوائس پر انسٹال کرنے کی ضرورت ہے جہاں مارکیٹ کلکٹر پروگرام چل رہا ہے اور سروس شروع کریں۔ یہ بنیادی طور پر ایک میک کمپیوٹر پر منگودب انسٹال کرنے کے برابر ہے۔ انٹرنیٹ پر بہت سارے سبق موجود ہیں ، آپ اسے گوگل کرسکتے ہیں ، یہ بہت آسان ہے۔

  • پائتھون 3 انسٹال کریں

پروگرام python3 استعمال کرتا ہے، کچھ python لائبریریوں کے استعمال پر توجہ دیں، اگر وہ نصب نہیں ہیں، تو آپ کو پہلے ان کو انسٹال کرنے کی ضرورت ہے.

پیمونگو http urllib

  • ڈوکر

ایک FMZ ڈاکر چلانے کافی ہو جائے گا.

مارکیٹ کوٹس کلیکٹر کو تبدیل کریں

مارکیٹ کوٹس جمع کرنے والا یہ ہے:https://www.fmz.com/strategy/199120(ریکارڈ جمع کرنے والا) حکمت عملی.

آئیے اس میں کچھ تبدیلیاں کرتے ہیں:

ڈیٹا اکٹھا کرنے کے لئے جب پروگرام لوپ میں داخل ہوتا ہے تو ، ایک ملٹی تھریڈ لائبریری استعمال کی جاتی ہے ، اور بیک وقت عمل درآمد ایف ایم زیڈ پلیٹ فارم بیک ٹیسٹ سسٹم کے ڈیٹا کی درخواست کی نگرانی کے لئے ایک سروس شروع کرتی ہے۔ (دیگر تفصیلات کو نظرانداز کیا جاسکتا ہے)

RecordsCollector (اپ گریڈ اپنی مرضی کے مطابق ڈیٹا ماخذ تقریب فراہم کرنے کے لئے)

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("The custom data source service receives the request, self.path:", self.path, "query parameter:", dictParam)
            
            # At present, the backtesting system can only select the exchange name from the list. When adding a custom data source, set it to Binance, that is: Binance
            exName = exchange.GetName()                                     
            # Note that period is the bottom K-line period
            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)
            
            
            # Connect to the database
            Log("Connect to the database service to obtain data, the database:", exName, "table:", tabName)
            myDBClient = pymongo.MongoClient("mongodb://localhost:27017")
            ex_DB = myDBClient[exName]
            exRecords = ex_DB[tabName]
            
            
            # Request data
            data = {
                "schema" : ["time", "open", "high", "low", "close", "vol"],
                "data" : []
            }
            
            # Construct query condition: greater than a certain value{'age': {'$gt': 20}} Less than a certain value{'age': {'$lt': 20}}
            dbQuery = {"$and":[{'Time': {'$gt': fromTS}}, {'Time': {'$lt': toTS}}]}
            Log("Query conditions:", dbQuery, "Number of inquiries:", exRecords.find(dbQuery).count(), "Total number of databases:", exRecords.find().count())
            
            for x in exRecords.find(dbQuery).sort("Time"):
                # Need to process data accuracy according to request parameters round and 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:", data, "Respond to backtest system requests.")
            # Write data reply
            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("collect", exName, "Exchange K-line data,", "K line cycle:", period, "second")
    
    # Connect to the database service, service address mongodb://127.0.0.1:27017 See the settings of mongodb installed on the server
    Log("Connect to the mongodb service of the hosting device, mongodb://localhost:27017")
    myDBClient = pymongo.MongoClient("mongodb://localhost:27017")   
    # Create a database
    ex_DB = myDBClient[exName]
    
    # Print the current database table
    collist = ex_DB.list_collection_names()
    Log("mongodb ", exName, " collist:", collist)
    
    # Check if the table is deleted
    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, "delete:", dropName)
                ret = tab.drop()
                collist = ex_DB.list_collection_names()
                if dropName in collist:
                    Log(dropName, "failed to delete")
                else :
                    Log(dropName, "successfully deleted")
    
    # Start a thread to provide a custom data source service
    try:
        # _thread.start_new_thread(createServer, (("localhost", 9090), ))     # local computer test
        _thread.start_new_thread(createServer, (("0.0.0.0", 9090), ))         # Test on VPS server
        Log("Open the custom data source service thread", "#FF0000")
    except BaseException as e:
        Log("Failed to start the custom data source service!")
        Log("Error message:", e)
        raise Exception("stop")
    
    # Create the records table
    ex_DB_Records = ex_DB["%s_%d" % ("records", period)]
    Log("Start collecting", exName, "K-line data", "cycle:", period, "Open (create) the database table:", "%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:
            # Write all BAR data for the first time
            for i in range(len(r) - 1):
                bar = r[i]
                # Write line by line, you need to determine whether the data already exists in the current database table, based on timestamp detection, if there is the data, then skip, if not write in
                retQuery = ex_DB_Records.find({"Time": bar["Time"]})
                if retQuery.count() > 0:
                    continue
                
                # Write bar to the database table
                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]
            # Check before writing data, whether the data already exists, based on time stamp detection
            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)
        # adding drawing display
        ext.PlotRecords(r, "%s_%d" % ("records", period))
        Sleep(10000)

ٹیسٹ

روبوٹ کو ترتیب دیں

img

روبوٹ کو چلائیں، مارکیٹ کوٹ جمع کرنے والے کو چلائیں.

img

بیک ٹسٹ کے لئے ٹیسٹ کی حکمت عملی کھولیں۔ مثال کے طور پر:

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

بیک ٹسٹ آپشن کو ترتیب دیں ، تبادلے کو بائننس پر ترتیب دیں کیونکہ عارضی کسٹم ڈیٹا ماخذ ابھی تک خود ہی تبادلے کا نام تشکیل نہیں دے سکتا ، آپ صرف فہرست میں تبادلے کی ترتیب میں سے ایک کو قرض لے سکتے ہیں ، بیک ٹسٹ سے پتہ چلتا ہے کہ بائننس ، اصل یہ ہے ہم ایکس ایپ کی نقلی مارکیٹ کا ڈیٹا۔

img

موازنہ کریں کہ کیا مارکیٹ کوٹس کلیکٹر پر مبنی بیک ٹسٹ سسٹم کے ذریعہ تیار کردہ چارٹ کسٹم ڈیٹا ماخذ کے طور پر ویکس ایپ ایکسچینج پیج پر 1 گھنٹے کے کی لائن چارٹ کے ساتھ ایک جیسا ہے۔

img img

اس طرح، VPS پر روبوٹ خود سے K لائن کے اعداد و شمار جمع کر سکتے ہیں، اور ہم کسی بھی وقت جمع کردہ اعداد و شمار حاصل کر سکتے ہیں اور براہ راست بیک ٹیسٹ کے نظام میں بیک ٹیسٹ کرسکتے ہیں.

آپ توسیع جاری رکھ سکتے ہیں، مثال کے طور پر، حقیقی سطح کے بیک ٹیسٹ اپنی مرضی کے مطابق ڈیٹا ذرائع، اور کثیر قسم، کثیر مارکیٹ ڈیٹا کلیکشن اور دیگر افعال کی کوشش کریں.


متعلقہ

مزید