En el último artículo, implementamos una estrategia muy simple en Python:"Estrategia de persecución y caída en Python"La estrategia es muy sencilla, es decir, la búsqueda de la caída y la caída. A veces queremos usar la misma lógica de negociación para operar diferentes pares de operaciones. Se pueden crear varios robots y configurar diferentes pares de operaciones para realizar operaciones en diferentes monedas. Si la estrategia no es muy compleja, dada la gran flexibilidad de la plataforma de negociación cuantificada por los inventores.
El código fuente de la estrategia después de la modificación:
'''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)
En el caso de la aplicación, el código es diferente al del artículo anterior. En realidad, la lógica de transacción es exactamente la misma, sin ningún cambio, solo que modificamos la estrategia en varias variedades, no podemos usar las variables individuales de la columna anterior como parámetros de la estrategia. Una solución más razonable es hacer los parámetros en conjuntos, los índices de cada posición de la matriz corresponden a las transacciones agregadas.
Y luego envuelvo esta parte del código de la lógica de transacción en una función.process
En el ciclo principal de la estrategia, la función se invoca iterativamente según el par de transacciones añadido, haciendo que cada par de transacciones ejecute un código lógico de transacción.
for i in range(len(exchanges)):
process(exchanges[i], i)
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 de transacciones tenga sus propios parámetros, ya que cada transacción tiene una gran diferencia en los precios posibles, que también pueden diferir en parámetros, y a veces se requiere un ajuste de diferenciación.
Se puede comparar con la variación de esta función. La función simplemente modifica un poco el código y luego piensa en la intención de la modificación.
Se ha añadido un gráfico que muestra los datos de mercado y los datos de activos de la cuenta en la barra de estado, mostrando en tiempo real los activos y mercados correspondientes a cada objeto de intercambio.
¿No es tan sencillo, con todas estas ideas de diseño, cambiar una estrategia de Python en varias variedades?
Las estrategias son solo para aprendizaje de referencia, pruebas de retrospección y interés para optimizar la actualización.Dirección estratégica
Se casó en 2009Meng, por favor, por qué no tienes que configurar la dirección de exchange.SetDirection para esta política, y también una dirección de e. no de exchange.
El gran caballo negro del círculo monetario¿Cuál es el capital mínimo de esta estrategia?
El gran caballo negro del círculo monetario¿Por qué no negociar, no hay respuesta durante medio día?
El gran caballo negro del círculo monetarioBien, bien, bien, bien, lo hice, lo hice en moneda propia, no me extraña.
El gran caballo negro del círculo monetario/upload/asset/164f3fe6e84331d800583.png Ahora está bien, pero tengo dinero en mi cuenta, ¿cuánto debe invertir mi estrategia de capital mínimo, no hay suficiente dinero en mi cuenta?
El gran caballo negro del círculo monetario/upload/asset/16495fcb1185338f8af27.png es el IP del administrador que se ha añadido.
El gran caballo negro del círculo monetarioGetAccount: 400: {"error_message": Invalid IP","code":30011, "error_code": 30011","message:"Invalid IP"} El código de acceso es el siguiente: IP también lo he añadido a la API, pero de alguna manera está mal.
El gran caballo negro del círculo monetario/upload/asset/164330beccf32fc55e7b6.png ¿Cómo se resuelve esto?
El gran caballo negro del círculo monetario¿Cuántos ciclos de la línea K de un robot?
Los inventores cuantifican - sueños pequeñosLa estrategia es una estrategia de enseñanza, de aprendizaje, y puede ser modificada, ampliada y optimizada por sí misma.
Los inventores cuantifican - sueños pequeñosLa estrategia es abierta, la lógica estratégica es simple: perseguir y caer. Tenga en cuenta que esta es una estrategia de efectivo de moneda digital, no puede ejecutar futuros, puede modificarse a futuros.
Los inventores cuantifican - sueños pequeñosCuando se solicita la API KEY, la dirección IP que se establece es la dirección de la lista blanca a la que se permite el acceso, y una vez que se establece, solo esta dirección IP puede utilizarse para acceder a la API KEY. ¿Estabas configurando la dirección IP de tu administrador?
Los inventores cuantifican - sueños pequeñosEn el servidor donde el administrador está instalado, instale Python.
Los inventores cuantifican - sueños pequeñosEsta política no tiene que ver con la línea K, la configuración es arbitraria, la palabra de repetición se establece en 1 minuto debido a que afecta a la granulometría de las ticks.