Разработка инструментария для анализа Price Action (Часть 68): Панель RSI с привязкой к цене на языке MQL5
Введение
Трейдеры и разработчики MQL5 часто используют RSI для подтверждения Price Action, однако его стандартное размещение в отдельном подокне разрывает связь с ключевой точкой принятия решения. Необходимость отвлекаться от ценового графика вносит задержку в интерпретацию, а на быстро движущемся рынке, например при скальпинге, ручном сопровождении сделок или высокочастотных торговых сценариях, это может дорого обойтись. Эта статья решает четкую задачу: разработать представление RSI, которое остается привязанным к текущему ценовому уровню, обновляется в реальном времени и автоматически адаптируется к изменениям графика, включая прокрутку, масштабирование и смену таймфрейма.
Для этого в статье представлена компактная панель RSI, встроенная непосредственно в график. Расположенная на текущем ценовом уровне, панель показывает три ключевых элемента в момент принятия решения: текущее значение RSI, его состояние по категориям (OVERBOUGHT, OVERSOLD или NEUTRAL) и силу сигнала (WEAK, STRONG или EXTREME). При этом предусмотрены опции привязки либо к Bid, либо к Ask. Реализация построена с учетом практических ограничений, включая непрерывные обновления по тикам, точное преобразование координат через ChartTimePriceToXY, контроль границ для предотвращения отрисовки за пределами экрана и классификацию по наклону для оценки моментума. В результате получается адаптивный, встроенный в график компонент RSI, который оставляет подтверждение в поле зрения и при этом дает структурированную основу для дальнейшей разработки.
Статья начинается с обзора решения, затем переходит к реализации на MQL5 и завершается результатами и ключевыми выводами. В оглавлении ниже показана структура статьи.
Обзор решения
Индекс относительной силы (RSI) – это осциллятор моментума, который измеряет величину недавних ценовых движений по шкале от 0 до 100. Обычно его используют для выявления состояний перекупленности и перепроданности, как правило выше 70 и ниже 30, а также для подтверждения возможных разворотов, продолжений и дивергенций в движении цены. На практике RSI выступает как инструмент подтверждения и показывает, поддерживается ли движение цены моментумом.
Инструмент RSI выполнен как плавающий интерфейс, привязанный непосредственно к текущей цене, поэтому данные RSI постоянно остаются в зоне непосредственного внимания трейдера. Вместо того чтобы выносить анализ моментума в отдельное окно, это решение помещает RSI в то же визуальное пространство, в котором интерпретируется ценовое движение. Сохраняя RSI в контексте цены, решение устраняет необходимость переключения внимания и поддерживает непрерывность анализа.

Рисунок 1. Традиционное окно RSI
В традиционном подходе RSI отображается в отдельной панели под основным ценовым графиком. Чтобы интерпретировать моментум, трейдерам приходится постоянно переводить взгляд между ценовым движением и окном RSI. Такое разделение может вызывать задержки, снижать ясность анализа и иногда приводить к упущенным торговым возможностям. Встроенная в график панель решает эту проблему, выводя данные RSI непосредственно на уровень цены.

Рисунок 2. Встроенная в график панель RSI
Этот инструмент привязан непосредственно к текущей цене и показывает данные о моментуме в реальном времени прямо в точке принятия решения. Он включает трехуровневую систему: числовое значение RSI, состояние (перекупленность, перепроданность или нейтральное) и силу сигнала (слабый, сильный или экстремальный). Направленная стрелка указывает на цену, а цветовое кодирование текста позволяет мгновенно распознавать состояние. Адаптивное позиционирование обеспечивает полную видимость панели даже при изменении размера графика или при приближении цены к его краям.
Основные компоненты 
Рисунок 3. Архитектура потока системы
В основе системы лежат следующие основные компоненты:
1. Динамическая привязка к цене
Система привязывает панель непосредственно к текущей цене. Это достигается за счет преобразования координат графика, при котором значения времени и цены переводятся в экранные координаты. По мере движения цены панель следует за ней в реальном времени и сохраняет фиксированный отступ относительно текущей цены. В результате данные RSI не просто остаются видимыми, но и сохраняют привязку к текущему ценовому контексту. Такое поведение подчеркивает, что моментум нужно интерпретировать в точке принятия решения, а не отдельно от нее.
2. Трехуровневая система представления информации
Чтобы совместить простоту и функциональность, панель представляет информацию в виде трех структурированных уровней. Каждый уровень выполняет свою задачу и при этом работает на единую интерпретацию.

Рисунок 4. Структура панели
- Значение RSI. Числовое значение RSI дает точную оценку силы моментума. Это позволяет трейдерам количественно оценивать состояние рынка, а не опираться только на визуальные зоны.
- Состояние. Состояние RSI классифицируется как Overbought, Oversold или Neutral. Это упрощает интерпретацию и позволяет быстро распознавать потенциальные зоны реакции.
- Сила сигнала. Помимо статических состояний, система вводит направленный сигнал, отражающий интенсивность и направленность моментума. Это помогает трейдерам определить, продолжит ли рынок движение, замедлится или развернется.
Благодаря такой организации данных панель избегает перегрузки и при этом сохраняет информативность для принятия решений.
3. Визуальная структура
Визуальное оформление намеренно сделано компактным и ненавязчивым, чтобы оно дополняло анализ ценового движения, а не мешало ему.
Панель состоит из следующих элементов:
- прямоугольной области отображения, содержащей всю информацию, связанную с RSI;
- направленной стрелки, указывающей на текущую цену и усиливающей связь между панелью и положением цены на графике;
- цветовых текстовых элементов, позволяющих трейдерам мгновенно различать состояния без необходимости подробно считывать каждое значение.
Отступы, выравнивание и размеры тщательно контролируются, чтобы панель оставалась читаемой на разных уровнях масштабирования графика. Цель состоит в том, чтобы сохранить ясность без лишних отвлечений и позволить трейдерам в первую очередь следить за ценой, не теряя при этом подтверждение моментума.
4. Интеллектуальная логика сигналов
Традиционное использование RSI часто опирается на фиксированные пороговые уровни, такие как 70 для перекупленности и 30 для перепроданности. Хотя эти уровни полезны, сами по себе они не отражают всей динамики моментума. Чтобы сделать анализ точнее, система использует анализ наклона RSI, который измеряет скорость изменения между соседними значениями. Это позволяет панели различать:
- слабые сигналы, когда моментум присутствует, но ему не хватает силы;
- сильные сигналы, когда моментум имеет четкую направленность и активен;
- экстремальные сигналы, когда условия указывают на возможное истощение движения или резкие развороты.
Эти классификации определяются на основе скорости изменения, то есть наклона, между соседними значениями RSI. Это превращает RSI из статического индикатора в динамическую меру моментума.
5. Адаптивное позиционирование
Критически важный аспект решения состоит в том, чтобы панель оставалась видимой и удобной в использовании при любых состояниях графика. Для этого положение панели ограничивается границами графика. При изменении размера графика, его масштабировании или прокрутке система автоматически корректирует положение панели, чтобы она не уходила за пределы экрана и не перекрывала критически важные области чрезмерно.
Это обеспечивает:
- постоянную видимость;
- стабильный и предсказуемый пользовательский опыт;
- надежную работу независимо от размера экрана и компоновки.
Стрелка и панель сохраняют свое положение относительно цены, одновременно учитывая границы графика и сохраняя как функциональность, так и визуальную целостность.
Реализация на MQL5
Реализация превращает RSI во встроенную в график визуальную панель с помощью объектов MQL5 и данных в реальном времени. Вместо отдельного окна индикатора используются графические объекты и преобразование координат, чтобы выводить RSI на текущем ценовом уровне. В этом разделе рассматриваются расчет RSI, классификация сигналов и динамическое позиционирование на графике.
Свойства и настройка индикатора
На первом шаге определяется, как индикатор будет выглядеть и вести себя в MetaTrader 5. Мы указываем, что индикатор должен отображаться непосредственно в основном окне графика, а не в отдельной области. Поскольку цель состоит в отображении визуальной панели, а не традиционной линии индикатора, код не создает ни буферов, ни графических построений; вместо этого он использует графические объекты, такие как прямоугольники, текстовые метки и стрелки.
//+------------------------------------------------------------------+ //| Indicator properties | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 //--- This indicator renders a chart-embedded RSI panel using objects
Такой подход делает отображение более гибким и визуально аккуратным, позволяя точно задавать положение и стиль элементов.
Входные параметры и возможности настройки
Далее код определяет несколько входных параметров, которые можно настроить под свои предпочтения. InpRSIPeriod определяет, сколько баров используется для расчета RSI; значение по умолчанию – 14, это распространенная настройка. Уровни InpOverbought и InpOversold служат порогами для определения перекупленности и перепроданности рынка, обычно на уровнях 70 и 30 соответственно. Опция InpUseAsk позволяет выбрать, будет ли положение панели привязано к цене Bid или Ask.
//+------------------------------------------------------------------+ //| Input parameters | //+------------------------------------------------------------------+ input int InpRSIPeriod=14; input double InpOverbought=70.0; input double InpOversold=30.0; input bool InpUseAsk=false; input int InpTimeOffsetSec=90; input string InpFontName="Segoe UI"; input int InpFontSize=9; input bool InpShowAlerts=true; input bool InpLogToExperts=true; //--- Panel appearance input color InpPanelBgColor=clrDarkSlateGray; input color InpBorderColor=clrGoldenrod; input int InpPanelWidth=290; input int InpPanelHeight=36;
InpTimeOffsetSec задает временное смещение в секундах для горизонтального положения панели, что может помочь при визуальном анализе. Имя и размер шрифта (InpFontName и InpFontSize) настраиваются, что обеспечивает читаемость и визуальное соответствие панели общему оформлению. Параметры алертов (InpShowAlerts и InpLogToExperts) определяют, будут ли показываться уведомления и записываться сообщения в лог при возникновении определенных рыночных условий. Наконец, можно менять цвет фона панели, цвет ее рамки и размеры, чтобы настроить внешний вид под индивидуальные предпочтения.
//+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ string g_PanelName="RSI_Panel"; string g_ArrowName="RSI_ArrowChar"; string g_TextValue="RSI_Val"; string g_TextState="RSI_State"; string g_TextSignal="RSI_Signal"; int g_RSIHandle=INVALID_HANDLE; double g_PrevRSI=EMPTY_VALUE; bool g_AlertOB=false; bool g_AlertOS=false;
Инициализация (OnInit()) – подготовка данных и визуальных элементов
При загрузке индикатора запускается функция OnInit(), которая подготавливает все необходимое для отображения в реальном времени. Сначала она создает хэндл RSI с помощью функции iRSI(), которая вычисляет значения RSI на основе заданного периода и цен закрытия. Этот хэндл затем многократно используется для эффективного получения актуальных данных RSI. Если создать его не удается, инициализация прерывается, чтобы предотвратить ошибки. Затем создается объект прямоугольника, который служит фоном панели; для него задаются размеры, рамка и цвет заливки, чтобы он четко выделялся на графике.
//+------------------------------------------------------------------+ //| Initialize indicator | //+------------------------------------------------------------------+ int OnInit() { //--- Create RSI handle g_RSIHandle=iRSI(_Symbol,PERIOD_CURRENT,InpRSIPeriod,PRICE_CLOSE); if(g_RSIHandle==INVALID_HANDLE) return(INIT_FAILED); //--- Create panel background if(!ObjectCreate(0,g_PanelName,OBJ_RECTANGLE_LABEL,0,0,0)) return(INIT_FAILED); ObjectSetInteger(0,g_PanelName,OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetInteger(0,g_PanelName,OBJPROP_XSIZE,InpPanelWidth); ObjectSetInteger(0,g_PanelName,OBJPROP_YSIZE,InpPanelHeight); ObjectSetInteger(0,g_PanelName,OBJPROP_BORDER_COLOR,InpBorderColor); ObjectSetInteger(0,g_PanelName,OBJPROP_BGCOLOR,InpPanelBgColor); ObjectSetInteger(0,g_PanelName,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,g_PanelName,OBJPROP_HIDDEN,true); //--- Create arrow if(!ObjectCreate(0,g_ArrowName,OBJ_TEXT,0,0,0)) return(INIT_FAILED); ObjectSetString(0,g_ArrowName,OBJPROP_TEXT,"<"); ObjectSetString(0,g_ArrowName,OBJPROP_FONT,"Arial"); ObjectSetInteger(0,g_ArrowName,OBJPROP_FONTSIZE,14); ObjectSetInteger(0,g_ArrowName,OBJPROP_COLOR,clrYellow); //--- Create labels UpdateLabel(g_TextValue,0,0,"",clrWhite); UpdateLabel(g_TextState,0,0,"",clrWhite); UpdateLabel(g_TextSignal,0,0,"",clrWhite); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+
Для прямоугольника отключается интерактивность, чтобы трейдер не мог случайно его переместить. Также создается объект стрелки, указывающий на текущую цену; ее размер шрифта и цвет подбираются так, чтобы она оставалась хорошо заметной. Для динамического отображения информации внутри панели инициализируются три текстовые метки: для значения RSI, для состояния рынка (OVERBOUGHT, OVERSOLD или NEUTRAL) и для классификации сигнала по силе покупки/продажи. Эти метки создаются с помощью отдельной функции, которая задает их позицию, шрифт и цвет. После настройки всех визуальных объектов в лог выводится подтверждающее сообщение о том, что панель готова к отображению данных в реальном времени.
Очистка (OnDeinit()) – удаление объектов и освобождение ресурсов
При удалении индикатора или закрытии графика функция OnDeinit() освобождает ресурсы. Она освобождает ранее созданный хэндл RSI с помощью IndicatorRelease(), тем самым освобождая системные ресурсы.
//+------------------------------------------------------------------+ //| Deinitialize indicator | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release handle if(g_RSIHandle!=INVALID_HANDLE) IndicatorRelease(g_RSIHandle); //--- Delete objects ObjectDelete(0,g_PanelName); ObjectDelete(0,g_ArrowName); ObjectDelete(0,g_TextValue); ObjectDelete(0,g_TextState); ObjectDelete(0,g_TextSignal); } //+------------------------------------------------------------------+
Затем она удаляет все графические объекты – прямоугольник панели, стрелку и метки – с помощью ObjectDelete(). Благодаря этому график остается аккуратным и свободным от артефактов, которые могли бы мешать дальнейшему анализу или снижать производительность. Корректная очистка поддерживает эффективность системы и не дает лишним объектам оставаться после того, как индикатор перестает быть нужен.
Основной расчет (OnCalculate()) – получение данных и обновление отображения
Основная логика сосредоточена в функции OnCalculate(). Эта функция выполняется при каждом поступлении новых рыночных данных и обновляет отображение в реальном времени. Сначала она получает актуальное значение RSI из буфера индикатора с помощью CopyBuffer(). Проверки на ошибки подтверждают, что значение RSI корректно; в противном случае функция завершается досрочно. Далее в зависимости от выбранной пользователем опции берется текущая рыночная цена – Bid или Ask. Эта цена используется как опорная точка для позиционирования панели и стрелки на графике. Затем код классифицирует текущее состояние рынка: если RSI превышает порог перекупленности, состояние помечается как OVERBOUGHT; если опускается ниже уровня перепроданности – как OVERSOLD; в иных случаях – как NEUTRAL. Эта классификация выводится в виде понятных текстовых меток для быстрого считывания.
//+------------------------------------------------------------------+ //| Main calculation | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total,const int prev_calculated, const datetime &time[],const double &open[], const double &high[],const double &low[], const double &close[],const long &tick_volume[], const long &volume[],const int &spread[]) { double rsiBuf[1]; //--- Get RSI value if(CopyBuffer(g_RSIHandle,0,0,1,rsiBuf)!=1) return(rates_total); double rsi=rsiBuf[0]; if(rsi<=0 || rsi>100) return(rates_total); //--- Get current price double price=InpUseAsk ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID); if(price<=0) return(rates_total); //--- Determine state bool isOB=(rsi>=InpOverbought); bool isOS=(rsi<=InpOversold); string stateText=GetStateText(rsi); color stateColor=isOB ? clrOrangeRed : (isOS ? clrDodgerBlue : clrSilver); //--- Determine signal color signalColor; string signal=GetSignalClassification(rsi,g_PrevRSI,isOB,isOS,signalColor); //--- Convert price to screen coordinates datetime lastTime=time[rates_total-1]; datetime anchorTime=lastTime+InpTimeOffsetSec; int priceX,priceY; if(!ChartTimePriceToXY(0,0,anchorTime,price,priceX,priceY)) return(rates_total); //--- Position elements int arrowX=priceX-45; int arrowY=priceY-2; int panelX=priceX+20; int panelY=priceY-(InpPanelHeight/2); ClampPanelPosition(panelX,panelY,arrowX,arrowY,priceX,priceY); //--- Apply positions ObjectSetInteger(0,g_ArrowName,OBJPROP_XDISTANCE,arrowX); ObjectSetInteger(0,g_ArrowName,OBJPROP_YDISTANCE,arrowY); ObjectSetInteger(0,g_PanelName,OBJPROP_XDISTANCE,panelX); ObjectSetInteger(0,g_PanelName,OBJPROP_YDISTANCE,panelY); //--- Update text int textY=(InpPanelHeight-InpFontSize)/2; UpdateLabel(g_TextValue,panelX+8,panelY+textY, StringFormat("RSI: %.1f",rsi),clrWhite); UpdateLabel(g_TextState,panelX+85,panelY+textY, stateText,stateColor); UpdateLabel(g_TextSignal,panelX+185,panelY+textY, signal,signalColor); //--- Store previous RSI g_PrevRSI=rsi; ChartRedraw(); return(rates_total); } //+------------------------------------------------------------------+
Изменение RSI (дельта) – то, насколько он изменился с момента предыдущего обновления, – рассчитывается для оценки того, усиливается ли рыночный моментум или ослабевает, что позволяет формировать сигналы вроде "Strong Buy" или "Weak Sell". Позиции панели и стрелки рассчитываются по времени и цене, а затем переводятся в пиксельные координаты графика. Чтобы панель всегда оставалась видимой, проверка границ корректирует позиции, если они оказываются слишком близко к краям графика. Затем перемещаются стрелка и панель, а текстовые метки внутри панели обновляются с учетом актуального значения RSI, состояния рынка и сигналов; для наглядности каждой метке задается свой цвет. Когда RSI входит в зону перекупленности или перепроданности, индикатор запускает алерт, если эта опция включена. Флаги предотвращают повторное срабатывание алертов. Предыдущее значение RSI сохраняется для следующего обновления, после чего график перерисовывается.
Вспомогательные функции – поддержка основной логики
Сила сигнала определяется по порогам величины наклона RSI: чем больше абсолютное значение наклона, тем сильнее моментум.
//+------------------------------------------------------------------+ //| Classify RSI signal | //+------------------------------------------------------------------+ string GetSignalClassification(double rsi,double prevRSI, bool isOB,bool isOS,color &textColor) { double slope=(prevRSI!=EMPTY_VALUE) ? (rsi-prevRSI) : 0; string signal=""; if(isOB) { if(rsi>=80) signal="EXTREME SELL"; else if(slope<-1.5) signal="STRONG SELL"; else if(slope>0) signal="WEAK SELL"; else signal="SELL"; textColor=clrOrangeRed; } else if(isOS) { if(rsi<=20) signal="EXTREME BUY"; else if(slope>1.5) signal="STRONG BUY"; else if(slope<0) signal="WEAK BUY"; else signal="BUY"; textColor=clrDodgerBlue; } else { signal="NEUTRAL"; textColor=clrSilver; } return signal; } //+------------------------------------------------------------------+
В реализации используется несколько вспомогательных функций, которые упрощают типовые задачи. GetSignalClassification() анализирует недавний наклон RSI и пороговые значения, формируя понятные сигналы на покупку или продажу и показывая силу и направленность сигнала с помощью текста и цвета.
//+------------------------------------------------------------------+ //| Return RSI state text | //+------------------------------------------------------------------+ string GetStateText(double rsi) { if(rsi>=InpOverbought) return "OVERBOUGHT"; if(rsi<=InpOversold) return "OVERSOLD"; return "NEUTRAL"; } //+------------------------------------------------------------------+
GetStateText() возвращает простую оценку состояния рынка по категориям (OVERBOUGHT, OVERSOLD или NEUTRAL), позволяя быстро оценивать состояние рынка по графику.
//+------------------------------------------------------------------+ //| Update label | //+------------------------------------------------------------------+ void UpdateLabel(string name,int x,int y, string text,color clr,int fontSize=-1) { if(fontSize==-1) fontSize=InpFontSize; if(!ObjectCreate(0,name,OBJ_LABEL,0,0,0)) { ObjectSetString(0,name,OBJPROP_TEXT,text); } ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y); ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetString(0,name,OBJPROP_TEXT,text); ObjectSetString(0,name,OBJPROP_FONT,InpFontName); ObjectSetInteger(0,name,OBJPROP_FONTSIZE,fontSize); ObjectSetInteger(0,name,OBJPROP_COLOR,clr); ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); } //+------------------------------------------------------------------+
Функция UpdateLabel() создает или обновляет текстовые метки внутри панели, единообразно задавая их позицию, шрифт, размер и цвет. ClampPanelPosition() проверяет границы графика и корректирует позиции панели и стрелки так, чтобы они оставались полностью видимыми и не обрезались за пределами области графика. Эти функции инкапсулируют повторяющиеся операции и упрощают основную логику расчета.
//+------------------------------------------------------------------+ //| Keep panel inside chart | //+------------------------------------------------------------------+ void ClampPanelPosition(int &panelX,int &panelY, int &arrowX,int &arrowY, int priceX,int priceY) { int chartWidth=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); int chartHeight=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); //--- Clamp panel X if(panelX+InpPanelWidth>chartWidth) panelX=chartWidth-InpPanelWidth-5; if(panelX<5) panelX=5; //--- Clamp panel Y if(panelY<5) panelY=5; if(panelY+InpPanelHeight>chartHeight) panelY=chartHeight-InpPanelHeight-5; //--- Arrow position arrowX=priceX-45; arrowY=priceY-2; } //+------------------------------------------------------------------+
Особенности реализации – удобный и эффективный инструмент
В основе индикатора – баланс технической эффективности и удобства использования. Хэндлы для расчета RSI создаются один раз в OnInit() и освобождаются в OnDeinit(), что исключает лишний расход ресурсов. Панель, стрелка и метки поддерживают настройку цветов и шрифтов, поэтому их легко согласовать с предпочитаемой темой графика. Положение панели рассчитывается динамически, поэтому она остается в пределах видимой области графика независимо от движения рынка и масштаба. Алерты управляются через флаги, поэтому повторные уведомления не срабатывают, а сигналы остаются своевременными и ненавязчивыми. Параметры индикатора полностью настраиваются, что позволяет точно отрегулировать чувствительность, пороги и внешний вид под торговую стратегию. В целом решение нацелено на то, чтобы обеспечить понятный, информативный и ненавязчивый визуальный инструмент, который поддерживает технический анализ и не загромождает график.
Такая пошаговая реализация позволяет создать визуальный индикатор RSI, который сразу дает ясное представление о состоянии рынка. За счет сочетания управления хэндлами, графических объектов и продуманного анализа рынка панель выводит обновления в реальном времени в наглядном и аккуратном виде. Модульная структура, вспомогательные функции и проверки границ упрощают настройку и расширение, превращая панель в мощный инструмент поддержки принятия решений. В результате получается удобный и визуально привлекательный индикатор, который можно адаптировать под разные стили торговли и предпочтения, делая анализ RSI в MetaTrader 5 более доступным и эффективным.
Результаты
Эффективность RSI Price Action Panel лучше всего видна по ее поведению на графике в реальном времени. Следующие схемы показывают, как система ведет себя в реальных рыночных условиях, с акцентом на движение, адаптивность и отзывчивость, а не на статическое сравнение.
Привязка к цене и движение в реальном времени
Схема ниже показывает, как панель остается привязанной к цене по мере развития рыночного движения. По мере формирования новых свечей и смещения цены панель постоянно меняет положение, сохраняя фиксированное пространственное соотношение с текущим ценовым уровнем.

Рисунок 5. Поведение при тестировании
Панель сохраняет привязку к цене благодаря пересчету координат в реальном времени. Стрелка остается привязанной к ценовой точке, а панель смещается так, чтобы сохранять видимость при масштабировании и изменении размера окна. Координаты пересчитываются с учетом обновленных размеров графика. В результате интерфейс остается отзывчивым, а данные RSI по-прежнему напрямую привязаны к цене.
Адаптация к разным таймфреймам

Рисунок 6. Переключение между таймфреймами
Схема выше показывает, как система ведет себя в разных контекстах графика, особенно при переключении между таймфреймами. При смене таймфрейма панель автоматически адаптируется к новым данным графика. Значения RSI пересчитываются по активному таймфрейму, а панель продолжает оставаться привязанной к последней ценовой точке без повторной инициализации и ручной настройки.
Это подтверждает, что система остается стабильной при смене таймфрейма. Значения RSI пересчитываются динамически, тогда как структура панели и ее позиционирование остаются стабильными. Это сохраняет непрерывность анализа и позволяет переключаться между таймфреймами, не теряя ясности интерпретации.
Из этих наблюдений можно сделать несколько практических выводов:
- непрерывная привязка к цене – панель сохраняет привязку в реальном времени к текущему рыночному уровню;
- адаптивное позиционирование – панель автоматически подстраивается под масштаб, изменение размера и смещение графика;
- независимость от таймфрейма – система остается стабильной и работоспособной на разных таймфреймах;
- стабильная визуальная структура – расположение информации не меняется, хотя данные обновляются динамически.
Эти результаты показывают, что панель RSI – не просто графическое наложение, а полностью адаптивная система, встроенная в график. Ее способность следовать за ценой, подстраиваться под изменения графика и сохранять согласованность на разных таймфреймах означает, что подтверждение на основе RSI всегда представляется в наиболее уместном контексте. Система перестает быть отдельным аналитическим инструментом и становится частью самого ценового движения, постоянно обновляясь, смещаясь и оставаясь в фокусе трейдера в реальном времени.
Заключение
Реализованное решение превращает RSI из отдельного инструмента подтверждения во встроенный графический объект, который находится непосредственно в точке исполнения сделки. Если говорить предметно, статья дает рабочий каркас на языке MQL5, который:
- рассчитывает RSI через хэндл iRSI и обновляет данные на каждом тике;
- строит компактную панель (OBJ RECTANGLE LABEL), стрелку (OBJ TEXT) и метки (OBJ LABEL), позиционируемые через ChartTimePriceToXY;
- не допускает вынесения объектов за пределы экрана с помощью функции ClampPanelPosition и автоматически адаптируется к масштабированию, прокрутке и смене таймфрейма;
- классифицирует состояние рынка (OVERBOUGHT/OVERSOLD/NEUTRAL) и определяет силу сигнала по наклону RSI с помощью настраиваемых порогов;
- корректно управляет ресурсами и алертами (IndicatorRelease, флаги алертов), поэтому индикатор безопасно запускать и удалять.
В результате вы получаете переносимый шаблон индикатора MT5: достаточно поместить его на график, и он сразу обеспечит непрерывную привязку к цене, адаптивное позиционирование, независимость от таймфрейма и стабильную визуальную структуру, которую можно расширить собственной логикой сигналов или правилами алертов. В итоге это и практический инструмент для более быстрого и целостного принятия решений, и шаблон, который можно использовать повторно для создания других панелей моментума, привязанных к графику.
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/22110
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Торговые инструменты на MQL5 (Часть 31): Создание интерактивной палитры инструментов в MQL5
Рыночные секреты Ларри Уильямса (Часть 14): Обнаружение разворотов Hidden Smash Day с помощью пользовательского индикатора
Рыночные секреты Ларри Уильямса (Часть 15): Торговля разворотами по паттерну Hidden Smash Day с учетом рыночного контекста
Автоматизация торговых стратегий с помощью MQL5 (Часть 48): Блоки ордеров, провокация ликвидности, пробой структуры
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования