Руководство показывает вам, как обновить и перепроверять настройки источников данных.

Автор:Маленькие мечты, Создано: 2020-05-07 17:43:54, Обновлено: 2023-10-09 22:47:43

img

Руководство показывает вам, как обновить и перепроверять настройки источников данных.

Предыдущая статьяРука за рукой, чтобы научить вас реализовать сборник данных.Мы вместе реализовали робот-программу, которая собирает рынок, собирает рыночные данные, и что делать дальше? Конечно, для рекурсионной системы, где, опираясь на настраиваемую функцию рекурсионной системы, мы можем напрямую использовать собранные данные как источник рекурсионной системы, чтобы мы могли применить рекурсионную систему к любому рынку, на который мы хотим рекурсионировать исторические данные.

Таким образом, мы можем сделать обновление для "Сборщика рынка", чтобы он мог одновременно предоставлять данные системе обратной связи в качестве собственного источника данных.

Если есть потребность, действуйте!

Подготовьтесь

В отличие от предыдущей статьи, в прошлый раз мы запустили сервис с помощью администраторской программы, работающей на моем локальном компьютере. На этот раз мы сменили среду работы на VPS и использовали сервер Ali Cloud Linux для работы с нашей программой.

  • База данных mongodb

    Как и в предыдущей статье, требуется установка базы данных Mongodb на устройстве, на котором работает программа сборщика данных, и открытие сервиса.

  • Установка Python 3 Программа использует язык python3, обратите внимание, что некоторые библиотеки используются, если нет, то их необходимо установить.

    • пимонго
    • http
    • Urllib
  • Хранитель Изобретатель может управлять квантовой торговой платформой.

Реконструкция "Сборника данных"

Сборщик данныхRecordsCollecter (преподавание)Эта стратегия. Давайте сделаем некоторые изменения: Перед тем, как программа вступит в цикл сбора данных, она использует многоуровневую библиотеку, чтобы одновременно запустить службу, которая используется для прослушивания запросов на данные, отправленных системой квантовой торговой платформы. (Некоторые другие изменения могут быть проигнорированы)

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("自定义数据源服务接收到请求,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

Откройте тест-политику и выполните повторный тест, например, такой же, как этот.

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-часовой линии K на странице обмена wexApp.

img

img

Это позволяет роботам на VPS самостоятельно собирать данные K-линии, а мы можем получать эти данные прямо в системе обратной связи. Кроме того, вы можете продолжать расширяться, например, поддерживая настройки на уровне реального диска, поддерживая многообразие, сбор данных для многих рынков и так далее.

Приветствую комментарии.


Связанные

Больше

ВуньцзяньИ ни один из сервисов, обслуживающих пользовательские источники данных, не получает отпечатки, которые просят отпечатать эти журналы.

ВуньцзяньКогда мы пересматриваем, мы выбираем персонализированные данные, и мы начинаем с выбранных транзакций по данным, которые мы выбираем.

Lcgs006Если собрать данные по валютным парам, которые не предоставлены выше, чтобы рекурсировать некоторые небольшие разновидности валютных пар, такие как DOT_USDT, когда рекурсирование валют не может быть настроено, то как это сделать?

ЗлтмВершина

Теперь и никогдаЕсли вы выбрали настраиваемый источник данных, поддерживает ли он только одну пару транзакций?

Маленькие мечтыДля этого нужно будет запустить на сервере "сборник данных", о котором говорится в этом посте.

ВуньцзяньТеперь, когда вы заполнили адрес источника данных, ниже приведенные данные не показывают никаких новых данных.

Маленькие мечтыПосле использования функции настройки источника данных вам также нужно заполнить адрес службы настройки источника данных в правом элементе управления.

Маленькие мечтыЭтот диск должен работать на сервере с IP-адресом, чтобы получить доступ к системе отслеживания.

Маленькие мечтыВы не поняли, что я имею в виду, я имею в виду, что данные, предоставленные вашим пользовательским источником данных, например, фактически EOS_USDT, но на FMZ вы можете выбрать только BTC_USDT, вы можете взять эти фактические данные EOS_USDT и использовать их в качестве BTC_USDT, предоставляемой FMZ.

Lcgs006Где это нужно заменить, или есть какие-то учебные пособия по этому поводу?

Маленькие мечтыВместо того, чтобы торговать по именам, вы можете использовать только те данные, которые вы собираете.

Маленькие мечтыЭта сервисная программа, предоставляемая источнику данных, может писать несколько различных транзакций на данные, предоставляемые системой обратной связи.