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 API
Un 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.
Así que buscamos una simple estrategia de Python para hacer una demostración, usando los clásicos.Dual Thrust
La 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.
Pegar en el archivo testA abierto en el editor local.
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.SetExchanges
,SetParams
,SetFunc
La política en la plataforma FMZ es llamar a estas funciones y pasar algunas de las funciones usadas, objetos, etc.
La estrategia de inicio es muy sencilla:
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.
Localización del archivo testA
La política original, re-testada en el servidor público
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").
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:
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.
¿Qué es esto?Me inspiró pensar que había muchas más cosas que se podían hacer con selenio.
¿Qué es esto?Aprendiendo
Los inventores cuantifican - sueños pequeñosHa ha, ¿hay alguna idea que podamos discutir juntos?