
En examinant une idée de trading pas très fiable - la stratégie de trading de la zone K-line, dans cet article, nous discuterons de cette idée et essaierons de mettre en œuvre ce script.
La stratégie de zone K-line est une stratégie de trading basée sur la relation de zone entre la ligne K du prix et la moyenne mobile. Son idée principale est de prédire l’évolution possible des cours des actions en analysant l’amplitude et les changements des tendances des prix, ainsi que la conversion des sentiments d’achat et de vente, afin de déterminer le moment d’ouverture et de sortie des positions. Cette stratégie s’appuie sur la zone entre le chandelier et la moyenne mobile, ainsi que sur la valeur de l’indicateur KDJ, pour générer des signaux de trading longs et courts.
La zone du chandelier fait référence à l’espace entre le chandelier de prix et la moyenne mobile, qui est calculé en soustrayant la valeur de la moyenne mobile du prix de clôture de chaque barre, puis en les additionnant. Lorsque le prix augmente pendant une longue période et dans une grande amplitude, la zone de la ligne K deviendra plus grande, tandis que dans un marché volatil ou un retournement après volatilité, la zone de la ligne K sera plus petite . Selon le principe « tout va vers l’extrême opposé », plus la tendance à la hausse est forte et plus le temps est long, plus la zone de la ligne K correspondante est grande et plus la probabilité d’inversion est grande, tout comme un ressort, plus il est long. est étiré, plus la force de rebond est grande. Par conséquent, un seuil est défini pour la zone de la ligne K. Lorsque ce seuil est atteint, la tendance des prix peut être complétée et la possibilité d’un renversement est plus grande.
Afin de confirmer davantage que la tendance est sur le point de s’inverser, l’indicateur KDJ est introduit pour juger de la conversion du sentiment d’achat et de vente. Les paramètres de seuil et de valeur de l’indicateur KDJ de cette stratégie peuvent être ajustés en fonction de circonstances et de besoins spécifiques pour améliorer la précision de la stratégie.
L’avantage de la stratégie de zone K-line est qu’elle combine l’amplitude et les changements des tendances de prix, ainsi que la conversion du sentiment d’achat et de vente, offrant une stratégie de trading quantitative relativement complète. Ses avantages incluent :
Bien que la stratégie de zone de chandelier présente certains avantages, elle comporte également certains risques, notamment :
Afin d’optimiser la stratégie de la zone K-line, les directions suivantes peuvent être envisagées :
Calculer l’aire du chandelier
Signal d’ouverture d’une position longue :
(1) La « zone K-line » de la tendance à la baisse atteint le seuil, qui peut être établi avant
(2) La valeur de l’indicateur KDJ est supérieure à 80
(1) La « zone K-line » de la tendance à la hausse atteint le seuil, qui peut être établi avant
(2) La valeur de l’indicateur KDJ est inférieure à 20
Implémentation du code
// 参数
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)
}
}
La logique de la stratégie est très simple :
Paramètres de la stratégie
Variables globales
Fonction de calcul
Fonction de boucle principale
a. Obtenez les dernières données de la ligne K et assurez-vous que le nombre de lignes K n’est pas inférieur à maPeriod, sinon enregistrez le statut et renvoyez.
b. Calculez la moyenne mobile ma et l’indicateur ATR atr, ainsi que l’indicateur KDJ.
c. Obtenez les informations de zone, le dernier index de ligne K croisée vers le haut et le dernier index de ligne K croisée vers le bas à partir de areaInfo.
d. Utilisez l’objet graphique en chandeliers c pour dessiner les lignes du chandelier et de l’indicateur, et remplissez-les de différentes couleurs en fonction de la relation entre le prix et la moyenne mobile.
e. Déterminer le moment de l’achat et de la vente en fonction des conditions :
Si tradeState est « NULL », et que la zone est inférieure à -threshold et que la valeur du chandelier KDJ est supérieure à 70, une opération d’achat est effectuée. Si tradeState est « NULL », que la zone est supérieure au seuil et que la valeur du chandelier KDJ est inférieure à 30, exécutez une opération de vente. f. Définissez les conditions de stop loss et de take profit et fermez la position si les conditions sont remplies :
Si la position est dans un état d’achat, elle est clôturée lorsque le prix est inférieur au prix de clôture du jour de négociation précédent moins l’ATR du jour précédent. Si la position est dans un état de vente, elle est clôturée lorsque le prix est supérieur au prix de clôture du jour de négociation précédent plus l’ATR du jour précédent. fonction principale : il s’agit du point d’entrée d’exécution principal, vérifiant si le nom d’échange contient « _« Futures », s’il est inclus, génère une exception, sinon entre dans une boucle infinie, exécute la fonction onTick dans chaque boucle et dort pendant 1 seconde.
En général, cette stratégie s’appuie principalement sur des graphiques K-line et des indicateurs techniques pour prendre des décisions d’achat et de vente, tout en utilisant des stratégies de stop-loss et de take-profit pour gérer les risques. Veuillez noter qu’il s’agit simplement d’un exemple de stratégie et que son utilisation réelle doit être ajustée et optimisée en fonction des conditions du marché et des besoins spécifiques.
Ce modèle a été facilement implémenté à l’aide de JavaScript sur FMZ.COM sans utiliser de nombreuses lignes de code. Et la représentation graphique de la zone K-line est facilement réalisée à l’aide de la fonction KLineChart. La stratégie est conçue pour le marché spot des crypto-monnaies et utilise le modèle « Digital Currency Spot Trading Library ». Le placement d’ordres à l’aide des fonctions encapsulées dans le modèle est également très simple, facile à utiliser et à comprendre.


J’ai choisi au hasard une période de backtesting. Même si je n’ai pas perdu d’argent, je n’ai pas accumulé de bénéfices en continu, donc le problème de drawdown était quand même assez important. Il devrait y avoir d’autres directions d’optimisation et d’espace pour cette stratégie. Ceux qui sont intéressés peuvent essayer de mettre à niveau cette stratégie.

Grâce à cette stratégie, en plus d’apprendre une idée de trading plus alternative, nous avons également appris à dessiner des graphiques ; représenter la zone délimitée par la ligne K et la moyenne mobile ; dessiner l’indicateur KDJ, etc.
La stratégie de zone K-line est une stratégie de trading basée sur l’amplitude de la tendance des prix et l’indicateur KDJ. Elle aide les traders à prédire les tendances du marché en analysant la zone entre la ligne K et la moyenne mobile et la conversion du sentiment d’achat et de vente. Bien qu’il existe certains risques, grâce à une optimisation et un ajustement continus, cette stratégie peut fournir un outil de trading puissant pour aider les traders à mieux faire face aux fluctuations du marché. Il est important que les traders ajustent de manière flexible les paramètres et les règles de leurs stratégies en fonction de la situation spécifique et des conditions du marché pour obtenir de meilleures performances de trading.