O artigo anterior mostra uma estratégia Python muito simples:"Estratégias de caça e queda em Python"A estratégia é muito simples, é simples, é simples. Às vezes, queremos usar a mesma lógica de negociação para operar pares de transações diferentes. É possível criar vários robôs, configurando diferentes pares de transações, para negociar em várias moedas.
O código-fonte da estratégia foi alterado:
'''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)
Em comparação com o código, será que o código encontrado é muito diferente do código do artigo anterior? Na verdade, a lógica de transação é exatamente a mesma, sem nenhuma alteração, apenas modificamos a estratégia em várias variedades, não podemos usar a variável única anterior como um parâmetro de estratégia. Uma solução mais razoável é fazer os parâmetros em conjuntos, onde o índice de cada posição da matriz corresponde ao par de transações adicionadas.
Então, vamos envolver essa parte do código da lógica de transação numa função.process
No ciclo principal da estratégia, a função é chamada de modo a que cada par de transações execute um código lógico de transação baseado no par de transações adicionado.
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":[]
}
Assim, cada par de transações pode ter seus próprios parâmetros, pois cada par de transações pode ter uma grande diferença de preços possíveis, pode ser diferente em parâmetros e, às vezes, precisa de um ajuste de diferenciação.
A função é apenas uma modificação de um pouco de código, e depois pensar sobre a intenção de tal modificação.
Adicionou-se um gráfico que mostra dados de mercado e dados de ativos de conta no painel de status, mostrando os ativos e mercados correspondentes a cada objeto de troca em tempo real.
Com todas essas ideias de design, não é fácil modificar uma estratégia Python para várias variedades?
A estratégia é apenas para aprendizagem de referência, testes de retrospectiva, interessados em otimizar a atualização.Endereço estratégico
BBBwwed2009Meng, por favor, por que você está usando essa política sem definir a direção de exchange.Set (("buy")), e um e. Não é exchange.
O Grande Cavalo NegroQual é o capital mínimo para esta estratégia?
O Grande Cavalo NegroComo não negociar, não há resposta há meio dia.
O Grande Cavalo NegroMuito bem, muito bem, resolvi.
O Grande Cavalo Negro/upload/asset/164f3fe6e84331d800583.png Tudo bem agora, mas eu tenho dinheiro na minha conta, qual é o mínimo de capital que você deve investir na sua estratégia?
O Grande Cavalo Negro/upload/asset/16495fcb1185338f8af27.png é o IP do administrador adicionado
O Grande Cavalo NegroGetAccount: 400: {"error_message":"Invalid IP","code":30011,"error_code":"30011","message":"Invalid IP"} Eu também adicionei a API, mas foi um erro.
O Grande Cavalo Negro/upload/asset/164330beccf32fc55e7b6.png Como resolver isso?
O Grande Cavalo NegroQuantos ciclos de linha K do robô?
Inventor quantificado - sonho pequenoA estratégia é uma estratégia de ensino, baseada na aprendizagem, que pode ser modificada, ampliada e otimizada.
Inventor quantificado - sonho pequenoO código fonte da estratégia é aberto e a lógica estratégica é simples: perseguir e derrotar. Observe que esta é uma estratégia de moeda digital em contato, não pode ser executada com futuros, pode ser modificada em futuros.
Inventor quantificado - sonho pequenoQuando você solicita o API KEY, o IP que você define é o endereço de lista branca para acesso permitido, e depois que você o define, apenas esse endereço IP pode ser usado para acessar a interface API com seu API KEY. Você define o IP do seu administrador?
Inventor quantificado - sonho pequenoO servidor onde o administrador está instalado é o Python.
Inventor quantificado - sonho pequenoEsta política não se aplica à linha K, mas pode ser executada em qualquer configuração. O tempo de reinicialização é de 1 minuto, pois afeta o tamanho do tick.