Cette stratégie utilise une courbe secondaire correspondant aux hauts et aux bas de la ligne K pour former un signal de transaction. Lorsque le prix réel franchit la courbe correspondante, un signal d’achat et de vente est généré. La stratégie tente d’identifier les principaux supports et résistances avec un modèle mathématique pour effectuer des transactions de rupture.
Les principaux éléments et règles de la stratégie sont les suivants:
Adaptation des hauts et des bas: utilisez la courbe secondaire pour adapter les hauts et les bas de la ligne K.
Signaux d’achat: un signal d’achat est généré lorsque le prix de clôture de la ligne K franchit la courbe de la courbe supérieure.
Signal de vente: produit lorsque le prix de clôture de la ligne K franchit la courbe descendante.
Vérification en N cycles: la nécessité d’une rupture en N cycles pour qu’elle prenne effet, afin d’éviter une fausse rupture.
Signal de plage: il n’y a pas de signal de plage clair, le temps de détention est déterminé par l’optimisation de la rétroaction.
Cette stratégie tente d’identifier les prix critiques par des modèles mathématiques et de s’inscrire à la rupture, ce qui est typique d’un système de rupture.
Les principaux avantages de cette stratégie par rapport à d’autres systèmes de percée sont:
Les modèles mathématiques sont utilisés pour faire des ajustements plus objectifs que les jugements subjectifs.
La méthodologie est innovante, avec une combinaison de techniques de négociation et de modèles statistiques.
La mise en place d’une vérification à cycles multiples permet de filtrer les fausses percées.
L’optimisation de la rétroaction permet de trouver le meilleur moment pour conserver une position.
La réalisation n’est pas difficile et peut être adaptée avec souplesse.
Les modèles sont mis à jour automatiquement et ne nécessitent aucune maintenance.
Les paramètres de robustesse peuvent être vérifiés pour différentes variétés et cycles.
L’apprentissage automatique peut être introduit pour optimiser et valider davantage.
Dans l’ensemble, il y a beaucoup de nouveautés à explorer.
Mais cette stratégie comporte aussi les risques suivants:
L’effet d’adaptation dépend de la sélection des paramètres et peut être sur-optimisé.
La courbe d’ajustement est en retard et les pertes ne peuvent pas être complètement évitées.
Il existe un risque de couverture sans tenir compte du volume des transactions.
L’arbitrage statistique est difficile à maintenir à long terme.
Le cycle de rétroaction est court et la robustesse du modèle doit être vérifiée.
L’adaptation environnementale de plusieurs variétés est en cours de test.
Les positions fixes ne peuvent pas être modifiées dynamiquement.
Le taux de rétractation des gains doit être strictement évalué.
D’après l’analyse ci-dessus, la stratégie pourrait être améliorée dans les domaines suivants:
Test de la robustesse des paramètres dans différents environnements de marché.
L’indicateur de vérification du volume des transactions a été ajouté.
Optimisation de la logique d’entrée et de sortie et amélioration de la qualité du signal.
Créer un modèle de gestion dynamique des positions.
Introduction d’une stratégie de stop-loss pour limiter les pertes.
Optimiser les stratégies de gestion des fonds.
Le défilement de la fenêtre de rétroaction a été validé.
Évaluation de la stabilité des rendements de plusieurs variétés.
L’optimisation des modèles par l’apprentissage automatique.
L’ensemble de la stratégie a une certaine valeur d’innovation et d’expérimentation. Cependant, la stabilité des bénéfices à long terme de Statistical Arbitrage reste à l’épreuve.
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
strategy(title = " Strategy Quadratic Semaphore ",
shorttitle = "SQS",
overlay = true,
precision = 8,
calc_on_order_fills = true,
calc_on_every_tick = true,
backtest_fill_limits_assumption = 0,
default_qty_type = strategy.fixed,
default_qty_value = 2,
initial_capital = 10000,
pyramiding=5,
currency = currency.USD,
linktoseries = true)
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)
FromMonth = input(defval = 1, title = "Month", minval = 1)
FromDay = input(defval = 1, title = "Day", minval = 1)
FromYear = input(defval = 2019, title = "Year", minval = 2014)
backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth = input(defval = 31, title = "Month", minval = 1)
ToDay = input(defval = 12, title = "Day", minval = 1)
ToYear = input(defval = 9999, title = "Year", minval = 2014)
Config = input(title = "══════════════ Config ══════════════", defval = true, type = input.bool)
p = input(6)
length = input(30)
//
backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))
//
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
x1 = bar_index
x2 = sqrt(x1)
y = high
//
S11 = sum(x2,length) - sqrt(sum(x1,length)) / length
S12 = sum(x1*x2,length) - (sum(x1,length) * sum(x2,length)) / length
S22 = sum(sqrt(x2),length) - sqrt(sum(x2,length)) / length
Sy1 = sum (y*x1,length) - (sum(y,length) * sum(x1,length)) / length
Sy2 = sum (y*x2,length) - (sum(y,length) * sum(x2,length)) / length
//
max1 = sma(x1,length)
max2 = sma(x2,length)
may = sma(y,length)
b2 = ((Sy1 * S22) - (Sy2*S12))/(S22*S11 - sqrt(S12))
b3 = ((Sy2 * S11) - (Sy1 * S12))/(S22 * S11 - sqrt(S12))
b1 = may - b2*max1 - b3*max2
qr = b1 + b2*x1 + b3*x2
//
yl = low
//
Sy1l = sum(yl*x1,length) - (sum(yl,length) * sum(x1,length)) / length
Sy2l = sum(yl*x2,length) - (sum(yl,length) * sum(x2,length)) / length
//
mayl = sma(yl,length)
b2l = ((Sy1l * S22) - (Sy2l*S12))/(S22*S11 - sqrt(S12))
b3l = ((Sy2l * S11) - (Sy1l * S12))/(S22 * S11 - sqrt(S12))
b1l = mayl - b2l*max1 - b3l*max2
qrl = b1l + b2l*x1 + b3l*x2
//
period = round(p/2)+1
hh = qr[period]
ll = qrl[period]
countH = 0
countL = 0
buy=0
sell=0
//
for i = 1 to period-1
if qr[i]<hh
countH:=countH+1
if qrl[i]>ll
countL:=countL+1
for i = period+1 to p+1
if qr[i]<hh
countH:=countH+1
if qrl[i]>ll
countL:=countL+1
if countH==p
pivotH = high[period]
buy := 1
if countL==p
pivotL = low[period]
sell := 1
//
plotshape(buy == 1 , text='💣', style=shape.arrowup, location=location.belowbar, color=#32CD32, textcolor=color.white, offset=0, transp=0,size=size.auto)
plotshape(sell == 1 , text='🔨', style=shape.arrowdown, location=location.abovebar, color=#FF0000, textcolor=color.white, offset=0, transp=0,size=size.auto)
//
if (backTestPeriod())
strategy.entry("long", true, 1, when = buy == 1)
strategy.entry("short", false, 1, when = sell == 1)