La mano a la mano te enseña cómo envuelven una política de Python en un archivo barato

El autor:Un sueño pequeño., Creado: 2020-06-30 10:48:18, Actualizado: 2023-10-08 19:48:02

img

La mano a la mano te enseña cómo envuelven una política de Python en un archivo barato

En este artículo se hablan de dos soluciones, la otra es más sencilla (recomendada) al final del artículo.

Muchos desarrolladores que escriben políticas en Python desean mantener el archivo de código de la política localmente, por preocupación por la seguridad de la política.FMZ APIUn proyecto propuesto en el documento:

Seguridad estratégica En la plataforma de negociación cuantificada de inventores, las políticas son visibles solo para los titulares de cuentas cuantificadas de inventores. Y en la plataforma de negociación cuantificada de inventores, se puede localizar completamente el código de la política, por ejemplo, envuelviéndola en un paquete de Python y cargándola en el código de la política, lo que permite la localización de la política.https://www.fmz.com/api#策略安全性

En realidad, esa preocupación es innecesaria, pero una solución como esta ofrece un ejemplo completo de implementación.

Envuelve una estrategia

Así que buscamos una simple estrategia de Python para hacer una demostración, usando los clásicos.Dual ThrustLa estrategia, la dirección de la estrategia:https://www.fmz.com/strategy/21856Nos esforzamos por no modificar ningún código de la parte de la política, empaquetamos la política en un documento que puede ser llamado por el código de la política en la plataforma FMZ, y los resultados de ejecución son perfectamente coherentes con la ejecución directa de la política. El mayor problema con el envase es que los objetos globales, funciones globales, valores de las variables a los que se llama el código de la política en la plataforma FMZ no son accesibles en el documento que empaquetamos, por lo que tenemos que encontrar una manera de pasar estos objetos, funciones, variables y constantes al documento envuelto.

  • ReproducciónEl futuro de OKCoin en PythonEl código de la política se pega en el archivo local de Python, llamado testA.

    img

    Pegar en el archivo testA abierto en el editor local.

    img

  • Añadimos un poco de código para mantener la parte original del código de la política de copiar y pegar.

    # 函数、对象
    exchanges = None
    exchange = None
    Log = None
    Sleep = None
    TA = None
    Chart = None
    LogProfitReset = None
    LogStatus = None
    _N = None
    _C = None 
    LogProfit = None  
    
    
    # 策略参数
    ContractTypeIdx = None
    MarginLevelIdx = None
    NPeriod = None
    Ks = None
    Kx = None
    AmountOP = None
    Interval = None
    LoopInterval = None
    PeriodShow = None  
    
    # 常量
    ORDER_STATE_PENDING = 0
    ORDER_STATE_CLOSED = 1
    ORDER_STATE_CANCELED = 2
    ORDER_STATE_UNKNOWN = 3
    ORDER_TYPE_BUY = 0 
    ORDER_TYPE_SELL = 1
    PD_LONG = 0
    PD_SHORT = 1  
    
    
    def SetExchanges(es):
        global exchanges, exchange
        exchanges = es
        exchange = es[0]  
    
    def SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit):
        global Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit
        Log = pLog
        Sleep = pSleep
        TA = pTA
        Chart = pChart
        LogStatus = pLogStatus
        LogProfitReset = pLogProfitReset
        _N = p_N
        _C = p_C
        LogProfit = pLogProfit  
    
    def SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow):
        global ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow
        ContractTypeIdx = pContractTypeIdx
        MarginLevelIdx = pMarginLevelIdx
        NPeriod = pNPeriod
        Ks = pKs
        Kx = pKx
        AmountOP = pAmountOP
        Interval = pInterval
        LoopInterval = pLoopInterval
        PeriodShow = pPeriodShow
    

    La función principal del código anterior es declarar las funciones globales o variables utilizadas en el documento actual; y luego reservar la interfaz para importar estas funciones.SetExchangesSetParamsSetFuncLa política en la plataforma FMZ es llamar a estas funciones y pasar algunas de las funciones usadas, objetos, etc.

Estrategia de inicio en la plataforma FMZ

La estrategia de inicio es muy sencilla:

img

En la plataforma FMZ, sólo hay unas cuantas líneas de código, y hay que tener en cuenta que el parámetro de esta política de inicio es la política que queremos envuelven.El futuro de OKCoin en PythonLo mismo, en realidad, se puede copiar directamente la estrategia "Python versión Dual Thrust OKCoin futuros" y luego limpiar el código de la estrategia y pegarla en el botón de inicio.

import sys
# 这里我写的是自己放置testA文件的路径,具体我替换为xxx了,简单说就是设置自己的testA文件路径就可以了
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA

def main():
    # 传递交易所对象
    testA.SetExchanges(exchanges)
    # 传递全局函数 SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
    testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
    # 传递策略参数 SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
    testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
    # 执行封装的testA文件中的策略主函数
    testA.main()

De esta manera, podemos envolver el sujeto de la lógica de la política en el archivo testA y colocarlo localmente en el dispositivo donde se encuentra el administrador, en la plataforma FMZ, con solo guardar una política de inicio, el bot que crea esta política de inicio puede cargar directamente nuestro archivo local y ejecutarlo localmente en el administrador.

Las pruebas de contraste

  • Localización del archivo testA

    img

  • La política original, re-testada en el servidor público

    img

Hay otra forma más sencilla.

En el caso de los archivos, los archivos se pueden descargar directamente en el ejecutivo. Esta vez, preparamos un testB que incluye el código de la política "Python version Dual Thrust OKCoin futures".

import time
class Error_noSupport(BaseException):
    def __init__(self):
        Log("只支持OKCoin期货!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("启动时有期货持仓! #FF0000")

ChartCfg = {
    '__isStock': True,
    'title': {
        'text': 'Dual Thrust 上下轨图'
    },
    'yAxis': {

...

Si la estrategia es demasiado larga, se omite y no hay necesidad de cambiar el código de la estrategia. A continuación, preparamos el "Python Dual Thrust OKCoin Futures", que es nuestra estrategia en la plataforma FMZ: crear un robot, cargar directamente el testB y ejecutarlo directamente. Tenga en cuenta que la estrategia de inicio debe tener la misma configuración de parámetros de estrategia que la versión original de Python Dual Thrust OKCoin Futures ("parámetros de interfaz de estrategia").

img

if __name__ == '__main__':
    Log("run...")
    try:
        # 文件路径做了处理,可以写入自己testB文件放置的实际路径
        f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
        code = f.read()
        exec(code)
    except Exception as e:
        Log(e)

Hacer un retrospecto:img

Los resultados de las pruebas de repetición coinciden con las pruebas anteriores.

Obviamente, el segundo método es más sencillo y se recomienda usarlo, y si hay un mejor método, bienvenido al mensaje de Dios.


Relacionados

Más.

¿Qué es esto?Me inspiró pensar que había muchas más cosas que se podían hacer con selenio.

¿Qué es esto?Aprendiendo

Un sueño pequeño.Ha ha, ¿hay alguna idea que podamos discutir juntos?