Тестер стратегий в TradeView: проблема с количеством и возвратами

#pine-script

#pine-script

Вопрос:

Я новичок в Pine-Script, в настоящее время я играю с некоторыми существующими скриптами.

Мне интересно, прослушивается ли тестер стратегий.

Я ОТРЕДАКТИРОВАЛ вопрос, значительно упростив скрипт, просто чтобы сосредоточиться на своей проблеме, как предложили комментаторы.

1) У меня проблемы с количествами. Я написал этот скрипт, который принимает простой сигнал (пересечение 2 МА) и пытается открыть длинную / короткую позицию всегда одного и того же размера [100 000 долларов США]

Вот почему я определил

 strategy("Debug Qty and Returns ", default_qty_type=strategy.cash, default_qty_value=100000,overlay=true, precision=5)
  

Я попробовал следующий скрипт на тикере BITMEX: ежедневный интервал XBTUSD

 //@version=3
strategy("Debug Qty and Returns ", default_qty_type=strategy.cash, default_qty_value=100000,overlay=true, precision=5)

// Upon execution, why are some short trades with a notional of 200,000 USD equivalent ?

tradeType   = input("BOTH", title="Trade Type ", options=["LONG", "SHORT", "BOTH"])

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2019, title = "From Year", minval = 2014)
ToMonth   = input(defval = 1, title = "To Month", minval = 1)
ToDay     = input(defval = 1, title = "To Day", minval = 1)
ToYear    = input(defval = 9999, title = "To Year", minval = 2014) 

testPeriod() =>
    (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))


//////////////////////////////

isLongOpen = false
isShortOpen = false

//Order open on previous ticker?
isLongOpen := nz(isLongOpen[1])
isShortOpen := nz(isShortOpen[1])

////////////
//Somes EMAs to trigger trades
ema7Avg = ema(ohlc4, 7)
ema30Avg = ema(ohlc4, 30)

plot(ema7Avg)
plot(ema30Avg)


//Entry Conditions
shortEntry= (tradeType=="SHORT" or tradeType=="BOTH") and crossunder(ema7Avg,ema30Avg )
longEntry = (tradeType=="LONG" or tradeType=="BOTH") and crossover(ema7Avg,ema30Avg )



///////////////////

shortExit = isShortOpen[1] and longEntry
longExit = isLongOpen[1] and shortEntry


if(testPeriod() and (tradeType == "LONG" or tradeType == "BOTH" ))
    strategy.entry("long", strategy.long, when=longEntry)
    strategy.close("long", when = longExit)

if(testPeriod() and (tradeType == "SHORT" or tradeType == "BOTH" ))
    strategy.entry("short", strategy.short, when=shortEntry)
    strategy.close("short", when = shortExit)


//If the value changed to invoke a buy, lets set it before we leave
isLongOpen := longEntry  ? true : (longExit == true ? false : isLongOpen)
isShortOpen := shortEntry ? true : (shortExit == true ? false : isShortOpen)

plotshape(isShortOpen,  title= "Short Open", color=red, style=shape.circle, location=location.bottom)
plotshape(isLongOpen,  title= "Long Open", color=green, style=shape.circle, location=location.bottom)
  

При выбранном графике и временном интервале имеется только 3 сигнала.

8 января открывается длинная позиция по 24,96 контрактам (BTC) по цене 4 005, которые имеют значение 24,96, так что общая потраченная стоимость составляет 4 005 * 24,96 = 100 000 долларов США по желанию

Затем тестер стратегий показывает, что когда стратегия меняется 12 января, она закрывает (с убытком) длинную позицию по цене 3631,5 и открывает короткую позицию по той же цене, ОДНАКО объем короткой позиции составляет 52,5055 контрактов (BTC), что соответствует общей стоимости (3631,5 * 52,5055) = 200 000 долларов США

Это не то поведение, которое я ожидаю.

2) я замечаю, что команда strategy.entry открывает сделку по цене, равной цене ОТКРЫТИЯ СЛЕДУЮЩЕЙ СВЕЧИ, после чего условие входа выполняется. Это нормальное поведение?

Комментарии:

1. Напишите небольшой, понятный скрипт, без всех этих ненужных входных данных, сложных условий и миллиона переменных. Я думаю, это поможет вам понять, как это работает, и найти проблему.

2. @Michel_T. спасибо за совет. Я действительно сильно упростил скрипт, чтобы сосредоточиться на проблеме. Это сохраняется. Это не то поведение, которого я ожидаю, когда читаю документацию.

Ответ №1:

Оба ваших вопроса / проблемы описаны здесь: https://www.tradingview.com/wiki/Strategies#Broker_emulator в broker emulator теме рассматривается ваша вторая проблема, а в Order placement commands — первая.

Короче говоря (извините за каламбур), вы выставляете два ордера с одинаковыми условиями, которые заполняются в одном баре. Таким образом, это имитирует ситуацию, которая иногда случается с реальным брокером. Сначала длинная позиция заполняется, так что вы получаете BTC за 100 тыс. долларов США, затем во втором заказе говорится: «Я хотел бы иметь дефицит BTC в 100 тыс.», поскольку тестировщик стратегий продает ваш BTC за 100 тыс. и продает еще на 100 тыс., чтобы открыть «короткую» позицию.

Ответ №2:

спасибо Michel_T

Если я изменю strategy.close на strategy.exit

проблема исчезает

Ответ №3:

Это огромная и хорошо известная ошибка в тестировании TradingView. Всякий раз, когда условие strategy.close совпадает с условием strategy.entry (таким образом, одна сделка закрывается одновременно с открытием следующей), в список сделок добавляется какая-то очень-очень некрасивая запись — сделка вводится с сигналом «Закрыть ордер на вход …»??? Это даже не имеет смысла.

Записи, подобные этой, включаются в вычисление обратного тестирования, следовательно, полностью уничтожая его. Иногда они улучшают результаты бэктестов, иногда ухудшают их — но все время они неверны.

Решение: экспортируйте весь список сделок, вставьте в Excel и удалите эти уродливые сделки вручную. Функция экспорта предоставляется дополнениями ProvitView или AutoView Chrome.