A estratégia de grade e a estratégia de Martingale, que gosta de oscilar as cotações do mercado, têm desvantagens inerentes, e estratégias semelhantes foram testadas no mercado de contratos ETH por um período de tempo.FMZ.COMHá uma coisa que eu realmente concordo com um amigo sobre este tipo de estratégia. que é fazer contratos no círculo de moeda, e o risco de fazer longo é menor do que fazer curto. ou simplesmente falando, a pior queda é voltar a zero, mas o aumento é infinito.
Então, estratégias como Martingale e Grid só fazem longo, mas não curto? É melhor espalhar o risco de pesca de fundo em uma longa distância do que fazer bilateral? Esta ideia soa muito bem, mas ninguém sabe se pode resistir ao combate real. Mas pelo menos podemos simplesmente backtest esta ideia. Portanto, temos o tópico do artigo de hoje - Projetar uma estratégia de pesca de fundo de contrato.
O código para implementar essa ideia é muito simples, graças à flexibilidade, encapsulamento de interface e poderoso sistema de backtest da plataforma FMZ, etc. O código inteiro é de apenas 60 linhas (para as especificações de escrita de código, muitas linhas que podem ser abreviadas, não são abreviadas).
O projeto da ideia da estratégia é muito simples. De acordo com o preço inicial no início da lógica, coloque uma ordem de compra, se a distância do intervalo estiver diminuindo. Se o preço continuar a diminuir, continue a colocar uma ordem de compra e mantenha a pesca de fundo. Em seguida, espere a ordem de posição fechada após o preço da posição adicionando um certo spread de lucro e espere para fechar. Se a posição for fechada, a lógica acima é repetida com o preço atual como o preço inicial. A estratégia não é curta, apenas longa.
Código fonte da estratégia:
function cancelAll() {
while (true) {
var orders = _C(exchange.GetOrders)
if (orders.length == 0) {
break
}
for (var i = 0 ; i < orders.length ; i++) {
exchange.CancelOrder(orders[i].Id, orders[i])
Sleep(interval)
}
}
}
function getLong(arr, kind) {
var ret = null
for (var i = 0 ; i < arr.length ; i++) {
if (arr[i].Type == (kind == "pos" ? PD_LONG : ORDER_TYPE_BUY)) {
ret = arr[i]
}
}
return ret
}
function pendingBidOrders(firstPrice) {
var index = 0
var amount = baseAmount
while (true) {
var pos = _C(exchange.GetPosition)
var price = firstPrice - index * baseSpacing
amount *= ratio
index++
exchange.SetDirection("buy")
exchange.Buy(price, amount)
if (pos.length != 0) {
var longPos = getLong(pos, "pos")
if (longPos) {
exchange.SetDirection("closebuy")
exchange.Sell(longPos.Price + profitTarget, longPos.Amount)
}
}
while (true) {
Sleep(interval)
if (!getLong(_C(exchange.GetOrders), "orders")) {
cancelAll()
break
}
if (!getLong(_C(exchange.GetPosition), "pos")) {
cancelAll()
return
}
}
}
}
function main() {
exchange.SetContractType(symbol)
while (true) {
pendingBidOrders(_C(exchange.GetTicker).Last)
}
}
O desenho dos parâmetros é também muito simples:
Há apenas vários parâmetros.
Configure o intervalo de tempo de backtest aleatoriamente:
Teste de retrocesso:
Parece uma estratégia de tipo grade ou Martingale. Os novos alunos que estão apenas começando têm muito medo deste tipo de estratégias longas e são facilmente persuadidos a desistir? Uma introdução de estratégia breve e concisa é mais adequada, e é mais fácil digerir ideias de estratégia e aprender o design lógico.
Os códigos de estratégia acima são utilizados apenas para estudo e investigação.