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