
Analisando uma ideia de negociação não muito confiável - estratégia de negociação de área de linha K, neste artigo discutiremos essa ideia e tentaremos implementar esse script.
A estratégia de área da linha K é uma estratégia de negociação baseada na relação de área entre a linha K do preço e a média móvel. Sua ideia principal é prever a possível tendência dos preços das ações analisando a amplitude e as mudanças nas tendências de preços, bem como a conversão dos sentimentos de compra e venda, para determinar o momento de abertura e saída de posições. Essa estratégia se baseia na área entre o candle e a média móvel, bem como no valor do indicador KDJ, para gerar sinais de negociação longos e curtos.
A área do candlestick se refere ao espaço entre o candlestick de preço e a média móvel, que é calculada subtraindo o valor da média móvel do preço de fechamento de cada barra e depois somando-os. Quando o preço sobe por muito tempo e em grande amplitude, a área da linha K se tornará maior, enquanto em um mercado volátil ou uma reversão após a volatilidade, a área da linha K será menor . De acordo com o princípio de “tudo vai para o extremo oposto”, quanto maior a tendência de alta e quanto maior o tempo, maior a área da linha K correspondente e maior a probabilidade de reversão, assim como uma mola, quanto maior for o tempo for esticado, maior será a força de rebote. Portanto, um limite para a área da linha K é definido. Quando esse limite é atingido, a tendência de preço pode ser concluída e a possibilidade de uma reversão é maior.
Para confirmar ainda mais que a tendência está prestes a se reverter, o indicador KDJ é introduzido para avaliar a conversão do sentimento de compra e venda. As configurações de limite e valor do indicador KDJ desta estratégia podem ser ajustadas de acordo com circunstâncias e necessidades específicas para aumentar a precisão da estratégia.
A vantagem da estratégia de área da linha K é que ela combina a amplitude e as mudanças das tendências de preços, bem como a conversão do sentimento de compra e venda, fornecendo uma estratégia de negociação quantitativa relativamente completa. Suas vantagens incluem:
Embora a estratégia de área de velas tenha certas vantagens, ela também apresenta alguns riscos, incluindo:
Para otimizar a estratégia da área da linha K, as seguintes direções podem ser consideradas:
Calcular a área do castiçal
Sinal para abrir uma posição longa:
(1) A “área da linha K” da tendência descendente atinge o limite, que pode ser estabelecido antes
(2) O valor do indicador KDJ é maior que 80
(1) A “área da linha K” da tendência ascendente atinge o limite, que pode ser estabelecido antes
(2) O valor do indicador KDJ é menor que 20
Implementação de código
// 参数
var maPeriod = 30
var threshold = 50000
var amount = 0.1
// 全局变量
let c = KLineChart({})
let openPrice = 0
let tradeState = "NULL" // NULL BUY SELL
function calculateKLineArea(r, ma) {
var lastCrossUpIndex = null
var lastCrossDownIndex = null
for (var i = r.length - 1 ; i >= 0 ; i--) {
if (ma[i] !== null && r[i].Open < ma[i] && r[i].Close > ma[i]) {
lastCrossUpIndex = i
break
} else if (ma[i] !== null && r[i].Open > ma[i] && r[i].Close < ma[i]) {
lastCrossDownIndex = i
break
}
if (i >= 1 && ma[i] !== null && ma[i - 1] !== null && r[i - 1].Close < ma[i - 1] && r[i].Close > ma[i]) {
lastCrossUpIndex = i
break
} else if (i >= 1 && ma[i] !== null && ma[i - 1] !== null && r[i - 1].Close > ma[i - 1] && r[i].Close < ma[i]) {
lastCrossDownIndex = i
break
}
}
var area = 0
if (lastCrossDownIndex !== null) {
for (var i = r.length - 1 ; i >= lastCrossDownIndex ; i--) {
area -= Math.abs(r[i].Close - ma[i])
}
} else if (lastCrossUpIndex !== null) {
for (var i = r.length - 1 ; i >= lastCrossUpIndex ; i--) {
area += Math.abs(r[i].Close - ma[i])
}
}
return [area, lastCrossUpIndex, lastCrossDownIndex]
}
function onTick() {
var r = _C(exchange.GetRecords)
if (r.length < maPeriod) {
LogStatus(_D(), "K线数量不足")
return
}
var ma = TA.MA(r, maPeriod)
var atr = TA.ATR(r)
var kdj = TA.KDJ(r)
var lineK = kdj[0]
var lineD = kdj[1]
var lineJ = kdj[2]
var areaInfo = calculateKLineArea(r, ma)
var area = _N(areaInfo[0], 0)
var lastCrossUpIndex = areaInfo[1]
var lastCrossDownIndex = areaInfo[2]
r.forEach(function(bar, index) {
c.begin(bar)
c.plotcandle(bar.Open, bar.High, bar.Low, bar.Close, {overlay: true})
let maLine = c.plot(ma[index], "ma", {overlay: true})
let close = c.plot(bar.Close, 'close', {overlay: true})
c.fill(maLine, close, {color: bar.Close > ma[index] ? 'rgba(255, 0, 0, 0.1)' : 'rgba(0, 255, 0, 0.1)'})
if (lastCrossUpIndex !== null) {
c.plotchar(bar.Time, {char: '$:' + area, overlay: true})
} else if (lastCrossDownIndex !== null) {
c.plotchar(bar.Time, {char: '$:' + area, overlay: true})
}
c.plot(lineK[index], "K")
c.plot(lineD[index], "D")
c.plot(lineJ[index], "J")
c.close()
})
if (tradeState == "NULL" && area < -threshold && lineK[lineK.length - 1] > 70) {
// long
let tradeInfo = $.Buy(amount)
if (tradeInfo) {
openPrice = tradeInfo.price
tradeState = "BUY"
}
} else if (tradeState == "NULL" && area > threshold && lineK[lineK.length - 1] < 30) {
// short
let tradeInfo = $.Sell(amount)
if (tradeInfo) {
openPrice = tradeInfo.price
tradeState = "SELL"
}
}
let stopBase = tradeState == "BUY" ? Math.max(openPrice, r[r.length - 2].Close) : Math.min(openPrice, r[r.length - 2].Close)
if (tradeState == "BUY" && r[r.length - 1].Close < stopBase - atr[atr.length - 2]) {
// cover long
let tradeInfo = $.Sell(amount)
if (tradeInfo) {
tradeState = "NULL"
openPrice = 0
}
} else if (tradeState == "SELL" && r[r.length - 1].Close > stopBase + atr[atr.length - 2]) {
// cover short
let tradeInfo = $.Buy(amount)
if (tradeInfo) {
tradeState = "NULL"
openPrice = 0
}
}
LogStatus(_D(), "area:", area, ", lineK[lineK.length - 2]:", lineK[lineK.length - 2])
}
function main() {
if (exchange.GetName().includes("_Futures")) {
throw "not support Futures"
}
while (true) {
onTick()
Sleep(1000)
}
}
A lógica da estratégia é muito simples:
Parâmetros de estratégia
Variáveis globais
Função de Cálculo
Função do loop principal
a. Obtenha os dados mais recentes da linha K e certifique-se de que o número de linhas K não seja menor que maPeriod, caso contrário, registre o status e retorne.
b. Calcule a média móvel ma e o indicador ATR atr, bem como o indicador KDJ.
c. Obtenha as informações da área, o último índice de K-line cruzado para cima e o último índice de K-line cruzado para baixo de areaInfo.
d. Use o objeto c do gráfico de velas para desenhar as linhas de velas e indicadores e preenchê-las com cores diferentes de acordo com a relação entre o preço e a média móvel.
e. Determine o momento de compra e venda com base nas condições:
Se tradeState for “NULL”, a área for menor que -threshold e o valor do candlestick KDJ for maior que 70, uma operação de compra será realizada. Se tradeState for “NULL”, a área for maior que o limite e o valor do candle KDJ for menor que 30, execute uma operação de venda. f. Defina as condições de stop loss e take profit e feche a posição se as condições forem atendidas:
Se estiver em estado de compra, a posição será fechada quando o preço for menor que o preço de fechamento do dia de negociação anterior menos o ATR do dia anterior. Se estiver em estado de venda, a posição será fechada quando o preço for maior que o preço de fechamento do dia de negociação anterior mais o ATR do dia anterior. função principal: Este é o principal ponto de entrada de execução, verificando se o nome da troca contém “_“Futures”, se incluído, lança uma exceção, caso contrário, entra em um loop infinito, executa a função onTick em cada loop e dorme por 1 segundo.
Em geral, essa estratégia se baseia principalmente em gráficos K-line e indicadores técnicos para tomar decisões de compra e venda, enquanto usa estratégias de stop-loss e take-profit para gerenciar riscos. Observe que esta é apenas uma estratégia de exemplo e o uso real precisa ser ajustado e otimizado com base nas condições de mercado e necessidades específicas.
Este modelo foi facilmente implementado usando JavaScript no FMZ.COM sem usar muitas linhas de código. E a representação gráfica da área da linha K é facilmente obtida usando a função KLineChart. A estratégia é projetada para o mercado spot de criptomoedas e usa o modelo “Digital Currency Spot Trading Library”. Colocar ordens usando funções encapsuladas no modelo também é muito simples, fácil de usar e entender.


Selecionei aleatoriamente um período de backtesting. Embora eu não tenha perdido dinheiro, não acumulei lucros continuamente, então o problema de drawdown ainda era bem grande. Deve haver outras direções de otimização e espaço para essa estratégia. Os interessados podem tentar melhorar essa estratégia.

Por meio dessa estratégia, além de aprender uma ideia de negociação mais alternativa, também aprendemos a desenhar gráficos; representar a área delimitada pela linha K e pela média móvel; desenhar o indicador KDJ, etc.
A estratégia de área K-line é uma estratégia de negociação baseada na amplitude da tendência de preço e no indicador KDJ. Ela ajuda os traders a prever tendências de mercado analisando a área entre a K-line e a média móvel e a conversão do sentimento de compra e venda. Embora existam certos riscos, por meio de otimização e ajuste contínuos, essa estratégia pode fornecer uma ferramenta de negociação poderosa para ajudar os traders a lidar melhor com as flutuações do mercado. É importante que os traders ajustem com flexibilidade os parâmetros e regras de suas estratégias de acordo com a situação específica e as condições de mercado para obter melhor desempenho de negociação.