← К каталогу
Исходный код · ID 4708

marketstructure_rsi_validator.mq5

Похожие материалы по тегам

fibochannel s&r.pineTradingView · 1 общих теговxmc ea 1.02 d_grid_v1.mq5MQL5 / MetaTrader 5 · 1 общих теговxmc ea 1.02 d_grid_v1.mq4MQL4 / MetaTrader 4 · 1 общих теговtradingview kinetic momentum squeeze (1).pineTradingView · 1 общих теговmulti-signal trading signal system.pineTradingView · 1 общих теговaurumbreakclone_v016.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Market Structure RSI Validator — это аналитический советник для MetaTrader 5, который проверяет пересечения порогов RSI на закрытых барах в контексте рыночной структуры. Программа определяет подтверждённые свинг-максимумы и свинг-минимумы, классифицирует структуру как бычью, медвежью или боковик, и генерирует визуальные сигналы-стрелки на графике.

Советник обрабатывает событие OnTick, но анализирует только вновь открытые бары, игнорируя изменения внутри текущего бара. RSI рассчитывается через стандартный индикаторный handle iRSI, а данные ценового графика получаются через CopyRates. Перед началом работы входные параметры проверяются на корректность.

Программа явно заявлена как аналитическая и не размещает торговые ордера. Она отображает результаты анализа в виде графических объектов и информационной панели Comment на графике.

При деинициализации советник освобождает индикаторный handle и удаляет только свои графические объекты по заданному префиксу.

Настройки программы

НастройкаОписание
InpRSIPeriod Период расчёта индикатора RSI.
InpAppliedPrice Тип цены, используемой для расчёта индикатора RSI (например, PRICE_CLOSE).
InpOverbought Уровень перекупленности RSI, при превышении которого фиксируется пересечение вверх.
InpOversold Уровень перепроданности RSI, при снижении ниже которого фиксируется пересечение вниз.
InpSwingLeft Количество баров слева от кандидата, которые не должны содержать более высокий максимум или более низкий минимум для подтверждения свинга.
InpSwingRight Количество баров справа от кандидата, которые не должны содержать более высокий максимум или более низкий минимум для подтверждения свинга.
InpStructureLookback Количество баров истории, используемых для поиска двух последних подтверждённых свинг-точек.
InpConfirmationBars Максимальное количество баров ожидания структурного подтверждения для отложенного кандидата, после чего он аннулируется.
InpBreakBufferPoints Размер буфера в пунктах для определения пробоя свинг-уровней высокого и низкого.
InpDrawSignals Переключатель отображения или скрытия стрелок сигналов на графике.
InpBuyColor Цвет стрелок, отображающих покупательские подтверждённые сигналы на графике.
InpSellColor Цвет стрелок, отображающих продавательские подтверждённые сигналы на графике.
InpObjectPrefix Префикс имён графических объектов-стрелок, создаваемых программой на графике.
Получить полный код

Поиск по коду файла

#property version   "1.00"
#property strict
#property description "Validates closed-bar RSI threshold crossings with swing structure."
#property description "The program is analytical and does not place trades."

input group "RSI settings"
input int                InpRSIPeriod             = 14;
input ENUM_APPLIED_PRICE InpAppliedPrice          = PRICE_CLOSE;
input double             InpOverbought            = 70.0;
input double             InpOversold              = 30.0;

input group "Market structure settings"
input int                InpSwingLeft             = 2;
input int                InpSwingRight            = 2;
input int                InpStructureLookback     = 150;
input int                InpConfirmationBars      = 5;
input int                InpBreakBufferPoints     = 10;

input group "Visualization settings"
input bool               InpDrawSignals           = true;
input color              InpBuyColor              = clrLimeGreen;
input color              InpSellColor             = clrTomato;
input string             InpObjectPrefix          = "MSRSI_";

enum ENUM_STRUCTURE_STATE
  {
   STRUCTURE_UNKNOWN,
   STRUCTURE_BULLISH,
   STRUCTURE_BEARISH,
   STRUCTURE_RANGE
  };

enum ENUM_RSI_CANDIDATE
  {
   CANDIDATE_NONE,
   CANDIDATE_OVERBOUGHT,
   CANDIDATE_OVERSOLD
  };

int                  g_rsi_handle=INVALID_HANDLE;
datetime             g_last_bar_time=0;
ENUM_RSI_CANDIDATE   g_candidate=CANDIDATE_NONE;
int                  g_candidate_age=0;
datetime             g_candidate_time=0;
double               g_candidate_rsi=0.0;
string               g_last_result="Waiting for a closed-bar RSI event";

bool InputsAreValid()
  {

   if(InpRSIPeriod<2 || InpSwingLeft<1 || InpSwingRight<1)
      return(false);

   if(InpStructureLookback<20 || InpConfirmationBars<1)
      return(false);

   if(InpOversold<=0.0 || InpOverbought>=100.0 ||
      InpOversold>=InpOverbought)
      return(false);

   return(true);
  }

int OnInit()
  {
      // код доступен только после оплаты
   }

void OnTick()
  {
      // код доступен только после оплаты
   }

bool IsSwingHigh(const MqlRates &rates[],const int shift)
  {

   double level=rates[shift].high;

   for(int i=1;i<=InpSwingLeft;i++)
     {
      if(level<=rates[shift+i].high)
         return(false);
     }

   for(int i=1;i<=InpSwingRight;i++)
     {
      if(level<=rates[shift-i].high)
         return(false);
     }

   return(true);
  }

bool IsSwingLow(const MqlRates &rates[],const int shift)
  {

   double level=rates[shift].low;

   for(int i=1;i<=InpSwingLeft;i++)
     {
      if(level>=rates[shift+i].low)
         return(false);
     }

   for(int i=1;i<=InpSwingRight;i++)
     {
      if(level>=rates[shift-i].low)
         return(false);
     }

   return(true);
  }

bool ReadStructure(double &last_high,double &prior_high,
                   double &last_low,double &prior_low,
                   MqlRates &rates[])
  {

   int required=InpStructureLookback+InpSwingLeft+InpSwingRight+5;
   ArraySetAsSeries(rates,true);
   int copied=CopyRates(_Symbol,_Period,0,required,rates);
   if(copied<InpSwingLeft+InpSwingRight+10)
      return(false);

   int highs=0;
   int lows=0;
   int first_shift=InpSwingRight+1;
   int final_shift=MathMin(copied-InpSwingLeft-1,InpStructureLookback);

   for(int shift=first_shift;shift<=final_shift;shift++)
     {
      if(highs<2 && IsSwingHigh(rates,shift))
        {

         if(highs==0)
            last_high=rates[shift].high;
         else
            prior_high=rates[shift].high;
         highs++;
        }

      if(lows<2 && IsSwingLow(rates,shift))
        {

         if(lows==0)
            last_low=rates[shift].low;
         else
            prior_low=rates[shift].low;
         lows++;
        }

      if(highs==2 && lows==2)
         break;
     }

   return(highs==2 && lows==2);
  }

ENUM_STRUCTURE_STATE ClassifyStructure(const double last_high,
                                        const double prior_high,
                                        const double last_low,
                                        const double prior_low)
  {

   if(last_high>prior_high && last_low>prior_low)
      return(STRUCTURE_BULLISH);

   if(last_high<prior_high && last_low<prior_low)
      return(STRUCTURE_BEARISH);

   return(STRUCTURE_RANGE);
  }

string StructureText(const ENUM_STRUCTURE_STATE state)
  {

   if(state==STRUCTURE_BULLISH)
      return("Bullish: higher high and higher low");

   if(state==STRUCTURE_BEARISH)
      return("Bearish: lower high and lower low");

   if(state==STRUCTURE_RANGE)
      return("Range or transition");

   return("Unknown");
  }

void DrawSignal(const datetime time,const double price,
                const bool buy,const string label)
  {

   if(!InpDrawSignals)
      return;

   string name=InpObjectPrefix+IntegerToString((long)time)+"_"+label;
   if(Objec

Показано первые 50% кода (символов: 8031)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
803,10₽ ≈ $9.82