
Strategi ini adalah strategi trend-following dan menggabungkan konfigurasi indikator Awan Ichimoku untuk menilai kekuatan pasaran untuk mendedahkan peluang penembusan yang berpotensi. Komponen utama termasuk kerangka penilaian berasaskan Awan Ichimoku, ATR Stop Loss, Peratusan Stop Loss dan mekanisme penangguhan pilihan.
Penghakiman teras strategi terdiri daripada dua bahagian, satu adalah isyarat trend yang berdasarkan kepada indikator Awan Ichimoku untuk menilai kekuatan pasaran yang berlebihan, dan satu adalah isyarat kekuatan yang berdasarkan kepada potensi penembusan.
Untuk penghakiman trend, kita perlu memenuhi syarat-syarat seperti penembusan garis asas di atas garis penukaran yang menunjukkan pembentukan trend multi-arah, Lagging Span yang lebih tinggi daripada entiti garis K yang menunjukkan kekuatan multi-arah yang kuat pada masa ini, dan harga yang lebih tinggi daripada harga tertinggi di awan yang menunjukkan terobosan di atas landasan.
Untuk isyarat yang kuat, untuk memenuhi syarat-syarat seperti menunjukkan kekuatan super kuat pada masa yang sama dengan harga yang lebih tinggi daripada harga tertinggi dalam awan, garis penukaran dan garis asas adalah sama dengan banyak kepala yang menunjukkan kekuatan penuh.
Apabila mana-mana set kedua-dua jenis keadaan dicetuskan, lebih banyak kedudukan akan dibuat dengan harga pasaran; selepas itu, penjejakan hentian kerugian akan ditetapkan berdasarkan peraturan ATR, peratusan atau indikator Awan Ichimoku, untuk mengunci keuntungan lebih lanjut.
Kelebihan utama strategi ini adalah bahawa ia menggunakan kedua-dua penilaian trend dan penilaian kekuatan pelbagai ruang dari Awan Ichimoku. Daripada satu-satunya purata bergerak, Awan Ichimoku dapat mencerminkan perbandingan kekuatan semasa, meningkatkan ketepatan isyarat.
Di samping itu, gabungan ATR dan peratusan stop loss untuk menguruskan risiko, boleh mengawal kerugian tunggal dengan baik. Di samping itu, mekanisme penutupan yang boleh dipilih juga menjadikan keuntungan strategi lebih stabil.
Risiko utama strategi ini adalah bahawa Awan Ichimoku sendiri mempunyai keterbelakangan. Selain itu, isyarat yang kuat sebagai ciri pengejaran, juga boleh meningkatkan kebarangkalian strategi yang dipenuhi.
Untuk mengurangkan risiko yang disebabkan oleh masalah ketinggalan, kitaran parameter Awan Ichimoku dapat dikurangkan dengan sewajarnya; untuk risiko yang disebabkan oleh isyarat kuat, anda perlu meningkatkan tetapan pengesanan kehilangan untuk menangani.
Strategi ini boleh dioptimumkan dengan cara berikut:
Uji data dari pasaran yang berbeza untuk menilai kekuatan dan kebolehan strategi
Mengoptimumkan parameter Ichimoku Cloud agar lebih sesuai dengan keadaan pasaran tertentu
Cuba algoritma pembelajaran mendalam seperti LSTM untuk membantu menentukan kekuatan isyarat penembusan
Menambah Indeks Tenaga Kuantitatif untuk Mengelakkan Kebarangkalian Jatuh
Strategi ini menggabungkan penggunaan Ichimoku Cloud untuk menentukan kekuatan pasaran yang tidak stabil, dan dengan mengambil kira potensi trend, juga mempertimbangkan pengurusan risiko. Strategi ini menyeimbangkan keuntungan dan kawalan dengan berkesan. Walaupun masih ada ruang untuk pengoptimuman, secara keseluruhannya merupakan strategi trend yang sangat praktikal.
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 3h
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/
// © mikul_se
//@version=5
strategy("mikul's Ichimoku Cloud Strategy v 2.0", shorttitle="mikul's Ichi strat", overlay=true, margin_long=100, margin_short=100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
// Strategy settings
strategySettingsGroup = "Strategy settings"
trailSource = input.string(title="Trail Source", defval="Lows/Highs", options=["Lows/Highs", "Close", "Open"], confirm=true, group=strategySettingsGroup)
trailMethod = input.string(title="Trail Method", defval="ATR", options=["ATR", "Percent", "Ichi exit"], confirm=true, tooltip="Ichi rules means it follows the rules of the Ichimoku cloud for exiting the trade.", group=strategySettingsGroup)
trailPercent = input.float(title="Trail Percent", defval=10, minval=0.1, confirm=true, group=strategySettingsGroup)
swingLookback = input.int(title="Lookback", defval=7, confirm=true, group=strategySettingsGroup)
atrPeriod = input.int(title="ATR Period", defval=14, confirm=true, group=strategySettingsGroup)
atrMultiplier = input.float(title="ATR Multiplier", defval=1.0, confirm=true, group=strategySettingsGroup)
addIchiExit = input.bool(false, "Add Ichimoku exit", "You can use this to add Ichimoku cloud exit signals on top of Percent or ATR", group=strategySettingsGroup)
useTakeProfit = input.bool(false, "Use Take Profit", confirm=true, group=strategySettingsGroup)
takeProfitPercent = input.float(title="Take Profit Percentage", defval=5, minval=0.1, confirm=true, group=strategySettingsGroup)
// Ichimoku settings
ichimokuSettingsGroup = "Ichimoku settings"
conversionPeriods = input.int(9, minval=1, title="Conversion Line Length", group=ichimokuSettingsGroup)
basePeriods = input.int(26, minval=1, title="Base Line Length", group=ichimokuSettingsGroup)
laggingSpan2Periods = input.int(52, minval=1, title="Leading Span B Length", group=ichimokuSettingsGroup)
displacement = input.int(26, minval=1, title="Lagging Span", group=ichimokuSettingsGroup)
delta = input.int(26, minval=1, title="Delta", group=ichimokuSettingsGroup)
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
conversionLine = donchian(conversionPeriods)
baseLine = donchian(basePeriods)
leadLine1 = math.avg(conversionLine, baseLine)
leadLine2 = donchian(laggingSpan2Periods)
uppercloud = leadLine1[displacement-1]
bottomcloud = leadLine2[displacement-1]
// Ichi exit variables and calculations
delta2 = delta-3
average(len) => math.avg(ta.lowest(len), ta.highest(len))
conversion_line = average(conversionPeriods)
base_line = average(basePeriods)
lead_line_a = math.avg(conversion_line, base_line)
lead_line_b = average(laggingSpan2Periods)
lagging_span = close
lead_line_a_delta = lead_line_a[delta]
lead_line_b_delta = lead_line_b[delta]
lagging_span_delta = lagging_span[delta]
prisgris = hlc3[delta]
prisgris2 = hlc3[delta2]
// Declare trailing price variable (stores our trail stop value)
var float trailPrice = na
float next_trailPrice = na
// Get required trailing stop variables
atrValue = ta.atr(atrPeriod) * atrMultiplier
swingLow = ta.lowest(low, swingLookback)
swingHigh = ta.highest(high, swingLookback)
// Ichi plotting
plot(conversionLine, color=#2962FF, title="Conversion Line")
plot(baseLine, color=#B71C1C, title="Base Line")
plot(close, offset=-displacement + 1, color=#43A047, title="Lagging Span")
p1 = plot(leadLine1, offset=displacement - 1, color=#A5D6A7, title="Leading Span A")
p2 = plot(leadLine2, offset=displacement - 1, color=#EF9A9A, title="Leading Span B")
fill(p1, p2, color=leadLine1 > leadLine2 ? color.rgb(67, 160, 71, 90) : color.rgb(244, 67, 54, 90))
// Plotting ichi crossover signals
ichiup = ta.crossover(conversionLine, baseLine)
ichidown = ta.crossover(baseLine, conversionLine)
plotshape(ichiup ? conversionLine : na, 'Ichi long 1', style=shape.circle, location=location.absolute, offset=0, color=#00ff00b0, size=size.tiny)
plotshape(ichidown ? conversionLine : na, 'Ichi short 1', style=shape.circle, location=location.absolute, offset=0, color=#ff1100c7, size=size.tiny)
// Pamp signal
signal5 = close > bottomcloud[displacement] and close > uppercloud[displacement] and close > high[displacement]
signal5b = close[1] <= bottomcloud[displacement+1] or close[1] <= uppercloud[displacement+1] or close <= high[displacement+1]
signal6 = close > bottomcloud and close > uppercloud and close > open
signal6b = close[1] <= bottomcloud[1] or close[1] <= uppercloud[1]
signal7 = leadLine1 > leadLine2
signal7b = leadLine1[1] <= leadLine2[1]
signal8 = conversionLine > baseLine
pamp = signal5 and signal6 and signal7 and signal8 and strategy.position_size == 0 and (signal5b or signal6b or signal7b)
// Trend signal
nsignal5 = close > close[displacement]
nsignal6 = close > bottomcloud and close > uppercloud and close > open
nsignal8 = ta.crossover(conversionLine, baseLine) and conversionLine > bottomcloud and conversionLine > uppercloud and baseLine > bottomcloud and baseLine > uppercloud
trend = nsignal5 and nsignal6 and nsignal8 and strategy.position_size == 0
plotshape(trend, style=shape.triangleup, location=location.belowbar, color=color.green)
if (trend or pamp)
trailPrice := na
strategy.entry(trend ? "Trend" : "Pamp", direction = strategy.long)
// Get trailing stop price
if trailMethod == "ATR"
next_trailPrice := switch trailSource
"Close" => strategy.position_size > 0 ? close - atrValue : close + atrValue
"Open" => strategy.position_size > 0 ? open - atrValue : open + atrValue
=> strategy.position_size > 0 ? swingLow - atrValue : swingHigh + atrValue
else if trailMethod == "Percent"
float percentMulti = strategy.position_size > 0 ? (100 - trailPercent) / 100 : (100 + trailPercent) / 100
next_trailPrice := switch trailSource
"Close" => close * percentMulti
"Open" => open * percentMulti
=> strategy.position_size > 0 ? swingLow * percentMulti : swingHigh * percentMulti
else
short_signal = (ta.crossunder(lagging_span, prisgris)) or ta.crossover(base_line, conversion_line) and ((close)) < ((lead_line_a)) or ta.crossunder(lagging_span, prisgris) or (ta.crossover(base_line, conversion_line) and ((lagging_span) < (lead_line_a)) and ((lagging_span) < (lead_line_b)))
if short_signal
strategy.close("Trend", "Ichi trend over")
strategy.close("Pamp", "Ichi pamp over")
alert("Sell")
if (addIchiExit)
short_signal = (ta.crossunder(lagging_span, prisgris)) or ta.crossover(base_line, conversion_line) and ((close)) < ((lead_line_a)) or ta.crossunder(lagging_span, prisgris) or (ta.crossover(base_line, conversion_line) and ((lagging_span) < (lead_line_a)) and ((lagging_span) < (lead_line_b)))
if short_signal
strategy.close("Trend", "Ichi trend over")
strategy.close("Pamp", "Ichi pamp over")
alert("Sell")
// Check for trailing stop update
if strategy.position_size != 0 and barstate.isconfirmed
if (next_trailPrice > trailPrice or na(trailPrice)) and strategy.position_size > 0
trailPrice := next_trailPrice
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)
if (next_trailPrice < trailPrice or na(trailPrice)) and strategy.position_size < 0
trailPrice := next_trailPrice
alert(message="Trailing Stop updated for " + syminfo.tickerid + ": " + str.tostring(trailPrice, "#.#####"), freq=alert.freq_once_per_bar_close)
// Draw data to chart
plot(strategy.position_size != 0 ? trailPrice : na, color=color.red, title="Trailing Stop")
// Take Profit
float profitTarget = strategy.position_avg_price * (1 + takeProfitPercent / 100)
// Exit trade if stop is hit
strategy.exit(id="trend Exit", from_entry="Trend", stop=trailPrice, limit=useTakeProfit ? profitTarget : na)
strategy.exit(id="pamp Exit", from_entry="Pamp", stop=trailPrice, limit=useTakeProfit ? profitTarget : na)
if strategy.position_size == 0
trailPrice = 0