Stratégie quantitative à deux volets


Date de création: 2023-12-29 16:29:21 Dernière modification: 2023-12-29 16:29:21
Copier: 0 Nombre de clics: 601
1
Suivre
1621
Abonnés

Stratégie quantitative à deux volets

Aperçu

La stratégie est basée sur une combinaison de deux indicateurs EMA et Bull Power. Le nom de la stratégie contient les mots clés de l’acide chlorhydrique et de l’acide chlorhydrique jumelés, soulignant la caractéristique de son utilisation de deux indicateurs indépendants.

Principe de stratégie

La stratégie est composée de deux volets:

  1. L’indicateur 220 EMA. Il calcule les EMA du 2e et du 20e jour, générant un signal d’achat lorsque le prix traverse l’EMA de bas en haut et un signal de vente lorsque le prix traverse l’EMA de haut en bas.
  2. L’indicateur de Bull Power. Il calcule la force de bulling en fonction de la relation entre la ligne K actuelle et la ligne K précédente, et émet un signal de transaction correspondant lorsque la force de bulling est supérieure à la limite définie.

Les deux parties du signal doivent être déclenchées simultanément pour ouvrir une position. Par exemple, l’EMA Gold Fork et Bull Power sont positifs pour ouvrir une position, l’EMA Dead Fork et Bull Power sont négatifs pour ouvrir une position vide.

Analyse des avantages

  1. Les deux indicateurs combinés filtrent les faux signaux. Le seul indicateur est susceptible de produire de faux signaux sous l’influence de facteurs externes. Les indicateurs combinés peuvent se vérifier mutuellement, filtrer les faux signaux et améliorer la qualité du signal.
  2. Les paramètres de l’indicateur sont réglables. Les cycles EMA et les seuils de Bull Power peuvent être personnalisés pour s’adapter à différents environnements de marché.
  3. La stratégie utilise seulement deux indicateurs courants, et les principes sont simples et faciles à comprendre.

Analyse des risques

  1. Risque de défaillance de l’indicateur. Même si l’indicateur est combiné, il est possible que l’indicateur ne fonctionne pas dans des cas extrêmes.
  2. Risque d’optimisation des paramètres. Des paramètres mal définis peuvent entraîner trop de transactions et trop peu de transactions, ce qui réduit l’efficacité de la stratégie.

Direction d’optimisation

  1. Il est possible de mettre en place un arrêt mobile ou un arrêt rétrospectif pour contrôler les pertes individuelles.
  2. Optimiser les paramètres. Vous pouvez tester différentes combinaisons de paramètres pour trouver les paramètres optimaux et obtenir de meilleurs résultats stratégiques.
  3. Ajout de conditions de filtrage. Il est possible d’ajouter des conditions de filtrage similaires au volume de transactions ou à la volatilité dans les conditions d’ouverture de position, afin de filtrer certaines anomalies.

Résumer

La stratégie permet de prendre des décisions de négociation grâce à une application combinée de deux EMA et de Bull Power. Comparée à un seul indicateur, l’indicateur combiné permet de filtrer efficacement les faux signaux, tout en conservant la qualité du signal de négociation et en ayant la possibilité d’ajuster les paramètres.

Code source de la stratégie
/*backtest
start: 2022-12-22 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 12/07/2022
// This is combo strategies for get a cumulative signal.  
//
// First strategy
// This indicator plots 2/20 exponential moving average. For the Mov 
// Avg X 2/20 Indicator, the EMA bar will be painted when the Alert criteria is met.
//
// Second strategy
//  Bull Power Indicator
//  To get more information please see "Bull And Bear Balance Indicator" 
//  by Vadim Gimelfarb. 
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
EMA20(Length) =>
    pos = 0.0
    xPrice = close
    xXA = ta.ema(xPrice, Length)
    nHH = math.max(high, high[1])
    nLL = math.min(low, low[1])
    nXS = nLL > xXA or nHH < xXA ? nLL : nHH
    iff_1 = nXS < close[1] ? 1 : nz(pos[1], 0)
    pos := nXS > close[1] ? -1 : iff_1
    pos


BP(SellLevel) =>
    pos = 0.0
    value = close < open ?  
             close[1] < open ?  math.max(high - close[1], close - low): math.max(high - open, close - low):
              close > open ? 
               close[1] > open ?  high - low : math.max(open - close[1], high - low) : 
                 high - close > close - low ? 
                  close[1] < open ? math.max(high - close[1], close - low) : high - open : 
                   high - close < close - low ? 
                     close[1] > open ?  high - low : math.max(open - close, high - low) : 
                      close[1] > open ? math.max(high - open, close - low) :
                       close[1] < open? math.max(open - close, high - low): high - low
    val2 = ta.sma(value, 15)                   
    pos :=  val2 > SellLevel ? 1 : -1
    pos

strategy(title='Combo 2/20 EMA & Bull Power', shorttitle='Combo', overlay=true)
var I1 = '●═════ 2/20 EMA ═════●'
Length = input.int(14, minval=1, group=I1)
var I2 = '●═════  Bull Power ═════●'
SellLevel = input.float(-15, step=0.01, group=I2)
var misc = '●═════ MISC ═════●'
reverse = input.bool(false, title='Trade reverse', group=misc)
var timePeriodHeader = '●═════ Time Start ═════●'
d = input.int(1, title='From Day', minval=1, maxval=31, group=timePeriodHeader)
m = input.int(1, title='From Month', minval=1, maxval=12, group=timePeriodHeader)
y = input.int(2005, title='From Year', minval=0, group=timePeriodHeader)
StartTrade = time > timestamp(y, m, d, 00, 00) ? true : false
posEMA20 = EMA20(Length)
prePosBP = BP(SellLevel)
iff_1 = posEMA20 == -1 and prePosBP == -1 and StartTrade ? -1 : 0
pos = posEMA20 == 1 and prePosBP == 1 and StartTrade ? 1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
if possig == 1
    strategy.entry('Long', strategy.long)
if possig == -1
    strategy.entry('Short', strategy.short)
if possig == 0
    strategy.close_all()
barcolor(possig == -1 ? #b50404 : possig == 1 ? #079605 : #0536b3)