この戦略は,市場情勢を計測し,潜在的なブレイクアウト機会を特定するためにIchimoku Cloud指標を組み合わせています. イチモクベースのトレンドフィルタリング,ATR/パーセントトラッキングストップ,およびオプションの利益採取メカニズムがあります.
イチモク・クラウドの信号は,上昇/下落の勢いを決定し,強度ブレイク信号は,潜在的ブレイクを捕捉します.
トレンドシグナルには,上昇傾向を示すためにコンバーションラインがベースラインの上を横断し,強い勢いを示す価格バーの上のLagging Spanと, Ichimoku Cloudのトップバンドを破る値が必要です.
追加的なエントリー機会の強度爆発信号は,CLOUDの最近の低点と高点を突破し,超強度と変換/ベースラインが上昇傾向に一致することを要求します.
ロングエントリは,信号が発射されると起動し,出口はATR,パーセント,またはイチモクルールに基づいて停止し,利益をロックします.
最大の利点は イチモク・クラウドを利用して 動向分析とインパクト分析の両方をすることで シグナルが 移動平均値のような単一の指標よりも 精度が高くなります
ATR/百分比後続停止によるリスク管理により,取引あたりの損失も小さく保たれます.オプションの利益は報酬の一貫性をさらに高めます.
イチモク雲には 遅滞がある 強い信号も 勢いを追う可能性を高める
遅延リスクに対処するために,Cloudの設定をより速く最適化します.モメントリスクでは,より緊密な遅延ストップが逆転により早く反応します.
改善する可能性は以下の通りです.
市場データにより 安定性を検証する
特定の機器のためのクラウドパラメータを最適化します.
LSTMのような MLを試して 信号の評価が良くなる
ボリューム分析を加えれば 罠にはまりません
このイチモクシステムは,トレンド取引に対する市場情勢を効果的に測定する.モメントを把握し,リスクを管理することにバランスのとれた焦点を当てることも,それを実践的にします.改善の余地がありますが,全体的には,堅固なトレンドフォローフレームワークです.
/*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