
Cette stratégie, appelée “double filtrage quantique”, utilise la technique du multi-frame de temps pour réaliser une stratégie de trading quantifiée à haute fréquence basée sur l’idée du double filtrage. La stratégie utilise des indicateurs sur différentes périodes de temps pour faire des jugements, pour un filtrage plus rigoureux des signaux de trading, qui permet de filtrer un grand nombre de faux signaux, ce qui permet d’obtenir un taux de victoire plus élevé.
Le principe de base de cette stratégie est le suivant:
L’utilisation de la courbe circulaire et de la courbe solaire pour déterminer la direction de la tendance du marché, comme condition de filtrage de la direction de la stratégie, ne peut être négociée que si elle est conforme à la tendance.
Les fournisseurs d’accès à Internet ont été invités à se joindre à la plateforme de négociation en ligne, qui a été lancée en août.
L’équilibre de la courbe, de la ligne de jour et de la direction des 4 heures permet de filtrer un grand nombre de faux signaux et d’améliorer la fiabilité des signaux de négociation.
Le point de rétractation de Fibonacci est utilisé pour déterminer la position du stop loss et pour réaliser un stop loss rapide.
En particulier, la stratégie commence par déterminer la direction de la priorité de la tendance sur la courbe et la courbe solaire, le principe de la direction de la priorité est le suivant: le côté où le cours de clôture de la ligne K est en retard sur la ligne périodique est plus grand, jugez la direction de la ligne périodique; puis construisez un canal A B C D à 4 heures, jugez le point d’achat et de vente à travers la direction du canal et le point de retournement, émettez un signal de transaction; enfin, le sens de la priorité de la ligne périodique actuelle doit être conforme au signal de direction de la transaction de 4 heures, ce qui permet de filtrer de nombreux faux signaux, ce qui améliore la fiabilité du signal de transaction.
Les principaux avantages de cette stratégie sont les suivants:
Un mécanisme de filtrage du double signal basé sur plusieurs périodes permet de filtrer les nuisances et d’obtenir des opportunités de négociation de haute fiabilité.
Les points de vente et d’achat sont déterminés par les canaux et les signaux de transaction sont clairs.
Le point de rétractation de Fibonacci définit la position d’arrêt de la perte, permettant une perte rapide de la perte.
Les paramètres de stratégie sont moins nombreux et plus faciles à comprendre.
Il est facile à optimiser et à améliorer.
La stratégie présente principalement les risques suivants:
Il y a trop de délais de surveillance, ce qui ajoute à la complexité et à la facilité d’erreur.
Il ne tient pas compte des événements exceptionnels tels que les fortes fluctuations de la situation causées par des événements d’importance médiatique.
Le point de retrait est la possibilité d’un profit insuffisant en cas d’arrêt des pertes.
Une mauvaise configuration des paramètres peut entraîner des transactions excessives ou des fuites.
La réponse:
Renforcer la surveillance des situations exceptionnelles et des événements d’importance médiatique.
Optimiser la logique de stop-loss pour assurer une certaine marge.
Test et optimisation des paramètres afin de réduire la probabilité de survente des transactions et de fuites de factures.
Les principaux axes d’optimisation de la stratégie sont:
Augmenter la capacité des modèles d’apprentissage automatique à déterminer les tendances prioritaires, en utilisant plus de données pour améliorer l’exactitude des jugements.
Il est également possible de tester d’autres indicateurs pour construire des canaux de négociation et de déterminer les points de vente.
Essayez des méthodes plus sophistiquées de freinage, comme le freinage mobile, le freinage sautant, etc.
Les résultats de la rétroanalyse permettent de déduire les paramètres optimaux, ce qui rend la configuration des paramètres plus conforme aux principes d’investissement quantitatif.
Accroître les mécanismes de surveillance et de réponse aux urgences majeures.
L’idée centrale de la stratégie est une stratégie de trading quantifiée à haute fréquence basée sur un double filtrage réduisant le bruit. Elle utilise des jugements de plusieurs temps et des canaux pour déterminer les points d’achat et de vente, ce qui permet un double filtrage de la fiabilité des signaux de négociation.
/*backtest
start: 2023-11-19 00:00:00
end: 2023-11-26 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='AG328', shorttitle='AG328', overlay=true )
// Настройки для включения/выключения торговли в Лонг и Шорт
longEnabled = input(true, title="Торговля в Лонг")
shortEnabled = input(true, title="Торговля в Шорт")
smaEnabled = input(true, title="Включить SMA89")
tradeInGrey = input(false, title = "Сигнал в серой зоне")
pipsBuyStop = input.int(0, title="Пунктов добавить для Buy ордера", minval=-50, step=1, maxval=50)
pipsSellStop = input.int(0, title="Пунктов добавить для Sell ордера", minval=-50, step=1, maxval=50)
// Const
LicenseID = 6889430941909
contracts = input.float(0.01, title="Контрактов на сделку:", minval=0, step=0.01, maxval=10)
var float sma = na
var float UW = na
var float DW = na
var bool weeklyLongPriority = na
var bool weeklyShortPriority = na
var float UD = na
var float DD = na
var bool dailyLongPriority = na
var bool dailyShortPriority = na
var float UP = na
var float DOWN = na
var bool h4LongPriority = na
var bool h4ShortPriority = na
var bool LongCondition = na
var bool ShortCondition = na
var bool GreenZone = na
var bool GreyZone = na
var bool RedZone = na
var float LongOrder = 0
var float ShortOrder = 0
var float LongTP = 0
var float ShortTP = 0
var float LongTake = 0
var float ShortTake = 0
var float AA = 0
var float BB = 0
var float CC = 0
var float D = 0
var float AAA = 0
var float BBB = 0
var float CCC = 0
var float DDD = 0
var float stopLong = 0
var float stopShort = 0
var string olderTF = ""
var string oldestTF = ""
var string pivotTF = ""
// Создаем входную настройку для ТФ Пивота
maxValuePivotTF = input.int(2, title="ТФ Пивота старше на:", minval=1, step=1, maxval=3)
// Шаг цены инструмента
stepSize = syminfo.mintick
currentTF = timeframe.period // Получаем текущий ТФ
if currentTF == "1" // Определяем 2 более старших ТФ
olderTF := "5"
oldestTF := "15"
pivotTF := (maxValuePivotTF == 1 ? "5" : (maxValuePivotTF == 2 ? "15" : "60"))
if currentTF == "5"
olderTF := "15"
oldestTF := "60"
pivotTF := (maxValuePivotTF == 1 ? "15" : (maxValuePivotTF == 2 ? "60" : "240"))
if currentTF == "15"
olderTF := "60"
oldestTF := "240"
pivotTF := (maxValuePivotTF == 1 ? "60" : (maxValuePivotTF == 2 ? "240" : "D"))
if currentTF == "60"
olderTF := "240"
oldestTF := "D"
pivotTF := (maxValuePivotTF == 1 ? "240" : (maxValuePivotTF == 2 ? "D" : "W"))
if currentTF == "240"
olderTF := "D"
oldestTF := "W"
pivotTF := (maxValuePivotTF == 1 ? "D" : (maxValuePivotTF == 2 ? "W" : "M"))
if currentTF == "D"
olderTF := "W"
oldestTF := "M"
pivotTF := (maxValuePivotTF == 1 ? "W" : (maxValuePivotTF == 2 ? "M" : "3M"))
if currentTF == "W"
olderTF := "M"
oldestTF := "3M"
pivotTF := (maxValuePivotTF == 1 ? "M" : (maxValuePivotTF == 2 ? "3M" : "3M"))
// Рассчитываем бары ТФ+2
weekHigh0 = request.security(syminfo.tickerid, oldestTF, high)
weekHigh1 = request.security(syminfo.tickerid, oldestTF, high[1])
weekHigh2 = request.security(syminfo.tickerid, oldestTF, high[2])
weekHigh3 = request.security(syminfo.tickerid, oldestTF, high[3])
weekHigh4 = request.security(syminfo.tickerid, oldestTF, high[4])
weekLow0 = request.security(syminfo.tickerid, oldestTF, low)
weekLow1 = request.security(syminfo.tickerid, oldestTF, low[1])
weekLow2 = request.security(syminfo.tickerid, oldestTF, low[2])
weekLow3 = request.security(syminfo.tickerid, oldestTF, low[3])
weekLow4 = request.security(syminfo.tickerid, oldestTF, low[4])
// ТФ+2 Фракталы
weekFractal_UP = weekHigh2 > weekHigh1 and weekHigh2 > weekHigh0 and weekHigh2 > weekHigh3 and weekHigh2 > weekHigh4
weekFractal_DOWN = weekLow2 < weekLow1 and weekLow2 < weekLow0 and weekLow2 < weekLow3 and weekLow2 < weekLow4
if weekFractal_UP
UW := weekHigh2
UW
if weekFractal_DOWN
DW := weekLow2
DW
// Рисуем UW, DW
plot(UW, title = "UW", color=color.green)
plot(DW, title = "DW", color=color.red)
// ТФ+2 priority
if close > UW
weeklyLongPriority := true
weeklyLongPriority
else if close < DW
weeklyLongPriority := false
weeklyLongPriority
//weeklyColor = weeklyLongPriority ? color.new(color.green, transp=70) : color.new(color.red, transp=70)
//bgcolor(weeklyColor, title = "WeeklyPriority")
//-----------------------------------------------
// Рассчитываем дневные бары
dayHigh0 = request.security(syminfo.tickerid, olderTF, high)
dayHigh1 = request.security(syminfo.tickerid, olderTF, high[1])
dayHigh2 = request.security(syminfo.tickerid, olderTF, high[2])
dayHigh3 = request.security(syminfo.tickerid, olderTF, high[3])
dayHigh4 = request.security(syminfo.tickerid, olderTF, high[4])
dayLow0 = request.security(syminfo.tickerid, olderTF, low)
dayLow1 = request.security(syminfo.tickerid, olderTF, low[1])
dayLow2 = request.security(syminfo.tickerid, olderTF, low[2])
dayLow3 = request.security(syminfo.tickerid, olderTF, low[3])
dayLow4 = request.security(syminfo.tickerid, olderTF, low[4])
// Дневные Фракталы
dayFractal_UP = dayHigh2 > dayHigh1 and dayHigh2 > dayHigh0 and dayHigh2 > dayHigh3 and dayHigh2 > dayHigh4
dayFractal_DOWN = dayLow2 < dayLow1 and dayLow2 < dayLow0 and dayLow2 < dayLow3 and dayLow2 < dayLow4
if dayFractal_UP
UD := dayHigh2
UD
if dayFractal_DOWN
DD := dayLow2
DD
// Рисуем UD, DD
//plot(UD, title = "UD", color=color.green)
//plot(DD, title = "DD", color=color.red)
// Daily priority
if close > UD
dailyLongPriority := true
dailyLongPriority
else if close < DD
dailyLongPriority := false
dailyLongPriority
//dailyColor = dailyLongPriority ? color.new(color.green, transp=70) : color.new(color.red, transp=70)
//bgcolor(dailyColor, title = "DailyPriority")
//-----------------------------------------------
// Рассчитываем 4-часовые бары
h4High0 = request.security(syminfo.tickerid, currentTF, high)
h4High1 = request.security(syminfo.tickerid, currentTF, high[1])
h4High2 = request.security(syminfo.tickerid, currentTF, high[2])
h4High3 = request.security(syminfo.tickerid, currentTF, high[3])
h4High4 = request.security(syminfo.tickerid, currentTF, high[4])
h4Low0 = request.security(syminfo.tickerid, currentTF, low)
h4Low1 = request.security(syminfo.tickerid, currentTF, low[1])
h4Low2 = request.security(syminfo.tickerid, currentTF, low[2])
h4Low3 = request.security(syminfo.tickerid, currentTF, low[3])
h4Low4 = request.security(syminfo.tickerid, currentTF, low[4])
// H4 Фракталы
h4Fractal_UP = h4High2 > h4High1 and h4High2 > h4High0 and h4High2 > h4High3 and h4High2 > h4High4
h4Fractal_DOWN = h4Low2 < h4Low1 and h4Low2 < h4Low0 and h4Low2 < h4Low3 and h4Low2 < h4Low4
if h4Fractal_UP
UP := h4High2
UP
if h4Fractal_DOWN
DOWN := h4Low2
DOWN
// Рисуем UP, DOWN
plot(UP, title='UP', color=color.new(color.green, 0))
plot(DOWN, title='DOWN', color=color.new(color.red, 0))
// SMA89
sma89 = ta.sma(close, 89)
plot(smaEnabled ? sma89 : na, title='sma89', color=color.new(color.white, transp=10))
//smaColor = close > sma89 ? color.new(color.green, transp=70) : color.new(color.red, transp=70)
//bgcolor(smaColor, title = "smaPriority")
// Condition
LongCondition := weeklyLongPriority and dailyLongPriority and (smaEnabled ? close > sma89 : true)
ShortCondition := weeklyLongPriority == false and dailyLongPriority == false and (smaEnabled ? close < sma89 : true)
ConditionColor = LongCondition ? color.new(color.green, transp=85) : ShortCondition ? color.new(color.red, transp=85) : color.new(color.gray, transp=85)
bgcolor(ConditionColor, title='Condition')
// LOGIC LONG
if AA == 0 and h4Fractal_UP
AA := UP
if (AA[1] != 0 and BB == 0 and h4Fractal_DOWN) or (AA[1] != 0 and BB != 0 and D == 2 and h4Fractal_DOWN)
BB := DOWN
D := 1
if BB != 0 and D == 1 and ta.crossunder(low, BB)
D := 2
if AA != 0 and BB != 0
if D == 2 and (D[1] == 1 or D[2] == 1 or D[3] == 1) and h4Fractal_UP
CC := UP
else if D == 1 and h4Fractal_UP
CC := UP
if (AA != 0 and high > AA) or (LongOrder != 0 and high > LongOrder + pipsBuyStop * stepSize) or (tradeInGrey ? ShortCondition : not LongCondition)
AA := 0
BB := 0
CC := 0
D := 0
//
//plot(AA != 0 ? AA : na, title='A', color=color.new(color.white, transp=10), linewidth=2, style=plot.style_linebr)
//plot(BB != 0 ? BB : na, title='B', color=color.new(color.gray, transp=10), linewidth=2, style=plot.style_linebr)
//plot(CC != 0 ? CC : na, title='C', color=color.new(color.blue, transp=10), linewidth=2, style=plot.style_linebr)
//plot(D != 0 ? D : na, title='D', color=color.new(color.green, transp=80), linewidth=2, style=plot.style_linebr)
// LOGIC SHORT
if AAA == 0 and h4Fractal_DOWN
AAA := DOWN
if (AAA[1] != 0 and BBB == 0 and h4Fractal_UP) or (AAA[1] != 0 and BBB[1] != 0 and DDD == 2 and h4Fractal_UP)
BBB := UP
DDD := 1
if BBB != 0 and DDD == 1 and ta.crossover(high, BBB)
DDD := 2
if AAA != 0 and BBB != 0
if DDD == 2 and (DDD[1] == 1 or DDD[2] == 1 or DDD[3] == 1) and h4Fractal_DOWN
CCC := DOWN
else if DDD == 1 and h4Fractal_DOWN
CCC := DOWN
if (AAA != 0 and low < AAA) or (ShortOrder != 0 and low < ShortOrder - pipsSellStop * stepSize) or (tradeInGrey ? LongCondition : not ShortCondition)
AAA := 0
BBB := 0
CCC := 0
DDD := 0
//
//plot(AAA != 0 ? AAA : na, title='ShortA', color=color.new(color.white, transp=10), linewidth=2, style=plot.style_linebr)
//plot(BBB != 0 ? BBB : na, title='ShortB', color=color.new(color.gray, transp=10), linewidth=2, style=plot.style_linebr)
//plot(CCC != 0 ? CCC : na, title='ShortC', color=color.new(color.blue, transp=10), linewidth=2, style=plot.style_linebr)
//plot(DDD != 0 ? DDD : na, title='ShortD', color=color.new(color.green, transp=80), linewidth=2, style=plot.style_linebr)
// LongOrder
if (tradeInGrey ? not ShortCondition : LongCondition) and CC != 0 and D == 2 and strategy.position_size[1] == 0 and longEnabled
LongOrder := CC
LongOrder
else if (tradeInGrey ? ShortCondition : not LongCondition) or strategy.position_size[1] > 0 or (LongOrder != 0 and high > LongOrder + pipsBuyStop * stepSize)
LongOrder := 0
LongOrder
plot(LongOrder != 0 ? LongOrder : na, title='LongOrder', color=color.new(color.yellow, transp=10), linewidth=2, style=plot.style_linebr)
// ShortOrder
if (tradeInGrey ? not LongCondition : ShortCondition) and CCC != 0 and DDD == 2 and strategy.position_size[1] == 0 and shortEnabled
ShortOrder := CCC
ShortOrder
else if (tradeInGrey ? LongCondition : not ShortCondition) or strategy.position_size[1] < 0 or (ShortOrder != 0 and low < ShortOrder - pipsSellStop * stepSize)
ShortOrder := 0
ShortOrder
plot(ShortOrder != 0 ? ShortOrder : na, title='ShortOrder', color=color.new(color.orange, transp=10), linewidth=2, style=plot.style_linebr)
// Fibo Pivots
H = request.security(syminfo.tickerid, pivotTF, high[1])
L = request.security(syminfo.tickerid, pivotTF, low[1])
C = request.security(syminfo.tickerid, pivotTF, close[1])
PP = (H + L + C) / 3
R3 = PP + 1.000 * (H - L)
R2 = PP + 0.618 * (H - L)
R1 = PP + 0.382 * (H - L)
S1 = PP - 0.382 * (H - L)
S2 = PP - 0.618 * (H - L)
S3 = PP - 1.000 * (H - L)
//plot(PP)
//plot(R3)
//plot(R2)
//plot(R1)
//plot(S1)
//plot(S2)
//plot(S3)
// Расчет цены Лонг Тейка
if S3 - LongOrder > LongOrder - DOWN
LongTP := S3
LongTP
else if S2 - LongOrder > LongOrder - DOWN
LongTP := S2
LongTP
else if S1 - LongOrder > LongOrder - DOWN
LongTP := S1
LongTP
else if PP - LongOrder > LongOrder - DOWN
LongTP := PP
LongTP
else if R1 - LongOrder > LongOrder - DOWN
LongTP := R1
LongTP
else if R2 - LongOrder > LongOrder - DOWN
LongTP := R2
LongTP
else if R3 - LongOrder > LongOrder - DOWN
LongTP := R3
LongTP
else
LongTP := 0
LongTP
//
//plot(LongTake)
if strategy.position_size == 0
if LongTP == 0 and LongOrder != 0
LongTake := LongOrder + LongOrder - DOWN
LongTake
else
LongTake := LongTP
LongTake
plot(series=strategy.position_size > 0 ? LongTake : na, title='LongTake', color=color.new(color.rgb(99, 253, 104), transp=0), linewidth=1, style=plot.style_linebr)
// Расчет цены Шорт Тейка
if ShortOrder - R3 > UP - ShortOrder
ShortTP := R3
ShortTP
else if ShortOrder - R2 > UP - ShortOrder
ShortTP := R2
ShortTP
else if ShortOrder - R1 > UP - ShortOrder
ShortTP := R1
ShortTP
else if ShortOrder - PP > UP - ShortOrder
ShortTP := PP
ShortTP
else if ShortOrder - S1 > UP - ShortOrder
ShortTP := S1
ShortTP
else if ShortOrder - S2 > UP - ShortOrder
ShortTP := S2
ShortTP
else if ShortOrder - S3 > UP - ShortOrder
ShortTP := S3
ShortTP
else
ShortTP := 0
ShortTP
//
//plot(ShortTP)
if strategy.position_size == 0
if ShortTP == 0 and ShortOrder != 0
ShortTake := ShortOrder - (UP - ShortOrder)
ShortTake
else
ShortTake := ShortTP
ShortTake
plot(series=strategy.position_size < 0 ? ShortTake : na, title='ShortTake', color=color.new(color.rgb(99, 253, 104), transp=0), linewidth=1, style=plot.style_linebr)
// StopForLONG and SHORT
stopLong := math.min(DOWN,ta.lowest(low,3)) - pipsSellStop*stepSize
//plot(stopLong)
stopShort := math.max(UP,ta.highest(high,3)) + pipsBuyStop*stepSize
//plot(stopShort)
// TRADES LONG
if LongOrder > 0 and close < LongOrder and longEnabled and LongCondition
strategy.entry('Long', strategy.long, stop=LongOrder + pipsBuyStop*stepSize)
if LongOrder == 0 or not LongCondition or not longEnabled
strategy.cancel('Long')
strategy.exit('CloseLong', from_entry='Long', stop=stopLong, limit=LongTake - pipsSellStop*stepSize)
// // LONG ALERT !!!
// if longEnabled and LongCondition and LongOrder[1] == 0 and LongOrder != 0
// alert(str.tostring(LicenseID)+',buystop,GBPUSDb,price=' +str.tostring(LongOrder + pipsBuyStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close)
// if longEnabled and LongCondition and LongOrder[1] != 0 and LongOrder != 0 and LongOrder != LongOrder[1]
// alert(str.tostring(LicenseID)+',cancellongbuystop,GBPUSDb,price='+str.tostring(LongOrder + pipsBuyStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close)
// if (strategy.position_size > 0 and (LongTake != LongTake[1] or stopLong != stopLong[1])) or (strategy.position_size > 0 and strategy.position_size[1] == 0 )
// alert(str.tostring(LicenseID)+',newsltplong,GBPUSDb,sl='+str.tostring(stopLong)+',tp='+str.tostring(LongTake - pipsSellStop*stepSize), alert.freq_once_per_bar_close)
// if strategy.position_size == 0 and ((LongCondition[1] and not LongCondition) or not longEnabled) and (LongOrder[1] != 0 and LongOrder == 0)
// alert(str.tostring(LicenseID)+',cancellong,GBPUSDb', alert.freq_once_per_bar_close)
// // TRADES SHORT
// if ShortOrder > 0 and close > ShortOrder and shortEnabled and ShortCondition
// strategy.entry('Short', strategy.short, stop=ShortOrder - pipsSellStop*stepSize)
// if ShortOrder == 0 or not ShortCondition or not shortEnabled
// strategy.cancel('Short')
// strategy.exit('CloseShort', from_entry='Short', stop=stopShort, limit=ShortTake + pipsBuyStop*stepSize)
// // SHORT ALERT !!!
// if shortEnabled and ShortCondition and ShortOrder[1] == 0 and ShortOrder != 0
// alert(str.tostring(LicenseID)+',sellstop,GBPUSDb,price=' +str.tostring(ShortOrder - pipsSellStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close)
// if shortEnabled and ShortCondition and ShortOrder[1] != 0 and ShortOrder != 0 and ShortOrder != ShortOrder[1]
// alert(str.tostring(LicenseID)+',cancelshortsellstop,GBPUSDb,price='+str.tostring(ShortOrder - pipsSellStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close)
// if (strategy.position_size < 0 and (ShortTake != ShortTake[1] or stopShort != stopShort[1])) or (strategy.position_size < 0 and strategy.position_size[1] == 0)
// alert(str.tostring(LicenseID)+',newsltpshort,GBPUSDb,sl='+str.tostring(stopShort)+',tp='+str.tostring(ShortTake + pipsBuyStop*stepSize), alert.freq_once_per_bar_close)
// if strategy.position_size == 0 and ((ShortCondition[1] and not ShortCondition) or not shortEnabled) and (ShortOrder[1] != 0 and ShortOrder == 0)
// alert(str.tostring(LicenseID)+',cancelshort,GBPUSDb', alert.freq_once_per_bar_close)