
マルチチャネル自己適応海取引戦略は,古典的な海取引法を基礎として,全面的に最適化および拡張された近代的なトレンド追跡システムである.この戦略の核心は,市場突破点を識別するためにダブルドンチアンチャネル ((Donchian Channels) システムを使用し,動的に調整された退出チャネルによって正確なストップロスの位置を提供している.戦略は,二重の確認機構を設計している.チャネル1は,短期価格突破をキャプチャするために,チャネル2は,偽の信号を減らすために確認フィルターとして使用する.さらに,戦略は,3Commasの取引ロボットインターフェースを統合し,完全に自動取引の実行をサポートし,波動的な市場の中で長期のトレンドをキャプチャしたいトレーダーに適しています.
この戦略は,クラシックな海取引システムの核心原理に基づいているが,近代的な二通道確認機構とダイナミックな止損システムを追加している.
双通道突破確認システム:
ダイナミクスは通路を退ける:
入場と出場の論理:
資金管理:
信号の質が向上しました: 双通道確認メカニズムは,偽突破を大幅に削減し,信号の質と精度を向上させる.buy = buy_fast and close > upper_slow[1]そしてsel = sel_fast and close < lower_slow[1]デザインは,
ダイナミックなリスク管理: 戦略は,自主的な退出チャネルを採用し,市場の構造の動向に応じてストップロスを調整します. 市場が有利に動くと,ストップロスは自動的にフォローし,利益の一部をロックします. これはコードで通過します.exit_buy_level:= math.max(nz(exit_buy_level,10e-10), lower_exit)成し遂げる。
完全な資金管理システム戦略は,プロフェッショナルなマネジメントの規則を内蔵し,各取引のリスクの範囲を,パーセンテージ配分システムで制御しています.
取引管理の可視化戦略は,入場点,止損点,停止点をグラフで明確にマークし,トレーダーが取引の論理とリスクの範囲を直観的に理解するのを助けます.
市場が揺れ動いた分析コードは,双通道システムが誤報を減少させたものの,明確なトレンドがない市場では,まだ小さな損失の取引を何度も引き起こすことを示している.
パラメータ感度: 戦略性能は,通路周期と偏移量設定に高度に依存する. 異なる市場と時間枠には,異なるパラメータの組み合わせが必要で,十分な反測と最適化が必要である. コードにパラメータを入力する._period_dc1、_period_dc2そして_period_off重要な要素を制御する
遅滞のリスク: ダイナミックストップダメージチャネルは,急激に波動する市場で迅速に反応しない可能性があり,引き下げの拡大につながります. 特に,Kラインの閉店確認を要求します.barstate.isconfirmed) 高い波動性のある環境で最高の脱出時間を逃す可能性があります.
歴史的モデルに過度に依存している: 戦略は,歴史的な突破パターンが将来も有効であると仮定しますが,市場の特徴は時間とともに変化し,戦略のパフォーマンスに影響を与える可能性があります.
トレンドフィルターを追加: コード分析は,現在の戦略は,全体的な市場トレンドに対する判断が欠けていることを示しています. 移動平均,ADXまたはMACDなどのトレンド指標を追加し,強いトレンド環境で戦略を活性化し,弱いトレンドまたは震動市場では感度を下げることを推奨しています.
経路周期に適応する:現在,戦略は固定周期値を使用している.最適化の方向は,ATRまたは市場変動率に基づく自適化チャネル周期を導入し,戦略が異なる市場環境により良く適応できるようにすることです.これは変更することができます._period_dc1そして_period_dc2計算方法の実現について
退出の仕組みを最適化する:コードの退出論理は唐通路のみに依存する. 一定の利益を達成した後に部分的なポジションを平らにして,残りの部分のためにより緩やかな尾行ストップを設定するなど,段階的な退出戦略を実施することを推奨する.
タイムフィルター:取引時間フィルターを追加し,市場が低流動性または高波動性の時期を避ける.特に24時間取引の暗号通貨市場では,特定の時期が取引を実行するのにより適している可能性があります.
感情指標の統合: 取引量,波動率,資金流動などの市場情緒指標を統合して,入場と出場の決定を強化する.例えば,取引量が高い突破信号に重み付け,または異常な波動率の低い環境で取引頻度を減らす.
マルチチャネル自己適応海取引戦略は,ダブルチャネル確認メカニズムとダイナミックストップを介して伝統的な海取引法の多くの課題を解決する近代的で包括的なトレンド追跡システムである.この戦略は,H4または日線などのより高い時間枠でより安定したパフォーマンスを発揮する中長期のトレンドトレーダーに特に適しています.この戦略の3Commas集積の成功は,自動取引の理想的な選択肢となり,人間の感情的干渉を減らすことができます.
変動する市場では不良な結果が出るかもしれませんが,適切なパラメータ最適化と追加のトレンドフィルターによって,その全体的なパフォーマンスを大幅に向上させることができます. 戦略の資金管理モジュールは,リスクが効果的に管理されることを保証し,ダイナミックな止損システムは,既得利益を保護するのに役立ちます.
これは,様々な市場の状況でトレンドを捉えたいトレーダーにとって,特に他の市場分析ツールと組み合わせたときに考慮すべき戦略です. 覚えておいてください,どんな戦略も,個人のリスク承受能力と取引目標に合わせて調整され,実際の資金投入の前に十分な反射と模擬取引を行う必要があります.
/*backtest
start: 2024-03-04 00:00:00
end: 2025-03-02 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © 3Commas
//@version=6
// Strategy configuration: sets properties for the strategy like title, overlay, pyramiding, calculation mode, and risk parameters.
strategy(title = "[3Commas] Turtle Strategy"
, overlay = true
, pyramiding = 0
, calc_on_order_fills = false
, calc_on_every_tick = true
, default_qty_type = strategy.percent_of_equity
, default_qty_value = 1
, initial_capital = 10000
, slippage = 5
, commission_type = strategy.commission.percent
, commission_value = 0.1
, use_bar_magnifier = true
, fill_orders_on_standard_ohlc = true
)
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// 🟦 Inputs
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// Define menu options for strategy testing
var menu_buy = "🟢 Long"
var menu_sel = "🔴 Short"
var menu_buy_sell = "🟢 Long & 🔴 Short"
var menu_none = "🟤 None"
var group_settings = '🟦 Settings'
var group_test = '🟦 Strategy Tester'
// Input parameters for the channels and exit period
_period_dc1 = input.int(20, "Period Channel 1" , group = group_settings, inline = '' , display = display.none, tooltip ='Channel 1 Period.')
_period_dc2 = input.int(20, "Period Channel 2 ", group = group_settings, inline = '2', display = display.none, tooltip ='Channel 2 Period and offset to the right.')
_period_off = input.int(20, "Offset" , group = group_settings, inline = '2', display = display.none)
_period_exit = input.int(10, "Period Exit" , group = group_settings, inline = '' , display = display.none, tooltip ='Exit Period (Trailing).')
// Input parameters for strategy testing options
_test_pos_type = input.string( title= 'Strategy ' , group=group_test, inline = 'o' , defval = menu_buy_sell, options=[menu_buy_sell, menu_buy, menu_sel, menu_none], tooltip = 'Order Type direction in which trades are executed.')
_tp_use = input.bool (false, title= "Take Profit %" , group=group_test, inline = 'tp', tooltip = 'When activated, the entered value will be used as the Take Profit in percentage from the entry price level.')
_tp_percent = input.float (20 , title= "" , group=group_test, inline = 'tp', display = display.none)
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// 🟦 Logic
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// Calculate take profit levels if enabled; otherwise set to not available (na)
tp_buy = _tp_use?close * (1 + _tp_percent / 100) : na
tp_sel = _tp_use?close * (1 - _tp_percent / 100) : na
// Calculate fast and slow channel extremes and exit levels
upper_fast = ta.highest(high, _period_dc1)
lower_fast = ta.lowest (low , _period_dc1)
upper_slow = ta.highest(high, _period_dc2)[_period_off]
lower_slow = ta.lowest (low , _period_dc2)[_period_off]
upper_exit = ta.highest(high, _period_exit)
lower_exit = ta.lowest (low , _period_exit)
// Determine if there is a crossover or crossunder for fast and slow channels
buy_fast = ta.crossover (close, upper_fast[1]) and barstate.isconfirmed
sel_fast = ta.crossunder(close, lower_fast[1]) and barstate.isconfirmed
buy_slow = ta.crossover (close, upper_slow[1]) and barstate.isconfirmed
sel_slow = ta.crossunder(close, lower_slow[1]) and barstate.isconfirmed
// Initialize variables to track if we are in a long or short position
var inbuy = false
var insel = false
// Conditions to enter long or short positions based on fast signals and slow channel confirmation
buy = buy_fast and close>upper_slow[1] and not inbuy
sel = sel_fast and close<lower_slow[1] and not insel
// Update position flags if a trade is executed
inbuy := buy? true:inbuy
insel := sel? true:insel
// Plot shapes on the chart for long and short signals using circles and labels
plotshape(buy ?close:na, title="Label Long" , style=shape.circle , location= location.absolute, color=color.new(color.teal, 0), text='' , textcolor=color.white, size= size.auto, offset=0, editable=true)
plotshape(sel ?close:na, title="Label Short", style=shape.circle , location= location.absolute, color=color.new(color.red , 0), text='' , textcolor=color.white, size= size.auto, offset=0, editable=true)
plotshape(buy ?close:na, title="Label Long" , style=shape.labelup , location= location.belowbar, color=color.new(color.teal, 0), text='▲', textcolor=color.white, size= size.auto, offset=0, editable=true)
plotshape(sel ?close:na, title="Label Short", style=shape.labeldown, location= location.abovebar, color=color.new(color.red , 0), text='▼', textcolor=color.white, size= size.auto, offset=0, editable=true)
// Initialize take profit, stop loss, and exit levels for both long and short positions
var tp = float(na)
var sl = float(na)
var exit_buy_level = float(na)
var exit_sel_level = float(na)
// Set take profit levels when a new long or short signal is triggered
if buy
tp := tp_buy
if sel
tp := tp_sel
// For long positions, update the exit level based on the lowest exit channel
if inbuy
exit_buy_level:= math.max(nz(exit_buy_level,10e-10), lower_exit)
sl:= exit_buy_level
// For short positions, update the exit level based on the highest exit channel
if insel
exit_sel_level:= math.min(nz(exit_sel_level,10e+10), upper_exit)
sl:= exit_sel_level
// Check for exit conditions when price crosses the exit levels
exit_buy_pos = ta.crossunder(close,exit_buy_level)
exit_sel_pos = ta.crossover (close,exit_sel_level)
// Confirm exit conditions when in a position
exit_buy_close = inbuy and exit_buy_pos and barstate.isconfirmed
exit_sel_close = insel and exit_sel_pos and barstate.isconfirmed
// Check for take profit exit conditions for long and short positions
buy_tp_exit = (inbuy[1] and high>= tp and not buy)
sel_tp_exit = (insel[1] and low <= tp and not sel)
// Plot channel bands and exit levels on the chart (set to not display by default)
plot(upper_fast , title="Upper Channel 1", color=color.blue , display = display.none)
plot(lower_fast , title="Lower Channel 1", color=color.blue , display = display.none)
plot(upper_slow , title="Upper Channel 2", color=color.green, display = display.none)
plot(lower_slow , title="Lower Channel 2", color=color.green, display = display.none)
plot(exit_buy_level, title="Exit Long" , color=color.red , display = display.none, style = plot.style_linebr)
plot(exit_sel_level, title="Exit Short" , color=color.red , display = display.none, style = plot.style_linebr)
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// 🟦 Strategy Tester
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// Conditions for testing buy and sell signals
test_buy = buy
test_sel = sel
test_tp = tp
test_sl = sl
// Track the average entry price for the current position
test_en = strategy.position_avg_price
// Determine if the stop loss should be adjusted based on the current position and entry price
savestop = (strategy.position_size>0 and test_sl>test_en) or (strategy.position_size<0 and test_sl<test_en)
// Execute strategy entries based on the test conditions and selected position type
if test_buy and _test_pos_type != menu_sel and _test_pos_type != menu_none
strategy.entry ("Buy" , strategy.long)
if test_sel and _test_pos_type != menu_buy and _test_pos_type != menu_none
strategy.entry ("Sell", strategy.short)
// Close positions based on exit signals
if exit_buy_close
strategy.close("Buy")
if exit_sel_close
strategy.close("Sell")
// Set strategy exits using take profit conditions; stop loss is not used in these exits
strategy.exit("Exit Buy" , "Buy" , limit= test_tp, stop = na)
strategy.exit("Exit Sell", "Sell", limit= test_tp, stop = na)
// Define colors for plotting stop loss lines based on the savestop condition
test_sl_col = savestop?color.new(color.teal,50 ):color.new(color.red ,50)
// Check if there is no trade, based on changes in entry price or if entry price is not available
notrade = test_en!=test_en[1] or na(test_en)
// Plot entry price, stop loss, and take profit on the chart
plot_en = plot(notrade?na:test_en, title = 'Entry', color = color.new(color.blue,50 ), style = plot.style_linebr)
plot_sl = plot(notrade?na:test_sl, title = 'SL' , color = test_sl_col , style = plot.style_linebr)
plot_tp = plot(notrade?na:test_tp, title = 'TP' , color = color.new(color.teal,100), style = plot.style_linebr)
// Fill the background between the take profit and entry lines
fill(plot_tp, plot_en, test_tp, test_en, notrade?na:color.new(color.teal,50 ), notrade?na:color.new(color.teal,100), fillgaps = false, title = 'Trade Background')
// Fill the background between the entry and stop loss lines
fill(plot_en, plot_sl, test_en, test_sl, notrade?na:savestop?color.new(color.teal ,100):color.new(color.red ,100), notrade?na:savestop?color.new(color.teal ,50):color.new(color.red ,50 ), fillgaps = false, title = 'Trade Background')
// Reset variables when an exit condition is met for a long position
if exit_buy_close or buy_tp_exit
exit_buy_level:= float(na)
tp := float(na)
sl := float(na)
inbuy := false
// Reset variables when an exit condition is met for a short position
if exit_sel_close or sel_tp_exit
exit_sel_level:= float(na)
tp := float(na)
sl := float(na)
insel := false
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// 🟦 3Commas Integration
// ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
// This section integrates the strategy with 3Commas DCA Bot signals.
// Tutorial text for integration instructions
var c3_tuto = "Here you can enable the table to review the messages to be sent to the bot, as well as change the background color and text color."
+'\n\n🤖 𝗛𝗼𝘄 𝘁𝗼 𝘂𝘀𝗲 𝗗𝗖𝗔 𝗕𝗼𝘁 𝗦𝗶𝗴𝗻𝗮𝗹𝘀'
+'\n ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'
+ '\n🔹Verify Messages: Ensure the message matches the one specified by the DCA Bot.'
+'\n\n🔹Multi-Pair Configuration: For multi-pair setups, enable the option to add the symbol in the correct format.'
+'\n\n🔹Signal Settings: Enable whether you want to receive long or short signals (Entry | TP | SL), copy and paste the the messages for the DCA Bots configured in 3Commas.'
+'\n\n🔹Alert Setup:'
+'\n\n- When creating an alert, set the condition to the indicator and choose "alert() function call only."'
+'\n\n- Enter any desired Alert Name.'
+'\n\n- Open the Notifications tab, enable Webhook URL, and paste the Webhook URL from 3Commas.'
+'\n\n- For more details, refer to the 3Commas section: "How to use TradingView Custom Signals."'
+"\n\n🔹Finalize Alerts: Click Create, you're done! Alerts will now be sent automatically in the correct format to 3Commas."
// Predefined JSON messages for bot signals for both entry and exit in long and short positions
var c3_text_buy_entry = '{ "message_type": "bot", "bot_id": 15743097, "email_token": "b9ed9d7d-7777-42ed-a0a6-608f4ecedf82", "delay_seconds": 0}'
var c3_text_sel_entry = '{ "message_type": "bot", "bot_id": 15743017, "email_token": "b9ed9d7d-7777-42ed-a0a6-608f4ecedf82", "delay_seconds": 0}'
var c3_text_buy_exit = '{ "action": "close_at_market_price", "message_type": "bot", "bot_id": 15743097, "email_token": "b9ed9d7d-7777-42ed-a0a6-608f4ecedf82", "delay_seconds": 0}'
var c3_text_sel_exit = '{ "action": "close_at_market_price", "message_type": "bot", "bot_id": 15743017, "email_token": "b9ed9d7d-7777-42ed-a0a6-608f4ecedf82", "delay_seconds": 0}'
// Define emojis for visual signals
var emog = '🟢'
var emor = '🔴'
var emof = '🏁'
var read = 'Check Messages, Please Read 👉'
// Input settings for the integration table and signal customization
group_c3 = '🟦 DCA Bot Signals'
_c3_tuto = input.bool (false , title= read , group=group_c3, inline='h', display = display.none, tooltip = c3_tuto)
_c3_size = input.string('Normal' , title= ' ↳ Size' , group=group_c3, inline='' , display = display.none, options=['Tiny','Small','Normal','Large','Huge'])
_c3_pos = input.string('Bottom Center' , title= ' ↳ Position' , group=group_c3, inline='' , display = display.none, options=['Top Left','Top Center','Top Right','Middle Left','Middle Center','Middle Right','Bottom Left','Bottom Center','Bottom Right'])
_c3_col1 = input.color(#1F1F1F , title= ' ↳ Colors ' , group=group_c3, inline='c', display = display.none)
_c3_col2 = input.color(color.white , title= '' , group=group_c3, inline='c', display = display.none)
_c3_buy_entry = input.bool (true , title= emog+' Buy Entry ' , group=group_c3, inline='b', display = display.none, tooltip= 'Enable this options to send Buy Entry, Take Profit (TP), and Stop Loss (SL) signals to 3Commas.')
_c3_buy_tp = input.bool (true , title= 'TP' , group=group_c3, inline='b', display = display.none)
_c3_buy_sl = input.bool (true , title= 'SL' , group=group_c3, inline='b', display = display.none)
_c3_text_buy_entry = input.string(c3_text_buy_entry, title= ' ↳ Deal Entry' , group=group_c3, inline= '', display = display.none, tooltip= 'Long DCA Bot: Copy and paste the message for the deal start signal of the DCA Bot you created in 3Commas.')
_c3_text_buy_exit = input.string(c3_text_buy_exit , title= ' ↳ Deal Exit' , group=group_c3, inline= '', display = display.none, tooltip= 'Long DCA Bot: Copy and paste the message to close order at Market Price of the DCA Bot you created in 3Commas.')
_c3_sel_entry = input.bool (true , title= emor+' Sell Entry ', group=group_c3, inline='s', display = display.none, tooltip= 'Enable this options to send Sell Entry, Take Profit (TP), and Stop Loss (SL) signals to 3Commas.')
_c3_sel_tp = input.bool (true , title= 'TP' , group=group_c3, inline='s', display = display.none)
_c3_sel_sl = input.bool (true , title= 'SL' , group=group_c3, inline='s', display = display.none)
_c3_text_sel_entry = input.string(c3_text_sel_entry, title= ' ↳ Deal Entry' , group=group_c3, inline= '', display = display.none, tooltip= 'Short DCA Bot: Copy and paste the message for the deal start signal of the DCA Bot you created in 3Commas.')
_c3_text_sel_exit = input.string(c3_text_sel_exit , title= ' ↳ Deal Exit' , group=group_c3, inline= '', display = display.none, tooltip= 'Short DCA Bot: Copy and paste the message to close order at Market Price of the DCA Bot you created in 3Commas.')
_c3_entry_bot_use = input.bool (false , title= 'DCA Bot Multi-Pair' , group=group_c3, inline= '', display = display.none, tooltip = 'You must activate it if you want to use the signals in a DCA Bot Multi-pair \n\nIn the text box you must enter (using the 3Commas format) the symbol in which you are creating the alert, you can check the format of each symbol when you create the bot.\n\nBefore creating the alert, verify that the message is the same as the one specified in the DCA bot, using the summary option.')
_c3_entry_bot_mult = input.string('USDT_BTC' , title= ' ↳ Symbol' , group=group_c3, inline= '', display = display.none)
// Function to determine label size based on the selected menu option
LabelSize (size_menu_)=>
switch size_menu_
'Auto' => size.auto
'Tiny' => size.tiny
'Small' => size.small
'Normal' => size.normal
'Large' => size.large
'Huge' => size.huge
// Function to determine table position based on the selected menu option
TablePosition (pos_menu_)=>
switch pos_menu_
'Top Left' => position.top_left
'Top Center' => position.top_center
'Top Right' => position.top_right
'Middle Left' => position.middle_left
'Middle Center' => position.middle_center
'Middle Right' => position.middle_right
'Bottom Left' => position.bottom_left
'Bottom Center' => position.bottom_center
'Bottom Right' => position.bottom_right
// Function to trim the JSON message and add the pair if multi-pair is enabled
TrimPair(txt_, multipair_, pair_) =>
trim = txt_
check = str.contains(trim,'delay_seconds') and
str.contains(trim,'email_token' ) and
str.contains(trim,'bot_id' ) and
str.contains(trim,'message_type' )
if check
del = array.get(str.split(trim, '"delay_seconds": 0'), 1)
trim := str.replace(trim, del, '', 0)
pair = ', "pair": '+ '"' + str.replace_all(pair_, ' ', '')+ '"'
trim := trim + (multipair_? pair: '') + '}'
trim
// Function to format JSON for a nicer display by adding new lines and spacing
JsonFormat(json_)=>
nice = json_
check = str.contains(nice,'delay_seconds') and
str.contains(nice,'email_token' ) and
str.contains(nice,'bot_id' ) and
str.contains(nice,'message_type' )
if check
nice := str.replace_all(nice, ' ', '' )
nice := str.replace_all(nice, ',', ',\n ')
nice := str.replace_all(nice, '{', '{\n ')
nice := str.replace_all(nice, '}', '\n}' )
nice := str.replace_all(nice, ':', ': ' )
nice
// Define conditions to send signals based on entry and exit signals
c3_en_buy = _c3_buy_entry and buy
c3_ex_buy = (_c3_buy_tp and buy_tp_exit) or (_c3_buy_sl and exit_buy_close)
c3_en_sel = _c3_sel_entry and sel
c3_ex_sel = (_c3_sel_tp and sel_tp_exit) or (_c3_sel_sl and exit_sel_close)
// Format the messages for both entry and exit, applying multi-pair configuration if enabled
var c3_buy_dealstart = JsonFormat(TrimPair(_c3_text_buy_entry, _c3_entry_bot_use, _c3_entry_bot_mult))
var c3_buy_closemarket = JsonFormat(TrimPair(_c3_text_buy_exit , _c3_entry_bot_use, _c3_entry_bot_mult))
var c3_sel_dealstart = JsonFormat(TrimPair(_c3_text_sel_entry, _c3_entry_bot_use, _c3_entry_bot_mult))
var c3_sel_closemarket = JsonFormat(TrimPair(_c3_text_sel_exit , _c3_entry_bot_use, _c3_entry_bot_mult))
// Send alerts for buy and sell entries and exits based on conditions
switch
c3_en_buy => alert(c3_buy_dealstart , alert.freq_once_per_bar)
c3_ex_buy => alert(c3_buy_closemarket, alert.freq_once_per_bar)
switch
c3_en_sel => alert(c3_sel_dealstart , alert.freq_once_per_bar)
c3_ex_sel => alert(c3_sel_closemarket, alert.freq_once_per_bar)
// Create a table with the signal messages for user review
if barstate.isfirst and _c3_tuto
var bg = _c3_col1
var tx = _c3_col2
var gr = color.green
var re = color.red
var hw = 'How to use 3Commas DCA Bot Signals 🤖'
var ms = '🤖 DCA Bot Signals Messages '
var ds = 'Deal start signal'
var me = 'Close order at Market Price'
var c3_table = table.new(TablePosition (_c3_pos), 6, 6, border_width=1, frame_width=1,border_color = color.new(color.black,0), frame_color = color.new(color.black,0))
table.cell(c3_table, 1, 1, ms , text_color=tx, text_halign=text.align_center, text_size = LabelSize(_c3_size), bgcolor = bg)
table.cell(c3_table, 1, 2, ds , text_color=tx, text_halign=text.align_center, text_size = LabelSize(_c3_size), bgcolor = bg, width=0)
table.cell(c3_table, 1, 3, me , text_color=tx, text_halign=text.align_center, text_size = LabelSize(_c3_size), bgcolor = bg, width=0)
table.cell(c3_table, 2, 1, 'Long Bot Messages' , text_color=gr, text_halign=text.align_center, text_size = LabelSize(_c3_size), bgcolor = bg)
table.cell(c3_table, 2, 2, c3_buy_dealstart , text_color=tx, text_halign=text.align_left , text_size = LabelSize(_c3_size), bgcolor = bg, text_font_family= font.family_monospace)
table.cell(c3_table, 2, 3, c3_buy_closemarket , text_color=tx, text_halign=text.align_left , text_size = LabelSize(_c3_size), bgcolor = bg, text_font_family= font.family_monospace)
table.cell(c3_table, 3, 1, 'Short Bot Messages', text_color=re, text_halign=text.align_center, text_size = LabelSize(_c3_size), bgcolor = bg)
table.cell(c3_table, 3, 2, c3_sel_dealstart , text_color=tx, text_halign=text.align_left , text_size = LabelSize(_c3_size), bgcolor = bg, text_font_family= font.family_monospace)
table.cell(c3_table, 3, 3, c3_sel_closemarket , text_color=tx, text_halign=text.align_left , text_size = LabelSize(_c3_size), bgcolor = bg, text_font_family= font.family_monospace)