
Idea utama strategi ini adalah untuk menggunakan isyarat gabungan pelbagai indikator MACD dari tempoh masa yang berlainan untuk menilai masa perubahan trend pasaran, untuk mencapai perdagangan trend yang rendah risiko.
Strategi menggunakan 5 tempoh masa MACD yang berbeza, termasuk 60 minit, 120 minit, 240 minit, 480 minit dan garis matahari, untuk membentuk gabungan pelbagai tempoh masa MACD.
Apabila semua penunjuk MACD untuk 5 kitaran masa adalah positif (((atau negatif), dan garis K teratas belum sepenuhnya MACD positif (((atau negatif), dinilai sebagai tanda multicap (((atau kosong), lakukan lebih (((atau kosong).
Stop loss ialah stop loss dengan bilangan titik tetap.
Penutupan adalah dua tahap penutupan bergerak, masing-masing menutup sebahagian dan seluruh kedudukan.
Apabila MACD menunjukkan lebih daripada satu keadaan kosong, pertimbangkan sebagai isyarat pembalikan dan ratahkan kedudukan semasa.
TsL juga digunakan untuk menjejaki kerugian.
Menggunakan Stop Loss Move to Breakeven, apabila keuntungan tertentu dicapai, Stop Loss akan dipindahkan ke sekitar harga pembukaan, mengunci keuntungan.
Menggunakan sintaks Pineconector, secara dinamik menjana pop-up isyarat transaksi.
Kombinasi MACD pelbagai bingkai masa, dapat meningkatkan ketepatan isyarat, menangkap trend besar, menapis sebahagian daripada kebisingan.
Tetapan dua tahap stop-move membolehkan anda mendapatkan sebahagian keuntungan dalam trend besar beberapa kali.
Nombor titik hentian tetap ditetapkan untuk mengawal kerugian tunggal.
Apabila penunjuk MACD tidak selaras, anda boleh menghentikan kerugian tepat pada masanya, untuk mengelakkan pemecahan.
TsL menjejaki fungsi stop loss, yang membolehkan stop loss menjejaki perubahan harga dalam masa nyata.
Hentikan kerugian berpindah ke fungsi BE, yang boleh mengunci sebahagian keuntungan selepas kerugian berubah menjadi keuntungan.
Isyarat dagangan dinamik, boleh disambungkan ke MT4/5 untuk perdagangan automatik.
Sinyal MACD mungkin berlaku penembusan palsu, menyebabkan kerugian yang tidak perlu. Parameter MACD boleh disesuaikan dengan betul, menyaring terlalu banyak isyarat palsu.
Nombor titik hentian tetap mungkin terlalu besar atau terlalu kecil. Anda boleh menguji saiz titik hentian yang berbeza untuk mencari parameter terbaik.
Dua titik berhenti terlalu dekat atau terlalu jauh, tidak dapat mencapai penarikan balik dan kadar keuntungan yang optimum. Anda boleh menguji titik berhenti yang berbeza untuk mencari parameter terbaik.
Fungsi BE mungkin tercetus terlalu awal atau terlalu lewat. Anda boleh menguji titik pencetus BE yang berbeza untuk mencari parameter terbaik.
Jarak penghentian pengesanan mungkin terlalu besar atau terlalu kecil. Anda boleh menguji jarak penghentian pengesanan yang berbeza untuk mencari parameter terbaik.
Anda boleh menguji kombinasi MACD pada lebih banyak bingkai masa untuk mencari kombinasi terbaik untuk trend pasaran yang ditangkap.
Anda boleh memperkenalkan lebih banyak petunjuk untuk menilai latar belakang perdagangan, dan mengelakkan membuka kedudukan yang tidak sesuai.
Perbezaan tetapan parameter yang berbeza dapat dikaji untuk merancang sistem penghadangan kerosakan yang beradaptasi.
Ia boleh digabungkan dengan teknologi pembelajaran mesin untuk mencapai optimasi dinamik parameter Stop Loss Stop Stop.
Modul pengurusan wang boleh diperkenalkan untuk menyesuaikan saiz kedudukan secara dinamik dan mengawal risiko.
Secara keseluruhannya, strategi ini adalah strategi pengesanan trend yang agak stabil yang menggunakan trend penghakiman indikator MACD pelbagai kerangka masa, menetapkan double stop, mengesan stop loss, dan fungsi BE untuk mengunci keuntungan, dan mengawal risiko stop loss tetap. Dengan pengoptimuman parameter dan pengembangan fungsi, anda dapat meningkatkan lagi kestabilan dan kadar pulangan strategi.
/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 6h
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/
//@version=5
//@strategy_alert_message {{strategy.order.alert_message}}
SCRIPT_NAME = "Heatmap MACD Strategy - Pineconnector"
strategy(SCRIPT_NAME,
overlay= true,
process_orders_on_close = true,
calc_on_every_tick = true,
pyramiding = 1,
initial_capital = 100000,
default_qty_type = strategy.fixed,
default_qty_value = 1,
commission_type = strategy.commission.percent,
commission_value = 0.075,
slippage = 1
)
pineconnector_licence_ID = input.string(title = "Licence ID", defval = "123456789", group = "Pineconnector", tooltip = "Insert your Pineconnector Licence ID here")
pos_size = input.float(3, minval = 0, maxval = 100, title = "Position Size", group = "Position Size", tooltip = "Required to specify the position size here for Pineconnector to work properly")
res1 = input.timeframe('60', title='First Timeframe', group = "Timeframes")
res2 = input.timeframe('120', title='Second Timeframe', group = "Timeframes")
res3 = input.timeframe('240', title='Third Timeframe', group = "Timeframes")
res4 = input.timeframe('240', title='Fourth Timeframe', group = "Timeframes")
res5 = input.timeframe('480', title='Fifth Timeframe', group = "Timeframes")
macd_src = input.source(close, title="Source", group = "MACD")
fast_len = input.int(9, minval=1, title="Fast Length", group = "MACD")
slow_len = input.int(26, minval=1, title="Slow Length", group = "MACD")
sig_len = input.int(9, minval=1, title="Signal Length", group = "MACD")
// # ========================================================================= #
// # | Close on Opposite |
// # ========================================================================= #
use_close_opposite = input.bool(false, title = "Close on Opposite Signal?", group = "Close on Opposite", tooltip = "Close the position if 1 or more MACDs become bearish (for longs) or bullish (for shorts)")
// # ========================================================================= #
// # | Stop Loss |
// # ========================================================================= #
use_sl = input.bool(true, title = "Use Stop Loss?", group = "Stop Loss")
sl_mode = "pips"//input.string("%", title = "Mode", options = ["%", "pips"], group = "Stop Loss")
sl_value = input.float(40, minval = 0, title = "Value", group = "Stop Loss", inline = "stoploss")// * 0.01
// # ========================================================================= #
// # | Trailing Stop Loss |
// # ========================================================================= #
use_tsl = input.bool(false, title = "Use Trailing Stop Loss?", group = "Trailing Stop Loss")
tsl_input_pips = input.float(10, minval = 0, title = "Trailing Stop Loss (pips)", group = "Trailing Stop Loss")
// # ========================================================================= #
// # | Take Profit |
// # ========================================================================= #
use_tp1 = input.bool(true, title = "Use Take Profit 1?", group = "Take Profit 1")
tp1_value = input.float(30, minval = 0, title = "Value (pips)", group = "Take Profit 1")// * 0.01
tp1_qty = input.float(50, minval = 0, title = "Quantity (%)", group = "Take Profit 1")// * 0.01
use_tp2 = input.bool(true, title = "Use Take Profit 2?", group = "Take Profit 2")
tp2_value = input.float(50, minval = 0, title = "Value (pips)", group = "Take Profit 2")// * 0.01
// # ========================================================================= #
// # | Stop Loss to Breakeven |
// # ========================================================================= #
use_sl_be = input.bool(false, title = "Use Stop Loss to Breakeven Mode?", group = "Break Even")
sl_be_value = input.float(30, step = 0.1, minval = 0, title = "Value (pips)", group = "Break Even", inline = "breakeven")
sl_be_offset = input.int(1, step = 1, minval = 0, title = "Offset (pips)", group = "Break Even", tooltip = "Set the SL at BE price +/- offset value")
[_, _, MTF1_hist] = request.security(syminfo.tickerid, res1, ta.macd(macd_src, fast_len, slow_len, sig_len))
[_, _, MTF2_hist] = request.security(syminfo.tickerid, res2, ta.macd(macd_src, fast_len, slow_len, sig_len))
[_, _, MTF3_hist] = request.security(syminfo.tickerid, res3, ta.macd(macd_src, fast_len, slow_len, sig_len))
[_, _, MTF4_hist] = request.security(syminfo.tickerid, res4, ta.macd(macd_src, fast_len, slow_len, sig_len))
[_, _, MTF5_hist] = request.security(syminfo.tickerid, res5, ta.macd(macd_src, fast_len, slow_len, sig_len))
bull_hist1 = MTF1_hist > 0 and MTF1_hist[1] < 0
bull_hist2 = MTF2_hist > 0 and MTF2_hist[1] < 0
bull_hist3 = MTF3_hist > 0 and MTF3_hist[1] < 0
bull_hist4 = MTF4_hist > 0 and MTF4_hist[1] < 0
bull_hist5 = MTF5_hist > 0 and MTF5_hist[1] < 0
bear_hist1 = MTF1_hist < 0 and MTF1_hist[1] > 0
bear_hist2 = MTF2_hist < 0 and MTF2_hist[1] > 0
bear_hist3 = MTF3_hist < 0 and MTF3_hist[1] > 0
bear_hist4 = MTF4_hist < 0 and MTF4_hist[1] > 0
bear_hist5 = MTF5_hist < 0 and MTF5_hist[1] > 0
plotshape(bull_hist1, title = "Bullish MACD 1", location = location.bottom, style = shape.diamond, size = size.normal, color = #33e823)
plotshape(bull_hist2, title = "Bullish MACD 2", location = location.bottom, style = shape.diamond, size = size.normal, color = #1a7512)
plotshape(bull_hist3, title = "Bullish MACD 3", location = location.bottom, style = shape.diamond, size = size.normal, color = #479c40)
plotshape(bull_hist4, title = "Bullish MACD 4", location = location.bottom, style = shape.diamond, size = size.normal, color = #81cc7a)
plotshape(bull_hist5, title = "Bullish MACD 5", location = location.bottom, style = shape.diamond, size = size.normal, color = #76d66d)
plotshape(bear_hist1, title = "Bearish MACD 1", location = location.top, style = shape.diamond, size = size.normal, color = #d66d6d)
plotshape(bear_hist2, title = "Bearish MACD 2", location = location.top, style = shape.diamond, size = size.normal, color = #de4949)
plotshape(bear_hist3, title = "Bearish MACD 3", location = location.top, style = shape.diamond, size = size.normal, color = #cc2525)
plotshape(bear_hist4, title = "Bearish MACD 4", location = location.top, style = shape.diamond, size = size.normal, color = #a11d1d)
plotshape(bear_hist5, title = "Bearish MACD 5", location = location.top, style = shape.diamond, size = size.normal, color = #ed2424)
bull_count = (MTF1_hist > 0 ? 1 : 0) + (MTF2_hist > 0 ? 1 : 0) + (MTF3_hist > 0 ? 1 : 0) + (MTF4_hist > 0 ? 1 : 0) + (MTF5_hist > 0 ? 1 : 0)
bear_count = (MTF1_hist < 0 ? 1 : 0) + (MTF2_hist < 0 ? 1 : 0) + (MTF3_hist < 0 ? 1 : 0) + (MTF4_hist < 0 ? 1 : 0) + (MTF5_hist < 0 ? 1 : 0)
bull = bull_count == 5 and bull_count[1] < 5 and barstate.isconfirmed
bear = bear_count == 5 and bear_count[1] < 5 and barstate.isconfirmed
signal_candle = bull or bear
entryLongPrice = ta.valuewhen(bull and strategy.position_size[1] <= 0, close, 0)
entryShortPrice = ta.valuewhen(bear and strategy.position_size[1] >= 0, close, 0)
plot(strategy.position_size, title = "avg_pos_size")
get_pip_size() =>
float _pipsize = 1.
if syminfo.type == "forex"
_pipsize := (syminfo.mintick * (str.contains(syminfo.ticker, "JPY") ? 100 : 10))
else if str.contains(syminfo.ticker, "XAU") or str.contains(syminfo.ticker, "XAG")
_pipsize := 0.1
_pipsize
// # ========================================================================= #
// # | Stop Loss |
// # ========================================================================= #
var float final_SL_Long = 0.
var float final_SL_Short = 0.
if signal_candle and use_sl
final_SL_Long := entryLongPrice - (sl_value * get_pip_size())
final_SL_Short := entryShortPrice + (sl_value * get_pip_size())
// # ========================================================================= #
// # | Trailing Stop Loss |
// # ========================================================================= #
var MaxReached = 0.0
if signal_candle[1]
MaxReached := strategy.position_size > 0 ? high : low
MaxReached := strategy.position_size > 0
? math.max(nz(MaxReached, high), high)
: strategy.position_size < 0 ? math.min(nz(MaxReached, low), low) : na
if use_tsl and use_sl
if strategy.position_size > 0
stopValue = MaxReached - (tsl_input_pips * get_pip_size())
final_SL_Long := math.max(stopValue, final_SL_Long[1])
else if strategy.position_size < 0
stopValue = MaxReached + (tsl_input_pips * get_pip_size())
final_SL_Short := math.min(stopValue, final_SL_Short[1])
// # ========================================================================= #
// # | Take Profit 1 |
// # ========================================================================= #
var float final_TP1_Long = 0.
var float final_TP1_Short = 0.
final_TP1_Long := entryLongPrice + (tp1_value * get_pip_size())
final_TP1_Short := entryShortPrice - (tp1_value * get_pip_size())
plot(use_tp1 and strategy.position_size > 0 ? final_TP1_Long : na, title = "TP1 Long", color = color.aqua, linewidth=2, style=plot.style_linebr)
plot(use_tp1 and strategy.position_size < 0 ? final_TP1_Short : na, title = "TP1 Short", color = color.blue, linewidth=2, style=plot.style_linebr)
// # ========================================================================= #
// # | Take Profit 2 |
// # ========================================================================= #
var float final_TP2_Long = 0.
var float final_TP2_Short = 0.
final_TP2_Long := entryLongPrice + (tp2_value * get_pip_size())
final_TP2_Short := entryShortPrice - (tp2_value * get_pip_size())
plot(use_tp2 and strategy.position_size > 0 and tp1_qty != 100 ? final_TP2_Long : na, title = "TP2 Long", color = color.orange, linewidth=2, style=plot.style_linebr)
plot(use_tp2 and strategy.position_size < 0 and tp1_qty != 100 ? final_TP2_Short : na, title = "TP2 Short", color = color.white, linewidth=2, style=plot.style_linebr)
// # ========================================================================= #
// # | Stop Loss to Breakeven |
// # ========================================================================= #
var bool SL_BE_REACHED = false
// Calculate open profit or loss for the open positions.
tradeOpenPL() =>
sumProfit = 0.0
for tradeNo = 0 to strategy.opentrades - 1
sumProfit += strategy.opentrades.profit(tradeNo)
result = sumProfit
//get_pip_size() =>
// syminfo.type == "forex" ? syminfo.pointvalue * 100 : 1
current_profit = tradeOpenPL()// * get_pip_size()
current_long_profit = (close - entryLongPrice) / (syminfo.mintick * 10)
current_short_profit = (entryShortPrice - close) / (syminfo.mintick * 10)
plot(current_short_profit, title = "Current Short Profit")
plot(current_long_profit, title = "Current Long Profit")
if use_sl_be
if strategy.position_size[1] > 0
if not SL_BE_REACHED
if current_long_profit >= sl_be_value
final_SL_Long := entryLongPrice + (sl_be_offset * get_pip_size())
SL_BE_REACHED := true
else if strategy.position_size[1] < 0
if not SL_BE_REACHED
if current_short_profit >= sl_be_value
final_SL_Short := entryShortPrice - (sl_be_offset * get_pip_size())
SL_BE_REACHED := true
plot(use_sl and strategy.position_size > 0 ? final_SL_Long : na, title = "SL Long", color = color.fuchsia, linewidth=2, style=plot.style_linebr)
plot(use_sl and strategy.position_size < 0 ? final_SL_Short : na, title = "SL Short", color = color.fuchsia, linewidth=2, style=plot.style_linebr)
// # ========================================================================= #
// # | Strategy Calls |
// # ========================================================================= #
string entry_long_limit_alert_message = ""
string entry_long_TP1_alert_message = ""
string entry_long_TP2_alert_message = ""
tp1_qty_perc = tp1_qty / 100
if use_tp1 and use_tp2
entry_long_TP1_alert_message := pineconnector_licence_ID + ",buy," + syminfo.ticker + ",risk=" + str.tostring(pos_size * tp1_qty_perc) + ",tp=" + str.tostring(final_TP1_Long)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Long) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
entry_long_TP2_alert_message := pineconnector_licence_ID + ",buy," + syminfo.ticker + ",risk=" + str.tostring(pos_size - (pos_size * tp1_qty_perc)) + ",tp=" + str.tostring(final_TP2_Long)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Long) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
else if use_tp1 and not use_tp2
entry_long_TP1_alert_message := pineconnector_licence_ID + ",buy," + syminfo.ticker + ",risk=" + str.tostring(pos_size * tp1_qty_perc) + ",tp=" + str.tostring(final_TP1_Long)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Long) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
else if not use_tp1 and use_tp2
entry_long_TP2_alert_message := pineconnector_licence_ID + ",buy," + syminfo.ticker + ",risk=" + str.tostring(pos_size) + ",tp=" + str.tostring(final_TP2_Long)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Long) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
entry_long_limit_alert_message := entry_long_TP1_alert_message + "\n" + entry_long_TP2_alert_message
//entry_long_limit_alert_message = pineconnector_licence_ID + ",buystop," + syminfo.ticker + ",price=" + str.tostring(buy_price) + ",risk=" + str.tostring(pos_size) + ",tp=" + str.tostring(final_TP_Long) + ",sl=" + str.tostring(final_SL_Long)
//entry_short_market_alert_message = pineconnector_licence_ID + ",sell," + syminfo.ticker + ",risk=" + str.tostring(pos_size) + (use_tp1 ? ",tp=" + str.tostring(final_TP1_Short) : "")
// + (use_sl ? ",sl=" + str.tostring(final_SL_Short) : "")
//entry_short_limit_alert_message = pineconnector_licence_ID + ",sellstop," + syminfo.ticker + ",price=" + str.tostring(sell_price) + ",risk=" + str.tostring(pos_size) + ",tp=" + str.tostring(final_TP_Short) + ",sl=" + str.tostring(final_SL_Short)
string entry_short_limit_alert_message = ""
string entry_short_TP1_alert_message = ""
string entry_short_TP2_alert_message = ""
if use_tp1 and use_tp2
entry_short_TP1_alert_message := pineconnector_licence_ID + ",sell," + syminfo.ticker + ",risk=" + str.tostring(pos_size * tp1_qty_perc) + ",tp=" + str.tostring(final_TP1_Short)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Short) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
entry_short_TP2_alert_message := pineconnector_licence_ID + ",sell," + syminfo.ticker + ",risk=" + str.tostring(pos_size - (pos_size * tp1_qty_perc)) + ",tp=" + str.tostring(final_TP2_Short)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Short) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
else if use_tp1 and not use_tp2
entry_short_TP1_alert_message := pineconnector_licence_ID + ",sell," + syminfo.ticker + ",risk=" + str.tostring(pos_size * tp1_qty_perc) + ",tp=" + str.tostring(final_TP1_Short)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Short) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
else if not use_tp1 and use_tp2
entry_short_TP2_alert_message := pineconnector_licence_ID + ",sell," + syminfo.ticker + ",risk=" + str.tostring(pos_size) + ",tp=" + str.tostring(final_TP2_Short)
+ (use_sl ? ",sl=" + str.tostring(final_SL_Short) : "") + (use_sl_be ? ",beoffset=" + str.tostring(sl_be_offset) + ",betrigger=" + str.tostring(sl_be_value) : "")
+ (use_tsl ? ",trailtrig=" + str.tostring(tsl_input_pips) + ",traildist=" + str.tostring(tsl_input_pips) + ",trailstep=1" : "")
entry_short_limit_alert_message := entry_short_TP1_alert_message + "\n" + entry_short_TP2_alert_message
long_update_sl_alert_message = pineconnector_licence_ID + ",newsltplong," + syminfo.ticker + ",sl=" + str.tostring(final_SL_Long)
short_update_sl_alert_message = pineconnector_licence_ID + ",newsltpshort," + syminfo.ticker + ",sl=" + str.tostring(final_SL_Short)
cancel_long = pineconnector_licence_ID + ",cancellong," + syminfo.ticker// + "x"
cancel_short = pineconnector_licence_ID + ",cancellong," + syminfo.ticker// + "x"
close_long = pineconnector_licence_ID + ",closelong," + syminfo.ticker
close_short = pineconnector_licence_ID + ",closeshort," + syminfo.ticker
if bull and strategy.position_size <= 0
alert(close_short, alert.freq_once_per_bar_close)
strategy.entry("Long", strategy.long)
alert(entry_long_TP1_alert_message, alert.freq_once_per_bar_close)
alert(entry_long_TP2_alert_message, alert.freq_once_per_bar_close)
else if bear and strategy.position_size >= 0
alert(close_long, alert.freq_once_per_bar_close)
strategy.entry("Short", strategy.short)
alert(entry_short_TP1_alert_message, alert.freq_once_per_bar_close)
alert(entry_short_TP2_alert_message, alert.freq_once_per_bar_close)
if strategy.position_size[1] > 0
if low <= final_SL_Long and use_sl
strategy.close("Long", alert_message = close_long)
else
strategy.exit("Exit TP1 Long", "Long", limit = final_TP1_Long, comment_profit = "Exit TP1 Long", qty_percent = tp1_qty)
strategy.exit("Exit TP2 Long", "Long", limit = final_TP2_Long, comment_profit = "Exit TP2 Long", alert_message = close_long)
if bull_count[1] == 5 and bull_count < 5 and barstate.isconfirmed and use_close_opposite
strategy.close("Long", comment = "1 or more MACDs became bearish", alert_message = close_long)
else if strategy.position_size[1] < 0
if high >= final_SL_Short and use_sl
//strategy.exit("Exit SL Short", "Short", stop = final_SL_Short, comment_loss = "Exit SL Short")
strategy.close("Short", alert_message = close_short)
else
strategy.exit("Exit TP1 Short", "Short", limit = final_TP1_Short, comment_profit = "Exit TP1 Short", qty_percent = tp1_qty)
strategy.exit("Exit TP2 Short", "Short", limit = final_TP2_Short, comment_profit = "Exit TP2 Short")
if bear_count[1] == 5 and bear_count < 5 and barstate.isconfirmed and use_close_opposite
strategy.close("Short", comment = "1 or more MACDs became bullish", alert_message = close_short)
// # ========================================================================= #
// # | Logs |
// # ========================================================================= #
// if bull and strategy.position_size <= 0
// log.info(entry_long_limit_alert_message)
// else if bear and strategy.position_size >= 0
// log.info(entry_short_limit_alert_message)
// # ========================================================================= #
// # | Reset Variables |
// # ========================================================================= #
if (strategy.position_size > 0 and strategy.position_size[1] <= 0)
or (strategy.position_size < 0 and strategy.position_size[1] >= 0)
//is_TP1_REACHED := false
SL_BE_REACHED := false