Le enseño a encapsular una estrategia de Python en un archivo local

El autor:La bondad, Creado: 2020-07-09 10:21:31, Actualizado: 2023-10-28 15:28:00

img

Muchos desarrolladores que escriben estrategias en Python quieren poner los archivos de código de estrategia localmente, preocupándose por la seguridad de la estrategia.

Seguridad estratégica

La estrategia se desarrolla en la plataforma FMZ, y la estrategia solo es visible para los titulares de cuentas FMZ. Y en la plataforma FMZ, el código de la estrategia puede localizarse completamente, por ejemplo, la estrategia se encapsula en un paquete Python y se carga en el código de la estrategia, de modo que se realice la localización de la estrategia.

Para obtener más información, visite:https://www.fmz.com/api

De hecho, este tipo de preocupación no es necesaria, pero dado que existen tales necesidades, proporcionaremos un ejemplo completo de aplicación.

Encapsular una estrategia

Vamos a encontrar una estrategia Python simple para la demostración, utilizando el clásicoDual ThrustDirección de la estrategia:https://www.fmz.com/strategy/21856Nos esforzamos por no cambiar ninguna parte del código de estrategia, encapsular la estrategia en un archivo que puede ser llamado por el código de estrategia en la plataforma FMZ, y el resultado de ejecución es exactamente el mismo que ejecutar la estrategia directamente. El mayor problema con la encapsulación es que los objetos globales, funciones globales y valores constantes llamados por el código de estrategia en la plataforma FMZ no se pueden acceder en los archivos que encapsulamos, por lo que debemos encontrar una manera de pasar estos objetos, funciones, variables y constantes al archivo encapsulado. hagámoslo paso a paso.

img

Pegar en el archivotestAabierto por el editor local.

img

Añadir un poco de código, y mantener la parte de código de la estrategia copiado y pegado intacto

# Function, object
exchanges = None
exchange = None
Log = None
Sleep = None
TA = None
Chart = None
LogProfitReset = None
LogStatus = None
_N = None
_C = None 
LogProfit = None  


# Strategy parameters
ContractTypeIdx = None
MarginLevelIdx = None
NPeriod = None
Ks = None
Kx = None
AmountOP = None
Interval = None
LoopInterval = None
PeriodShow = None  

# constant
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 y variables utilizadas en el archivo actual.SetExchanges, SetParams, SetFuncLas estrategias en la plataforma FMZ llaman a estas funciones y pasan algunas funciones y objetos usados.

Estrategia de puesta en marcha en la plataforma FMZ

La estrategia de inicio es muy simple, como sigue:

img

Hay sólo unas pocas líneas de código escritas en la plataforma FMZ.Versión Python del código de la estrategia de futuros OKCoin Dual ThrustDe hecho, se puede copiar directamenteVersión Python del código de la estrategia de futuros OKCoin Dual ThrustEstrategia, entonces limpia el código de estrategia, pegalo.

import sys
# Here I wrote the path where I put the testA file myself. I replaced it with xxx. To put it simply, I set the path of my testA file.
sys.path.append("/Users/xxx/Desktop/pythonPlayground/")
import testA

def main():
    # Passing Exchange Object
    testA.SetExchanges(exchanges)
    # Pass global function SetFunc(pLog, pSleep, pTA, pChart, pLogStatus, pLogProfitReset, p_N, p_C, pLogProfit)
    testA.SetFunc(Log, Sleep, TA, Chart, LogStatus, LogProfitReset, _N, _C, LogProfit)
    # Passing strategy parameters SetParams(pContractTypeIdx, pMarginLevelIdx, pNPeriod, pKs, pKx, pAmountOP, pInterval, pLoopInterval, pPeriodShow)
    testA.SetParams(ContractTypeIdx, MarginLevelIdx, NPeriod, Ks, Kx, AmountOP, Interval, LoopInterval, PeriodShow)
    # Execute the main strategy function in the encapsulated testA file
    testA.main()

De esta manera, resumimos el cuerpo principal de la lógica estratégica en eltestAEn la plataforma FMZ, solo necesitamos guardar una estrategia de inicio. El robot que crea esta estrategia de inicio puede cargar directamente nuestro archivo local y ejecutarlo localmente.

Comparación de pruebas de retroceso

  • CargatestAarchivo local para backtest

img

  • Estrategia original, backtesting en el servidor público

img

Otra forma más sencilla

Cargue el archivo directamente para su ejecución. Esta vez preparamos unatestBarchivo con el código para elVersión Python del código de la estrategia de futuros OKCoin Dual Thrust strategy.

import time
class Error_noSupport(BaseException):
    def __init__(self):
        Log("Only OKCoin futures are supported!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("There is a futures position at startup!#FF0000")

ChartCfg = {
    '__isStock': True,
    'title': {
        'text': 'Dual Thrust Top and bottom rail map'
    },
    'yAxis': {

...

Si la estrategia es demasiado larga, se omite y no es necesario cambiar el código de estrategia.

Entonces prepárate.Versión Python del código de la estrategia de futuros OKCoin Dual Thrust(inicio de la estrategia, ejecución directatestBarchivo), que es nuestra estrategia en la plataforma FMZ, crear un robot, cargar directamente eltestBSe debe tener en cuenta que la estrategia de inicio también debe tener exactamente las mismas configuraciones de parámetros de estrategia (parámetros de interfaz de estrategia) que la versión original deVersión Python del código de la estrategia de futuros OKCoin Dual Thrust.

img

if __name__ == '__main__':
    Log("run...")
    try:
        # The file path is processed, you can write the actual path of your testB file
        f = open("/Users/xxx/Desktop/pythonPlayground/testB.py", "r")
        code = f.read()
        exec(code)
    except Exception as e:
        Log(e)

Realice una prueba de retroceso:

img

El resultado del backtest es consistente con el anterior.

Obviamente, el segundo método anterior es más simple, se recomienda utilizarlo.


Más.