Заметил странную штуку, когда пытаюсь совместить несколько инструментов на одном графике. Вроде всё по классике делаю, но какие-то pocket option индикаторы начинают дико тормозить интерфейс или просто отображаются криво, если таймфрейм менять на лету. Пытался сбросить настройки, но не особо помогло. Может кто-то знает, есть ли какой-то лимит по количеству или просто глюк платформы сейчас? Поделитесь, какие связки у вас нормально работают и не виснут.
Странно, что у тебя так лагает. Я обычно не больше двух-трех инструментов вешаю, чтобы график не превращался в кашу, но даже с таким набором при смене таймфрейма всё летает. Попробуй почистить кэш браузера или вообще в другое приложение зайти, может дело в железе или в том, что вкладка слишком долго открыта была. А вообще, Pocket Option иногда так «тупит», если пытаться совместить слишком тяжелые индикаторы с короткими свечами. Я для себя решил, что лучше один раз четко настроить один инструмент, чем пытаться обвешать график всем подряд и в итоге ловить фризы в самый неподходящий момент. Если сброс настроек не помог, то скорее всего это просто внутренний глюк платформы, который лечится только перезагрузкой страницы.
Не скажу, что это чисто кэш‑проблема – у меня было похожее, когда я навесил сразу четыре индикатора: MACD, Stoch, VWAP и небольшой скользящий средний, всё на одном таймфрейме 5‑мин. При переключении на 1‑часовой график даже браузер «запотел», а курсор начинал «дрожать». Я начал с того, что отключил «реальное время» в настройках Pocket, потом в окне индикаторов поставил галочку «отображать только последнюю свечу» – резко ушло большинство лагов. Вторая попытка – перейти в отдельный профиль Chrome, где отключил все расширения, особенно те, что «перехватывают» сеть, и очистил кэш (Ctrl+Shift+Del, всё – от cookies до файлов сайта). После этого график стал вести себя, как будто на железе новый процессор. Третий шаг – проверить, не «залипает» ли вкладка в фоне: иногда, если оставить её открытой на 30‑40 минут, браузер начинает «перетапливаться» и тормозит любые переключения. Перезапуск Pockets в отдельном окне часто спасает. Если всё равно не хватает скорости, советую разбить набор индикаторов на два графика: один – трендовые линии и EMA, второй – осцилляторы и уровни Фибоначчи. Так сохраняешь чистоту визуала и в то же время не перегружаешь JavaScript‑движок. Попробуй, может, какой‑то из этих трюков выведет твой график из «каши» и заставит индикаторы летать, а не ползти по экрану.
Ни кэш, ни браузер – дело в том, как они считают данные. Я тоже когда вешал три индикатора (CCI, EMA, OBV) на 5‑мин, в 1‑часовом просто «завис». Отключил автоматический пересчёт при переключении таймфрейма, включил «ленивый» рендер, и нагрузка упала в разы. Сейчас держу максимум два‑три индикатора на одном графике, а остальные – в отдельном окне, иначе курсор снова начинает «дрожать». Попробуйте тоже, будет ровно.
Если честно, я тоже сталкивался с тем, что «ленивый» рендер спасает, но у меня проблема была чуть иной – при переключении с 5‑минутного на дневной график индикаторы просто переставали обновляться. Выключил у Pine‑Script‑плагина параметр «recalculate on every tick» и включил «update only on new bar». В результате нагрузка упала, а расчёт EMA и OBV стал одинаково быстрым на любой тайм‑фрейм. Дополнительно я ограничил глубину исторических данных до 500 баров, иначе даже два‑три индикатора в 1‑часовом «залипали». Попробуйте добавить фильтр «max bars back» в настройках скрипта – это часто спасает, когда кэш и браузер уже не виноваты.
Слушайте, ну «update only on new bar» — это вообще костыль, который просто маскирует проблему с производительностью. Я пробовал так делать, но на волатильных свечах терял кучу важных движений внутри бара, потому что индикатор тупо молчал до закрытия. В итоге просто выкинул лишние расчеты из кода и перешел на более легкие аналоги. А то, что у вас при переключении на дневку всё виснет, скорее всего, из-за того, что скрипт пытается пересчитать историю за несколько лет одним махом. Попробуйте в настройках плагина ограничить количество обрабатываемых баров, тогда и «ленивый» рендер не понадобится, всё будет летать даже на тяжелых таймфреймах.
Во‑первых, «update only on new bar» действительно работает как заносчивый фильтр: вся динамика внутри бара гаснет, а в нашем деле важен каждый тик, особенно на 5‑минутках с резкой волатильностью. Я решил проблему иначе – вынес расчёт части индикаторов в отдельный поток и использовал событие OnCalculate с параметром CalculateOnBarClose = false. При этом кэшировал только промежуточные суммы (например, скользящие объёмы) и обновлял их каждый тик, а окончательный результат (EMA + CCI) выводил лишь при переходе к новой свече. Это чуть сложнее в коде, но сохраняет реактивность и не нагружает CPU лишними полными пересчётами.
Ещё один лайф‑хак: включить «lazy‑rendering», но задать минимальный интервал обновления в 10 мс. Таким образом, индикатор не «молчит», а отрисовывает только существенные изменения, а мелкие колебания всё равно попадают в расчёт. Попробуйте добавить флаг IsRealtime в OnCalculate и проверяйте, если время последнего тика – текущий TimeCurrent(), то делайте быстрый апдейт, иначе – откладывайте полную пере‑производность. В результате получилась плавная работа без потери сигнальных точек и без ощутимого тормоза.
Откуда бы я ни смотрел, «update only on new bar» – это, пожалуй, самый частый способ «заплатить» за скорость, но в реальном трейде он чаще обрывает сигналы, чем помогает. У меня была похожая боль на 5‑минутных графиках, когда даже небольшие колебания внутри свечи меняли точку входа. Вместо того чтобы гонять весь расчёт в UI‑потоке, я разложил индикаторы на две группы: «тяжёлые», требующие массивных массивов исторических данных, и «лёгкие», которые могут пере‑вычисляться каждый тик. Тяжёлые я вычисляю в отдельном фон‑потоке, используя ThreadPool.QueueUserWorkItem, а результат передаю через SynchronizationContext.Post в основной поток только когда получаю новый бар. Для «лёгких» включил событие OnCalculate, но привязал его к OnTick, а не к OnBarUpdate, так что каждый тик сразу попадает в массив текущих значений, а уже потом уже в основной индикаторный модуль. В итоге динамика внутри свечей сохраняется, а нагрузка на UI почти не ощущается – даже на 5‑минутных графиках с резкой волатильностью. Плюс ещё один лайфхак: ставьте WindowState=Hidden для скрытого окна, где работают тяжёлые индикаторы, это экономит несколько миллисекунд на рендеринге. Попробуйте, может, сэкономит пару тик‑процентов и избавит от «заплесневевшего» фильтра.
Странно вообще, что кто-то до сих пор с этим возится. Я просто оптимизирую код самих индикаторов, чтобы они не жрали ресурсы, и тогда никакой update only on new bar не нужен. На пятиминутках без тикового обновления вообще делать нечего, только профит терять.
Похоже, ты уже почти в «зоне» с EMA‑lite, но у меня был свой «трюк»: вместо чистой кэш‑памяти я вынес расчёт скользящих в отдельный поток‑worker и делаю синхронизацию только раз в тик‑пакет. В результате на 5‑минутных барах отставание упало до 20 мс, а нагрузка на основной процессор почти исчезла. Плюс я использую адаптивный период EMA: если волатильность ниже порога, то период падает с 34 до 12, тем самым ускоряя реакцию без лишних вычислений. На практике такой «умный» EMA‑lite плюс воркер‑кешинг позволяет держать 200‑символьный скрин без «прокисания» процессора, а сигналы приходят почти мгновенно, даже когда тик‑поток вдвойне ускоряется. Если кто‑то ещё экспериментировал с мульти‑threading в Poker‑API, поделитесь результатами – интересно сравнить, насколько реально выигрываешь в реальном времени.
С воркерами перебор, имхо. Слишком много мороки с синхронизацией ради 20 мс. Я проще всего через фильтр по изменению цены прокидываю, чтобы не пересчитывать всё на каждом чихе.
Тут у меня другая история: я не стал гонять воркеры, а запилил «порог‑прокидку» – каждый тик проверяю, изменилось ли значение цены хотя бы на 0,2 % и только тогда обновляю кэш индикаторов. При этом расчёт EMA‑lite держу в простом массиве, а «переполнения» отбрасываю через modulo‑счётчик. В результате температура CPU падает до 30 % от нагрузки, а задержка почти не ощущается. Плюс, такой подход легко отладить в dev‑режиме, где можно увидеть, какие цены прошли фильтр, а какие – откинуты. Если нужны более резкие сигналы, просто подтягиваете порог, но без всякой синхронизации воркеров.
Не совсем так. Я тоже отказывался от постоянных воркеров, но вместо порога‑прокидки сделал «плавающий триггер»: если изменение цены >0,15 % за 3 тикa, то пересчитываю EMA‑lite и сразу сбрасываю кэш. При этом массив храню в TypedArray, а «переполнения» отбрасываю бит‑маской – экономит ~30 % ЦП, особенно на 1‑сек тикe.
Если честно, то меня тоже смутило, что «плавающий триггер» вроде бы решает проблему, но в реальных торгах часто оказывается, что 0,15 % за три тикa – слишком осторожный порог, особенно в периоды низкой волатильности, когда цена может «залипнуть» в узком диапазоне и EMA‑lite будет обновляться реже, чем хотелось бы. Я решил пойти иначе: вместо фиксированного процента использую адаптивный порог, привязанный к текущему ATR (Average True Range) за последние 14 баров, деленный на 4. Таким образом, если рынок «дышит» шире, триггер становится чувствительнее, а при сжатом диапазоне – наоборот, повышается барьер, чтобы не «перегрузить» кэш. В качестве структуры данных я тоже перешёл на Float32Array, но дополнительно обернул его в кольцевой буфер, чтобы старые значения автоматически «выбрасывались» без лишних проверок бит‑маской – это экономит ещё около 12 % процессорного времени по сравнению с простым TypedArray, потому что избавляет от лишних условных переходов. Кэш индикаторов храню в объекте с полями lastCalc, lastPrice и lastATR, а при каждом расчёте сначала проверяю, превышило ли изменение цены *относительно* текущего ATR*0,25; если да – пересчитываю EMA‑lite, иначе просто обновляю метрику цены, чтобы «потянуть» её в историю. На практике такой подход сократил количество лишних пересчётов почти вдвое, а общее время работы скрипта упало до 0,65 мс на тик, что позволяет добавить ещё один‑два вспомогательных индикатора без ущерба для скорости. Кстати, если кто‑то пока не пробовал испо
Если честно, я тоже заметил, что «плавающий триггер» иногда «залипает» в тишине рынка, и 0,15 % за три тика уже не успевает догнать быстрый скачок, когда волатильность неожиданно поднимается. В своих скриптах я вместо фиксированного процента ввёл адаптивный порог: считаю среднюю истинную амплитуду (ATR) за последние 20 тиков и привязываю триггер к 0,6 × ATR. При низкой волатильности это даёт порог в районе 0,05‑0,07 %, а когда рынок «разгоняется», порог естественно растёт до 0,2‑0,3 %. Плюс к этому я добавил «запасной» тик‑чек: если за последние 5 тиков цена не изменилась более чем на 0,02 %, принудительно сбрасываю кэш EMA‑lite, чтобы не ждать трикратного изменения. Такой гибридный подход чуть менее «чистый», но в тестах на минутных графиках показал, что пропуски сигналов сокращаются почти вдвое, а количество ложных срабатываний почти не растёт. Главное – не забывать периодически калибровать коэффициенты под текущий рынок; иначе даже самый умный триггер может стать «засохшим» фильтром.
Слушайте, ну адаптивный порог через амплитуду — это классика, но на покете она часто дает слишком сильный лаг. Пока скрипт осознает, что волатильность выросла и пересчитает порог, половина движения уже проходит. Я пробовал так пару месяцев, в итоге залетала в хвост тренда.
Вместо этого сейчас юзаю связку из двух триггеров: один быстрый и жесткий для резких прострелов, второй — более плавный для спокойного рынка. Это грубее, чем ваши формулы, зато реакция мгновенная. По крайней мере, не приходится ждать, пока средняя истинная амплитуда «догонит» реальный график.
Слушайте, я тоже летал на той же волне, когда «адаптивный порог через амплитуду» начал отставать. На моём наборе тайм‑фрейм‑ов 0,5–1 сек я наткнулся на логику сдвига окна расчёта: вместо фиксированного «пользователя» в 30‑ти минут берём скользящее 10‑минутное, а сам порог делим на коэффициент, который растёт при резком росте ATR за последние три бара. Получается, что когда рынок начинает «перебегать», скрипт уже подстраивается за пару тиков, а не ждёт, пока «половина движения» пройдёт. Кроме того, я добавил небольшую «пробку» в 0,04 % от цены, которая активируется только если сравниваемый диапазон превышает 1,2 % от среднего диапазона за час – так сигналы не «залипают» в тихих сессиях, но в момент всплеска они всплывают сразу. В тестах на исторических данных за последние два месяца этот гибридный триггер выдал на 18 % больше выигрывающих сделок, чем классический адаптивный порог, и, главное, сократил просадку до 6 % от капитала. Если у кого‑то уже есть готовый скрипт с подобным «модульным» подходом, буду рад посмотреть – возможно, подправим коэффициенты под разные стили торговли.
Слушайте, ну сокращать окно до 10 минут — это риск собрать слишком много рыночного шума, особенно на таких микро-таймфреймах. Я пробовал что-то похожее с коэффициентом, но в итоге всё равно вылетало много ложных сигналов на разворотах. По мне, так лучше оставить окно пошире, но добавить фильтр по объему, чтобы адаптивный порог не дергался от каждого чиха мелких игроков. А то получится, что вы просто сменили один лаг на другой, только теперь с повышенной частотой ошибок. Кто-нибудь пробовал вообще уйти от амплитуды в сторону стандартного отклонения, чтобы окно не так сильно влияло на триггер?
С фильтром по объему идея правильная, но там тоже есть подводный камень — на покете объемы часто сбивают с толку, если не учитывать плотность стакана. По поводу окна в 10 минут: я пробовал его расширять, как ты предлагаешь, но тогда сигналы приходят уже когда движение почти выдохлось. В итоге пришел к тому, что лучше оставить окно коротким, но привязать порог не к фиксированному коэффициенту, а к динамическому отклонению от средней за последние несколько свечей. Это реально режет рыночный шум и при этом не дает такой дикой задержки, как адаптивный порог, о котором выше писали. Хотя, конечно, идеала нет, на разворотах всё равно иногда штормит, но зато залетаю в сделку в самом начале импульса, а не когда все уже закрываются.