avatar of 发明者量化-小小梦 发明者量化-小小梦
focar em Mensagem privada
4
focar em
1271
Seguidores

Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Criado em: 2020-02-14 21:56:58, atualizado em: 2023-10-10 21:13:38
comments   4
hits   3047

Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Como uma plataforma de negociação quantitativa poderosa, flexível e fácil de usar em toda a rede, a Plataforma de Negociação Quantitativa Inventor tem um limite de uso muito baixo e o programa do robô consome muito poucos recursos. Mas ainda esperamos que o robô possa ser ligado quando precisar funcionar e parado quando não precisar. Por exemplo, ao fazer negociações programadas e quantitativas de futuros de commodities, o horário de abertura fora do mercado representa a grande maioria do dia. Dessa forma, esperamos muito deixar o robô rodar somente durante o horário de abertura do mercado. É emocionante pensar em quanto custo pode ser economizado ao rodá-lo somente durante o horário de abertura do mercado todos os dias. Para atender a esse requisito, podemos usar Python para escrever um robô de estratégia que seja executado na plataforma de negociação quantitativa FMZ. A interface API estendida da plataforma de negociação quantitativa do inventor controla o início e a parada do robô em um horário fixo.

Quando houver demanda, faça!

Na verdade, todo o código é muito simples. O exemplo de chamar a interface API estendida da plataforma de negociação quantitativa do inventor pode ser usado diretamente

Endereço: https://www.fmz.com/api#%E7%AE%80%E5%8D%95%E7%9A%84%E4%BE%8B%E5%AD%90

Use a função no exemplo diretamente:def api(method, *args) A interface que precisamos chamar também é muito simples, usando as duas interfaces a seguir (podem ser encontradas no documento FMZ)

  • RestartRobot Reinicie a interface do robô e passe o ID do robô como parâmetro. Use específicoid, você pode chamá-lo assim:api('RestartRobot', id)

  • StopRobot Pare a interface do robô, os parâmetros também são do robôID

robôIDVer, obter, captura de tela: Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Para chamar a API de extensão da plataforma de negociação quantitativa do Inventor, você precisa usar a plataforma de negociação quantitativa do InventorAPI KEY。 Você pode gerar o seu próprio no Gerenciamento de ContasAPI KEY。 Nós colocamosAPI KEYPassado como parâmetro para a estratégia. Obtenha a conta da plataforma de negociação quantitativa InventorAPI KEYcaptura de tela: Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Tudo o que resta é escrever a lógica de temporização, que também é muito simples. Defina os parâmetros de temporização:

["175708,14:55:33-15:10:33", ...]

As reticências indicam que há mais semelhanças"175708,14:55:33-15:10:33"configurações. O parâmetro de tempo é uma string JSON, que é analisada em uma lista no código da política. Cada elemento na lista é um conjunto de configurações de início/parada do robô. Agora mesmo:

"175708,14:55:33-15:10:33"

As vírgulas são usadas para separá-los. A parte antes da vírgula175708é o ID do robô e a parte depois da vírgula é o horário de início/término. No exemplo acima, o robô com ID 175708 foi iniciado às 14:55:33 e parado às 15:10:33.

Em seguida, a estratégia continua a busca, cada vez obtendo primeiro a hora atual e, em seguida, comparando a hora atual com a hora programada para determinar se é necessário acionar o início ou a parada do robô. Se acionado, chame api(‘RestartRobot’, id) ou api(‘StopRobot’, id) para iniciar ou parar o robô.

O código de estratégia completo:

# -*- coding: utf-8 -*-
import time
import json

try:
    import md5
    import urllib2
    from urllib import urlencode
except:
    import hashlib as md5
    import urllib.request as urllib2
    from urllib.parse import urlencode

def api(method, *args):
    d = {
        'version': '1.0',
        'access_key': accessKey,
        'method': method,
        'args': json.dumps(list(args)),
        'nonce': int(time.time() * 1000),
        }

    d['sign'] = md5.md5(('%s|%s|%s|%d|%s' % (d['version'], d['method'], d['args'], d['nonce'], secretKey)).encode('utf-8')).hexdigest()
    return json.loads(urllib2.urlopen('https://www.fmz.com/api/v1', urlencode(d).encode('utf-8')).read().decode('utf-8'))

RobotParams = json.loads(strRobotParams)

def main():
    global RobotParams 
    arrParams = []
    nowDay = 0
    strPush = ""
    if isPushMsg:
        strPush = "@"

    for i in range(len(RobotParams)):
        param = {}
        arr = RobotParams[i].split(",")
        if len(arr) != 2:
            raise Exception("字符串配置错误:分隔符号,")
        param["id"] = arr[0]
        param["isProcessOpenThisDay"] = False
        param["isProcessCloseThisDay"] = False

        arr = arr[1].split("-")
        if len(arr) != 2:
            raise Exception("字符串配置错误:分隔符号-")

        begin = arr[0]
        arrBegin = begin.split(":")
        if len(arrBegin) != 3:
            raise Exception("字符串配置错误:起始时间分隔符号:")
        
        param["begin"] = {}
        param["begin"]["hour"] = float(arrBegin[0])
        param["begin"]["min"] = float(arrBegin[1])
        param["begin"]["sec"] = float(arrBegin[2])

        end = arr[1]
        arrEnd = end.split(":")
        if len(arrEnd) != 3:
            raise Exception("字符串配置错误:结束时间分隔符号:")            
        
        param["end"] = {}
        param["end"]["hour"] = float(arrEnd[0])
        param["end"]["min"] = float(arrEnd[1])
        param["end"]["sec"] = float(arrEnd[2])
        arrParams.append(param)

    # 测试
    Log("输出参数", arrParams, "#FF0000")  

    while True:
        nowTime = time.localtime(time.time())
        nowHour = nowTime.tm_hour 
        nowMin = nowTime.tm_min
        nowSec = nowTime.tm_sec
        
        tbl = {
            "type" : "table", 
            "title" : "msg", 
            "cols" : ["id", "begin", "end", "今天是否执行过启动", "今天是否执行过停止"],
            "rows" : []
        }

        for i in range(len(arrParams)):
            tbl["rows"].append([arrParams[i]["id"], json.dumps(arrParams[i]["begin"]), json.dumps(arrParams[i]["end"]), arrParams[i]["isProcessOpenThisDay"], arrParams[i]["isProcessCloseThisDay"]])
            if nowDay != nowTime.tm_mday:
                arrParams[i]["isProcessOpenThisDay"] = False
                arrParams[i]["isProcessCloseThisDay"] = False

            if arrParams[i]["isProcessOpenThisDay"] == False:
                if nowTime.tm_hour == arrParams[i]["begin"]["hour"] and nowTime.tm_min >= arrParams[i]["begin"]["min"] and nowTime.tm_sec >= arrParams[i]["begin"]["sec"]:
                    ret = api('RestartRobot', int(arrParams[i]["id"]))                    
                    arrParams[i]["isProcessOpenThisDay"] = True
                    Log("机器人ID:", arrParams[i]["id"], "执行启动,请登录平台检查是否启动成功", "扩展API返回值:", ret, strPush)

            if arrParams[i]["isProcessCloseThisDay"] == False:
                if nowTime.tm_hour == arrParams[i]["end"]["hour"] and nowTime.tm_min >= arrParams[i]["end"]["min"] and nowTime.tm_sec >= arrParams[i]["end"]["sec"]:
                    ret = api('StopRobot', int(arrParams[i]["id"]))
                    arrParams[i]["isProcessCloseThisDay"] = True
                    Log("机器人ID:", arrParams[i]["id"], "执行停止,请登录平台检查是否停止成功", "扩展API返回值:", ret, strPush)
        
        if nowDay != nowTime.tm_mday:
            nowDay = nowTime.tm_mday

        LogStatus(_D(), nowTime, "\n`" + json.dumps(tbl) + "`")
        Sleep(500)

Configurações de parâmetros do robô:

Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Operação de estratégia:

captura de tela Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Robôs operados por esta estratégia: Use Python para implementar um robô de negociação quantitativa para iniciar ou parar um gadget

Endereço estratégico: https://www.fmz.com/strategy/184600

Conclusão

Como ponto de partida, a API estendida da plataforma de negociação quantitativa Inventor é muito poderosa. É completamente possível usar essas APIs estendidas para construir sua própria plataforma de negociação quantitativa com base na plataforma FMZ. O design deste robô de cronometragem é relativamente simples. Ele apenas inicia e para quando chega a hora. Ele não inclui nenhum mecanismo como se a inicialização foi bem-sucedida, verificação, nova tentativa anormal, etc. Aqueles que estão interessados ​​podem adicionar funções e expandir isto. A estratégia é apenas para referência de aprendizagem