
この戦略は,超強指数平滑移動平均と相対的に強い指数に基づいて,二重トレンド追跡機構を設計し,トレンドを正確に判断し,合理的な止損停止点を設定します.この戦略は,トレンドを基準にストップ・ロスト・ストップ・ストップの設定,二重トレンド判断などの特性を有し,個々の取引のリスクを効果的に制御し,トレンドの状況で超強の利益を得ることができます.
超強指数平移平均を計算して,主要トレンドの方向を判断する。超強指数平移平均は,トレンドの方向を正確に判断し,理想的な入場点を与える。
比較強弱指数 (RSI) を計算し,トレンドの判断に役立つ指標である. RSI高値が超買い区で,牛市トレンドを表す. RSI低値が超売り区で,熊市トレンドを表す.
閉店価格が超強指数平移平均線を越えたとき,多めに;閉店価格が超強指数平移平均線を下回ったとき,空っぽに.
合理的にストップ・ロスを設定する. オーバー・タイムでは,超強指数平移平均をストップ・ラインとして,超強指数平移平均と合理的な利益のストップ・ポイントとして;空いている時は,超強指数平移平均をストップ・ラインとして,超強指数平移平均と合理的な利益のストップ・ポイントとして.
ストップ・ロスは,市場の変動に合わせて浮動する.市場が有利な方向に進むと,ストップ・ロスは有利な方向に移動し,利益を確保する.
RSIが超強指数平移平均線方向と一致するときは,現在のトレンドが強いことを示す.この時点で戦略は入場する. RSIが超強指数平移平均線方向と一致しないときは,トレンドの転換の可能性を示し,この時点で戦略は一時的に出場する.
双重トレンド判定メカニズムにより,誤信号が減り,戦略の安定性が向上する.
ストップ・ロスはトレンドに沿って動き,利益を最大限に固定し,過早なストップ・ロスを回避します.
RSIの指標は,弱点のある取引信号をフィルタリングします.
利潤を最大化するために,合理的な停止位置を設定します.
戦略のパラメータは調整可能で,異なる品種や状況の特徴に応じて最適化できます.
戦略の撤回は制御可能で,リスク管理能力は高い.
重要な政策発表などの突発的な事件が発生した場合,市場が激しく波動し,止損点が突破され,大きな損失を招く可能性があります. 止損点を適切に緩めることができるか,または重大なリスクイベントが起こる前に,時間内に退場することができます.
パラメータ設定が不適切で,ストップ・ストップ・ポイントが不合理に設定され,損失を拡大したり,利益を縮小したりする可能性があります.
多空混戦段階では,RSIと超強指数平滑移動平均は一定偏差が発生し,戦略が誤った取引シグナルを生じさせる可能性があります.この時には一時的に取引を中止し,明確なトレンドが再開されるのを待つことができます.
ATR周期のパラメータを最適化して,異なる品種の特性に合わせる.
RSIパラメータの設定を最適化して,より安定した信頼性の高い補助トレンド判断条件を見つける.
ブリン帯,KDJなどの他の指標判断と組み合わせて,より正確な出場入場基準を設定する.
トラッキングストップ,階段ストップ,シャットラインストップなどの様々なストップ戦略をテストし,利益レベルを最適化します.
ポジション管理戦略を反省結果に合わせて調整し,単一取引のリスクを低減する.
この戦略は,全体として強い安定性および継続的な収益性を持っています. 二重トレンド判断機構は,ノイズを効果的にフィルターし,止損ストップ戦略は,利益をロックし,リスクを制御することができます. パラメータ設定と入場出場条件を継続的に最適化することにより,戦略は,異なる市場環境で良好なパフォーマンスを得ることができます. 全体として,この戦略は,量化取引の優れた戦略のテンプレートとして,研究と適用を重点にすることができます.
/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// -----------------------------------------------------------------------------
// Copyright 2019 Mauricio Pimenta | exit490
// SuperTrend with Trailing Stop Loss script may be freely distributed under the MIT license.
//
// Permission is hereby granted, free of charge,
// to any person obtaining a copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
// -----------------------------------------------------------------------------
//
// Authors: @exit490
// Revision: v1.0.0
// Date: 5-Aug-2019
//
// Description
// ===========
// SuperTrend is a moving stop and reversal line based on the volatility (ATR).
// The strategy will ride up your stop loss when price moviment 1%.
// The strategy will close your operation when the market price crossed the stop loss.
// The strategy will close operation when the line based on the volatility will crossed
//
// The strategy has the following parameters:
//
// INITIAL STOP LOSS - Where can isert the value to first stop.
// POSITION TYPE - Where can to select trade position.
// ATR PERIOD - To select number of bars back to execute calculation
// ATR MULTPLIER - To add a multplier factor on volatility
// BACKTEST PERIOD - To select range.
//
// -----------------------------------------------------------------------------
// Disclaimer:
// 1. I am not licensed financial advisors or broker dealers. I do not tell you
// when or what to buy or sell. I developed this software which enables you
// execute manual or automated trades multplierFactoriplierFactoriple trades using TradingView. The
// software allows you to set the criteria you want for entering and exiting
// trades.
// 2. Do not trade with money you cannot afford to lose.
// 3. I do not guarantee consistent profits or that anyone can make money with no
// effort. And I am not selling the holy grail.
// 4. Every system can have winning and losing streaks.
// 5. Money management plays a large role in the results of your trading. For
// example: lot size, account size, broker leverage, and broker margin call
// rules all have an effect on results. Also, your Take Profit and Stop Loss
// settings for individual pair trades and for overall account equity have a
// major impact on results. If you are new to trading and do not understand
// these items, then I recommend you seek education materials to further your
// knowledge.
//
// YOU NEED TO FIND AND USE THE TRADING SYSTEM THAT WORKS BEST FOR YOU AND YOUR
// TRADING TOLERANCE.
//
// I HAVE PROVIDED NOTHING MORE THAN A TOOL WITH OPTIONS FOR YOU TO TRADE WITH THIS PROGRAM ON TRADINGVIEW.
//
// I accept suggestions to improve the script.
// If you encounter any problems I will be happy to share with me.
// -----------------------------------------------------------------------------
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
strategy(title='DEO SESSSION', shorttitle='DEO S', overlay=true, precision=8, calc_on_order_fills=true, calc_on_every_tick=true, backtest_fill_limits_assumption=0, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD, linktoseries=true)
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
// === BACKTEST RANGE ===
backTestSectionFrom = input(title='════════════ FROM ════════════', defval=true)
// selected dates
i_startTime = input(title="START FILTER", defval=timestamp("02 Jan 2023 00:00 +0000"), group="RISK MANAGEMENT", tooltip="Start date & time to begin searching for setups")
i_endTime = input(title="END FILTER", defval=timestamp("12 Dec 2100 00:00 +0000"), group="RISK MANAGEMENT", tooltip="End date & time to stop searching for setups")
afterStartDate = true
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
parameterSection = input(title='══════════ STRATEGY ══════════', defval=true)
// === INPUT TO SELECT POSITION ===
positionType = input.string(defval='LONG', title='Position Type', options=['LONG', 'SHORT'])
// === INPUT TO SELECT INITIAL STOP LOSS
initialStopLossPercent = input.float(defval=3.0, minval=0.0, title='Initial Stop Loss')
// === INPUT TO SELECT BARS BACK
barsBack = input(title='ATR Period', defval=1)
// === INPUT TO SELECT MULTPLIER FACTOR
multplierFactor = input.float(title='ATR multplierFactoriplier', step=0.1, defval=3.0)
RSI = input.int(title='RSI', defval=7, minval=1, maxval=100)
calcSection = input(title='══════════ LOT CALC ══════════', defval=true)
accountBalance = input.float(title="ACCOUNT BALANCE", defval=250000, minval=1, group="INPUTS")
entryPrice = input.float(title="ENTRY PRICE", defval=100, minval=1, group="INPUTS")
slPrice = input.float(title="STOP LOSS PRICE", defval=100, minval=1, group="INPUTS")
riskPer = input.float(title="RISK USD", defval=1, minval=0.1, group="INPUTS")
lotSize = input.float(title="LOT SIZE", defval=10, minval=0.1, group="INPUTS")
RiskSize = riskPer
qtyLongTargetPrice = math.abs((RiskSize / ((entryPrice - slPrice) * syminfo.pointvalue)) / lotSize)
trendcSection = input(title='══════════ TREND LINE ══════════', defval=true)
// ema trend
tLen = input.int(200, minval=1, title="Trend Line")
tSrc = input(close, title="Source")
thisEma = ta.ema(tSrc, tLen)
plot(thisEma, title = "Trend Line",color=#ffffff)
MTSection = input(title='══════════ MT LOGIN ══════════', defval=true)
exchange = input.string(defval='MT5', title='EXCHANGE', options=['MT4', 'MT5'])
mtLogin= input.string(defval="", title='MT LOGIN', group = "mt")
mtPassword =input.string(defval='', title='MT PASSWORD', group = "mt")
mtServer =input.string(defval='', title='MT SERVER', group = "mt")
mtIsOn = input.string(defval='ON', title='STRATEGY ON', options=['ON', 'OFF'])
mtEntryMode = input.string(defval='CLOSE OPEN', title='ENTRY MODE', options=['CLOSE OPEN', 'OPEN'])
displaySection = input(title='══════════ DISPLAY LOGIN ══════════', defval=true)
displayTable = input(title="DISPLAY TABLE", defval=false, group = 'PRODUCTION', tooltip = "MAKES YOUR STRATEGY TRIGGER SLOWER")
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //
// LOGIC TO FIND DIRECTION WHEN THERE IS TREND CHANGE ACCORDING VOLATILITY
atr = multplierFactor * ta.atr(barsBack)
longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
direction = 1
direction := nz(direction[1], direction)
direction := direction == -1 and close > shortStopPrev ? 1 : direction == 1 and close < longStopPrev ? -1 : direction
longColor = color.blue
shortColor = color.blue
var valueToPlot = 0.0
var colorToPlot = color.white
if direction == 1
valueToPlot := longStop
colorToPlot := color.green
colorToPlot
else
valueToPlot := shortStop
colorToPlot := color.red
colorToPlot
//RSI
src = close
ep = 2 * RSI - 1
auc = ta.ema(math.max(src - src[1], 0), ep)
adc = ta.ema(math.max(src[1] - src, 0), ep)
x1 = (RSI - 1) * (adc * 70 / (100 - 70) - auc)
ub = x1 >= 0 ? src + x1 : src + x1 * (100 - 70) / 70
x2 = (RSI - 1) * (adc * 30 / (100 - 30) - auc)
lb = x2 >= 0 ? src + x2 : src + x2 * (100 - 30) / 30
//Affichage
plot(math.avg(ub, lb), color=color.white ,linewidth=1, title='RSI')
plot(valueToPlot == 0.0 ? na : valueToPlot, title='Action Line', linewidth=2, color=color.new(colorToPlot, 0))
plotshape(direction == 1 and direction[1] == -1 ? longStop : na, title='Buy', style=shape.labelup, location=location.absolute, size=size.normal, text='Buy', textcolor=color.new(color.white, 0), color=color.new(color.green, 0))
plotshape(direction == -1 and direction[1] == 1 ? shortStop : na, title='Sell', style=shape.labeldown, location=location.absolute, size=size.normal, text='Sell', textcolor=color.new(color.white, 0), color=color.new(color.red, 0))
p_ma1 = plot(valueToPlot, title = "ST", color = color.rgb(255, 236, 66))
p_ma2 = plot(math.avg(ub, lb), title = "RSI", color = color.rgb(234, 0, 255))
// Definitions: Trends
TrendUp1() =>
valueToPlot > math.avg(ub, lb)
TrendDown1() =>
valueToPlot < math.avg(ub, lb)
trendColor1 = TrendUp1() ? color.rgb(255, 236, 66, 85): TrendDown1() ? color.rgb(234, 0, 255, 85) : color.rgb(255, 255, 255, 85)
fill(p_ma1, p_ma2, color=trendColor1)
longCondition () =>
ta.crossover(close, valueToPlot)
shortCondition () =>
ta.crossunder(close, valueToPlot)
IsLongShort() =>
strategy.position_size != 0
getNewLotSize() =>
math.abs(riskPer / (close - valueToPlot))
// plot(getNewLotSize(), "new lot size")
newLotS = getNewLotSize()
alertManagement = str.tostring(exchange) + "," + str.tostring(mtLogin) + "," +str.tostring(mtPassword) + ","
alertManagement += str.tostring(mtServer) + "," + str.tostring(newLotS)
// alertManagement += str.tostring(stopLoss) + "," + str.tostring(applyingSL) + "," + str.tostring(applyTrailingStop) + ","
// alertManagement += str.tostring(exchange) + "," + str.tostring(exchangeAccount) + "," + str.tostring(slAmount) + "," + str.tostring(closeTpAmount) + ","
// alertManagement += str.tostring(exchangeLeverage) + "," + str.tostring(exchangeLeverageType) + ","
// alertManagement += str.tostring(mtLogin) + "," + str.tostring(mtPassword) + "," + str.tostring(mtServer) + "," + str.tostring(mtLot) + ","
// alertManagement += str.tostring(mtTp) + "," + str.tostring(mtTs) + "," + str.tostring(orderStrategy)
// alertManagement = "alertManagement"
myStop = 0.0
myTarget = 0.0
if (longCondition())
qtyLongTargetPrice := math.abs((RiskSize / ((close - valueToPlot) * syminfo.pointvalue)) / lotSize)
if IsLongShort()
strategy.close_all(comment = "close all entries")
strategy.entry("LONG", strategy.long, qty=12, comment="LONG", alert_message=alertManagement)
strategy.exit("TPL", "LONG", stop=valueToPlot, limit= close + (close - valueToPlot), comment="Target", alert_message=alertManagement)
if (shortCondition())
qtyLongTargetPrice := math.abs((RiskSize / ((close - valueToPlot) * syminfo.pointvalue)) / lotSize)
if IsLongShort()
strategy.close_all(comment = "close all entries")
strategy.entry("SHORT", strategy.short, qty=12, comment="SHORT", alert_message=alertManagement)
strategy.exit("TPS", "SHORT", stop=valueToPlot, limit= close + (close - valueToPlot), comment="Target", alert_message=alertManagement)
// Calculate the average profit per open trade
// avgProfit = profitSum / strategy.opentrades
getTotalProfit()=>
// Sum the profit of all open trades
profitSum = 0.0
for tradeNumber = 0 to strategy.closedtrades - 1
if strategy.closedtrades.profit(tradeNumber) > 0
profitSum += strategy.closedtrades.profit(tradeNumber)
result = profitSum
getTotalLoss()=>
// Sum the profit of all open trades
lossSum = 0.0
for tradeNumber = 0 to strategy.closedtrades - 1
if strategy.closedtrades.profit(tradeNumber) < 0
lossSum += strategy.closedtrades.profit(tradeNumber)
result = lossSum
maxLossRun()=>
lossRun = 0.0
currentMaxLoss = 0.0
for tradeNo = 0 to strategy.closedtrades - 1
if strategy.closedtrades.profit(tradeNo) < 0.0
lossRun += strategy.closedtrades.profit(tradeNo)
else
currentMaxLoss := math.min(currentMaxLoss, lossRun)
lossRun := 0.0
result = currentMaxLoss
TotalTrades() =>
strategy.closedtrades + strategy.opentrades
maxDrawDown() =>
maxDrawdown = 0.0
for tradeNo = 0 to strategy.closedtrades - 1
maxDrawdown := math.max(maxDrawdown, strategy.closedtrades.max_drawdown(tradeNo))
result = maxDrawdown
maxRunUp() =>
maxRunup = 0.0
for tradeNo = 0 to strategy.closedtrades - 1
maxRunup := math.max(maxRunup, strategy.closedtrades.max_runup(tradeNo))
result = maxRunup
tradeMaxLossReached() =>
maxLoss = 0.0
for tradeNo = 0 to strategy.closedtrades - 1
maxLoss := math.min(maxLoss, strategy.closedtrades.profit(tradeNo))
result = maxLoss
tradingStartTime() =>
strategy.closedtrades.entry_time(0)
daysBetween(t1, t2) => (t1 - t2) / 86400000
// Table
var InfoPanel = table.new(position = position.bottom_right, columns = 2, rows = 40, border_width = 1)
ftable(_table_id, _column, _row, _text, _bgcolor) =>
table.cell(_table_id, _column, _row, _text, 0, 0, color.black, text.align_right, text.align_center, size.small, _bgcolor)
tfString(int timeInMs) =>
// @function Produces a string corresponding to the input time in days, hours, and minutes.
// @param (series int) A time value in milliseconds to be converted to a string variable.
// @returns (string) A string variable reflecting the amount of time from the input time.
float s = timeInMs / 100000
float m = s / 60
float h = m / 60
float d = h / 24
float mo = d / 30.416
int tm = math.floor(m % 60)
int tr = math.floor(h % 24)
int td = math.floor(d % 30.416)
int tmo = math.floor(mo % 12)
int ys = math.floor(d / 365)
string result =
switch
d == 30 and tr == 10 and tm == 30 => "1M"
d == 7 and tr == 0 and tm == 0 => "1W"
=>
string yStr = ys ? str.tostring(ys) + "Y " : ""
string moStr = tmo ? str.tostring(tmo) + "M " : ""
string dStr = td ? str.tostring(td) + "D " : ""
string hStr = tr ? str.tostring(tr) + "H " : ""
string mStr = tm ? str.tostring(tm) + "min" : ""
yStr + moStr + dStr + hStr + mStr
if displayTable
maxLossRunInMarket= maxLossRun()
maxLossReached = tradeMaxLossReached()
tradeMaxLossReached = tradeMaxLossReached()
tradingInDays=daysBetween(time, tradingStartTime())
totalTrades=TotalTrades()