Торговый бот для спотовых и маржинальных торговых площадок OKX.
Эта стратегия использует пересечение тройной экспоненциальной скользящей средней и скользящей средней метода наименьших квадратов. Мы также контролируем прибыль, которую вы получите во время восходящего тренда, реализуя трейлинг-стоп на основе индикатора ATR. Эта стратегия предназначена только для спотового рынка и может быть использована в основном долгосрочными инвесторами.
Применяется для ETH/USDT 4H на OKX.
|
|
Направление торговли | LONG |
Первая линия тренда | TEMA |
Вторая линия тренда | LSMA |
Длина первой линии тренда | 18 |
Длина второй линии тренда | 57 |
Long Take Profit 1 (%) | 9 |
Long Take Profit 1 (qty) | 20 |
Long Take Profit 2 (%) | 20 |
Long Take Profit 2 (qty) | 20 |
Stop Loss (%) | 3 |
SL Множитель | 3.3 |
ATR Период | 4 |
Источник | close |
Код Pine Script
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Wunderbit Trading
//@version=5
strategy('Automated Ethereum (ETH) Investment Strategy', overlay=true, initial_capital=5000, pyramiding=0, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
//////////// Functions
Atr(p) =>
atr = 0.
Tr = math.max(high - low, math.max(math.abs(high - close[1]), math.abs(low - close[1])))
atr := nz(atr[1] + (Tr - atr[1]) / p, Tr)
atr
//TEMA
TEMA(series, length) =>
if length > 0
ema1 = ta.ema(series, length)
ema2 = ta.ema(ema1, length)
ema3 = ta.ema(ema2, length)
3 * ema1 - 3 * ema2 + ema3
else
na
tradeType = input.string('LONG', title='What trades should be taken : ', options=['LONG', 'SHORT', 'BOTH', 'NONE'])
///////////////////////////////////////////////////
/// INDICATORS
source = close
/// TREND
trend_type1 = input.string('TEMA', title='First Trend Line : ', options=['LSMA', 'TEMA', 'EMA', 'SMA'])
trend_type2 = input.string('LSMA', title='First Trend Line : ', options=['LSMA', 'TEMA', 'EMA', 'SMA'])
trend_type1_length = input(18, 'Length of the First Trend Line')
trend_type2_length = input(57, 'Length of the Second Trend Line')
leadLine1 = if trend_type1 == 'LSMA'
ta.linreg(close, trend_type1_length, 0)
else if trend_type1 == 'TEMA'
TEMA(close, trend_type1_length)
else if trend_type1 == 'EMA'
ta.ema(close, trend_type1_length)
else
ta.sma(close, trend_type1_length)
leadLine2 = if trend_type2 == 'LSMA'
ta.linreg(close, trend_type2_length, 0)
else if trend_type2 == 'TEMA'
TEMA(close, trend_type2_length)
else if trend_type2 == 'EMA'
ta.ema(close, trend_type2_length)
else
ta.sma(close, trend_type2_length)
p3 = plot(leadLine1, color=color.new(#53b987, 50), title='EMA', linewidth=1)
p4 = plot(leadLine2, color=color.new(#eb4d5c, 50), title='SMA', linewidth=1)
fill(p3, p4, color=leadLine1 > leadLine2 ? #53b987 : #eb4d5c, transp=60)
//Upward Trend
UT = ta.crossover(leadLine1, leadLine2)
DT = ta.crossunder(leadLine1, leadLine2)
// TP/ SL/ FOR LONG
// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input.float(9, title='Long Take Profit 1 %', step=0.1) / 100
long_tp1_qty = input.int(20, title='Long Take Profit 1 Qty', step=1)
long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100
long_tp2_qty = input.int(20, title='Long Take Profit 2 Qty', step=1)
long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
long_sl_input = input.float(3, title='stop loss in %', step=0.1) / 100
long_sl_input_level = strategy.position_avg_price * (1 - long_sl_input)
// Stop Loss
multiplier = input.float(3.3, 'SL Mutiplier', minval=1, step=0.1)
ATR_period = input.int(4, 'ATR period', minval=1, step=1)
// Strategy
//LONG STRATEGY CONDITION
SC = input(close, 'Source')
SL1 = multiplier * Atr(ATR_period) // Stop Loss
Trail1 = 0.0
iff_1 = SC > nz(Trail1[1], 0) ? SC - SL1 : SC + SL1
Trail1 := SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0) ? math.min(nz(Trail1[1], 0), SC + SL1) : iff_1
Trail1_high = ta.highest(Trail1, 50)
// iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1),
entry_long = ta.crossover(leadLine1, leadLine2) and Trail1_high < close
exit_long = close < Trail1_high or ta.crossover(leadLine2, leadLine1) or close < long_sl_input_level
///// BACKTEST PERIOD ///////
testStartYear = input(2016, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
testStopYear = input(9999, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(31, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
if testPeriod()
if tradeType == 'LONG' or tradeType == 'BOTH'
if strategy.position_size == 0 or strategy.position_size > 0
strategy.entry('long', strategy.long, comment='b8f60da7_ENTER-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H', when=entry_long)
strategy.exit('TP1', 'long', qty_percent=long_tp1_qty, limit=long_take_level_1)
strategy.exit('TP2', 'long', qty_percent=long_tp2_qty, limit=long_take_level_2)
strategy.close('long', when=exit_long, comment='b8f60da7_EXIT-LONG_BINANCE_BTC/USDT_b8f60da7-BTC-Investment_4H')
// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit')
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit')
plot(strategy.position_size > 0 ? Trail1_high : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')