#pine-script
Вопрос:
Я пытаюсь определить направление торговли (Длинное/короткое/и то, и другое) в режиме обучения, как это сделали LucF и PineCoders здесь.
Проблемы:
- Когда я выбираю «Только длинные позиции», я ожидаю, что он будет показывать только длинные сделки, но это не происходит из-за отсутствия части, которая определяет диапазон свечей в длинной сделке. Если вы проверите ссылку, которую я дал выше (Механизм тестирования и торговли [PineCoders]), LucF использует переменные InLong, inShort, InTrade. Проблема в том, что его код старше и слишком перегружен для меня, и я не понимаю, как его воссоздать.
Я сказал «перепроектирован», потому что его код включает пирамидирование, проскальзывание и другие вещи, которые теперь встроены в TradingView, вероятно, потому, что в 2019 году у PineScript не было таких функций.
Фактическая идея, лежащая в основе этого индикатора, заключается в построении предупреждений и другого сценария, который проверяет его, используя этот индикатор в качестве источника.
- Часть раскраски полос не работает, и в настоящее время она прокомментирована, поэтому код может быть скомпилирован. Проблема та же, что и в описании выше. Мне нужно знать, нахожусь ли я в длинном торговом направлении или в коротком, или вообще не в торговле. Я не знаю, как выполнить эту часть.
//@version=4
//@author=TeamTrading1
study("Futures Strategy", overlay = true, precision = 6)
// —————————— Constants {
// ————— Input options
var string ON = "On"
var string OFF = "Off"
var string TD1 = "Both"
var string TD2 = "Longs Only"
var string TD3 = "Shorts Only"
// ————— Color constants
var color C_AQUA = #0080FFff
var color C_BLACK = #000000ff
var color C_BLUE = #013BCAff
var color C_CORAL = #FF8080ff
var color C_GOLD = #CCCC00ff
var color C_GRAY = #808080ff
var color C_DARK_GREEN = #006400ff
var color C_GREEN = #008000ff
var color C_LIME = #00FF00ff
var color C_MAROON = #800000ff
var color C_ORANGE = #FF8000ff
var color C_PINK = #FF0080ff
var color C_DARK_RED = #8B0000ff
var color C_RED = #FF0000ff
var color C_VIOLET = #AA00FFff
var color C_YELLOW = #FFFF00ff
var color C_WHITE = #FFFFFFff
var color C_UPTREND = color.new(color.green, 80)
var color C_DOWNTREND = color.new(color.red, 80)
var color C_HARDEXIT = color.new(color.maroon, 25)
// }
// —————————— Inputs {
// ————— Entries
var string GP1 = "Entries"
string i_tradeDirection = input(TD1, "Trade Direction", options = [TD1, TD2, TD3], group = GP1)
// ————— User-selected trade directions
var bool doLongs = (i_tradeDirection == TD2 or i_tradeDirection == TD1)
var bool doShorts = (i_tradeDirection == TD3 or i_tradeDirection == TD1)
// }
// —————————— Functions {
// ————— Functions rounding OHLC to tick precision
f_roundedToTickOHLC() =>
float _op = round(open / syminfo.mintick) * syminfo.mintick
float _hi = round(high / syminfo.mintick) * syminfo.mintick
float _lo = round(low / syminfo.mintick) * syminfo.mintick
float _cl = round(close / syminfo.mintick) * syminfo.mintick
[_op, _hi, _lo, _cl]
// ————— Function for a repainting/non-repainting version of the HTF data
f_security(_symbol, _resolution, _src, _repaint) =>
security(_symbol, _resolution, _src[_repaint ? 0 : barstate.isrealtime ? 1 : 0])[_repaint ? 0 : barstate.isrealtime ? 0 : 1]
// }
// —————————— Calculations {
// ————— Get rounded prices
[rOpen, rHigh, rLow, rClose] = f_roundedToTickOHLC()
// ————— TV built-in MACD code
fastLength = 12
slowlength = 26
MACDLength = 9
MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
// ————— Filter
filterLong = MACD > 0
filterShort = MACD < 0
// ————— Entries
enterLong = crossover(MACD, 0)
enterShort = crossunder(MACD, 0)
// ————— Stops
atr = atr(14)
stopLong = min(lowest(5), min(close, open) - atr * 1.5)
stopShort = max(highest(5), max(close, open) atr * 1.5)
// ————— Exits
exitLong = crossunder(MACD, aMACD) and MACD > 0
exitShort = crossover(MACD, aMACD) and MACD < 0
// ————— Determine if we have entered a trade and propagate state until we exit
longEntryTrigger = doLongs
shortEntryTrigger = doShorts
bool inLong = false
bool inShort = false
//stoppedCondition = ((inLong and rClose < InTradeStop[longEntryTrigger[1] ? 0 : 1]) or (InShort and rClose > InTradeStop[shortEntryTrigger[1] ? 0 : 1]))
exitTradeCondition = (inLong and exitLong) or (inShort and exitShort)
exitCondition = exitTradeCondition // stoppedCondition or exitTradeCondition
inLong := longEntryTrigger[1] or (inLong[1] and not exitCondition[1])
inShort := shortEntryTrigger[1] or (inShort[1] and not exitCondition[1])
entryPrice = valuewhen(enterLong or enterShort, close, 0)
// }
// —————————— Plots {
// ————— Trend Background Colors
bgcolor(filterLong ? C_UPTREND : filterShort ? C_DOWNTREND : na, title = "Trend Background Colors")
// Entry Price Colors
plot(entryPrice, title = "Entry Price", color = color.blue, style = plot.style_circles, linewidth = 2)
// Hard Exit Colors
plot(stopLong, title = "Hard Exit Price", color = color.orange, style = plot.style_circles, linewidth = 2)
// ————— Entry Background Colors
plotshape(enterLong, title = "Main BUY", style = shape.triangleup, location = location.belowbar, color = color.green, size = size.large)
plotshape(enterShort, title = "Main SELL", style = shape.triangledown, location = location.abovebar, color = color.red, size = size.large)
plotshape(exitLong, title = "Close BUY", style = shape.diamond, location = location.abovebar, color = color.green, size = size.large)
plotshape(exitShort, title = "Close SELL", style = shape.diamond, location = location.belowbar, color = color.red, size = size.large)
// entry price = lime colored
// gray when not in a trade
// dark green when the candle close is below the entry price (in a loss)
// light green when the candle close is above the entry price (in a win position)
// dark red when the candle close is above the entry price (in a loss)
// light red when the candle close is below the entry price (in a win position)
var color c = na
// if signal == 0
// c := c_NOT_IN_TRADE
// if signal == 1 and close < entryPrice
// c := c_LONG_ABOVE_ENTRYPRICE
// else if signal == 1 and close > entryPrice
// c := c_LONG_BELOW_ENTRYPRICE
// else if signal == -1 and close > entryPrice
// c := c_SHORT_BELOW_ENTRYPRICE
// else if signal == -1 and close < entryPrice
// c := c_SHORT_ABOVE_ENTRYPRICE
// barcolor(c, title = "Trade State Bar Coloring")
// —————————— Alerts {
alertcondition(enterLong, title = "Buy Alert", message = "Buy Alert")
alertcondition(enterShort, title = "Sell Alert", message = "Sell Alert")
alertcondition(exitLong, title = "Buy Alert", message = "Buy Alert")
alertcondition(exitShort, title = "Sell Alert", message = "Sell Alert")
// }
Комментарии:
1. Убедитесь, что ваш фрагмент кода компилируется, пожалуйста. Вы можете отредактировать код в своем вопросе. Когда это будет сделано, дайте нам знать в комментарии, и мы посмотрим.
2. @PineCoders-LucF, добавил это! В основном он переходит от длинного непосредственно к короткому. Вместо этого он должен иметь близкий порядок длинных, а затем коротких, но я не могу этого сделать без InLong, inShort, InTrade, EntryFill и т. Д. Также красочные цвета свечей, которые не будут работать без этих переменных. Я прокомментировал это, но, пожалуйста, раскомментируйте, и вы увидите, как это должно быть.
3. @PineCoders-LucF, отредактировал сообщение еще раз, чтобы оно выглядело чище, и обновил код, потому что я смог выполнить длинный/короткий выход, основываясь на ваших tradingview.com/script/… сценарий.
4. @PineCoders-LucF, похоже, это похоже на ваше решение здесь: pinecoders.com/faq_and_code/… но я не совсем уверен, как это сработает.
Ответ №1:
Это поможет вам начать. Мы:
- Следите за состояниями коротких/длинных позиций, что позволяет строить уровни остановки и входа только тогда, когда мы находимся в торговле.
- Сделал
doLongs/doShorts
входные данные частью условий входа. - К условиям выхода добавлено нарушение остановок.
Обратите внимание, что эта логика не повторяет логику Движка, так как здесь вы входите при закрытии, в то время как Движок входит на следующем баре после определения условий входа/выхода, что более реалистично. Вы также можете адаптировать свой код таким образом:
//@version=4
//@author=TeamTrading1
study("Futures Strategy", overlay = true, precision = 6)
// —————————— Constants {
// ————— Input options
var string ON = "On"
var string OFF = "Off"
var string TD1 = "Both"
var string TD2 = "Longs Only"
var string TD3 = "Shorts Only"
// ————— Color constants
var color C_AQUA = #0080FFff
var color C_BLACK = #000000ff
var color C_BLUE = #013BCAff
var color C_CORAL = #FF8080ff
var color C_GOLD = #CCCC00ff
var color C_GRAY = #808080ff
var color C_DARK_GREEN = #006400ff
var color C_GREEN = #008000ff
var color C_LIME = #00FF00ff
var color C_MAROON = #800000ff
var color C_ORANGE = #FF8000ff
var color C_PINK = #FF0080ff
var color C_DARK_RED = #8B0000ff
var color C_RED = #FF0000ff
var color C_VIOLET = #AA00FFff
var color C_YELLOW = #FFFF00ff
var color C_WHITE = #FFFFFFff
var color C_UPTREND = color.new(color.green, 80)
var color C_DOWNTREND = color.new(color.red, 80)
var color C_HARDEXIT = color.new(color.maroon, 25)
// }
// —————————— Inputs {
// ————— Entries
var string GP1 = "Entries"
string i_tradeDirection = input(TD1, "Trade Direction", options = [TD1, TD2, TD3], group = GP1)
// ————— User-selected trade directions
var bool doLongs = (i_tradeDirection == TD2 or i_tradeDirection == TD1)
var bool doShorts = (i_tradeDirection == TD3 or i_tradeDirection == TD1)
// }
// —————————— Functions {
// ————— Functions rounding OHLC to tick precision
f_roundedToTickOHLC() =>
float _op = round(open / syminfo.mintick) * syminfo.mintick
float _hi = round(high / syminfo.mintick) * syminfo.mintick
float _lo = round(low / syminfo.mintick) * syminfo.mintick
float _cl = round(close / syminfo.mintick) * syminfo.mintick
[_op, _hi, _lo, _cl]
// ————— Function for a repainting/non-repainting version of the HTF data
f_security(_symbol, _resolution, _src, _repaint) =>
security(_symbol, _resolution, _src[_repaint ? 0 : barstate.isrealtime ? 1 : 0])[_repaint ? 0 : barstate.isrealtime ? 0 : 1]
// }
// —————————— Calculations {
// ————— Get rounded prices
[rOpen, rHigh, rLow, rClose] = f_roundedToTickOHLC()
// ————— TV built-in MACD code
fastLength = 12
slowlength = 26
MACDLength = 9
MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
// ————— Filter
filterLong = MACD > 0
filterShort = MACD < 0
// ————— States
var float entryPrice = na
var bool inLong = false
var bool inShort = false
bool inTrade = inLong or inShort
// ————— Entries
enterLong = doLongs and not inTrade and crossover(MACD, 0)
enterShort = doShorts and not inTrade and crossunder(MACD, 0)
// ————— Stops
atr = atr(14)
stopLong = min(lowest(5), min(close, open) - atr * 1.5)
stopShort = max(highest(5), max(close, open) atr * 1.5)
// ————— Exits
exitLong = inLong and ((crossunder(MACD, aMACD) and MACD > 0) or close < stopLong[1])
exitShort = inShort and ((crossover(MACD, aMACD) and MACD < 0) or close > stopShort[1])
if enterLong
inLong := true
entryPrice := close
else if enterShort
inShort := true
entryPrice := close
else if exitLong
inLong := false
entryPrice := na
else if exitShort
inShort := false
entryPrice := na
// }
// —————————— Plots {
// ————— Trend Background Colors
bgcolor(filterLong ? C_UPTREND : filterShort ? C_DOWNTREND : na, title = "Trend Background Colors")
// Entry Price Colors
plot(entryPrice, title = "Entry Price", color = color.blue, style = plot.style_circles, linewidth = 2)
// Hard Exit Colors
plot(inLong ? stopLong : inShort ? stopShort : na, title = "Hard Exit Price", color = color.orange, style = plot.style_circles, linewidth = 2)
// ————— Entry Background Colors
plotshape(enterLong, title = "Main BUY", style = shape.triangleup, location = location.belowbar, color = color.green, size = size.large)
plotshape(enterShort, title = "Main SELL", style = shape.triangledown, location = location.abovebar, color = color.red, size = size.large)
plotshape(exitLong, title = "Close BUY", style = shape.diamond, location = location.abovebar, color = color.green, size = size.large)
plotshape(exitShort, title = "Close SELL", style = shape.diamond, location = location.belowbar, color = color.red, size = size.large)
// —————————— Alerts {
alertcondition(enterLong, title = "Buy Alert", message = "Buy Alert")
alertcondition(enterShort, title = "Sell Alert", message = "Sell Alert")
alertcondition(exitLong, title = "Buy Alert", message = "Buy Alert")
alertcondition(exitShort, title = "Sell Alert", message = "Sell Alert")
// }
Комментарии:
1. Большое тебе спасибо, приятель! Ты действительно лучший пинекодер на свете! Продолжайте в том же духе!
2. Кое-что забыл. Как мне выполнить эту
i_tradeDirection
работу? В основном показывать только длинные для «Только длинные», короткие для «только короткие» и, соответственно, для «Обоих»?3. О, теперь я понял, как это на самом деле работает! Большое спасибо, приятель!!