Implementar um robô de negociação quantitativa início cronometrado ou parar gadget usando Python

Autora:Lydia., Criado: 2022-12-20 14:35:09, Atualizado: 2023-09-20 10:21:21

img

Implementar um robô de negociação quantitativa início cronometrado ou parar gadget usando Python

Como uma plataforma de negociação quantitativa poderosa, flexível e fácil de usar para toda a rede, a plataforma de negociação quantitativa FMZ tem barreiras muito baixas para uso e o programa de robô ocupa poucos recursos. Por exemplo, o tempo de não abertura representa a grande maioria do dia inteiro ao realizar a negociação quantitativa de futuros de commodities. Desta forma, esperamos que o robô só funcione na hora de abertura e que ele só funcione na hora de abertura todos os dias para economizar dinheiro. Não é emocionante? Para atender a essa exigência, podemos usar a linguagem Python para escrever um robô de estratégia rodando na plataforma de negociação FMZ Quant, e deixar o robô controlar o início e a parada do robô em intervalos regulares através da interface API estendida da plataforma de negociação FMZ Quant.

Se houver necessidade, vamos fazê-lo!

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

Endereço:https://www.fmz.com/api#simpleExemplo

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

  • ReiniciarRobot Reinicie a interface do robô e passe os parâmetros para o robot ID. Utilização específicaidpara ligar:api ('RestartRobot', id)

  • StopRobot Para parar a interface do robô, os parâmetros são também o robôID- Não. RobôID:

img

Para chamar o FMZ Quant Trading Platform extensão API, você precisa usar oAPI KEYda plataforma de negociação quantitativa FMZ. Você pode gerar sua própria API KEY no gerenciamento de contas. Passamos noAPI KEYcomo um parâmetro estratégico. A captura de tela de obter a conta da plataforma de negociação FMZ QuantAPI KEY:

img

O resto é escrever uma lógica de tempo, que também é muito simples.

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

A elipse indica que mais configurações como"175708,14:55:33-15:10:33"pode ser definido. O parâmetro de tempo é uma cadeia de caracteres JSON, que será analisada em uma lista no código de estratégia. A saber:

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

São separados por vírgulas.175708é a identificação do robô, e a parte após a vírgula é a hora de início/parada. No exemplo acima, o robô com ID 175708 começa às 14:55:33 e pára às 15:10:33.

Em seguida, na estratégia, o robô continuará girando. Cada rotação redonda primeiro obterá a hora atual e, em seguida, julgará se deve desencadear o início ou a parada do robô de acordo com a comparação entre a hora atual e a hora de cronometragem. Se for acionado, ligue para a API ('RestartRobot', id) ou API (StopRobot, id) para iniciar e parar o robô.

Código completo da estratégia:

# -*- 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("String configuration error: delimiter,")
        param["id"] = arr[0]
        param["isProcessOpenThisDay"] = False
        param["isProcessCloseThisDay"] = False

        arr = arr[1].split("-")
        if len(arr) != 2:
            raise Exception("String configuration error: delimiter-")

        begin = arr[0]
        arrBegin = begin.split(":")
        if len(arrBegin) != 3:
            raise Exception("String configuration error: start time separator:")
        
        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("String configuration error: end time separator:")            
        
        param["end"] = {}
        param["end"]["hour"] = float(arrEnd[0])
        param["end"]["min"] = float(arrEnd[1])
        param["end"]["sec"] = float(arrEnd[2])
        arrParams.append(param)

    # Test
    Log("Output parameters", 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", "Did you perform a start today", "Did you perform a stop today"],
            "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("Robot ID:", arrParams[i]["id"], "Execution started, please log in to the platform to check if it started successfully", "Extended API return value:", 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("Robot ID:", arrParams[i]["id"], "Execution stopped, please log in to the platform to check if it stopped successfully", "Extended API return value:", ret, strPush)
        
        if nowDay != nowTime.tm_mday:
            nowDay = nowTime.tm_mday

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

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

img

Estratégia em execução:

Capturas de tela:

img img

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

Fim

Como exemplo, a API estendida da FMZ Quant Trading Platform ainda é muito poderosa. O robô de cronometragem é simples em design, ele é para começar no momento e parar no momento. Ele não inclui mecanismos como se a inicialização é bem sucedida, inspeção, repetição de exceção, etc. Se você estiver interessado, você pode adicionar funções e expandí-los. A estratégia é apenas para referência.


Relacionados

Mais.