A estratégia de previsão de forma utiliza a forma de um mapa para determinar a movimentação futura dos preços, e é amplamente utilizada na comunidade de negociação. A estratégia capta oportunidades de reversão de tendência através da identificação de duas formas simples, a linha de um arco-íris e a estrela de tiro.
A estratégia baseia-se principalmente nos seguintes princípios:
O indicador ATR é usado para identificar tendências fortes e fracas e filtrar os mercados de turbulência. O ATR é considerado apenas quando o valor é menor do que o limite mínimo ou maior do que o limite máximo.
Calcule a linha de retorno de Fibonacci de 33,3% da linha K atual. Se o preço de fechamento for superior a essa linha, será considerado uma linha de chifres, se o preço de fechamento for inferior a essa linha, será considerado uma estrela de tiro.
Confirmação adicional para o formato identificado, requerendo que o formato seja concluído ((a parte da entidade é superior ou inferior ao preço de abertura) e para a linha K não confirmada
Depois de entrar, configure o stop loss e o stop loss, o stop loss é um determinado múltiplo do ATR, o stop loss é o múltiplo do retorno do risco do stop loss.
A estratégia usa os indicadores ATR e a técnica de Fibonacci para identificar as linhas de arco e as formas das estrelas de tiro, ao mesmo tempo em que configura indicadores de controle de risco, de acordo com o princípio geral de negociação de tendências.
A estratégia tem as seguintes vantagens:
O princípio é simples e fácil de entender.
A utilização de formas de curto prazo no dia, sem a necessidade de esperar muito tempo para manter as posições, a flexibilidade é forte.
A configuração de parâmetros ATR controla o risco de excesso de mercado. Os parâmetros podem ser otimizados para diferentes variedades.
O risco é controlado, combinado com a relação de retorno do risco, definindo um ponto de parada e perda razoável.
Os sinais de negociação automática são conectados diretamente ao Stop Loss Purchase e são fáceis de operar.
Aplica-se a várias variedades e é universal.
A estratégia também apresenta alguns riscos:
A forma de negociação tem uma certa taxa de erro e não pode ser totalmente confiável.
O mercado de ações é um mercado de ações com uma taxa de mercado de US\( 1 bilhão, que é mais baixa do que a taxa de mercado de US\) 1 bilhão.
A transação em linha curta pode aumentar a frequência de transação e os custos de deslizamento.
A otimização dos parâmetros do ATR depende de dados históricos, e não há garantia de que os parâmetros se aplicam para sempre.
O sistema de encomendas automáticas corre o risco de falhar e deve ser reiniciado.
A configuração inadequada do Stop Loss pode levar a um excesso de resgate ou a um excesso de resgate.
A estratégia pode ser melhorada nas seguintes direções:
Adicionar outros filtros, como volume de transações, para aumentar a eficácia da forma.
Considere a configuração de taxas e otimize o ponto de parada.
Otimizar dinamicamente os parâmetros do ATR para adaptá-los a diferentes ciclos de eventos.
Avaliar os parâmetros de cada par de variedades negociadas e definir parâmetros personalizados.
Aumentar o mecanismo de reexame automático e reduzir o risco individual.
O uso de aprendizado de máquina para melhorar a precisão do reconhecimento de formas.
Adicionar o rastreamento de stop loss para bloquear mais lucros.
Em suma, a estratégia de negociação integra indicadores técnicos comuns, os princípios são simples e fáceis de entender e implementar. Com a otimização dos parâmetros e o controle do risco em vigor, é esperado um lucro estável. No entanto, os comerciantes ainda precisam estar atentos aos riscos, manter o número de negociações moderado e evitar a radicalização excessiva.
/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ZenAndTheArtOfTrading / PineScriptMastery
// Last Updated: 28th April, 2021
// @version=4
strategy("Hammers & Stars Strategy [v1.0]", shorttitle="HSS[v1.0]", overlay=true)
// Get user input
atrMinFilterSize = input(title=">= ATR Filter", type=input.float, defval=0.0, minval=0.0, tooltip="Minimum size of entry candle compared to ATR", group="Strategy Settings")
atrMaxFilterSize = input(title="<= ATR Filter", type=input.float, defval=3.0, minval=0.0, tooltip="Maximum size of entry candle compared to ATR", group="Strategy Settings")
stopMultiplier = input(title="Stop Loss ATR", type=input.float, defval=1.0, tooltip="Stop loss multiplier (x ATR)", group="Strategy Settings")
rr = input(title="R:R", type=input.float, defval=1.0, tooltip="Risk:Reward profile", group="Strategy Settings")
fibLevel = input(title="Fib Level", type=input.float, defval=0.333, tooltip="Used to calculate upper/lower third of candle. (For example, setting it to 0.5 will mean hammers must close >= 50% mark of the total candle size)", group="Strategy Settings")
i_startTime = input(title="Start Date Filter", defval=timestamp("01 Jan 2000 13:30 +0000"), type=input.time, tooltip="Date & time to begin trading from", group="Strategy Settings")
i_endTime = input(title="End Date Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), type=input.time, tooltip="Date & time to stop trading", group="Strategy Settings")
oandaDemo = input(title="Use Oanda Demo?", type=input.bool, defval=false, tooltip="If turned on then oandapractice broker prefix will be used for AutoView alerts (demo account). If turned off then live account will be used", group="AutoView Oanda Settings")
limitOrder = input(title="Use Limit Order?", type=input.bool, defval=true, tooltip="If turned on then AutoView will use limit orders. If turned off then market orders will be used", group="AutoView Oanda Settings")
gtdOrder = input(title="Days To Leave Limit Order", type=input.integer, minval=0, defval=2, tooltip="This is your GTD setting (good til day)", group="AutoView Oanda Settings")
accountBalance = input(title="Account Balance", type=input.float, defval=1000.0, step=100, tooltip="Your account balance (used for calculating position size)", group="AutoView Oanda Settings")
accountCurrency = input(title="Account Currency", type=input.string, defval="USD", options=["AUD", "CAD", "CHF", "EUR", "GBP", "JPY", "NZD", "USD"], tooltip="Your account balance currency (used for calculating position size)", group="AutoView Oanda Settings")
riskPerTrade = input(title="Risk Per Trade %", type=input.float, defval=2.0, step=0.5, tooltip="Your risk per trade as a % of your account balance", group="AutoView Oanda Settings")
// Set up AutoView broker prefix
var broker = oandaDemo ? "oandapractice" : "oanda"
// See if this bar's time happened within date filter
dateFilter = true
// Get ATR
atr = atr(14)
// Check ATR filter
atrMinFilter = abs(high - low) >= (atrMinFilterSize * atr) or atrMinFilterSize == 0.0
atrMaxFilter = abs(high - low) <= (atrMaxFilterSize * atr) or atrMaxFilterSize == 0.0
atrFilter = atrMinFilter and atrMaxFilter
// Calculate 33.3% fibonacci level for current candle
bullFib = (low - high) * fibLevel + high
bearFib = (high - low) * fibLevel + low
// Determine which price source closes or opens highest/lowest
lowestBody = close < open ? close : open
highestBody = close > open ? close : open
// Determine if we have a valid setup
validHammer = lowestBody >= bullFib and atrFilter and close != open and not na(atr)
validStar = highestBody <= bearFib and atrFilter and close != open and not na(atr)
// Check if we have confirmation for our setup
validLong = validHammer and strategy.position_size == 0 and dateFilter and barstate.isconfirmed
validShort = validStar and strategy.position_size == 0 and dateFilter and barstate.isconfirmed
//------------- DETERMINE POSITION SIZE -------------//
// Get account inputs
var tradePositionSize = 0.0
var pair = syminfo.basecurrency + "/" + syminfo.currency
// Check if our account currency is the same as the base or quote currency (for risk $ conversion purposes)
accountSameAsCounterCurrency = accountCurrency == syminfo.currency
accountSameAsBaseCurrency = accountCurrency == syminfo.basecurrency
// Check if our account currency is neither the base or quote currency (for risk $ conversion purposes)
accountNeitherCurrency = not accountSameAsCounterCurrency and not accountSameAsBaseCurrency
// Get currency conversion rates if applicable
conversionCurrencyPair = accountSameAsCounterCurrency ? syminfo.tickerid : accountNeitherCurrency ? accountCurrency + syminfo.currency : accountCurrency + syminfo.currency
conversionCurrencyRate = security(symbol=syminfo.type == "forex" ? "BTC_USDT:swap" : "BTC_USDT:swap", resolution="D", expression=close)
// Calculate position size
getPositionSize(stopLossSizePoints) =>
riskAmount = (accountBalance * (riskPerTrade / 100)) * (accountSameAsBaseCurrency or accountNeitherCurrency ? conversionCurrencyRate : 1.0)
riskPerPoint = (stopLossSizePoints * syminfo.pointvalue)
positionSize = (riskAmount / riskPerPoint) / syminfo.mintick
round(positionSize)
// Custom function to convert pips into whole numbers
toWhole(number) =>
return = atr(14) < 1.0 ? (number / syminfo.mintick) / (10 / syminfo.pointvalue) : number
return := atr(14) >= 1.0 and atr(14) < 100.0 and syminfo.currency == "JPY" ? return * 100 : return
//------------- END POSITION SIZE CODE -------------//
// Calculate our stop distance & size for the current bar
stopSize = atr * stopMultiplier
longStopPrice = low < low[1] ? low - stopSize : low[1] - stopSize
longStopDistance = close - longStopPrice
longTargetPrice = close + (longStopDistance * rr)
shortStopPrice = high > high[1] ? high + stopSize : high[1] + stopSize
shortStopDistance = shortStopPrice - close
shortTargetPrice = close - (shortStopDistance * rr)
// Save trade stop & target & position size if a valid setup is detected
var tradeStopPrice = 0.0
var tradeTargetPrice = 0.0
// Set up our GTD (good-til-day) order info
gtdTime = time + (gtdOrder * 1440 * 60 * 1000) // 86,400,000ms per day
gtdYear = year(gtdTime)
gtdMonth = month(gtdTime)
gtdDay = dayofmonth(gtdTime)
gtdString = " dt=" + tostring(gtdYear) + "-" + tostring(gtdMonth) + "-" + tostring(gtdDay)
// Detect valid long setups & trigger alert
if validLong
tradeStopPrice := longStopPrice
tradeTargetPrice := longTargetPrice
tradePositionSize := getPositionSize(toWhole(longStopDistance) * 10)
// Trigger AutoView long alert
alert(message="e=" + broker + " b=long q="
+ tostring(tradePositionSize)
+ " s=" + pair
+ " t=" + (limitOrder ? "limit fp=" + tostring(close) : "market")
+ " fsl=" + tostring(tradeStopPrice)
+ " ftp=" + tostring(tradeTargetPrice)
+ (gtdOrder != 0 and limitOrder ? gtdString : ""),
freq=alert.freq_once_per_bar_close)
// Detect valid short setups & trigger alert
if validShort
tradeStopPrice := shortStopPrice
tradeTargetPrice := shortTargetPrice
tradePositionSize := getPositionSize(toWhole(shortStopDistance) * 10)
// Trigger AutoView short alert
alert(message="e=" + broker + " b=short q="
+ tostring(tradePositionSize)
+ " s=" + pair
+ " t=" + (limitOrder ? "limit fp=" + tostring(close) : "market")
+ " fsl=" + tostring(tradeStopPrice)
+ " ftp=" + tostring(tradeTargetPrice)
+ (gtdOrder != 0 and limitOrder ? gtdString : ""),
freq=alert.freq_once_per_bar_close)
// Enter trades whenever a valid setup is detected
strategy.entry(id="Long", long=strategy.long, when=validLong)
strategy.entry(id="Short", long=strategy.short, when=validShort)
// Exit trades whenever our stop or target is hit
strategy.exit(id="Long Exit", from_entry="Long", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size > 0)
strategy.exit(id="Short Exit", from_entry="Short", limit=tradeTargetPrice, stop=tradeStopPrice, when=strategy.position_size < 0)
// Draw trade data
plot(strategy.position_size != 0 or validLong or validShort ? tradeStopPrice : na, title="Trade Stop Price", color=color.red, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0 or validLong or validShort ? tradeTargetPrice : na, title="Trade Target Price", color=color.green, style=plot.style_linebr, transp=0)
plot(strategy.position_size != 0 or validLong or validShort ? tradePositionSize : na, color=color.purple, transp=100, title="AutoView Position Size")
// Draw price action setup arrows
plotshape(validLong ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup")
plotshape(validShort ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup")