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

JAFX Advanced SMC

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

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

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

О программе

JAFX Advanced SMC — это пользовательский индикатор для платформы MetaTrader 5, посвящённый анализу концепций Smart Money (SMC). Индикатор рассчитывает и отображает на графике элементы рыночной структуры, включая свинговые и внутренние точки разворота, зоны ордеров, уровни равных максимумов и минимумов, а также зоны премиум и дисконт.

Индикатор использует алгоритм симметричного обнаружения пивотов с левой и правой подтверждением, определяет события BOS (Break of Structure) и CHoCH (Change of Character) для свинговой и внутренней структуры. На каждое подтверждённое событие строятся прямоугольники зон ордеров, которые могут быть нейтрализованы при нарушении ценой заданных уровней.

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

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

НастройкаОписание
InpMode Режим отображения: Historical — только исторические бары, Present — текущие данные.
InpStyle Стиль отображения: Colored — цветной, Monochrome — монохромный.
InpColorCandles Включает или отключает цветное отображение свечей на графике.
InpShowInternals Включает или отключает отображение внутренней структуры (BOS/CHoCH на внутреннем уровне).
InpInternalBull Фильтр отображения внутренней бычьей структуры: All — все события, BOS — только Break of Structure, CHoCH — только Change of Character.
InpInternalBear Фильтр отображения внутренней медвежьей структуры: All — все события, BOS — только Break of Structure, CHoCH — только Change of Character.
InpConfluenceFilter Включает или отключает фильтр совпадений для структурных событий.
InpIntBullColor Цвет внутренней бычьей структуры.
InpIntBearColor Цвет внутренней медвежьей структуры.
InpShowStructure Включает или отключает отображение свинговой структуры (BOS/CHoCH на свинговом уровне).
InpSwingBull Фильтр отображения свинговой бычьей структуры: All — все события, BOS — только Break of Structure, CHoCH — только Change of Character.
InpSwingBear Фильтр отображения свинговой медвежьей структуры: All — все события, BOS — только Break of Structure, CHoCH — только Change of Character.
InpSwgBullColor Цвет свинговой бычьей структуры.
InpSwgBearColor Цвет свинговой медвежьей структуры.
InpShowSwingPoints Включает или отключает отображение меток HH/HL/LH/LL на свинговых точках.
InpSwingsLength Длина (количество баров) для обнаружения свинговых пивотов.
InpShowHighLow Включает или отключает отображение сильных и слабых максимумов и минимумов.
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 Включает или отключает режим отката, при котором анализ начинается от заданного количества баров назад.
InpLookBackBars Количество баров для периода отката при включённом режиме Look Back.
InpHTFPeriod Старший таймфрейм для расчёта предвзятости (bias) на дашборде.
InpITFPeriod Внутренний таймфрейм для расчёта предвзятости на дашборде.
InpShowDashboard Включает или отключает дашборд с информацией о рыночной предвзятости.
InpShowHTF Включает или отключает раздел старшего таймфрейма на дашборде.
InpShowITF Включает или отключает раздел внутреннего таймфрейма на дашборде.
InpDashX Горизонтальная позиция дашборда на графике.
InpDashY Вертикальная позиция дашборда на графике.
InpDashFontSize Размер шрифта текста на дашборде.
Получить полный код

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

#property version   "1.00"
#property description "Advanced Smart Money Concepts (SMC) indicator."
#property description "Draws market structure (BOS/CHoCH), Order Blocks,"
#property description "Premium/Discount zones, Equal Highs/Lows, and a"
#property description "multi-timeframe bias dashboard."
#property indicator_chart_window
#property indicator_plots 0

#define BULL  1
#define BEAR -1

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

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

input group "Internal Structure"
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 group "Swing Structure"
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 group "Order Blocks"
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';  // Internal Bullish OB Color
input color   InpIntBearOBColor   = C'80,80,80';  // Internal Bearish OB Color
input color   InpSwgBullOBColor   = C'30,100,255';// Swing Bullish OB Color
input color   InpSwgBearOBColor   = C'210,30,60'; // Swing Bearish OB Color

input group "Equal Highs / Lows"
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 group "Premium / Discount"
input bool    InpShowZones        = true;         // Show Premium/Discount Zones
input color   InpPremiumColor     = C'210,60,75'; // Premium Zone Color
input color   InpEquilColor       = C'90,100,120';// Equilibrium Zone Color
input color   InpDiscountColor    = C'0,180,140'; // Discount Zone Color

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

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

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

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

struct SOB
  {
   double            hi, lo;
   datetime          barTime;
   datetime          confirmTime;
   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[];

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;

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);

   ob.bdrObj = UID("SMC_OBB");
   color bdrClr = internal ? OBFillColor(internal, ob.bias)
                  : OBBorderColor(internal, ob.bias);
   int   bdrW   = internal ? 1 : 2;

   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);
  }

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
     {
      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(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(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_LLin

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

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

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

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

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

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

Стоимость полного кода
3 205,10₽ ≈ $39.17