Как рассчитать среднее время для всех сделок по стратегии?

Хорошо, есть две вещи, которые я не могу сделать.

  1. Мне нужно рассчитать время между всеми сделками стратегии (от входа в каждую отдельную сделку до выхода), а затем из всех этих сделок усреднить их. Затем преобразуйте этот вывод в минуты. Назовем его AverageTradeDurationTime =

  2. Затем аналогичным образом рассчитайте время между периодами неактивности сделок: то есть, когда сделка была «флэтовой» и сделок не было. Усредните их все вместе, чтобы получить среднюю сумму в днях между всеми сделками. Среднее. Итак, давайте назовем его TotalDaysBetweenAveraged =

Как?

Итак, от массивов до i-циклов, до постоянных варов ... ничего, что я делаю, здесь не работает.

#1 - Попытка кода.

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)

#2 - Попытка кода.

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)

Можете ли вы предоставить точные типы данных и структуру данных, включая отношения?

jmvcollaborator 15.04.2023 03:07

Учитывая, что я даже не знаю, что это значит, я не думаю, что это будет возможно, лол. Это обобщенно. Просто возьмите любую простую стратегию и сделайте так, чтобы она выполняла ее в течение периода тестирования на исторических данных, чтобы она брала первый вход и последний выход из сделки, а затем вычисляла время в минутах между ними.

TheLegendOfA 15.04.2023 04:01

@G.Lebret У меня была очень хаотичная неделя, извините, что отложено. Первым делом проверьте свой код и посмотрите, работает ли он !! Очень ценю это, так как вы действительно единственный, кто ответил мне, и это значит для меня целый мир.

TheLegendOfA 04.05.2023 06:50

@TheLegendOfA спасибо за ваш ответ. Вы проголосовали за ответ, и это хорошо, но если ответ работает для вас, вы должны принять его (нажмите на маленькую галочку слева от ответа).

G.Lebret 04.05.2023 07:42

@ G.Lebret Привет, это не работает. Прокомментировал ниже.

TheLegendOfA 04.05.2023 19:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот кусок кода, который я использую для этого:

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, "#.##"))

На экране он появится после закрытия текущего бара:

Привет, это не работает. Нигде на диаграмме не отображается таблица. Спасибо за попытку.

TheLegendOfA 04.05.2023 19:15

Появляется таблица barstate.isrealtime : вы можете видеть таблицу в реальном времени, когда появляется НОВЫЙ бар. Это проблема с pinescript: вы увидите диаграмму и должны дождаться нового бара для выполнения кода и увидеть таблицу: проблема в том, что если вы находитесь на 1 часе, вам придется ждать, возможно, 1 час. Вы можете заменить barstate.isrealtime на true в коде, он будет выполнять расчет на каждом баре (поэтому, возможно, это замедлит ваш график).

G.Lebret 05.05.2023 04:52

@TheLegendOfA: вы не можете сказать, что это не работает (см. Мое редактирование на скриншоте)

G.Lebret 05.05.2023 09:03

Чувак, ты чертовски гений! Большое спасибо. Буквально спас меня от стресса. Если бы я мог купить тебе полезный чай, я бы купил. 🤗

TheLegendOfA 05.05.2023 15:33

Привет, только что заметил одну вещь: почему вы не использовали var, чтобы сделать переменные постоянными? Кажется, что он сбрасывается до 0 на каждом баре, и поэтому выходные данные учитывают только одну единственную продолжительность, затем усредняют ее на последнем баре, а затем выводят. Таким образом, вы получаете среднее значение только по одной сделке, а не по всем. Это нежелательный эффект, так как он искажает данные. Как бы вы посоветовали?

TheLegendOfA 05.05.2023 16:07

Кроме того, на графике с дневным таймфреймом очень непрактично ждать целый день для заполнения данных, должен быть другой способ запустить этот код без «barstate.isrealtime»?

TheLegendOfA 05.05.2023 16:19

вы правы, вы можете попробовать без barstate.isrealtime (это замедлит расчет, но, конечно, ок)

G.Lebret 05.05.2023 16:22

Но изначально «if barstate.isrealtime» здесь для реализации вычислений в конце рисования графика. В этом случае нет необходимости использовать var.

G.Lebret 05.05.2023 16:25

Хорошо, я заметил одну неточность: в этом коде для неактивного "strategy.closedtrades.entry_time(0)" 0 вернет только самую первую сделку, но нам нужно повторить цикл и вычислить все значения, чтобы получить среднее, а не только самое первое и все на весь цикл. Имеет ли это смысл? Итак, как мы это исправим? Я вставил туда «i», похоже, он ничего не делает, кроме как возвращает отрицательное число.

TheLegendOfA 05.05.2023 21:01

Другие вопросы по теме