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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.