이 전략은 stochastic 지표가 오버 바이 오버 소드 반전점을 판단하고 MACD 지표가 트렌드 반전을 인식하여, 저비고 고비의 반전 거래 전략을 구현한다. 동시에 수익을 잠금하기 위해 스톱 로스를 추적하는 설정이 가능하며, 위험을 효과적으로 제어한다.
스토카스틱 지표를 사용하여 과매매 상황을 판단한다. 9일선은 20시 이하의 경우 과매매 지역으로, 80시 이상의 경우 과매매 지역으로, 역전 신호를 형성한다.
MACD 지표 금 포크가 더하고, 사포가 더했다. MACD 라인 브레이크 신호 라인은 평균선 반전을 예고하고, 트렌드 반전을 알려준다.
stochastic 반전 신호와 MACD 반전 신호가 동시에 나타났을 때, 더 많은 공백을 다.
트렌드에 들어간 후, 가격이 수익의 일정 비율을 달성했을 때, 트래킹 스톱을 시작; 이후 스톱 라인은 가격 상승 채널을 추적한다.
역전 신호가 나타난다면, 원래의 포지션을 닫고, 동시에 스톱피드 라인을 재설정한다.
여러 지표 판단을 통합하여 신호의 정확성을 향상시킵니다.
스토카스틱 지표는 오버 바이 오버 셀 영역을 효과적으로 식별할 수 있다.
MACD는 평균선 반전을 미리 포착하여 트렌드 반전을 파악할 수 있습니다.
손해 추적을 설정하면 수익을 보호할 수 있습니다
데이터의 충분한 회귀, 전략의 명확한 신호 생성
각 매개 변수가 최적화되며 매개 변수 조정이 가능합니다.
다중 지표 포트폴리오 최적화 난이도
반전 신호는 오차가 발생할 수 있으며, 지표의 검증이 필요합니다.
더 많은 데이터가 필요하여 테스트를 최적화할 수 있습니다.
스토카스틱과 MACD 지표는 모두 지연 문제입니다.
자주 거래하면 거래 비용이 더 높을 수 있습니다.
더 많은 지표를 추가하여 더 안정적인 거래 시스템을 만들려고 노력합니다.
다양한 주기 변수를 테스트하여 최적의 변수 조합을 찾습니다.
사용자 정의 변수 설정을 개발하고 최적 변수를 실시간으로 업데이트합니다.
최대 인출을 제어하기 위해 인출 중지 설정
거래량 지표를 추가하여 거래량 오차로 인한 오류를 방지합니다.
거래비용의 영향을 고려하여 최소 하락을 설정합니다.
이 전략은 종합적인 stochastic 지표와 MACD 지표의 장점을 가지고 있으며, 역전 거래 시점을 선택하는 것에 대한 강력한 식별 능력을 가지고 있다. 손실을 추적하는 스톱 메커니즘도 수익을 효과적으로 잠금 할 수 있다. 그러나 역전 거래 자체는 여전히 약간의 위험이 있으며, 더 많은 지표를 사용하여 검증하고 변수를 계속 테스트하여 최적화해야합니다. 안정적인 변수 조합을 얻고, 재산을 관리할 수 있다면, 이 전략은 효율적인 단선 거래 전략이 될 수 있다.
/*backtest
start: 2022-09-14 00:00:00
end: 2023-06-24 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
////////////////////////////////////////////////////////////
// @CoinDigger
//
// Credits for the base strategy go to HPotter
//
// I've just added a trail stop, basic leverage simulation and stop loss
//
////////////////////////////////////////////////////////////
// Copyright by HPotter v1.0 28/01/2021
// This is combo strategies for get a cumulative signal.
//
// First strategy
// This System was created from the Book "How I Tripled My Money In The
// Futures Market" by Ulf Jensen, Page 183. This is reverse type of strategies.
// The strategy buys at market, if close price is higher than the previous close
// during 2 days and the meaning of 9-days Stochastic Slow Oscillator is lower than 50.
// The strategy sells at market, if close price is lower than the previous close price
// during 2 days and the meaning of 9-days Stochastic Fast Oscillator is higher than 50.
//
// Second strategy
// MACD – Moving Average Convergence Divergence. The MACD is calculated
// by subtracting a 26-day moving average of a security's price from a
// 12-day moving average of its price. The result is an indicator that
// oscillates above and below zero. When the MACD is above zero, it means
// the 12-day moving average is higher than the 26-day moving average.
// This is bullish as it shows that current expectations (i.e., the 12-day
// moving average) are more bullish than previous expectations (i.e., the
// 26-day average). This implies a bullish, or upward, shift in the supply/demand
// lines. When the MACD falls below zero, it means that the 12-day moving average
// is less than the 26-day moving average, implying a bearish shift in the
// supply/demand lines.
// A 9-day moving average of the MACD (not of the security's price) is usually
// plotted on top of the MACD indicator. This line is referred to as the "signal"
// line. The signal line anticipates the convergence of the two moving averages
// (i.e., the movement of the MACD toward the zero line).
// Let's consider the rational behind this technique. The MACD is the difference
// between two moving averages of price. When the shorter-term moving average rises
// above the longer-term moving average (i.e., the MACD rises above zero), it means
// that investor expectations are becoming more bullish (i.e., there has been an
// upward shift in the supply/demand lines). By plotting a 9-day moving average of
// the MACD, we can see the changing of expectations (i.e., the shifting of the
// supply/demand lines) as they occur.
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
Reversal123(Length, KSmoothing, DLength, Level) =>
vFast = sma(stoch(close, high, low, Length), KSmoothing)
vSlow = sma(vFast, DLength)
pos = 0.0
pos := iff(close[2] < close[1] and close > close[1] and vFast < vSlow and vFast > Level, 1,
iff(close[2] > close[1] and close < close[1] and vFast > vSlow and vFast < Level, -1, nz(pos[1], 0)))
pos
MACD(fastLength,slowLength,signalLength) =>
pos = 0.0
fastMA = ema(close, fastLength)
slowMA = ema(close, slowLength)
macd = fastMA - slowMA
signal = sma(macd, signalLength)
pos:= iff(signal < macd , 1,
iff(signal > macd, -1, nz(pos[1], 0)))
pos
strategy(title="Combo Backtest 123 Reversal & MACD Crossover with Trail and Stop", shorttitle="ComboReversal123MACDWithStop", overlay = false, precision=8,default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, currency="USD", commission_type=strategy.commission.percent, commission_value=0.075)
leverage=input(2,"leverage",step=1)
percentOfEquity=input(100,"percentOfEquity",step=1)
sl_trigger = input(10, title='Stop Trail Trigger %', type=input.float)/100
sl_trail = input(5, title='Stop Trail %', type=input.float)/100
sl_inp = input(10, title='Stop Loss %', type=input.float)/100
Length = input(100, minval=1)
KSmoothing = input(1, minval=1)
DLength = input(2, minval=1)
Level = input(1, minval=1)
//-------------------------
fastLength = input(10, minval=1)
slowLength = input(19,minval=1)
signalLength=input(24,minval=1)
xSeria = input(title="Source", type=input.source, defval=close)
reverse = input(false, title="Trade reverse")
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2015, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2999, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
////////////////////////////////////////////////////////////////////////////////
////////////////////// STOP LOSS CALCULATIONS //////////////////////////////
///////////////////////////////////////////////////
cond() => barssince(strategy.position_size[1] == 0 and (strategy.position_size > 0 or strategy.position_size < 0)) > 0
lastStopLong = 0.0
lastStopLong := lastStopLong[1] != strategy.position_avg_price - (strategy.position_avg_price * (sl_inp)) and lastStopLong[1] != 0.0 ? lastStopLong[1] : strategy.position_size > 0 ? (cond() and close > strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price + (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))) : 0
lastStopShort = 0.0
lastStopShort := lastStopShort[1] != strategy.position_avg_price + (strategy.position_avg_price * (sl_inp)) and lastStopShort[1] != 9999999999.0 ? lastStopShort[1] : strategy.position_size < 0 ? (cond() and close < strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger)) ? strategy.position_avg_price - (strategy.position_avg_price * (sl_trail)) : strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))) : 9999999999.0
longStopPrice = 0.0
longStopPrice2 = 0.0
longStopPrice3 = 0.0
shortStopPrice = 0.0
longStopPrice := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice[1])
else
0
longStopPrice2 := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*2))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*2))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice2[1])
else
0
longStopPrice3 := if strategy.position_size > 0
originalStop = strategy.position_avg_price - (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price + (strategy.position_avg_price * (sl_trigger*4))
trail = strategy.position_avg_price + (strategy.position_avg_price * (sl_trail*3))
stopValue = high > trigger ? trail : 0
max(stopValue, originalStop, longStopPrice3[1])
else
0
shortStopPrice := if strategy.position_size < 0
originalStop = strategy.position_avg_price + (strategy.position_avg_price * (sl_inp))
trigger = strategy.position_avg_price - (strategy.position_avg_price * (sl_trigger))
trail = strategy.position_avg_price - (strategy.position_avg_price * (sl_trail))
stopValue = low < trigger ? trail : 999999
min(stopValue, originalStop, shortStopPrice[1])
else
999999
///////////////////////////////////////////////////
///////////////////////////////////////////////////
posReversal123 = Reversal123(Length, KSmoothing, DLength, Level)
posMACD = MACD(fastLength,slowLength, signalLength)
pos = iff(posReversal123 == 1 and posMACD == 1 , 1,
iff(posReversal123 == -1 and posMACD == -1, -1, 0))
possig = pos
quantity = max(0.000001,min(((strategy.equity*(percentOfEquity/100))*leverage/open),100000000))
if (possig == 1 and time_cond)
strategy.entry("Long", strategy.long, qty=quantity)
if (possig == -1 and time_cond)
strategy.entry("Short", strategy.short, qty=quantity)
if (strategy.position_size > 0 and possig == -1 and time_cond)
strategy.close_all()
if (strategy.position_size < 0 and possig == 1 and time_cond)
strategy.close_all()
if ((strategy.position_size < 0 or strategy.position_size > 0) and possig == 0)
strategy.close_all()
//EXIT TRADE @ TSL
if strategy.position_size > 0
strategy.exit(id="Long", stop=longStopPrice)
if strategy.position_size < 0
strategy.exit(id="Short", stop=shortStopPrice)