Type/to search
8
Follow
1364
Followers
Te enseñaré paso a paso cómo transformar la estrategia de un solo producto de Python en una estrategia multiproducto.
Discussions
Created 2020-01-20 17:33:36  Updated 2023-10-17 21:18:46
 14
 4782

img

1. Enseñarle cómo transformar una estrategia de un solo producto de Python en una estrategia de múltiples productos.

En el artículo anterior se implementó una estrategia de Python muy simple:「Versión Python de la estrategia de perseguir al alza y vender a la baja」Esta estrategia permite operar una cuenta para realizar operaciones programadas en un determinado par de divisas. El principio es muy simple: perseguir las subidas y vender las bajadas. A veces queremos utilizar la misma lógica comercial para operar diferentes pares comerciales. Puede crear varios robots y configurar diferentes pares comerciales para operar con varias monedas. Si la estrategia no es muy complicada, dada la poderosa flexibilidad de la plataforma de comercio cuantitativo del inventor. Es muy fácil transformar una estrategia en una estrategia multiproducto, de modo que puedas ejecutar múltiples pares comerciales simplemente creando un robot.

El código fuente de la estrategia transformada:

'''backtest start: 2019-02-20 00:00:00 end: 2020-01-10 00:00:00 period: 1m exchanges: [{"eid":"OKEX","currency":"BTC_USDT"},{"eid":"OKEX","currency":"ETH_USDT","stocks":30},{"eid":"OKEX","currency":"LTC_USDT","stocks":100}] ''' import time import json params = { "arrBasePrice": [-1, -1, -1], # -1 "arrRatio": [0.05, 0.05, 0.05], # 0.05 "arrAcc": [], # _C(exchange.GetAccount) "arrLastCancelAll": [0, 0, 0], # 0 "arrMinStocks": [0.01, 0.01, 0.01], # 0.01 "arrPricePrecision": [2, 2, 2], # 2 "arrAmountPrecision": [3, 2, 2], # 2 "arrTick":[] } def CancelAll(e): while True : orders = _C(e.GetOrders) for i in range(len(orders)) : e.CancelOrder(orders[i]["Id"], orders[i]) if len(orders) == 0 : break Sleep(1000) def process(e, index): global params ticker = _C(e.GetTicker) params["arrTick"][index] = ticker if params["arrBasePrice"][index] == -1 : params["arrBasePrice"][index] = ticker.Last if ticker.Last - params["arrBasePrice"][index] > 0 and (ticker.Last - params["arrBasePrice"][index]) / params["arrBasePrice"][index] > params["arrRatio"][index]: params["arrAcc"][index] = _C(e.GetAccount) if params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last > params["arrMinStocks"][index]: e.Buy(ticker.Last, params["arrAcc"][index].Balance * params["arrRatio"][index] / ticker.Last) params["arrBasePrice"][index] = ticker.Last if ticker.Last - params["arrBasePrice"][index] < 0 and (params["arrBasePrice"][index] - ticker.Last) / params["arrBasePrice"][index] > params["arrRatio"][index]: params["arrAcc"][index] = _C(e.GetAccount) if params["arrAcc"][index].Stocks * params["arrRatio"][index] > params["arrMinStocks"][index]: e.Sell(ticker.Last, params["arrAcc"][index].Stocks * params["arrRatio"][index]) params["arrBasePrice"][index] = ticker.Last ts = time.time() if ts - params["arrLastCancelAll"][index] > 60 * 5 : CancelAll(e) params["arrLastCancelAll"][index] = ts def main(): global params for i in range(len(exchanges)) : params["arrAcc"].append(_C(exchanges[i].GetAccount)) params["arrTick"].append(_C(exchanges[i].GetTicker)) exchanges[i].SetPrecision(params["arrPricePrecision"][i], params["arrAmountPrecision"][i]) for key in params : if len(params[key]) < len(exchanges): raise "params error!" while True: tblAcc = { "type" : "table", "title": "account", "cols": ["账户信息"], "rows": [] } tblTick = { "type" : "table", "title": "ticker", "cols": ["行情信息"], "rows": [] } for i in range(len(exchanges)): process(exchanges[i], i) for i in range(len(exchanges)): tblAcc["rows"].append([json.dumps(params["arrAcc"][i])]) tblTick["rows"].append([json.dumps(params["arrTick"][i])]) LogStatus(_D(), "\n`" + json.dumps([tblAcc, tblTick]) + "`") Sleep(500)

2. Encuentra la diferencia

¿Compara el código y descubre que es muy diferente del código del artículo anterior?
De hecho, la lógica de negociación es exactamente la misma, sin cambios. Es solo que hemos cambiado la estrategia a múltiples variedades, por lo que no podemos usar la forma anterior de "variable única como parámetro de estrategia". Una solución más razonable es Para crear el parámetro Array, el índice de cada posición en el array corresponde al par comercial agregado.

img

Luego encapsule el código de lógica de transacción en una funciónprocessEn el bucle principal de la estrategia, esta función se llama iterativamente de acuerdo con los pares comerciales agregados, de modo que el código de lógica comercial se ejecuta una vez para cada par comercial.

  • Llamada de iteración (recorrido):

    for i in range(len(exchanges)): process(exchanges[i], i)
  • Parámetros de la estrategia:

    params = { "arrBasePrice": [-1, -1, -1], # -1 "arrRatio": [0.05, 0.05, 0.05], # 0.05 "arrAcc": [], # _C(exchange.GetAccount) "arrLastCancelAll": [0, 0, 0], # 0 "arrMinStocks": [0.01, 0.01, 0.01], # 0.01 "arrPricePrecision": [2, 2, 2], # 2 "arrAmountPrecision": [3, 2, 2], # 2 "arrTick":[] }

    Este diseño permite que cada par comercial tenga sus propios parámetros, porque los precios de cada par comercial pueden variar mucho y los parámetros también pueden diferir, por lo que a veces se requieren configuraciones diferenciadas.

  • Función CancelarTodo

    Puede comparar los cambios de esta función. Esta función simplemente modifica un poco de código y luego piensa en la intención de esta modificación.

  • Datos del gráfico de la barra de estado

    Se agregaron gráficos para mostrar datos de mercado y datos de activos de la cuenta en la barra de estado, de modo que los activos y datos de mercado correspondientes a cada objeto de intercambio se puedan mostrar en tiempo real.

Después de dominar las ideas de diseño anteriores, ¿no es muy fácil modificar una estrategia de Python para convertirla en una estrategia multivariante?

3. Pruebas retrospectivas

img

img

img

La estrategia es solo de referencia, para realizar pruebas retrospectivas y pruebas. Si te interesa, puedes optimizarla y actualizarla.
Dirección de la política

Related Recommendations
Comment
All comments (14)

    孟总,请问为什么,你这个策略下单不用设置exchange.SetDirection("buy")方向,还有个e. 不是exchange.吗,我最近在学习策略

    4 years ago

    这个策略最低本金是多少啊

    6 years ago

    没有实盘过,该策略为教学策略,学习为主,可以自行修改、扩展、优化跑实盘。

    6 years ago

    怎么不交易啊,半天没有反应。。。。。

    6 years ago

    好了,好了,弄好了,我弄成币本位了,怪不得呢

    6 years ago

    img 现在好了,但是我账户里是有钱的,你这个策略最少本金要投入多少啊,是不是我账户里的钱不够

    6 years ago

    可以具体看下这个策略源码, 策略公开的,策略逻辑很简单就是追涨杀跌。注意,这个是个数字货币现货策略,不能跑期货,可以自己修改成期货的。

    6 years ago

    img 是添加的托管者IP啊,没错啊

    6 years ago

    GetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"}
    IP我也添加到API里面了,怎么还是出错

    6 years ago

    申请API KEY 的时候,设置的IP地址是允许访问的白名单地址,你设置了以后,就只有这个IP地址可以使用你的API KEY访问API接口。你设置的是你的托管者的IP地址么?

    6 years ago

    img 这个怎么解决

    6 years ago

    托管者所在服务器安装一下python。

    6 years ago

    机器人K线周期设置多少

    6 years ago

    这个策略不看K线的, 随便设置都行,回测的话因为影响tick粒度,设置为1分钟。

    6 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)