Хорошо, есть две вещи, которые я не могу сделать.
Мне нужно рассчитать время между всеми сделками стратегии (от входа в каждую отдельную сделку до выхода), а затем из всех этих сделок усреднить их. Затем преобразуйте этот вывод в минуты. Назовем его AverageTradeDurationTime =
Затем аналогичным образом рассчитайте время между периодами неактивности сделок: то есть, когда сделка была «флэтовой» и сделок не было. Усредните их все вместе, чтобы получить среднюю сумму в днях между всеми сделками. Среднее. Итак, давайте назовем его TotalDaysBetweenAveraged =
Как?
Итак, от массивов до i-циклов, до постоянных варов ... ничего, что я делаю, здесь не работает.
FirstTradeTime = strategy.opentrades.entry_time(0)
LastTradeTime = strategy.closedtrades.exit_time(99999) //What do I even put here?
DaysElapsed = (LastTradeTime - FirstTradeTime) / 86400000
DaysConvertedToWholeNumber = math.round((DaysElapsed / 86400000), 2)
plot(DaysConvertedToWholeNumber, "Total Days Between First And Last Trades", color=color.purple)
LastTradeTimeClose = strategy.closedtrades.exit_time(99999) //What do I even put here?
NextTradeTimeEntry = strategy.opentrades.entry_time(0)
DaysBetween = (LastTradeTime - FirstTradeTime) / 86400000
var TotalDaysBetween = 0
if DaysBetween > 0
TotalDaysBetween := +1
TotalDaysBetweenAveraged = (TotalDaysBetween / DaysBetween)
DaysBetweenConvertedToWholeNumber = math.round((TotalDaysBetweenAveraged / 86400000), 2)
plot(TotalDaysBetweenAveraged, "Total Days Between Trades", color=color.purple)
Учитывая, что я даже не знаю, что это значит, я не думаю, что это будет возможно, лол. Это обобщенно. Просто возьмите любую простую стратегию и сделайте так, чтобы она выполняла ее в течение периода тестирования на исторических данных, чтобы она брала первый вход и последний выход из сделки, а затем вычисляла время в минутах между ними.
@G.Lebret У меня была очень хаотичная неделя, извините, что отложено. Первым делом проверьте свой код и посмотрите, работает ли он !! Очень ценю это, так как вы действительно единственный, кто ответил мне, и это значит для меня целый мир.
@TheLegendOfA спасибо за ваш ответ. Вы проголосовали за ответ, и это хорошо, но если ответ работает для вас, вы должны принять его (нажмите на маленькую галочку слева от ответа).
@ G.Lebret Привет, это не работает. Прокомментировал ниже.
Вот кусок кода, который я использую для этого:
MeanDuratinOfATrade_m — средняя продолжительность закрытых сделок.
MeanDurationBetweenTrade_m — это средняя продолжительность между закрытыми сделками: если есть 2 сделки, это уникальная продолжительность между окончанием первой закрытой сделки и началом последней закрытой сделки.
var Affichage = table.new(position=position.top_right, columns=3, rows=25, border_color = color.black, border_width = 1)
if barstate.isrealtime
// Mean duration of trades
DurationInTrade_ms = 0
MeanDuratinOfATrade_m = 0.0
MeanDurationBetweenTrade_m = 0.0
if strategy.closedtrades > 0
for i = 0 to strategy.closedtrades - 1
DurationInTrade_ms := DurationInTrade_ms + strategy.closedtrades.exit_time(i) - strategy.closedtrades.entry_time(i) // Duration in milliseconds (from UNIX time)
MeanDuratinOfATrade_m := (DurationInTrade_ms / strategy.closedtrades) / 1000 / 60
// Mean duration between trades
if strategy.closedtrades > 1
TotalTimeBetweenFirstAndLastTrade_ms = strategy.closedtrades.exit_time(strategy.closedtrades-1) - strategy.closedtrades.entry_time(0)
MeanDurationBetweenTrade_m := (TotalTimeBetweenFirstAndLastTrade_ms - DurationInTrade_ms)/(strategy.closedtrades -1) / 1000 / 60
// Affichage
table.cell(Affichage, 0, 0, "Duration of a trade [m]")
table.cell(Affichage, 1, 0, str.tostring(MeanDuratinOfATrade_m, "#.##"))
table.cell(Affichage, 0, 1, "Duration Betweentrade [m]")
table.cell(Affichage, 1, 1, str.tostring(MeanDurationBetweenTrade_m, "#.##"))
На экране он появится после закрытия текущего бара:
Привет, это не работает. Нигде на диаграмме не отображается таблица. Спасибо за попытку.
Появляется таблица barstate.isrealtime : вы можете видеть таблицу в реальном времени, когда появляется НОВЫЙ бар. Это проблема с pinescript: вы увидите диаграмму и должны дождаться нового бара для выполнения кода и увидеть таблицу: проблема в том, что если вы находитесь на 1 часе, вам придется ждать, возможно, 1 час. Вы можете заменить barstate.isrealtime на true в коде, он будет выполнять расчет на каждом баре (поэтому, возможно, это замедлит ваш график).
@TheLegendOfA: вы не можете сказать, что это не работает (см. Мое редактирование на скриншоте)
Чувак, ты чертовски гений! Большое спасибо. Буквально спас меня от стресса. Если бы я мог купить тебе полезный чай, я бы купил. 🤗
Привет, только что заметил одну вещь: почему вы не использовали var, чтобы сделать переменные постоянными? Кажется, что он сбрасывается до 0 на каждом баре, и поэтому выходные данные учитывают только одну единственную продолжительность, затем усредняют ее на последнем баре, а затем выводят. Таким образом, вы получаете среднее значение только по одной сделке, а не по всем. Это нежелательный эффект, так как он искажает данные. Как бы вы посоветовали?
Кроме того, на графике с дневным таймфреймом очень непрактично ждать целый день для заполнения данных, должен быть другой способ запустить этот код без «barstate.isrealtime»?
вы правы, вы можете попробовать без barstate.isrealtime (это замедлит расчет, но, конечно, ок)
Но изначально «if barstate.isrealtime» здесь для реализации вычислений в конце рисования графика. В этом случае нет необходимости использовать var.
Хорошо, я заметил одну неточность: в этом коде для неактивного "strategy.closedtrades.entry_time(0)" 0 вернет только самую первую сделку, но нам нужно повторить цикл и вычислить все значения, чтобы получить среднее, а не только самое первое и все на весь цикл. Имеет ли это смысл? Итак, как мы это исправим? Я вставил туда «i», похоже, он ничего не делает, кроме как возвращает отрицательное число.
Можете ли вы предоставить точные типы данных и структуру данных, включая отношения?