Cette stratégie est basée sur l'indicateur Ichimoku Clouds, combinant la ligne Tenkan, la ligne Kijun, la ligne principale et les graphiques cloud pour identifier les signaux de trading et automatiser le trading.
La stratégie utilise le modèle Ichimoku standard, y compris la ligne Tenkan, la ligne Kijun, la ligne principale, Senkou A et Senkou B. Elle identifie les signaux de trading en comparant les croisements entre ces lignes.
Plus précisément, un signal haussier est généré lorsque la ligne Tenkan traverse au-dessus de la ligne Kijun, et un signal baissier lorsque la ligne Tenkan traverse en dessous.
La stratégie fournit des paramètres de personnalisation étendus permettant aux utilisateurs de combiner librement les signaux d'entrée et de sortie pour construire leurs propres systèmes de trading.
En tant que nouvelle génération d'outils d'analyse technique, Ichimoku combiné avec les capacités de visualisation et de développement de stratégie de TradingView fournit un support puissant pour le trading quantique. Cette stratégie utilise pleinement les deux pour construire un système de trading automatisé.
/*backtest start: 2023-01-25 00:00:00 end: 2024-01-31 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 // ----------------------------------------------------------------------------- // Copyright © 2024 Skyrex, LLC. All rights reserved. // ----------------------------------------------------------------------------- // Version: v2.1 // Release: Jan 22, 2024 strategy(title = "Advanced Ichimoku Clouds Strategy Long and Short", shorttitle = "Ichimoku Strategy Long and Short", overlay = true, format = format.inherit, pyramiding = 1, calc_on_order_fills = false, calc_on_every_tick = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, currency = currency.NONE, commission_type = strategy.commission.percent, commission_value = 0.1, slippage = 5) // Trading bot settings sourceUuid = input.string(title = "sourceUuid:", defval = "yourBotSourceUuid", group = "Trading Bot Settings") secretToken = input.string(title = "secretToken:", defval = "yourBotSecretToken", group = "Trading Bot Settings") // Trading Period Settings lookBackPeriodStart = input(title = "Trade Start Date/Time", defval = timestamp('2023-01-01T00:00:00'), group = "Trading Period Settings") lookBackPeriodStop = input(title = "Trade Stop Date/Time", defval = timestamp('2025-01-01T00:00:00'), group = "Trading Period Settings") // Trading Mode settings tradingMode = input.string("Long", "Trading Mode", options = ["Long", "Short"], group = "Trading Mode Settings") // Long Mode Signal Options entrySignalOptionsLong = input.string("Bullish All", "Select Entry Signal (Long)", options = ["None", "Bullish Strong", "Bullish Neutral", "Bullish Weak", "Bullish Strong and Neutral", "Bullish Neutral and Weak", "Bullish Strong and Weak", "Bullish All"], group = "Long Mode Signals - set up if Trading Mode: Long") exitSignalOptionsLong = input.string("Bearish Weak", "Select Exit Signal (Long)", options = ["None", "Bearish Strong", "Bearish Neutral", "Bearish Weak", "Bearish Strong and Neutral", "Bearish Neutral and Weak", "Bearish Strong and Weak", "Bearish All"], group = "Long Mode Signals - set up if Trading Mode: Long") // Short Mode Signal Options entrySignalOptionsShort = input.string("None", "Select Entry Signal (Short)", options = ["None", "Bearish Strong", "Bearish Neutral", "Bearish Weak", "Bearish Strong and Neutral", "Bearish Neutral and Weak", "Bearish Strong and Weak", "Bearish All"], group = "Short Mode Signals - set up if Trading Mode: Short") exitSignalOptionsShort = input.string("None", "Select Exit Signal (Short)", options = ["None", "Bullish Strong", "Bullish Neutral", "Bullish Weak", "Bullish Strong and Neutral", "Bullish Neutral and Weak", "Bullish Strong and Weak", "Bullish All"], group = "Short Mode Signals - set up if Trading Mode: Short") // Risk Management Settings takeProfitPct = input.float(0, "Take Profit, % (0 - disabled)", minval = 0, step = 0.1, group = "Risk Management") stopLossPct = input.float(0, "Stop Loss, % (0 - disabled)", minval = 0, step = 0.1, group = "Risk Management") // Indicator Settings tenkanPeriods = input.int(9, "Tenkan", minval=1, group="Indicator Settings") kijunPeriods = input.int(26, "Kijun", minval=1, group="Indicator Settings") chikouPeriods = input.int(52, "Chikou", minval=1, group="Indicator Settings") displacement = input.int(26, "Offset", minval=1, group="Indicator Settings") // Display Settings showTenkan = input(false, "Show Tenkan Line", group = "Display Settings") showKijun = input(false, "Show Kijun Line", group = "Display Settings") showSenkouA = input(true, "Show Senkou A Line", group = "Display Settings") showSenkouB = input(true, "Show Senkou B Line", group = "Display Settings") showChikou = input(false, "Show Chikou Line", group = "Display Settings") // Function to convert percentage to price points based on entry price pctToPoints(pct) => strategy.position_avg_price * pct / 100 // Colors and Transparency Level transparencyLevel = 90 colorGreen = color.new(#36a336, 23) colorRed = color.new(#d82727, 47) colorTenkanViolet = color.new(#9400D3, 0) colorKijun = color.new(#fdd8a0, 0) colorLime = color.new(#006400, 0) colorMaroon = color.new(#8b0000, 0) colorGreenTransparent = color.new(colorGreen, transparencyLevel) colorRedTransparent = color.new(colorRed, transparencyLevel) // Ichimoku Calculations donchian(len) => math.avg(ta.lowest(len), ta.highest(len)) tenkan = donchian(tenkanPeriods) kijun = donchian(kijunPeriods) senkouA = math.avg(tenkan, kijun) senkouB = donchian(chikouPeriods) displacedSenkouA = senkouA[displacement - 1] displacedSenkouB = senkouB[displacement - 1] // Plot Ichimoku Lines plot(showTenkan ? tenkan : na, color=colorTenkanViolet, title = "Tenkan", linewidth=2) plot(showKijun ? kijun : na, color=colorKijun, title = "Kijun", linewidth=2) plot(showChikou ? close : na, offset=-displacement, color = colorLime, title = "Chikou", linewidth=1) p1 = plot(showSenkouA ? senkouA : na, offset=displacement - 1, color=colorGreen, title = "Senkou A", linewidth=2) p2 = plot(showSenkouB ? senkouB : na, offset=displacement - 1, color=colorRed, title = "Senkou B", linewidth=2) fill(p1, p2, color=senkouA > senkouB ? colorGreenTransparent : colorRedTransparent) // Signal Calculations bullishSignal = ta.crossover(tenkan, kijun) bearishSignal = ta.crossunder(tenkan, kijun) bullishSignalValues = bullishSignal ? tenkan : na bearishSignalValues = bearishSignal ? tenkan : na strongBullishSignal = bullishSignalValues > displacedSenkouA and bullishSignalValues > displacedSenkouB neutralBullishSignal = ((bullishSignalValues > displacedSenkouA and bullishSignalValues < displacedSenkouB) or (bullishSignalValues < displacedSenkouA and bullishSignalValues > displacedSenkouB)) weakBullishSignal = bullishSignalValues < displacedSenkouA and bullishSignalValues < displacedSenkouB strongBearishSignal = bearishSignalValues < displacedSenkouA and bearishSignalValues < displacedSenkouB neutralBearishSignal = ((bearishSignalValues > displacedSenkouA and bearishSignalValues < displacedSenkouB) or (bearishSignalValues < displacedSenkouA and bearishSignalValues > displacedSenkouB)) weakBearishSignal = bearishSignalValues > displacedSenkouA and bearishSignalValues > displacedSenkouB // Functions to determine entry and exit conditions for Long and Short isEntrySignalLong() => entryCondition = false if entrySignalOptionsLong == "None" entryCondition := false else if entrySignalOptionsLong == "Bullish Strong" entryCondition := strongBullishSignal else if entrySignalOptionsLong == "Bullish Neutral" entryCondition := neutralBullishSignal else if entrySignalOptionsLong == "Bullish Weak" entryCondition := weakBullishSignal else if entrySignalOptionsLong == "Bullish Strong and Neutral" entryCondition := strongBullishSignal or neutralBullishSignal else if entrySignalOptionsLong == "Bullish Neutral and Weak" entryCondition := neutralBullishSignal or weakBullishSignal else if entrySignalOptionsLong == "Bullish Strong and Weak" entryCondition := strongBullishSignal or weakBullishSignal else if entrySignalOptionsLong == "Bullish All" entryCondition := strongBullishSignal or neutralBullishSignal or weakBullishSignal entryCondition isExitSignalLong() => exitCondition = false if exitSignalOptionsLong == "None" exitCondition := false else if exitSignalOptionsLong == "Bearish Strong" exitCondition := strongBearishSignal else if exitSignalOptionsLong == "Bearish Neutral" exitCondition := neutralBearishSignal else if exitSignalOptionsLong == "Bearish Weak" exitCondition := weakBearishSignal else if exitSignalOptionsLong == "Bearish Strong and Neutral" exitCondition := strongBearishSignal or neutralBearishSignal else if exitSignalOptionsLong == "Bearish Neutral and Weak" exitCondition := neutralBearishSignal or weakBearishSignal else if exitSignalOptionsLong == "Bearish Strong and Weak" exitCondition := strongBearishSignal or weakBearishSignal else if exitSignalOptionsLong == "Bearish All" exitCondition := strongBearishSignal or neutralBearishSignal or weakBearishSignal exitCondition isEntrySignalShort() => entryCondition = false if entrySignalOptionsShort == "None" entryCondition := false else if entrySignalOptionsShort == "Bearish Strong" entryCondition := strongBearishSignal else if entrySignalOptionsShort == "Bearish Neutral" entryCondition := neutralBearishSignal else if entrySignalOptionsShort == "Bearish Weak" entryCondition := weakBearishSignal else if entrySignalOptionsShort == "Bearish Strong and Neutral" entryCondition := strongBearishSignal or neutralBearishSignal else if entrySignalOptionsShort == "Bearish Neutral and Weak" entryCondition := neutralBearishSignal or weakBearishSignal else if entrySignalOptionsShort == "Bearish Strong and Weak" entryCondition := strongBearishSignal or weakBearishSignal else if entrySignalOptionsShort == "Bearish All" entryCondition := strongBearishSignal or neutralBearishSignal or weakBearishSignal entryCondition isExitSignalShort() => exitCondition = false if exitSignalOptionsShort == "None" exitCondition := false else if exitSignalOptionsShort == "Bullish Strong" exitCondition := strongBullishSignal else if exitSignalOptionsShort == "Bullish Neutral" exitCondition := neutralBullishSignal else if exitSignalOptionsShort == "Bullish Weak" exitCondition := weakBullishSignal else if exitSignalOptionsShort == "Bullish Strong and Neutral" exitCondition := strongBullishSignal or neutralBullishSignal else if exitSignalOptionsShort == "Bullish Neutral and Weak" exitCondition := neutralBullishSignal or weakBullishSignal else if exitSignalOptionsShort == "Bullish Strong and Weak" exitCondition := strongBullishSignal or weakBullishSignal else if exitSignalOptionsShort == "Bullish All" exitCondition := strongBullishSignal or neutralBullishSignal or weakBullishSignal exitCondition // Strategy logic for entries and exits if true if tradingMode == "Long" takeProfitLevelLong = strategy.position_avg_price * (1 + takeProfitPct / 100) stopLossLevelLong = strategy.position_avg_price * (1 - stopLossPct / 100) if isEntrySignalLong() strategy.entry(id = "entry1", direction = strategy.long, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry1",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '"\n}') if (takeProfitPct > 0 and close >= takeProfitLevelLong) or (stopLossPct > 0 and close <= stopLossLevelLong) or (exitSignalOptionsLong != "None" and isExitSignalLong()) strategy.close(id = "entry1", alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "close",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '"\n}') else if tradingMode == "Short" takeProfitLevelShort = strategy.position_avg_price * (1 - takeProfitPct / 100) stopLossLevelShort = strategy.position_avg_price * (1 + stopLossPct / 100) if isEntrySignalShort() strategy.entry(id = "entry1", direction = strategy.short, alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "entry1",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '"\n}') if (takeProfitPct > 0 and close <= takeProfitLevelShort) or (stopLossPct > 0 and close >= stopLossLevelShort) or (exitSignalOptionsShort != "None" and isExitSignalShort()) strategy.close(id = "entry1", alert_message = '{\n"base": "' + syminfo.basecurrency + '",\n"quote": "' + syminfo.currency + '",\n"position": "close",\n"price": "' + str.tostring(close) + '",\n"sourceUuid": "' + sourceUuid + '",\n"secretToken": "' + secretToken + '"\n}')