
다중 지표 가중 지능형 거래 전략은 다중 기술 지표의 신호를 통합하고 서로 다른 가중치를 부여하여 거래 결정을 생성하는 종합적인 정량 거래 시스템입니다. 이 전략은 MACD, 무작위 RSI, EMA, 슈퍼 트렌드 및 이동 평균 크로스 등과 같은 여러 가지 기술 분석 도구를 결합하여 포괄적인 거래 프레임 워크를 형성합니다. 이 시스템은 여러 단계의 스톱 및 다이내믹 스톱 손실 메커니즘을 지원 할뿐만 아니라 시장 상황에 따라 거래 매개 변수를 자동으로 조정하여 다양한 시장 환경에서 높은 적응력을 유지할 수 있습니다.
이 전략의 핵심은 5개의 다른 하위 전략으로 거래 신호를 생성하는 중화 신호 시스템입니다.
MACD 전략: MACD 선과 신호 선의 교차를 이용하여 시장의 경향 방향을 결정한다. MACD 선의 신호 선을 통과하면 구매 신호가 발생하고, 아래로 통과하면 판매 신호가 발생한다.
임의 RSI 전략: RSI와 무작위 지표의 장점을 결합하여 시장의 과매매 상태를 모니터링한다. 무작위 RSI가 설정된 과매매 경치보다 낮을 때 구매 신호를 발생시키고, 과매매 경치보다 높을 때 판매 신호를 발생시킨다.
EMA가 과매매하는 전략: 가격의 평균에서 벗어난 정도를 식별하기 위해 EMA를 사용하며, RSI가 설정된 초상가치보다 낮을 때 구매 신호를 발생시키고 초상가치보다 높을 때 판매 신호를 발생시킨다.
슈퍼 트렌드 전략:ATR 배수를 기반으로 가격 통로를 설정하고, 트렌드 변화를 통해 거래 방향을 결정한다. 슈퍼 트렌드 지표가 마이너스 전환으로 구매 신호를 생성하고, 마이너스 전환으로 판매 신호를 생성한다.
이동평균 교차 전략: 두 개의 다른 주기의 이동 평균의 교차를 사용하여 시장 추세를 결정한다. 단기 평균선 상에서 장기 평균선을 통과하면 구매 신호가 발생하고, 아래로 통과하면 판매 신호가 발생한다.
전략은 사용자 정의 가능한 무게 시스템을 통해 각 하위 전략의 신호에 대해 가중치를 계산하고, 가중치 합이 설정된 경계를 초과할 때만 거래를 촉발한다. 또한, 전략은 잠재적인 상위 하위 식별 메커니즘을 포함하고, 시장이 역전될 때 위치를 조정할 수 있다.
이러한 다단계 신호 확인 메커니즘은 가짜 신호를 효과적으로 줄이고 거래 시스템의 신뢰성을 높이며, 유연한 파라미터 설정은 전략이 다른 거래 품종과 기간에 적응할 수 있도록합니다.
신호 복수 확인5개의 독립된 기술 지표로 생성된 신호를 가중계하여 단일 지표로 인해 발생할 수 있는 오해를 줄이고 거래 신호의 품질과 신뢰성을 향상시킵니다.
자기 적응 중력 시스템각 하위 전략은 다른 무게를 할당 할 수 있습니다. 이는 거래자가 다른 지표에 대한 자신감과 역사적인 성과에 따라 전략의 중점을 조정할 수 있도록 해줍니다.
좋은 위험 관리이 전략은 여러 계층의 위험 제어 장치를 내장하고 있으며, 스톱, 다단계 스톱 및 스톱 위치를 동적으로 조정하는 기능을 포함하고 있으며, 시장의 불리한 변화에 따라 위험을 신속하게 제어 할 수 있습니다.
자동화된 잠재적인 상하단 식별RSI, 거래량 및 가격 동향을 종합적으로 분석하여 전략은 잠재적인 시장의 상위와 하위점을 식별하고 적절한 시간에 일부 입장을 완화하여 수익을 고정하거나 손실을 줄일 수 있습니다.
고도의 사용자 정의거의 모든 매개 변수가 조정할 수 있습니다. 각 지표의 계산주기, 무게값, 스톱로스 비율 등이 포함됩니다. 개인 스타일과 다른 시장 조건에 따라 트레이더가 전략을 최적화 할 수 있습니다.
내장 지연 장치: 조기 거래 또는 잡음 신호에 기반한 거래를 피하기 위해, 전략은 지연 확인 메커니즘을 채택하여 지속적인 신호만이 거래를 유발할 수 있도록 하며, 단기 변동의 영향을 줄입니다.
시간 필터 기능: 전략은 거래의 시작 날짜를 설정할 수 있게 해, 거래자는 역사적인 데이터에 따라 특정 기간의 성과를 재검토하거나, 알려진 시장의 비정상적인 변동기를 피할 수 있다.
과잉 최적화 위험: 변수가 많기 때문에, 과도하게 역사 데이터에 적합할 위험이 존재하여, 실판 거래에서 전략이 좋지 않을 수 있습니다. 해결책은 여러 시간 주기 및 품종에 걸쳐 재검토하고, 비교적 안정적인 변수 설정을 사용하여 특정 역사 데이터에 대한 과도한 최적화를 피합니다.
시장 조건의 변화 위험전략: 트렌드 시장과 흔들림 시장에서 전략의 성능이 다를 수 있으며, 시장 상태의 급격한 변화는 전략의 효과가 떨어질 수 있습니다. 해결책은 시장 환경 식별 장치를 도입하여 다른 시장 상태에서 매개 변수를 조정하거나 거래를 중단하는 것입니다.
신호 충돌 위험: 여러 지표가 동시에 사용되면 서로 상반되는 신호가 발생하여 의사 결정에 혼란을 초래합니다. 해결책은 각 지표의 무게를 합리적으로 설정하여 더 신뢰할 수있는 지표를 강조하고 충돌 가능성을 줄이기 위해 신호 값을 합리적으로 설정하는 것입니다.
부적절한 자금 관리의 위험전략에는 스톱로스 메커니즘이 포함되어 있지만, 불합리한 자금 관리로 인해 자금이 빠르게 소모 될 수 있습니다. 해결책은 거래당 자금 비율을 엄격히 제어하여 단일 거래의 최대 위험을 감당할 수 있는 범위 내에서 보장하는 것입니다.
기술 실패의 위험: 자동화 거래 시스템은 네트워크 중단, 데이터 지연 등의 기술적 문제에 직면할 수 있다. 해결책은 수동 개입 장치를 설정하고, 정기적으로 시스템 운영 상태를 모니터링하고, 특이한 상황을 제때 처리하는 것이다.
시장 환경 필터에 가입하세요: 현재 시장이 추세인지 흔들리는지 식별할 수 있는 지표를 개발하고, 시장 상태의 동성에 따라 각 하위 전략의 무게를 조정하고, 추세 시장에서 트렌드 추적 전략을 강화하고, 흔들리는 시장에서 스윙 전략을 강화한다.
기계학습 최적화를 도입합니다.: 기계 학습 기술을 사용하여 각 지표의 파라미터와 무게를 자동으로 조정하여 최신 시장 데이터에 따라 전략이 계속 학습하고 적응할 수 있도록 하여 전략의 동적 적응력을 향상시킵니다.
거래량 분석: 거래량 변화를 추가 확인 신호로 사용하여 예상 거래량에 부합하는 거래만 실행하여 신호의 신뢰성을 높인다.
잠재적인 상단 하단 식별 알고리즘을 최적화: 기존의 상단 인식 논리를 개선하고, 가격 형태, 다중 주기 확인 등과 같은 확인 요소를 추가하여 식별의 정확성을 향상시킨다.
감정 지표에 가입하세요: 공포 지수 (VIX) 와 낙점 옵션 비율과 같은 시장 정서 지표를 통합하고, 극심한 시장 정서 시 거래 전략을 조정하거나 거래를 중단하여 높은 변동 기간에 과도한 거래를 피하십시오.
동적 스톱스톱 손실 메커니즘 개발: 시장의 변동에 따라 자동으로 중지 중지 손실 수준을 조정하고, 높은 변동성 시장에서 중지 손실 범위를 넓히고, 낮은 변동성 시장에서 중지 손실을 강화하여 위험 관리를 더 유연하고 효율적으로 만듭니다.
시간주기 최적화: 더 많은 시간 주기의 분석 기능을 추가하여 더 높은 수준과 더 낮은 수준의 시간 주기를 동시에 확인하는 신호를 요구하고, 가짜 돌파구와 가짜 신호를 줄인다.
다중 지표 가중 지능 거래 전략은 여러 가지 기술 분석 도구를 통합하고 다양한 가중치를 부여하여 포괄적이고 유연한 거래 시스템을 구축합니다. 이 전략은 신호의 여러 가지 확인, 자동 적응 가중 시스템 및 완벽한 위험 관리 기능뿐만 아니라 자동화 된 잠재적인 상위 하위 식별 메커니즘을 포함합니다. 이는 복잡한 변화하는 시장 환경에서 강력한 적응력을 보여줍니다.
변수 과잉 최적화, 시장 조건의 변화, 신호 충돌과 같은 잠재적인 위험이 있음에도 불구하고, 이러한 위험은 합리적인 변수 설정, 시장 환경 식별 및 엄격한 자금 관리를 통해 효과적으로 제어 할 수 있습니다. 미래 최적화 방향은 시장 환경 필터를 추가하는 것, 기계 학습 기술을 도입하는 것, 거래량 분석을 강화하는 것, 잠재적인 상위 하위 식별 알고리즘을 최적화하는 것 등이 있습니다. 이러한 개선은 전략의 안정성과 수익성을 더욱 향상시킬 것입니다.
체계화 된 거래 방법을 찾는 투자자에게, 이러한 다중 지표 가중 지능형 거래 전략은 거래 결정에 대한 감정적 인 요소의 영향을 줄일 수있을뿐만 아니라 데이터 주도 방식으로 거래 성능을 지속적으로 최적화 할 수있는 고려할 가치가있는 프레임 워크를 제공합니다. 이 전략을 실행할 때, 보수적인 매개 변수 설정에서 시작하여 단계적으로 조정하고 전략 성능을 면밀히 모니터링하여 개인 위험 선호와 시장 조건에 가장 적합한配置을 찾습니다.
/*backtest
start: 2024-09-08 00:00:00
end: 2025-02-23 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
// **********************************************************************************************************************************************************************************************************************************************************************
// Last update: 08/03/2022
// *************************************************************************************************************************************************************************************************************************************************************************
//@version=5
strategy(title='Smart trading', overlay=true, precision=2, commission_value=0.075, commission_type=strategy.commission.percent, initial_capital=1000, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=100, slippage=1,calc_on_every_tick = false,calc_on_order_fills = true)
// *************************************************************************************************************************************************************************************************************************************************************************
// COMMENTS
// *************************************************************************************************************************************************************************************************************************************************************************
chat_id = input("-1001587924564",'Chat ID Telegram')
procent_stop = input.float(1.0,'Процент стоп')
procent_teik = input.float(4.0,'Процент TP4 ')
// *************************************************************************************************************************************************************************************************************************************************************************
// INPUTS
// *************************************************************************************************************************************************************************************************************************************************************************
// * Type trading
allow_longs = input.bool(true, 'Только лонги', group='Trading type')
allow_shorts = input.bool(true, 'Только шорты', group='Trading type')
// * Datastamp
from_day = input.int(1, 'From Day', minval=1, maxval=31, group='DataStamp')
from_month = input.int(1, 'From Month', minval=1, maxval=12, group='DataStamp')
from_year = input.int(2021, 'From Year', minval=1980, maxval=9999, group='DataStamp')
to_day = input.int(1, 'To Day', minval=1, maxval=31, group='DataStamp')
to_month = input.int(1, 'To Month', minval=1, maxval=12, group='DataStamp')
to_year = input.int(9999, 'To Year', minval=2017, maxval=9999, group='DataStamp')
// * Stop loss
stoploss = input.bool(true, 'Стоп лосс в стратегии', group='Stop loss')
movestoploss = input.string('TP-2', 'Перенос стопа', options=['None', 'Percentage', 'TP-1', 'TP-2', 'TP-3'], group='Stop loss')
movestoploss_entry = input.bool(false, 'Перенос стопа на твх', group='Stop loss')
stoploss_perc = input.float(6.0, 'Стоп лосс в %', minval=0, maxval=100, group='Stop loss') * 0.01
move_stoploss_factor = input.float(20.0, 'Фактор переноса стопа в %', group='Stop loss') * 0.01 + 1
stop_source = input.source(hl2, 'Stop Source', group='Stop loss')
// * Take profits
take_profits = input.bool(true, 'Тейк профит в стратегии', group='Take Profits')
// retrade= input.bool(false, 'Retrade', group='Take Profits')
MAX_TP = input.int(6, 'Кол-во TP', minval=1, maxval=10, group='Take Profits')
long_profit_perc = input.float(6.8, 'Long - TP в % каждый', minval=0.0, maxval=999, step=1, group='Take Profits') * 0.01
long_profit_qty = input.float(15, 'Long - TP в % от твх', minval=0.0, maxval=100, step=1, group='Take Profits')
short_profit_perc = input.float(13, 'Short - TP в % каждый', minval=0.0, maxval=999, step=1, group='Take Profits') * 0.01
short_profit_qty = input.float(10, 'Short - TP в % от твх', minval=0.0, maxval=100, step=1, group='Take Profits')
// * Delays
delay_macd = input.int(1, 'Candles delay MACD', minval=1, group='Delays')
delay_srsi = input.int(2, 'Candles delay RSI', minval=1, group='Delays')
delay_rsi = input.int(2, 'Candles delay EMA', minval=1, group='Delays')
delay_super = input.int(1, 'Candles delay Supertrend', minval=1, group='Delays')
delay_cross = input.int(1, 'Candles delay MA', minval=1, group='Delays')
delay_exit = input.int(7, 'Candles delay exit', minval=1, group='Delays')
// * Inputs Smart strategies
str_0 = input.bool(true, 'Strategy 0: Weighted Strategy', group='Weights')
weight_trigger = input.int(2, 'Smart Signal entry [0, 5]', minval=0, maxval=5, step=1, group='Weights')
weight_str1 = input.int(1, 'Smart Strategy 1 [0, 5]', minval=0, maxval=5, step=1, group='Weights')
weight_str2 = input.int(1, 'Smart Strategy 2 [0, 5]', minval=0, maxval=5, step=1, group='Weights')
weight_str3 = input.int(1, 'Smart Strategy 3 [0, 5]', minval=0, maxval=5, step=1, group='Weights')
weight_str4 = input.int(1, 'Smart Strategy 4 [0, 5]', minval=0, maxval=5, step=1, group='Weights')
weight_str5 = input.int(1, 'Smart Strategy 5 [0, 5]', minval=0, maxval=5, step=1, group='Weights')
// * Inputs strategy 1: MACD
str_1 = input.bool(true, 'Strategy 1: MACD', group='Strategy 1: MACD')
MA1_period_1 = input.int(16, 'MA 1', minval=1, maxval=9999, step=1, group='Strategy 1: MACD')
MA1_type_1 = input.string('EMA', 'MA1 Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'DEMA', 'TEMA', 'VWMA'], group='Strategy 1: MACD')
MA1_source_1 = input.source(hl2, 'MA1 Source', group='Strategy 1: MACD')
MA2_period_1 = input.int(36, 'MA 2', minval=1, maxval=9999, step=1, group='Strategy 1: MACD')
MA2_type_1 = input.string('EMA', 'MA2 Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'DEMA', 'TEMA', 'VWMA'], group='Strategy 1: MACD')
MA2_source_1 = input.source(high, 'MA2 Source', group='Strategy 1: MACD')
// * Inputs strategy 2: RSI oversold/overbought
str_2 = input.bool(true, 'Strategy 2: RSI', group='Strategy 2: RSI')
long_RSI = input.float(70, 'Exit RSI Long (%)', minval=0.0, step=1, group='Strategy 2: RSI')
short_RSI = input.float(27, 'Exit RSI Short (%)', minval=0.0, step=1, group='Strategy 2: RSI')
length_RSI = input.int(14, 'RSI Length', group='Strategy 2: RSI')
length_stoch = input.int(14, 'RSI Stochastic', group='Strategy 2: RSI')
smoothK = input.int(3, 'Smooth', group='Strategy 2: RSI')
// * Inputs strategy 3: EMA oversold/overbought
str_3 = input.bool(true, 'Strategy 3: RSI', group='Strategy 3: RSI')
long_RSI2 = input.float(77, 'Exit EMA Long', minval=0.0, step=1, group='Strategy 3: RSI')
short_RSI2 = input.float(30, 'Exit EMA Short', minval=0.0, step=1, group='Strategy 3: RSI')
// * Inputs strategy 4: Supertrend
str_4 = input.bool(true, 'Strategy 4: Supertrend', group='Strategy 4: Supertrend')
periods_4 = input.int(2, 'ATR Period', group='Strategy 4: Supertrend')
source_4 = input.source(hl2, 'Source', group='Strategy 4: Supertrend')
multiplier = input.float(2.4, 'ATR Multiplier', step=0.1, group='Strategy 4: Supertrend')
change_ATR = input.bool(true, 'Change ATR Calculation Method ?', group='Strategy 4: Supertrend')
// * Inputs strategy 5: MA
str_5 = input.bool(true, 'Strategy 5: MA', group='Strategy 5: MA')
MA1_period_5 = input.int(46, 'MA 1', minval=1, maxval=9999, step=1, group='Strategy 5: MA')
MA1_type_5 = input.string('EMA', 'MA1 Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'DEMA', 'TEMA', 'VWMA'], group='Strategy 5: MA')
MA1_source_5 = input.source(close, 'MA1 Source', group='Strategy 5: MA')
MA2_period_5 = input.int(82, 'MA 2', minval=1, maxval=9999, step=1, group='Strategy 5: MA')
MA2_type_5 = input.string('EMA', 'MA2 Type', options=['RMA', 'SMA', 'EMA', 'WMA', 'HMA', 'DEMA', 'TEMA', 'VWMA'], group='Strategy 5: MA')
MA2_source_5 = input.source(close, 'MA2 Source', group='Strategy 5: MA')
// * Inputs Potential TOP/BOTTOM
str_6 = input.bool(false, 'Потенциальные ордера long/short', group='Potential TOP/BOTTOM')
top_qty = input.float(30, 'Лонг закрыть (%) из оставшейся позиции', minval=0.0, maxval=100, step=1, group='Potential TOP/BOTTOM')
bottom_qty = input.float(30, 'Шорт закрыть (%) из оставшейся позиции', minval=0.0, maxval=100, step=1, group='Potential TOP/BOTTOM')
source_6_top = input.source(close, 'TP-TOP на предыдущий', group='Potential TOP/BOTTOM')
source_6_bottom = input.source(close, 'TP-BOTTOM на предыдущий', group='Potential TOP/BOTTOM')
long_trail_perc = input.float(150, 'Объем Long (%)', minval=0.0, step=1, group='Potential TOP/BOTTOM') * 0.01
short_trail_perc = input.float(150, 'Объем Short (%)', minval=0.0, step=1, group='Potential TOP/BOTTOM') * 0.01
// * Flags
FLAG_SIGNALS = input.bool(true, 'Show Buy/Sell Signals ?', group='Miscellaneous')
FLAG_SHADOWS = input.bool(true, 'Show shadows satisfied strategies ?', group='Miscellaneous')
// * Alarms
alarm_label_long = input.string('Buy', 'Label open long', group='Basic alarm system')
alarm_label_short = input.string('Sell', 'Label open short', group='Basic alarm system')
alarm_label_close_long = input.string('Close long', 'Label close long', group='Basic alarm system')
alarm_label_close_short = input.string('Close short', 'Label close short', group='Basic alarm system')
alarm_label_TP_long = input.string('TP long', 'Label Take Profit long', group='Basic alarm system')
alarm_label_TP_short = input.string('TP short', 'Label Take Profit short', group='Basic alarm system')
alarm_label_SL = input.string('SL', 'Label Stop-Loss', group='Basic alarm system')
// *************************************************************************************************************************************************************************************************************************************************************************
// ABBREVIATIONS
// *************************************************************************************************************************************************************************************************************************************************************************
// TP: Take profits
// SL: Stop-Loss
// *************************************************************************************************************************************************************************************************************************************************************************
// GLOBAL VARIABLES
// *************************************************************************************************************************************************************************************************************************************************************************
start = timestamp(from_year, from_month, from_day, 00, 00) // backtest start window
end = timestamp(to_year, to_month, to_day, 23, 59)// backtest finish window
var FLAG_FIRST = false
var price_stop_long = 0.
var price_stop_short = 0.
var profit_qty = 0. // Quantity to close per TP from open position
var profit_perc = 0. // Percentage to take profits since open position or last TP
var nextTP = 0. // Next target to take profits
var since_entry = 0 // Number of bars since open last postion
var since_close = 0 // Number of bars since close or TP/STOP last position
// * Compute profit quantity and profit percentage
if strategy.position_size > 0
profit_qty := long_profit_qty
profit_perc := long_profit_perc
else if strategy.position_size < 0
profit_qty := short_profit_qty
profit_perc := short_profit_perc
else
nextTP := 0. // Next Take Profit target (out of market)
// *************************************************************************************************************************************************************************************************************************************************************************
// FUNCTIONS
// *************************************************************************************************************************************************************************************************************************************************************************
// * MA type
// *************************************************************************************************************************************************************************************************************************************************************************
ma(MAType, MASource, MAPeriod) =>
if MAType == 'SMA'
ta.sma(MASource, MAPeriod)
else if MAType == 'EMA'
ta.ema(MASource, MAPeriod)
else if MAType == 'WMA'
ta.wma(MASource, MAPeriod)
else if MAType == 'RMA'
ta.rma(MASource, MAPeriod)
else if MAType == 'HMA'
ta.wma(2 * ta.wma(MASource, MAPeriod / 2) - ta.wma(MASource, MAPeriod), math.round(math.sqrt(MAPeriod)))
else if MAType == 'DEMA'
e = ta.ema(MASource, MAPeriod)
2 * e - ta.ema(e, MAPeriod)
else if MAType == 'TEMA'
e = ta.ema(MASource, MAPeriod)
3 * (e - ta.ema(e, MAPeriod)) + ta.ema(ta.ema(e, MAPeriod), MAPeriod)
else if MAType == 'VWMA'
ta.vwma(MASource, MAPeriod)
// *************************************************************************************************************************************************************************************************************************************************************************
// * Number strategies
// *************************************************************************************************************************************************************************************************************************************************************************
n_strategies() =>
var result = 0.
if str_1
result := 1.
if str_2
result += 1.
if str_3
result += 1.
if str_4
result += 1.
if str_5
result += 1.
// *************************************************************************************************************************************************************************************************************************************************************************
// * Price take profit
// *************************************************************************************************************************************************************************************************************************************************************************
price_takeProfit(percentage, N) =>
if strategy.position_size > 0
strategy.position_avg_price * (1 + N * percentage)
else
strategy.position_avg_price * (1 - N * percentage)
// *************************************************************************************************************************************************************************************************************************************************************************
// * Weigthed values
// *************************************************************************************************************************************************************************************************************************************************************************
weight_values(signal) =>
if signal
weight = 1.0
else
weight = 0.
// *************************************************************************************************************************************************************************************************************************************************************************
// * Weigthed total
// *************************************************************************************************************************************************************************************************************************************************************************
weight_total(signal1, signal2, signal3, signal4, signal5) =>
weight_str1 * weight_values(signal1) + weight_str2 * weight_values(signal2) + weight_str3 * weight_values(signal3) + weight_str4 * weight_values(signal4) + weight_str5 * weight_values(signal5)
// *************************************************************************************************************************************************************************************************************************************************************************
// * Set alert TP message
// *************************************************************************************************************************************************************************************************************************************************************************
set_alarm_label_TP() =>
if strategy.position_size > 0
alarm_label_TP_long
else if strategy.position_size < 0
alarm_label_TP_short
// *************************************************************************************************************************************************************************************************************************************************************************
// * Color
// *************************************************************************************************************************************************************************************************************************************************************************
colors(type, value=0) =>
switch str.lower(type)
'buy'=> color.new(color.aqua, value)
'sell' => color.new(color.gray, value)
'TP' => color.new(color.aqua, value)
'SL' => color.new(color.gray, value)
'signal' => color.new(color.orange, value)
'profit' => color.new(color.teal, value)
'loss' => color.new(color.red, value)
'info' => color.new(color.white, value)
'highlights' => color.new(color.orange, value)
// *************************************************************************************************************************************************************************************************************************************************************************
// * Bar since last entry
// *************************************************************************************************************************************************************************************************************************************************************************
bars_since_entry() =>
bar_index - strategy.opentrades.entry_bar_index(0)
// *************************************************************************************************************************************************************************************************************************************************************************
// * Bar since close or TP/STOP
// *************************************************************************************************************************************************************************************************************************************************************************
bars_since_close() =>
ta.barssince(ta.change(strategy.closedtrades))
// *************************************************************************************************************************************************************************************************************************************************************************
// ADDITIONAL GLOBAL VARIABLES
// *************************************************************************************************************************************************************************************************************************************************************************
// * Compute time since last entry and last close/TP position
since_entry := bars_since_entry()
since_close := bars_since_close()
if strategy.opentrades == 0
since_entry := delay_exit
if strategy.closedtrades == 0
since_close := delay_exit
// *************************************************************************************************************************************************************************************************************************************************************************
// STRATEGIES
// *************************************************************************************************************************************************************************************************************************************************************************
// * STRATEGY 1: MACD
// *************************************************************************************************************************************************************************************************************************************************************************
MA1 = ma(MA1_type_1, MA1_source_1, MA1_period_1)
MA2 = ma(MA2_type_1, MA2_source_1, MA2_period_1)
MACD = MA1 - MA2
signal = ma('SMA', MACD, 9)
trend= MACD - signal
long = MACD > signal
short = MACD < signal
proportion = math.abs(MACD / signal)
// * Conditions
long_signal1 = long and long[delay_macd - 1] and not long[delay_macd]
short_signal1 = short and short[delay_macd - 1] and not short[delay_macd]
close_long1 = short and not long[delay_macd]
close_short1 = long and not short[delay_macd]
// *************************************************************************************************************************************************************************************************************************************************************************
// * STRATEGY 2: STOCH RSI
// *************************************************************************************************************************************************************************************************************************************************************************
rsi = ta.rsi(close, length_RSI)
srsi = ta.stoch(rsi, rsi, rsi, length_stoch)
k = ma('SMA', srsi, smoothK)
isRsiOB = k >= long_RSI
isRsiOS = k <= short_RSI
// * Conditions
long_signal2 = isRsiOS[delay_srsi] and not isRsiOB and since_entry >= delay_exit and since_close >= delay_exit
short_signal2 = isRsiOB[delay_srsi] and not isRsiOS and since_entry >= delay_exit and since_close >= delay_exit
close_long2 = short_signal2
close_short2 = long_signal2
// *************************************************************************************************************************************************************************************************************************************************************************
// * STRATEGY 3: RSI
// *************************************************************************************************************************************************************************************************************************************************************************
isRsiOB2 = rsi >= long_RSI2
isRsiOS2 = rsi <= short_RSI2
// * Conditions
long_signal3 = isRsiOS2[delay_rsi] and not isRsiOB2 and since_entry >= delay_exit and since_close >= delay_exit
short_signal3 = isRsiOB2[delay_rsi] and not isRsiOS2 and since_entry >= delay_exit and since_close >= delay_exit
close_long3 = short_signal3
close_short3 = long_signal3
// *************************************************************************************************************************************************************************************************************************************************************************
// * STRATEGY 4: SUPERTREND
// *************************************************************************************************************************************************************************************************************************************************************************
atr2 = ma('SMA', ta.tr, periods_4)
atr = change_ATR ? ta.atr(periods_4) : atr2
up = source_4 - multiplier * atr
up1 = nz(up[1], up)
up := close[1] > up1 ? math.max(up, up1) : up
dn = source_4 + multiplier * atr
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? math.min(dn, dn1) : dn
trend := 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
// * Conditions
long4 = trend == 1
short4 = trend == -1
long_signal4 = trend == 1 and trend[delay_super - 1] == 1 and trend[delay_super] == -1
short_signal4 = trend == -1 and trend[delay_super - 1] == -1 and trend[delay_super] == 1
changeCond = trend != trend[1]
close_long4 = short_signal4
close_short4 = short_signal4
// *************************************************************************************************************************************************************************************************************************************************************************
// * STRATEGY 5: MA CROSS
// *************************************************************************************************************************************************************************************************************************************************************************
MA12 = ma(MA1_type_5, MA1_source_5, MA1_period_5)
MA22 = ma(MA2_type_5, MA2_source_5, MA2_period_5)
long5 = MA12 > MA22
short5 = MA12 < MA22
// * Conditions
long_signal5 = long5 and long5[delay_cross - 1] and not long5[delay_cross]
short_signal5 = short5 and short5[delay_cross - 1] and not short5[delay_cross]
close_long5 = short5 and not long5[delay_cross]
close_short5 = long5 and not short5[delay_cross]
// *************************************************************************************************************************************************************************************************************************************************************************
// * STRATEGY 6: POTENTIAL TOP/BOTTOM
// *************************************************************************************************************************************************************************************************************************************************************************
// * Combination RSI, Stoch RSI, MACD, volume, and weighted-strategy to detect potential TOP/BOTTOMS areas
volumeRSI_condition = volume[2] > volume[3] and volume[2] > volume[4] and volume[2] > volume[5]
condition_OB1 = isRsiOB2 and (isRsiOB or volume < ma('SMA', volume, 20) / 2) and volumeRSI_condition
condition_OS1 = isRsiOS2 and (isRsiOS or volume < ma('SMA', volume, 20) / 2) and volumeRSI_condition
condition_OB2 = volume[2] / volume[1] > (1.0 + long_trail_perc) and isRsiOB and volumeRSI_condition
condition_OS2 = volume[2] / volume[1] > (1.0 + short_trail_perc) and isRsiOS and volumeRSI_condition
condition_OB3 = weight_total(MACD < signal, isRsiOB, isRsiOB2, short4, short5) >= weight_trigger
condition_OS3 = weight_total(MACD > signal, isRsiOS, isRsiOS2, long4, long5) >= weight_trigger
condition_OB = (condition_OB1 or condition_OB2)
condition_OS = (condition_OS1 or condition_OS2)
condition_OB_several = condition_OB[1] and condition_OB[2] or condition_OB[1] and condition_OB[3] or condition_OB[1] and condition_OB[4] or condition_OB[1] and condition_OB[5] or condition_OB[1] and condition_OB[6] or condition_OB[1] and condition_OB[7]
condition_OS_several = condition_OS[1] and condition_OS[2] or condition_OS[1] and condition_OS[3] or condition_OS[1] and condition_OS[4] or condition_OS[1] and condition_OS[5] or condition_OS[1] and condition_OS[6] or condition_OS[1] and condition_OS[7]
// *************************************************************************************************************************************************************************************************************************************************************************
// STRATEGY ENTRIES AND EXITS
// *************************************************************************************************************************************************************************************************************************************************************************
long_SL = close - ((close / 100) * procent_stop)
long_OP = close
long_TP_1 = close + ((close / 100) * (procent_teik * 1.1))
long_TP_2 = close + ((close / 100) * (procent_teik * 1.8))
long_TP_3 = close + ((close / 100) * (procent_teik * 2.8))
long_TP_4 = close + ((close / 100) * (procent_teik * 4.5))
short_SL = close + ((close / 100) * procent_stop)
short_OP = close
short_TP_1 = close - ((close / 100) * (procent_teik * 1.1))
short_TP_2 = close - ((close / 100) * (procent_teik * 1.8))
short_TP_3 = close - ((close / 100) * (procent_teik * 2.8))
short_TP_4 = close - ((close / 100) * (procent_teik * 4.5))
if time >= start and time <= end
// ***************************************************************************************************************************************************************************
// * Set Entries
// ***************************************************************************************************************************************************************************
if str_0
if not str_1
weight_str1 := 0
if not str_2
weight_str2 := 0
if not str_3
weight_str3 := 0
if not str_4
weight_str4 := 0
if not str_5
weight_str5 := 0
if allow_shorts == true
w_total = weight_total(short_signal1, short_signal2, short_signal3, short_signal4, short_signal5)
if w_total >= weight_trigger
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(short_TP_1)) + ' ' + str.tostring(math.round_to_mintick(short_TP_2)) + ' ' + str.tostring(math.round_to_mintick(short_TP_3)) + ' ' + str.tostring(math.round_to_mintick(short_TP_4)) + ' ' + str.tostring(math.round_to_mintick(short_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
strategy.entry('Short', strategy.short)
if allow_longs == true
w_total = weight_total(long_signal1, long_signal2, long_signal3, long_signal4, long_signal5)
if w_total >= weight_trigger
strategy.entry('Long', strategy.long)
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('LONG') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
else
if allow_shorts == true
if str_1
strategy.entry('Short', strategy.short, when=short_signal1)
// alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + str.tostring(math.round_to_mintick(close)) + '"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(short_TP_1)) + ' ' + str.tostring(math.round_to_mintick(short_TP_2)) + ' ' + str.tostring(math.round_to_mintick(short_TP_3)) + ' ' + str.tostring(math.round_to_mintick(short_TP_4)) + ' ' + str.tostring(math.round_to_mintick(short_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_2
strategy.entry('Short', strategy.short, when=short_signal2)
// alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + str.tostring(math.round_to_mintick(close)) + '"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(short_TP_1)) + ' ' + str.tostring(math.round_to_mintick(short_TP_2)) + ' ' + str.tostring(math.round_to_mintick(short_TP_3)) + ' ' + str.tostring(math.round_to_mintick(short_TP_4)) + ' ' + str.tostring(math.round_to_mintick(short_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_3
strategy.entry('Short', strategy.short, when=short_signal3)
// alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + str.tostring(math.round_to_mintick(close)) + '"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(short_TP_1)) + ' ' + str.tostring(math.round_to_mintick(short_TP_2)) + ' ' + str.tostring(math.round_to_mintick(short_TP_3)) + ' ' + str.tostring(math.round_to_mintick(short_TP_4)) + ' ' + str.tostring(math.round_to_mintick(short_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_4
strategy.entry('Short', strategy.short, when=short_signal4)
// alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + str.tostring(math.round_to_mintick(close)) + '"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(short_TP_1)) + ' ' + str.tostring(math.round_to_mintick(short_TP_2)) + ' ' + str.tostring(math.round_to_mintick(short_TP_3)) + ' ' + str.tostring(math.round_to_mintick(short_TP_4)) + ' ' + str.tostring(math.round_to_mintick(short_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_5
strategy.entry('Short', strategy.short, when=short_signal5)
// alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + str.tostring(math.round_to_mintick(close)) + '"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('SHORT') + ' ' + str.tostring(math.round_to_mintick(short_TP_1)) + ' ' + str.tostring(math.round_to_mintick(short_TP_2)) + ' ' + str.tostring(math.round_to_mintick(short_TP_3)) + ' ' + str.tostring(math.round_to_mintick(short_TP_4)) + ' ' + str.tostring(math.round_to_mintick(short_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if allow_longs == true
if str_1
strategy.entry('Long', strategy.long, when=long_signal1)
// alert('{"chat_id":"'+ chat_id +'","text":"#' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' min'+ '\n' + str.tostring('LONG') + '\n' +'Вход на 1-3% от депозита \n' + 'TP 1: ' + str.tostring(math.round_to_mintick(long_TP_1)) + '\n' + 'TP 2: ' + str.tostring(math.round_to_mintick(long_TP_2)) + '\n' + 'TP 3: ' + str.tostring(math.round_to_mintick(long_TP_3)) + '\n' + 'TP 4: ' + str.tostring(math.round_to_mintick(long_TP_4)) + '\n' + '?? STOP: ' + str.tostring(math.round_to_mintick(long_SL)) +'"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('LONG') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_2
strategy.entry('Long', strategy.long, when=long_signal2)
// alert('{"chat_id":"'+ chat_id +'","text":"#' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' min'+ '\n' + str.tostring('LONG') + '\n' +'Вход на 1-3% от депозита \n' + 'TP 1: ' + str.tostring(math.round_to_mintick(long_TP_1)) + '\n' + 'TP 2: ' + str.tostring(math.round_to_mintick(long_TP_2)) + '\n' + 'TP 3: ' + str.tostring(math.round_to_mintick(long_TP_3)) + '\n' + 'TP 4: ' + str.tostring(math.round_to_mintick(long_TP_4)) + '\n' + '?? STOP: ' + str.tostring(math.round_to_mintick(long_SL)) +'"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('LONG') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_3
strategy.entry('Long', strategy.long, when=long_signal3)
// alert('{"chat_id":"'+ chat_id +'","text":"#' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' min'+ '\n' + str.tostring('LONG') + '\n' +'Вход на 1-3% от депозита \n' + 'TP 1: ' + str.tostring(math.round_to_mintick(long_TP_1)) + '\n' + 'TP 2: ' + str.tostring(math.round_to_mintick(long_TP_2)) + '\n' + 'TP 3: ' + str.tostring(math.round_to_mintick(long_TP_3)) + '\n' + 'TP 4: ' + str.tostring(math.round_to_mintick(long_TP_4)) + '\n' + '?? STOP: ' + str.tostring(math.round_to_mintick(long_SL)) +'"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('LONG') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_4
strategy.entry('Long', strategy.long, when=long_signal4)
// alert('{"chat_id":"'+ chat_id +'","text":"#' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' min'+ '\n' + str.tostring('LONG') + '\n' +'Вход на 1-3% от депозита \n' + 'TP 1: ' + str.tostring(math.round_to_mintick(long_TP_1)) + '\n' + 'TP 2: ' + str.tostring(math.round_to_mintick(long_TP_2)) + '\n' + 'TP 3: ' + str.tostring(math.round_to_mintick(long_TP_3)) + '\n' + 'TP 4: ' + str.tostring(math.round_to_mintick(long_TP_4)) + '\n' + '?? STOP: ' + str.tostring(math.round_to_mintick(long_SL)) +'"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('LONG') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
if str_5
strategy.entry('Long', strategy.long, when=long_signal5)
// alert('{"chat_id":"'+ chat_id +'","text":"#' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' min'+ '\n' + str.tostring('LONG') + '\n' +'Вход на 1-3% от депозита \n' + 'TP 1: ' + str.tostring(math.round_to_mintick(long_TP_1)) + '\n' + 'TP 2: ' + str.tostring(math.round_to_mintick(long_TP_2)) + '\n' + 'TP 3: ' + str.tostring(math.round_to_mintick(long_TP_3)) + '\n' + 'TP 4: ' + str.tostring(math.round_to_mintick(long_TP_4)) + '\n' + '?? STOP: ' + str.tostring(math.round_to_mintick(long_SL)) +'"}')
alert('{"chat_id":"'+ chat_id +'","text":"' + syminfo.ticker + ' ' + str.tostring(timeframe.period) + ' ' + str.tostring('LONG') + ' ' + str.tostring(math.round_to_mintick(long_TP_1)) + ' ' + str.tostring(math.round_to_mintick(long_TP_2)) + ' ' + str.tostring(math.round_to_mintick(long_TP_3)) + ' ' + str.tostring(math.round_to_mintick(long_TP_4)) + ' ' + str.tostring(math.round_to_mintick(long_SL)) + ' ' + str.tostring(math.round_to_mintick(close)) + '"}')
// ***************************************************************************************************************************************************************************
// * Set Take Profits
// ***************************************************************************************************************************************************************************
if strategy.position_size != 0 and take_profits and since_entry == 0
for i = 1 to MAX_TP
id = 'TP ' + str.tostring(i)
strategy.exit(id=id, limit=price_takeProfit(profit_perc, i), qty_percent=profit_qty, comment=id)
// ***************************************************************************************************************************************************************************
// * Set Stop loss
// ***************************************************************************************************************************************************************************
if strategy.position_size > 0
if since_close == 0
if high > price_takeProfit(profit_perc, 6) and MAX_TP >= 6
n = 6
nextTP := na
if movestoploss == 'Percentage'
price_stop_long := strategy.position_avg_price * (1 + n*profit_perc - stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_long := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_long := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3'
price_stop_long := price_takeProfit(profit_perc, n-3)
else if high > price_takeProfit(profit_perc, 5) and MAX_TP >= 5
n = 5
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_long := strategy.position_avg_price * (1 + n*profit_perc - stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_long := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_long := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3'
price_stop_long := price_takeProfit(profit_perc, n-3)
else if high > price_takeProfit(profit_perc, 4) and MAX_TP >= 4
n = 4
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_long := strategy.position_avg_price * (1 + n*profit_perc - stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_long := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_long := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3'
price_stop_long := price_takeProfit(profit_perc, n-3)
else if high > price_takeProfit(profit_perc, 3) and MAX_TP >= 3
n = 3
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_long := strategy.position_avg_price * (1 + n*profit_perc - stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_long := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_long := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3' and movestoploss_entry
price_stop_long := strategy.position_avg_price
else if high > price_takeProfit(profit_perc, 2) and MAX_TP >= 2
n = 2
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_long := strategy.position_avg_price * (1 + n*profit_perc - stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_long := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2' and movestoploss_entry
price_stop_long := strategy.position_avg_price
else if movestoploss == 'TP-3' and movestoploss_entry
price_stop_long := strategy.position_avg_price
else if high > price_takeProfit(profit_perc, 1) and MAX_TP >= 1
n = 1
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_long := strategy.position_avg_price * (1 + n*profit_perc - stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1' and movestoploss_entry
price_stop_long := strategy.position_avg_price
else if movestoploss == 'TP-2' and movestoploss_entry
price_stop_long := strategy.position_avg_price
else if movestoploss == 'TP-3' and movestoploss_entry
price_stop_long := strategy.position_avg_price
if since_entry == 0
n = 0
nextTP := price_takeProfit(profit_perc, n + 1)
price_stop_long := strategy.position_avg_price * (1 - stoploss_perc)
if strategy.position_size < 0
if since_close == 0
if low < price_takeProfit(profit_perc, 6) and MAX_TP >= 6
n = 6
nextTP := na
if movestoploss == 'Percentage'
price_stop_short := strategy.position_avg_price * (1 - n*profit_perc + stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_short := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_short := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3'
price_stop_short := price_takeProfit(profit_perc, n-3)
else if low < price_takeProfit(profit_perc, 5) and MAX_TP >= 5
n = 5
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_short := strategy.position_avg_price * (1 - n*profit_perc + stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_short := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_short := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3'
price_stop_short := price_takeProfit(profit_perc, n-3)
else if low < price_takeProfit(profit_perc, 4) and MAX_TP >= 4
n = 4
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_short := strategy.position_avg_price * (1 - n*profit_perc + stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_short := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_short := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3'
price_stop_short := price_takeProfit(profit_perc, n-3)
else if low < price_takeProfit(profit_perc, 3) and MAX_TP >= 3
n = 3
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_short := strategy.position_avg_price * (1 - n*profit_perc + stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_short := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2'
price_stop_short := price_takeProfit(profit_perc, n-2)
else if movestoploss == 'TP-3' and movestoploss_entry
price_stop_short := strategy.position_avg_price
else if low < price_takeProfit(profit_perc, 2) and MAX_TP >= 2
n = 2
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_short := strategy.position_avg_price * (1 - n*profit_perc + stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1'
price_stop_short := price_takeProfit(profit_perc, n-1)
else if movestoploss == 'TP-2' and movestoploss_entry
price_stop_short := strategy.position_avg_price
else if movestoploss == 'TP-3' and movestoploss_entry
price_stop_short := strategy.position_avg_price
else if low < price_takeProfit(profit_perc, 1) and MAX_TP >= 1
n = 1
nextTP := price_takeProfit(profit_perc, n + 1)
if movestoploss == 'Percentage'
price_stop_short := strategy.position_avg_price * (1 - n*profit_perc + stoploss_perc * move_stoploss_factor)
else if movestoploss == 'TP-1' and movestoploss_entry
price_stop_short := strategy.position_avg_price
else if movestoploss == 'TP-2' and movestoploss_entry
price_stop_short := strategy.position_avg_price
else if movestoploss == 'TP-3' and movestoploss_entry
price_stop_short := strategy.position_avg_price
if since_entry == 0
n = 0
nextTP := price_takeProfit(profit_perc, n + 1)
price_stop_short := strategy.position_avg_price * (1 + stoploss_perc)
// ***************************************************************************************************************************************************************************
// * Set Exits
// ***************************************************************************************************************************************************************************
if allow_longs == true and allow_shorts == false
if str_0
w_total = weight_total(short_signal1, short_signal2, short_signal3, short_signal4, short_signal5)
strategy.close('Long', when=w_total>=weight_trigger, qty_percent=100, comment='SHORT')
else
if str_1
strategy.close('Long', when=close_long1, qty_percent=100, comment='SHORT')
if str_2
strategy.close('Long', when=close_long2, qty_percent=100, comment='SHORT')
if str_3
strategy.close('Long', when=close_long3, qty_percent=100, comment='SHORT')
if str_4
strategy.close('Long', when=close_long4, qty_percent=100, comment='SHORT')
if str_5
strategy.close('Long', when=close_long5, qty_percent=100, comment='SHORT')
if allow_longs == false and allow_shorts == true
if str_0
w_total = weight_total(long_signal1, long_signal2, long_signal3, long_signal4, long_signal5)
strategy.close('Short', when=w_total>=weight_trigger, qty_percent=100, comment='LONG')
else
if str_1
strategy.close('Short', when=close_long1, qty_percent=100, comment='LONG')
if str_2
strategy.close('Short', when=close_long2, qty_percent=100, comment='LONG')
if str_3
strategy.close('Short', when=close_long3, qty_percent=100, comment='LONG')
if str_4
strategy.close('Short', when=close_long4, qty_percent=100, comment='LONG')
if str_5
strategy.close('Short', when=close_long5, qty_percent=100, comment='LONG')
if allow_shorts == true and strategy.position_size < 0 and stoploss and since_entry > 0
strategy.close('Short', when=stop_source >= price_stop_short, qty_percent=100, comment='STOP')
if str_6
if top_qty == 100
strategy.close('Short', when=condition_OS_several, qty_percent=bottom_qty, comment='STOP')
else
strategy.exit('Short', when=condition_OS_several, limit=source_6_bottom[1], qty_percent=bottom_qty, comment='TP-B')
if allow_longs == true and strategy.position_size > 0 and stoploss and since_entry > 0
strategy.close('Long', when=stop_source <= price_stop_long, qty_percent=100, comment='STOP')
if str_6
if top_qty == 100
strategy.close('Long', when=condition_OB_several, qty_percent=top_qty, comment='STOP')
else
strategy.exit('Long', when=condition_OB_several, limit=source_6_top[1], qty_percent=top_qty, comment='TP-T')
// ***********************************************************************************************************************************************************************************************************************************************************************************
// * Data window - debugging
// *************************************************************************************************************************************************************************************************************************************************************************
price_stop = strategy.position_size > 0 ? price_stop_long : price_stop_short
// *************************************************************************************************************************************************************************************************************************************************************************
// * Buy/Sell signals
// *************************************************************************************************************************************************************************************************************************************************************************
w_total_long = weight_total(long_signal1, long_signal2, long_signal3, long_signal4, long_signal5)
w_total_short = weight_total(short_signal1, short_signal2, short_signal3, short_signal4, short_signal5)
// *************************************************************************************************************************************************************************************************************************************************************************
// * Stop loss targets
// *************************************************************************************************************************************************************************************************************************************************************************
plot(series=(strategy.position_size > 0) ? price_stop_long : na, color=color.gray, style=plot.style_cross, linewidth=2, transp=30, title="Long Stop Loss")
plot(series=(strategy.position_size < 0) ? price_stop_short : na, color=color.gray, style=plot.style_cross, linewidth=2, transp=30, title="Short Stop Loss")
// *************************************************************************************************************************************************************************************************************************************************************************
// * TP targets
// *************************************************************************************************************************************************************************************************************************************************************************
plot(strategy.position_size > 0 or strategy.position_size < 0 ? nextTP : na, color=color.aqua, style=plot.style_cross, linewidth=2, transp=30, title="Next TP")
// *************************************************************************************************************************************************************************************************************************************************************************