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

Smart Money Concepts [LuxAlgo] MQL5 Port

smartmoneyconcepts_v5_dark.mq5
Вы автор или правообладатель?

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

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

О программе

Данный продукт представляет собой индикатор для платформы MetaTrader 5, реализующий визуализацию концепций Smart Money (SMC) на ценовых графиках. Индикатор отображает структуру свингов (высокие и низкие точки), определяет импульсы Break of Structure (BOS) и Change of Character (CHoCH), а также рисует зоны ордерблоков, равных максимумов/минимумов и премиальных/дисконтных зон.

В состав индикатора входит информационная панель (дашборд), отображающая текущие смещения (bias) для текущего, внутривидового (ITF) и старшего (HTF) таймфреймов. Поддерживается режим отображения исторических или текущих данных, а также период обзора (Look Back) для ограничения анализа последними барами.

Индикатор работает в окне графика без дополнительных линейных построений (indicator_plots 0), используя чарт-объекты для отрисовки всех элементов. Визуальные настройки включают цвета, прозрачность и стиль отображения как для обычного, так и для монохромного режима.

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

НастройкаОписание
InpMode Режим отображения: Historical — исторические данные, Present — текущие данные.
InpStyle Стиль отображения: Colored — цветной, Monochrome — монохромный.
InpColorCandles Включает или отключает цветную заливку свечей в зависимости от направления структуры.
InpShowInternals Включает или отключает отображение внутренней структуры (внутренние свинги и импульсы).
InpInternalBull Фильтр отображения внутренней бычьей структуры: все сигналы, только BOS или только CHoCH.
InpInternalBear Фильтр отображения внутренней медвежьей структуры: все сигналы, только BOS или только CHoCH.
InpConfluenceFilter Фильтр совпадений: при включении отображаются только сигналы, совпадающие с несколькими условиями структуры.
InpIntBullColor Цвет отображения внутренней бычьей структуры.
InpIntBearColor Цвет отображения внутренней медвежьей структуры.
InpShowStructure Включает или отключает отображение структуры свингов (BOS/CHoCH) на графике.
InpSwingBull Фильтр отображения свинговой бычьей структуры: все сигналы, только BOS или только CHoCH.
InpSwingBear Фильтр отображения свинговой медвежьей структуры: все сигналы, только BOS или только CHoCH.
InpSwgBullColor Цвет отображения свинговой бычьей структуры.
InpSwgBearColor Цвет отображения свинговой медвежьей структуры.
InpShowSwingPoints Включает или отключает отображение меток HH/HL/LH/LL на графике.
InpSwingsLength Длина (количество баров по обеим сторонам) для обнаружения свинговых точек.
InpShowHighLow Включает или отключает отображение сильных и слабых максимумов и минимумов (Strong/Weak High/Low).
InpShowInternalOB Включает или отключает отображение внутренних ордерблоков.
InpInternalOBCount Максимальное количество отображаемых внутренних ордерблоков на графике.
InpShowSwingOB Включает или отключает отображение свинговых ордерблоков.
InpSwingOBCount Максимальное количество отображаемых свинговых ордерблоков на графике.
InpOBMitigation Метод митигации ордерблоков: закрытие (Close) или пробой максимума/минимума (High/Low).
InpOBAlpha Прозрачность ордерблоков: 0 — непрозрачный (сплошной), 255 — невидимый.
InpIntBullOBColor Цвет заливки внутреннего бычьего ордерблока.
InpIntBearOBColor Цвет заливки внутреннего медвежьего ордерблока.
InpSwgBullOBColor Цвет заливки свингового бычьего ордерблока.
InpSwgBearOBColor Цвет заливки свингового медвежьего ордерблока.
InpShowEqualHL Включает или отключает отображение равных максимумов и минимумов (EQH/EQL).
InpEqualHLBars Количество баров для подтверждения равных максимумов и минимумов (EQH/EQL).
InpEqualHLThresh Пороговое значение на базе ATR для определения равных максимумов и минимумов.
InpShowZones Включает или отключает отображение премиальных и дисконтных зон на графике.
InpPremiumColor Цвет отображения премиальной зоны на графике.
InpEquilColor Цвет отображения зоны равновесия на графике.
InpDiscountColor Цвет отображения дисконтной зоны на графике.
InpUseLookBack Включает или отключает период обзора (Look Back) для ограничения анализа последними барами.
InpLookBackBars Количество баров для периода обзора (Look Back), ограничивающего анализ последними барами.
InpHTFPeriod Старший таймфрейм (HTF), используемый для анализа смещения на информационной панели.
InpITFPeriod Внутривидовой таймфрейм (ITF), используемый для анализа смещения на информационной панели.
InpShowDashboard Включает или отключает информационную панель дашборда на графике.
InpShowHTF Включает или отключает секцию старшего таймфрейма (HTF) на дашборде.
InpShowITF Включает или отключает секцию внутривидового таймфрейма (ITF) на дашборде.
InpDashX Горизонтальное положение информационной панели дашборда на графике.
InpDashY Вертикальное положение информационной панели дашборда на графике.
InpDashFontSize Размер шрифта текста на информационной панели дашборда.
Получить полный код

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

#property version   "5.30"
#property indicator_chart_window
#property indicator_plots 0

input string  InpMode             = "Historical"; // Mode: Historical | Present
input string  InpStyle            = "Colored";    // Style: Colored | Monochrome
input bool    InpColorCandles     = false;        // Color Candles

input bool    InpShowInternals    = true;         // Show Internal Structure
input string  InpInternalBull     = "All";        // Internal Bullish: All | BOS | CHoCH
input string  InpInternalBear     = "All";        // Internal Bearish: All | BOS | CHoCH
input bool    InpConfluenceFilter = false;        // Confluence Filter
input color   InpIntBullColor     = C'91,156,246'; // Internal Bullish Color
input color   InpIntBearColor     = C'255,100,100'; // Internal Bearish Color

input bool    InpShowStructure    = true;         // Show Swing Structure
input string  InpSwingBull        = "All";        // Swing Bullish: All | BOS | CHoCH
input string  InpSwingBear        = "All";        // Swing Bearish: All | BOS | CHoCH
input color   InpSwgBullColor     = C'0,220,170'; // Swing Bullish Color
input color   InpSwgBearColor     = C'255,110,110'; // Swing Bearish Color
input bool    InpShowSwingPoints  = true;        // Show HH/HL/LH/LL
input int     InpSwingsLength     = 50;           // Swing Detection Length
input bool    InpShowHighLow      = true;         // Show Strong/Weak High/Low

input bool    InpShowInternalOB   = true;         // Show Internal Order Blocks
input int     InpInternalOBCount  = 5;            // Internal OB Count
input bool    InpShowSwingOB      = true;        // Show Swing Order Blocks
input int     InpSwingOBCount     = 5;            // Swing OB Count
input string  InpOBMitigation     = "High/Low";   // OB Mitigation: Close | High/Low

input int     InpOBAlpha          = 200;          // OB Transparency (0=solid, 255=invisible)

input color   InpIntBullOBColor   = C'80,80,80';   // Teal/Cyan  — Internal Bullish OB
input color   InpIntBearOBColor   = C'80,80,80';   // Orange     — Internal Bearish OB

input color   InpSwgBullOBColor   = C'30,100,255';  // Deep Blue  — Swing Bullish OB
input color   InpSwgBearOBColor   = C'210,30,60';   // Deep Red   — Swing Bearish OB

input bool    InpShowEqualHL      = true;         // Show Equal Highs/Lows
input int     InpEqualHLBars      = 3;            // EQH/EQL Bars Confirmation
input double  InpEqualHLThresh    = 0.1;          // EQH/EQL ATR Threshold

input bool    InpShowZones        = true;        // Show Premium/Discount Zones
input color   InpPremiumColor     = C'210,60,75';
input color   InpEquilColor       = C'90,100,120';
input color   InpDiscountColor    = C'0,180,140';

input bool    InpUseLookBack      = true;        // Enable Look Back Period
input int     InpLookBackBars     = 1000;          // Look Back Period (bars)

input ENUM_TIMEFRAMES InpHTFPeriod = PERIOD_H4;   // Higher TimeFrame (HTF)
input ENUM_TIMEFRAMES InpITFPeriod = PERIOD_H1;  // Intra TimeFrame  (ITF)

input bool    InpShowDashboard    = true;         // Show Dashboard
input bool    InpShowHTF          = true;         // Show HTF Section in Dashboard
input bool    InpShowITF          = true;         // Show ITF Section in Dashboard
input int     InpDashX            = 5;            // Dashboard X Position
input int     InpDashY            = 430;          // Dashboard Y Position
input int     InpDashFontSize     = 9;            // Font Size

#define BULL  1
#define BEAR -1

struct SPivot
{
   double   level;
   double   lastLevel;
   bool     crossed;
   datetime barTime;
   int      barIndex;
};

struct SOB
{
   double   hi, lo;
   datetime barTime;     // time of the OB candle itself (hi/lo source)
   datetime confirmTime; // time of the BOS/CHoCH that confirmed this OB
   int      bias;
   string   fillObj;
   string   bdrObj;
};

struct STrail
{
   double   top, bottom;
   datetime barTime;
   int      barIndex;
   datetime lastTopTime, lastBottomTime;
};

SPivot  g_swH, g_swL;
SPivot  g_inH, g_inL;
SPivot  g_eqH, g_eqL;
STrail  g_tr;
int     g_swTr = 0, g_inTr = 0;

string  g_swLastSignal    = "None";
color   g_swLastSignalClr = C'90,95,110';

SOB     g_swOB[], g_inOB[];
double  g_pH[], g_pL[], g_hi[], g_lo[];
datetime g_t[];
int     g_bars = 0;
double  g_atr  = 0.0;
int     g_uid  = 0;

int     g_atrHandle = INVALID_HANDLE;
double  g_atrBuf[];

MqlRates g_htfRates[];
MqlRates g_itfRates[];

int      g_htfSwingChochBias  = 0;
int      g_htfInternChochBias = 0;
string   g_htfLastSignal      = "None";
color    g_htfLastSignalClr   = C'90,95,110';
datetime g_htfLastCalc        = 0;

int      g_itfSwingChochBias  = 0;
int      g_itfInternChochBias = 0;
int      g_itfInternBosBias   = 0;
string   g_itfChochSignal     = "Calculating...";
color    g_itfChochClr        = C'90,95,110';
string   g_itfBosSignal       = "Calculating...";
color    g_itfBosClr          = C'90,95,110';
string   g_itfSwingSignal     = "Calculating...";
color    g_itfSwingClr        = C'90,95,110';
datetime g_itfLastCalc        = 0;

#define DASH_PFX  "JAFX_DB_"
#define DASH_FONT "Consolas"

string UID(string p) { return p + IntegerToString(++g_uid); }

color cSwBull() { return InpStyle=="Monochrome" ? C'160,165,175' : InpSwgBullColor; }
color cSwBear() { return InpStyle=="Monochrome" ? C'110,115,130'   : InpSwgBearColor; }
color cInBull() { return InpStyle=="Monochrome" ? C'160,165,175' : InpIntBullColor; }
color cInBear() { return InpStyle=="Monochrome" ? C'110,115,130'   : InpIntBearColor; }

color OBFillColor(bool internal, int bias)
{
   color base;
   if(InpStyle=="Monochrome")
      base = bias==BULL ? C'160,165,175' : C'110,115,130';
   else if(internal)
      base = bias==BULL ? InpIntBullOBColor : InpIntBearOBColor;
   else
      base = bias==BULL ? InpSwgBullOBColor : InpSwgBearOBColor;

   int alpha = MathMax(0, MathMin(255, InpOBAlpha));
   return (color)ColorToARGB(base, (uchar)(255 - alpha));
}

color OBBorderColor(bool internal, int bias)
{
   if(internal) return clrNONE;
   if(InpStyle=="Monochrome") return bias==BULL ? C'160,165,175' : C'110,115,130';
   return bias==BULL ? InpSwgBullOBColor : InpSwgBearOBColor;
}

double GetATR(int barIdx)
{
   int sz = ArraySize(g_atrBuf);
   if(sz > 0 && barIdx >= 0 && barIdx < sz) return g_atrBuf[barIdx];
   return _Point * 100;
}

void RefreshATRBuffer(int rates_total)
{
   if(g_atrHandle == INVALID_HANDLE)
      g_atrHandle = iATR(_Symbol, PERIOD_CURRENT, 200);
   if(g_atrHandle == INVALID_HANDLE) return;

   ArraySetAsSeries(g_atrBuf, false);
   ArrayResize(g_atrBuf, rates_total);

   double tmp[];
   ArraySetAsSeries(tmp, false);
   if(CopyBuffer(g_atrHandle, 0, 0, rates_total, tmp) == rates_total)
      ArrayCopy(g_atrBuf, tmp);
}

void DrawStruct(SPivot &p, string tag, color clr, bool dashed, datetime endTime)
{
   if(p.level==EMPTY_VALUE) return;
   string ln=UID("SMC_SL"), lb=UID("SMC_ST");

   ObjectCreate(0,ln,OBJ_TREND,0,p.barTime,p.level,endTime,p.level);
   ObjectSetInteger(0,ln,OBJPROP_COLOR,    clr);
   ObjectSetInteger(0,ln,OBJPROP_STYLE,    dashed?STYLE_DASH:STYLE_SOLID);
   ObjectSetInteger(0,ln,OBJPROP_WIDTH,    1);
   ObjectSetInteger(0,ln,OBJPROP_RAY_RIGHT,false);
   ObjectSetInteger(0,ln,OBJPROP_BACK,     true);

   datetime mid=(datetime)(((long)p.barTime+(long)endTime)/2);
   ObjectCreate(0,lb,OBJ_TEXT,0,mid,p.level);
   ObjectSetString(0, lb,OBJPROP_TEXT,    tag);
   ObjectSetInteger(0,lb,OBJPROP_COLOR,   clr);
   ObjectSetInteger(0,lb,OBJPROP_FONTSIZE,7);
   ObjectSetInteger(0,lb,OBJPROP_ANCHOR,  ANCHOR_LOWER);
}

void DrawSwPt(datetime t, double price, string tag, color clr, bool above)
{
   string nm=UID("SMC_SP");
   ObjectCreate(0,nm,OBJ_TEXT,0,t,price);
   ObjectSetString(0, nm,OBJPROP_TEXT,    tag);
   ObjectSetInteger(0,nm,OBJPROP_COLOR,   clr);
   ObjectSetInteger(0,nm,OBJPROP_FONTSIZE,7);
   ObjectSetInteger(0,nm,OBJPROP_ANCHOR,  above?ANCHOR_UPPER:ANCHOR_LOWER);
}

void DrawEQL(SPivot &p, double level, datetime toTime, bool isHigh)
{
   string ln=isHigh?"SMC_EQH_L":"SMC_EQL_L";
   string lb=isHigh?"SMC_EQH_T":"SMC_EQL_T";
   if(InpMode=="Present"){ObjectDelete(0,ln);ObjectDelete(0,lb);}
   color clr=isHigh?cSwBear():cSwBull();

   ObjectCreate(0,ln,OBJ_TREND,0,p.barTime,p.level,toTime,level);
   ObjectSetInteger(0,ln,OBJPROP_COLOR,    clr);
   ObjectSetInteger(0,ln,OBJPROP_STYLE,    STYLE_DOT);
   ObjectSetInteger(0,ln,OBJPROP_WIDTH,    1);
   ObjectSetInteger(0,ln,OBJPROP_RAY_RIGHT,false);

   datetime mid=(datetime)(((long)p.barTime+(long)toTime)/2);
   ObjectCreate(0,lb,OBJ_TEXT,0,mid,level);
   ObjectSetString(0, lb,OBJPROP_TEXT,    isHigh?"EQH":"EQL");
   ObjectSetInteger(0,lb,OBJPROP_COLOR,   clr);
   ObjectSetInteger(0,lb,OBJPROP_FONTSIZE,7);
   ObjectSetInteger(0,lb,OBJPROP_ANCHOR,  isHigh?ANCHOR_UPPER:ANCHOR_LOWER);
}

void DrawOBRect(SOB &ob, bool internal)
{

   if(ob.fillObj!="") { ObjectDelete(0,ob.fillObj); ob.fillObj=""; }
   if(ob.bdrObj !="") { ObjectDelete(0,ob.bdrObj);  ob.bdrObj=""; }

   datetime rt = TimeCurrent()+(datetime)(PeriodSeconds()*50);

   string obType   = internal ? "Internal Order Block" : "Swing Order Block";
   string obBias   = (ob.bias==BULL) ? "Bullish" : "Bearish";
   string obAction = (ob.bias==BULL) ? "Demand Zone — expect price to react UP"
                                     : "Supply Zone — expect price to react DOWN";
   string tooltip  = obType + " | " + obBias + "\n"
                   + "High : " + DoubleToString(ob.hi, _Digits) + "\n"
                   + "Low  : " + DoubleToString(ob.lo, _Digits) + "\n"
                   + obAction;

   ob.fillObj = UID("SMC_OBF");
   color fillClr = OBFillColor(internal, ob.bias);

   datetime leftEdge = (ob.confirmTime > 0) ? ob.confirmTime : ob.barTime;
   ObjectCreate(0,ob.fillObj,OBJ_RECTANGLE,0,leftEdge,ob.hi,rt,ob.lo);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_COLOR,      fillClr);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_BGCOLOR,     fillClr);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_FILL,       true);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_BACK,       true);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_WIDTH,      1);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0,ob.fillObj,OBJPROP_SELECTED,   false);
   ObjectSetString(0, ob.fillObj,OBJPROP_TOOLTIP,    tooltip);  // ← hover description

   ob.bdrObj = UID("SMC_OBB");
   color bdrClr = internal ? OBFillColor(internal, ob.bias)   // subtler for internal
                           : OBBorderColor(internal, ob.bias); // solid for swing
   int   bdrW   = internal ? 1 : 2;                           // thinner for internal

   ObjectCreate(0,ob.bdrObj,OBJ_RECTANGLE,0,leftEdge,ob.hi,rt,ob.lo);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_COLOR,      bdrClr);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_FILL,       false);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_BACK,       false);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_WIDTH,      bdrW);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_STYLE,      internal ? STYLE_DOT : STYLE_SOLID);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0,ob.bdrObj,OBJPROP_SELECTED,   false);
   ObjectSetString(0, ob.bdrObj,OBJPROP_TOOLTIP,    tooltip);  // ← hover description on border too
}

void DrawZoneBox(string nm, datetime lt, double top, double bot, color clr, string lbl, bool above)
{
   ObjectDelete(0,nm); ObjectDelete(0,nm+"_l");
   datetime rt=TimeCurrent()+(datetime)(PeriodSeconds()*50);
   color fillClr=(color)ColorToARGB(clr,(uchar)180);

   ObjectCreate(0,nm,OBJ_RECTANGLE,0,lt,top,rt,bot);
   ObjectSetInteger(0,nm,OBJPROP_COLOR,   fillClr);
   ObjectSetInteger(0,nm,OBJPROP_BGCOLOR,  fillClr);
   ObjectSetInteger(0,nm,OBJPROP_FILL,    true);
   ObjectSetInteger(0,nm,OBJPROP_BACK,    true);

   ObjectCreate(0,nm+"_l",OBJ_TEXT,0,rt,above?top:bot);
   ObjectSetString(0, nm+"_l",OBJPROP_TEXT,    lbl);
   ObjectSetInteger(0,nm+"_l",OBJPROP_COLOR,   clr);
   ObjectSetInteger(0,nm+"_l",OBJPROP_FONTSIZE,8);
   ObjectSetInteger(0,nm+"_l",OBJPROP_ANCHOR,  above?ANCHOR_UPPER:ANCHOR_LOWER);
}

void StoreOB(SPivot &p, bool internal, int bias, int bosBarIndex)
{
   if( internal&&!InpShowInternalOB) return;
   if(!internal&&!InpShowSwingOB)    return;

   int si=p.barIndex, ei=bosBarIndex;
   if(si<0||si>=ei) return;

   int best_i=si; double best=(bias==BEAR)?-DBL_MAX:DBL_MAX;
   int arrSz=ArraySize(g_pH);
   for(int i=si; i<ei&&i<arrSz; i++)
   {
      if(bias==BEAR&&g_pH[i]>best){best=g_pH[i];best_i=i;}
      if(bias==BULL&&g_pL[i]<best){best=g_pL[i];best_i=i;}
   }
   if(best_i<0||best_i>=arrSz) return;

   SOB ob;
   ob.hi=g_hi[best_i]; ob.lo=g_lo[best_i];
   ob.barTime=g_t[best_i];

   ob.confirmTime=(bosBarIndex<ArraySize(g_t))?g_t[bosBarIndex]:g_t[best_i];
   ob.bias=bias;
   ob.fillObj=""; ob.bdrObj="";

   if(internal)
   {
      int sz=ArraySize(g_inOB);
      if(sz>=100)
      {
         ObjectDelete(0,g_inOB[sz-1].fillObj);
         ObjectDelete(0,g_inOB[sz-1].bdrObj);
         ArrayRemove(g_inOB,sz-1,1); sz--;
      }
      ArrayResize(g_inOB,sz+1);
      for(int i=sz;i>0;i--) g_inOB[i]=g_inOB[i-1];
      g_inOB[0]=ob;
   }
   else
   {
      int sz=ArraySize(g_swOB);
      if(sz>=100)
      {
         ObjectDelete(0,g_swOB[sz-1].fillObj);
         ObjectDelete(0,g_swOB[sz-1].bdrObj);
         ArrayRemove(g_swOB,sz-1,1); sz--;
      }
      ArrayResize(g_swOB,sz+1);
      for(int i=sz;i>0;i--) g_swOB[i]=g_swOB[i-1];
      g_swOB[0]=ob;
   }
}

void MitigateOBs(bool internal, double c, double h, double l)
{
   double bearSrc=(InpOBMitigation=="Close")?c:h;
   double bullSrc=(InpOBMitigation=="Close")?c:l;
   int sz=internal?ArraySize(g_inOB):ArraySize(g_swOB);
   for(int i=sz-1;i>=0;i--)
   {
      bool mit=false;
      if(internal)
      {
         if(g_inOB[i].bias==BEAR&&bearSrc>g_inOB[i].hi) mit=true;
         if(g_inOB[i].bias==BULL&&bullSrc<g_inOB[i].lo) mit=true;
         if(mit)
         {
            ObjectDelete(0,g_inOB[i].fillObj);
            ObjectDelete(0,g_inOB[i].bdrObj);
            ArrayRemove(g_inOB,i,1);
         }
      }
      else
      {
         if(g_swOB[i].bias==BEAR&&bearSrc>g_swOB[i].hi) mit=true;
         if(g_swOB[i].bias==BULL&&bullSrc<g_swOB[i].lo) mit=true;
         if(mit)
         {
            ObjectDelete(0,g_swOB[i].fillObj);
            ObjectDelete(0,g_swOB[i].bdrObj);
            ArrayRemove(g_swOB,i,1);
         }
      }
   }
}

void RedrawOBs(bool internal)
{
   int maxOB = internal?InpInternalOBCount:InpSwingOBCount;
   int sz    = internal?ArraySize(g_inOB):ArraySize(g_swOB);
   int lim   = MathMin(sz,maxOB);
   for(int i=0;i<lim;i++)
   {
      if(internal) DrawOBRect(g_inOB[i],true);
      else         DrawOBRect(g_swOB[i],false);
   }
}

bool StructQualifies(bool internal, int bias, const string &tag)
{
   if(bias==BULL)
   {
      if(internal)
      {
         if(!InpShowInternals) return false;
         return (InpInternalBull=="All")
             || (InpInternalBull=="BOS"   && tag=="BOS")
             || (InpInternalBull=="CHoCH" && tag=="CHoCH");
      }
      else
      {
         if(!InpShowStructure) return false;
         return (InpSwingBull=="All")
             || (InpSwingBull=="BOS"   && tag=="BOS")
             || (InpSwingBull=="CHoCH" && tag=="CHoCH");
      }
   }
   else // BEAR
   {
      if(internal)
      {
         if(!InpShowInternals) return false;
         return (InpInternalBear=="All")
             || (InpInternalBear=="BOS"   && tag=="BOS")
             || (InpInternalBear=="CHoCH" && tag=="CHoCH");
      }
      else
      {
         if(!InpShowStructure) return false;
         return (InpSwingBear=="All")
             || (InpSwingBear=="BOS"   && tag=="BOS")
             || (InpSwingBear=="CHoCH" && tag=="CHoCH");
      }
   }
}

void ProcessStruct(bool internal, datetime t, double c, int barIdx)
{
   SPivot pH=internal?g_inH:g_swH;
   SPivot pL=internal?g_inL:g_swL;
   int    tr=internal?g_inTr:g_swTr;

   color bullClr=internal?cInBull():cSwBull();
   color bearClr=internal?cInBear():cSwBear();

   if(pH.level!=EMPTY_VALUE&&!pH.crossed)
   {
      bool ex=internal?(g_inH.level!=g_swH.level):true;
      if(c>pH.level&&ex)
      {
         string tag=(tr==BEAR)?"CHoCH":"BOS";
         pH.crossed=true; tr=BULL;

         bool show=StructQualifies(internal,BULL,tag);
         if(show) DrawStruct(pH,tag,bullClr,internal,t);

         if(!internal && tag=="CHoCH")
            { g_swLastSignal="CHoCH ▲ Bullish"; g_swLastSignalClr=bullClr; }

         if(show) StoreOB(pH,internal,BULL,barIdx);
      }
   }

   if(pL.level!=EMPTY_VALUE&&!pL.crossed)
   {
      bool ex=internal?(g_inL.level!=g_swL.level):true;
      if(c<pL.level&&ex)
      {
         string tag=(tr==BULL)?"CHoCH":"BOS";
         pL.crossed=true; tr=BEAR;

         bool show=StructQualifies(internal,BEAR,tag);
         if(show) DrawStruct(pL,tag,bearClr,internal,t);

         if(!internal && tag=="CHoCH")
            { g_swLastSignal="CHoCH ▼ Bearish"; g_swLastSignalClr=bearClr; }

         if(show) StoreOB(pL,internal,BEAR,barIdx);
      }
   }

   if(internal){g_inH=pH;g_inL=pL;g_inTr=tr;}
   else        {g_swH=pH;g_swL=pL;g_swTr=tr;}
}

void UpdatePivots(int size, bool eqHL, bool internal, int barIdx, datetime t)
{
   int pivIdx=barIdx-size;
   if(pivIdx<size)         return;
   if(pivIdx+size>=g_bars) return;

   double pivH=g_hi[pivIdx], pivL=g_lo[pivIdx];
   bool isH=true, isL=true;

   for(int i=pivIdx-size; i<pivIdx; i++)
   {
      if(g_hi[i]>=pivH) isH=false;
      if(g_lo[i]<=pivL) isL=false;
   }
   for(int i=pivIdx+1; i<=pivIdx+size; i++)
   {
      if(g_hi[i]>=pivH) isH=false;
      if(g_lo[i]<=pivL) isL=false;
   }
   if(!isH&&!isL) return;

   SPivot pHl=eqHL?g_eqH:(internal?g_inH:g_swH);
   SPivot pLl=eqHL?g_eqL:(internal?g_inL:g_swL);

   if(isL)
   {
      if(eqHL&&pLl.level!=EMPTY_VALUE)
         if(MathAbs(pLl.level-pivL)<InpEqualHLThresh*g_atr)
            DrawEQL(pLl,pivL,t,false);

      pLl.lastLevel=pLl.level;
      pLl.level    =pivL;
      pLl.crossed  =false;
      pLl.barTime  =g_t[pivIdx];
      pLl.barIndex =pivIdx;

      if(!eqHL&&!internal)
      {

      }
      if(InpShowSwingPoints&&!internal&&!eqHL&&pLl.lastLevel!=EMPTY_VALUE)
         DrawSwPt(g_t[pivIdx],pivL,pivL<pLl.lastLevel?"LL":"HL",cSwBull(),false);
   }

   if(isH)
   {
      if(eqHL&&pHl.level!=EMPTY_VALUE)
         if(MathAbs(pHl.level-pivH)<InpEqualHLThresh*g_atr)
            DrawEQL(pHl,pivH,t,true);

      pHl.lastLevel=pHl.level;
      pHl.level    =pivH;
      pHl.crossed  =false;
      pHl.barTime  =g_t[pivIdx];
      pHl.barIndex =pivIdx;

      if(!eqHL&&!internal)
      {

      }
      if(InpShowSwingPoints&&!internal&&!eqHL&&pHl.lastLevel!=EMPTY_VALUE)
         DrawSwPt(g_t[pivIdx],pivH,pivH>pHl.lastLevel?"HH":"LH",cSwBear(),true);
   }

   if(eqHL)        {g_eqH=pHl;g_eqL=pLl;}
   else if(internal){g_inH=pHl;g_inL=pLl;}
   else             {g_swH=pHl;g_swL=pLl;}
}

void DrawHighLow()
{

   if(g_swH.level==EMPTY_VALUE || g_swL.level==EMPTY_VALUE) return;
   if(g_swH.barTime==0         || g_swL.barTime==0)         return;

   string hl = (g_swTr==BEAR) ? "Strong High" : "Weak High";
   string ll = (g_swTr==BULL) ? "Strong Low"  : "Weak Low";
   color  hc = cSwBear();
   color  lc = cSwBull();

   ObjectDelete(0,"SMC_HLine");
   ObjectDelete(0,"SMC_HLine_l");

   ObjectCreate(0,"SMC_HLine",OBJ_TREND,0,
                g_swH.barTime, g_swH.level,
                g_swH.barTime, g_swH.level);
   ObjectSetInteger(0,"SMC_HLine",OBJPROP_COLOR,     hc);
   ObjectSetInteger(0,"SMC_HLine",OBJPROP_STYLE,     STYLE_DOT);
   ObjectSetInteger(0,"SMC_HLine",OBJPROP_WIDTH,     1);
   ObjectSetInteger(0,"SMC_HLine",OBJPROP_RAY_RIGHT, true);
   ObjectSetInteger(0,"SMC_HLine",OBJPROP_SELECTABLE,false);

   ObjectCreate(0,"SMC_HLine_l",OBJ_TEXT,0, g_swH.barTime, g_swH.level);
   ObjectSetString(0, "SMC_HLine_l",OBJPROP_TEXT,     " " + hl);
   ObjectSetInteger(0,"SMC_HLine_l",OBJPROP_COLOR,    hc);
   ObjectSetInteger(0,"SMC_HLine_l",OBJPROP_FONTSIZE, 8);
   ObjectSetInteger(0,"SMC_HLine_l",OBJPROP_ANCHOR,   ANCHOR_LEFT_LOWER);
   ObjectSetInteger(0,"SMC_HLine_l",OBJPROP_SELECTABLE,false);

   ObjectDelete(0,"SMC_LLine");
   ObjectDelete(0,"SMC_LLine_l");

   ObjectCreate(0,"SMC_LLine",OBJ_TREND,0,
                g_swL.barTime, g_swL.level,
                g_swL.barTime, g_swL.level);
   ObjectSetInteger(0,"SMC_LLine",OBJPROP_COLOR,     lc);
   ObjectSetInteger(0,"SMC_LLine",OBJPROP_STYLE,     STYLE_DOT);
   ObjectSetInteger(0,"SMC_LLine",OBJPROP_WIDTH,     1);
   ObjectSetInteger(0,"SMC_LLine",OBJPROP_RAY_RIGHT, true);
   ObjectSetInteger(0,"SMC_LLine",OBJPROP_SELECTABLE,false);

   ObjectCreate(0,"SMC_LLine_l",OBJ_TEXT,0, g_swL.barTime, g_swL.level);
   ObjectSetString(0, "SMC_LLine_l",OBJPROP_TEXT,     " " + ll);
   ObjectSetInteger(0,"SMC_LLine_l",OBJPROP_COLOR,    lc);
   ObjectSetInteger(0,"SMC_LLine_l",OBJPROP_FONTSIZE, 8);
   ObjectSetInteger(0,"SMC_LLine_l",OBJPROP_ANCHOR,   ANCHOR_LEFT_UPPER);
   ObjectSetInteger(0,"SMC_LLine_l",OBJPROP_SELECTABLE,false);
}

void DrawZones()
{

   if(g_swH.level==EMPTY_VALUE || g_swL.level==EMPTY_VALUE) return;
   if(g_swH.barTime==0         || g_swL.barTime==0)         return;

   double top = g_swH.leve

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

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

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

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

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

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

Стоимость полного кода
3 250,60₽ ≈ $39.73