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

Breakout Retest Pro EA

breakout retest pro ea v2.0 source code@lifeindreamsworld.mq5
Вы автор или правообладатель?

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

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

О программе

Breakout Retest Pro EA — торговый советник для MetaTrader 5, основанный на стратегии обнаружения пробоев ценовых уровней (neckline) с последующим возвратом цены к зоне пробоя. Советник определяет свингные максимумы и минимумы, оценивает импульс через ATR и подтверждает пробой несколькими закрытиями выше/ниже уровня. После подтверждения пробоя советник ожидает возврат цены в зону ретеста и открывает позицию в направлении пробоя с установленными стоп-лоссом и тейк-профитом.

В советнике реализованы механизмы разворота позиций: обнаружение пин-бара (engulfing), трёхбарного разворота и пересечения скользящих средних EMA, а также оценка силы движения против позиции через ATR. При срабатывании любого из условий разворота открытые позиции закрываются. Визуальная составляющая включает настраиваемую тёмную тему, информационную панель с данными аккаунта, рынка и текущих setup, а также графические объекты — зоны ретеста и стрелки сигналов.

Для управления рисками предусмотрены авто-расчёт лота на основе процента риска от баланса, фильтр торговой сессии по серверному времени, фильтр тренда на основе SMA50, ограничение максимального количества открытых позиций и настройка проскальзывания. Торговые операции выполняются через стандартный торговый API MetaTrader 5 (CTrade).

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

НастройкаОписание
Buy_SwingLength Количество баров для определения свинг-максимума при поиске neckline на покупку.
Buy_ImpulseMult Множитель ATR для оценки минимального импульса при формировании neckline на покупку. Импульс должен быть не меньше произведения ATR на это значение.
Buy_BreakConfirm Количество закрытий свечей выше neckline, необходимых для подтверждения пробоя в покупке.
Buy_RetestATR Ширина зоны ретеста в долях ATR для покупающих позиций. Цена должна войти в эту зону вокруг neckline для открытия сделки.
Buy_RetestBars Максимальное количество баров, в течение которых ожидается возврат цены к зоне ретеста после подтверждения пробоя. По истечении срока ожидание сбрасывается.
Buy_SL_Mult Множитель ATR для расчёта расстояния стоп-лосса от цены входа в покупающей позиции.
Buy_TP_Mult Множитель ATR для расчёта тейк-профита от цены входа в покупающей позиции. Используется множитель, умноженный на 2.
Sell_SwingLength Количество баров для определения свинг-минимума при поиске neckline на продажу.
Sell_ImpulseMult Множитель ATR для оценки минимального импульса при формировании neckline на продажу. Импульс должен быть не меньше произведения ATR на это значение.
Sell_BreakConfirm Количество закрытий свечей ниже neckline, необходимых для подтверждения пробоя в продаже.
Sell_RetestATR Ширина зоны ретеста в долях ATR для продающих позиций. Цена должна войти в эту зону вокруг neckline для открытия сделки.
Sell_RetestBars Максимальное количество баров, в течение которых ожидается возврат цены к зоне ретеста после подтверждения пробоя. По истечении срока ожидание сбрасывается.
Sell_SL_Mult Множитель ATR для расчёта расстояния стоп-лосса от цены входа в продающей позиции.
Sell_TP_Mult Множитель ATR для расчёта тейк-профита от цены входа в продающей позиции. Используется множитель, умноженный на 2.
Use_Reversal Включает или отключает систему разворота позиций. При отключении советник не закрывает позиции по критериям разворота.
Rev_ConsecBars Количество последовательных баров движения против позиции, необходимое для активации критерия разворота на основе ATR.
Rev_ATR_Move Минимальное движение цены против текущей позиции в единицах ATR, необходимое для подтверждения разворота по критерию последовательных баров.
Use_Engulf Включает обнаружение свечного паттерна engulfing (поглощение) как один из критериев разворота против текущей позиции.
Use_ThreeBar Включает обнаружение трёхбарного разворота как одного из критериев разворота против текущей позиции.
Use_MomentumFlip Включает обнаружение пересечения быстрой и медленной EMA как критерия разворота momentum против текущей позиции.
EMA_Fast Период быстрой скользящей средней EMA, используемой для обнаружения пересечения импульсов и разворота momentum.
EMA_Slow Период медленной скользящей средней EMA, используемой для обнаружения пересечения импульсов и разворота momentum.
LotSize Фиксированный размер лота для ручного режима управления позицией. Используется, когда авто-расчёт лота отключён.
UseAutoLot Включает автоматический расчёт размера лота на основе процента риска от баланса вместо использования фиксированного размера лота.
RiskPercent Процент риска от баланса аккаунта на одну сделку. Используется при автоматическом расчёте размера лота на основе допустимого риска.
MaxPositions Максимальное количество одновременно открытых позиций, управляемых советником на символе.
Slippage Допустимое проскальзывание в пунктах при исполнении рыночных ордеров.
MagicNumber Магический номер, идентифицирующий позиции, открытые данным советником, для корректного управления и фильтрации сделок.
UseSessionFilter Включает фильтр торговой сессии. При активации советник обрабатывает сигналы только в заданном временном интервале по серверному времени.
SessionStartHour Час начала торговой сессии по серверному времени. Торговые сигналы не обрабатываются до этого часа при активном фильтре сессии.
SessionEndHour Час окончания торговой сессии по серверному времени. Торговые сигналы не обрабатываются после этого часа при активном фильтре сессии.
UseTrendFilter Включает фильтр тренда на основе SMA50. Покупающие сигналы генерируются только при цене выше SMA, продающие — при цене ниже SMA.
TrendSMA Период простой скользящей средней SMA, используемой в фильтре тренда для определения направления рынка.
ApplyTheme Включает или отключает применение тёмной морской темы оформления графика. При активации сохраняются исходные цвета графика для последующего восстановления при деинициализации советника.
ShowDashboard Отображение информационной панели на графике с данными аккаунта, рынка, текущих setup и позиций.
ShowBoxes Отображение графических прямоугольников зон neckline и ретеста на графике.
ShowSignals Отображение графических меток BUY/SELL и стрелок сигналов на графике при открытии позиций.
Получить полный код

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

#property version   "2.00"
#property strict

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

CTrade        trade;
CPositionInfo posInfo;

input group "═══ BUY SETTINGS ═══"
input int    Buy_SwingLength    = 10;    // Buy Swing Length
input double Buy_ImpulseMult    = 1.5;   // Buy Impulse ATR Mult
input int    Buy_BreakConfirm   = 2;     // Buy Break Confirm Bars
input double Buy_RetestATR      = 0.5;   // Buy Retest Zone (ATR)
input int    Buy_RetestBars     = 40;    // Buy Max Retest Bars
input double Buy_SL_Mult        = 1.5;   // Buy SL ATR Mult
input double Buy_TP_Mult        = 4.0;   // Buy TP ATR Mult

input group "═══ SELL SETTINGS ═══"
input int    Sell_SwingLength   = 10;    // Sell Swing Length
input double Sell_ImpulseMult   = 1.5;   // Sell Impulse ATR Mult
input int    Sell_BreakConfirm  = 2;     // Sell Break Confirm Bars
input double Sell_RetestATR     = 0.5;   // Sell Retest Zone (ATR)
input int    Sell_RetestBars    = 40;    // Sell Max Retest Bars
input double Sell_SL_Mult       = 1.5;   // Sell SL ATR Mult
input double Sell_TP_Mult       = 4.0;   // Sell TP ATR Mult

input group "═══ REVERSAL DETECTION ═══"
input bool   Use_Reversal       = true;  // Enable Reversal Exit
input int    Rev_ConsecBars     = 4;     // Consecutive Reversal Bars
input double Rev_ATR_Move       = 1.0;   // Min ATR Move Against Trade
input bool   Use_Engulf         = true;  // Detect Engulfing Candle
input bool   Use_ThreeBar       = true;  // Detect Three Bar Reversal
input bool   Use_MomentumFlip   = true;  // Detect EMA Momentum Flip
input int    EMA_Fast           = 8;     // Fast EMA Period
input int    EMA_Slow           = 21;    // Slow EMA Period

input group "═══ RISK MANAGEMENT ═══"
input double LotSize            = 0.5;   // Lot Size
input bool   UseAutoLot         = true; // Use Auto Lot (% risk)
input double RiskPercent        = 1.0;   // Risk % per trade
input int    MaxPositions       = 1;     // Max open positions
input int    Slippage           = 2;     // Slippage (points)
input int    MagicNumber        = 2026; // Magic Number

input group "═══ TRADE FILTERS ═══"
input bool   UseSessionFilter   = false; // Use Session Filter
input int    SessionStartHour   = 8;     // Session Start Hour (Server)
input int    SessionEndHour     = 22;    // Session End Hour (Server)
input bool   UseTrendFilter     = true;  // Use SMA50 Trend Filter
input int    TrendSMA           = 50;    // Trend SMA Period

input group "═══ VISUAL SETTINGS ═══"
input bool   ApplyTheme         = true;  // Apply Navy Dark Theme
input bool   ShowDashboard      = true;  // Show Dashboard Panel
input bool   ShowBoxes          = true;  // Show Neckline / Retest Boxes
input bool   ShowSignals        = true;  // Show BUY/SELL Labels

#define BRT            "BRT_"           // Object name prefix
#define PANEL_X        10
#define PANEL_Y        25
#define PANEL_W        290
#define PAD            10
#define ROW_H          18
#define HDR_H          30
#define SEC_H          16
#define LABEL_X        (PANEL_X+PAD)
#define VALUE_X        (PANEL_X+145)

#define CLR_PANEL_BG    C'25,28,38'
#define CLR_HEADER_BG   C'20,55,85'
#define CLR_SECTION_BG  C'30,35,48'
#define CLR_BORDER      C'55,65,85'
#define CLR_DIVIDER     C'45,50,65'
#define CLR_SECTION_TXT C'100,160,220'
#define CLR_LABEL       C'160,160,175'
#define CLR_VALUE       C'230,230,240'
#define CLR_PROFIT      clrSpringGreen
#define CLR_LOSS        clrTomato
#define CLR_WARN        clrOrange
#define CLR_INFO        clrDeepSkyBlue
#define CLR_DIMMED      C'100,100,115'

#define FONT_TITLE      "Segoe UI"
#define FONT_SECTION    "Segoe UI"
#define FONT_BODY       "Consolas"
#define FSIZE_TITLE     11
#define FSIZE_SECTION   8
#define FSIZE_BODY      9

#define SYM_DIAMOND     "\x25C6"    // ◆
#define SYM_BULLET      "\x25CF"    // ●
#define SYM_UP          "\x25B2"    // ▲
#define SYM_DOWN        "\x25BC"    // ▼
#define SYM_CHECK       "\x2713"    // ✓
#define SYM_CROSS       "\x2717"    // ✗

#define CLR_BULL_BOX    C'0,191,255'   // DodgerBlue tint for bull neckline
#define CLR_BEAR_BOX    C'255,68,68'   // Red tint for bear neckline
#define CLR_BULL_SIG    C'0,255,136'
#define CLR_BEAR_SIG    C'255,68,68'

double bull_neck      = 0;
int    bull_neck_bar  = -1;
bool   bull_broke     = false;
int    bull_broke_bar = -1;
bool   bull_waiting   = false;

double bear_neck      = 0;
int    bear_neck_bar  = -1;
bool   bear_broke     = false;
int    bear_broke_bar = -1;
bool   bear_waiting   = false;

int    consec_down    = 0;
int    consec_up      = 0;

int    atr_handle;
int    ema_fast_handle;
int    ema_slow_handle;
int    sma50_handle;

color  g_origBG, g_origFG, g_origGrid, g_origVol, g_origUp, g_origDown;
color  g_origLine, g_origBull, g_origBear, g_origBid, g_origAsk, g_origStop;

string lastSignal = "None";

int    obj_counter = 0;

void SaveOriginalChartColors()
{
   g_origBG   = (color)ChartGetInteger(0, CHART_COLOR_BACKGROUND);
   g_origFG   = (color)ChartGetInteger(0, CHART_COLOR_FOREGROUND);
   g_origGrid = (color)ChartGetInteger(0, CHART_COLOR_GRID);
   g_origVol  = (color)ChartGetInteger(0, CHART_COLOR_VOLUME);
   g_origUp   = (color)ChartGetInteger(0, CHART_COLOR_CHART_UP);
   g_origDown = (color)ChartGetInteger(0, CHART_COLOR_CHART_DOWN);
   g_origLine = (color)ChartGetInteger(0, CHART_COLOR_CHART_LINE);
   g_origBull = (color)ChartGetInteger(0, CHART_COLOR_CANDLE_BULL);
   g_origBear = (color)ChartGetInteger(0, CHART_COLOR_CANDLE_BEAR);
   g_origBid  = (color)ChartGetInteger(0, CHART_COLOR_BID);
   g_origAsk  = (color)ChartGetInteger(0, CHART_COLOR_ASK);
   g_origStop = (color)ChartGetInteger(0, CHART_COLOR_STOP_LEVEL);
}

void RestoreOriginalChartColors()
{
   ChartSetInteger(0, CHART_COLOR_BACKGROUND,  g_origBG);
   ChartSetInteger(0, CHART_COLOR_FOREGROUND,  g_origFG);
   ChartSetInteger(0, CHART_COLOR_GRID,        g_origGrid);
   ChartSetInteger(0, CHART_COLOR_VOLUME,      g_origVol);
   ChartSetInteger(0, CHART_COLOR_CHART_UP,    g_origUp);
   ChartSetInteger(0, CHART_COLOR_CHART_DOWN,  g_origDown);
   ChartSetInteger(0, CHART_COLOR_CHART_LINE,  g_origLine);
   ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, g_origBull);
   ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, g_origBear);
   ChartSetInteger(0, CHART_COLOR_BID,         g_origBid);
   ChartSetInteger(0, CHART_COLOR_ASK,         g_origAsk);
   ChartSetInteger(0, CHART_COLOR_STOP_LEVEL,  g_origStop);
   ChartRedraw(0);
}

void ApplyDarkNavyTheme()
{
   ChartSetInteger(0, CHART_COLOR_BACKGROUND,  C'15,15,40');
   ChartSetInteger(0, CHART_COLOR_FOREGROUND,  C'180,180,195');
   ChartSetInteger(0, CHART_COLOR_GRID,        C'30,30,60');
   ChartSetInteger(0, CHART_COLOR_VOLUME,      C'70,130,180');
   ChartSetInteger(0, CHART_COLOR_CANDLE_BULL, clrDodgerBlue);
   ChartSetInteger(0, CHART_COLOR_CHART_UP,    clrDodgerBlue);
   ChartSetInteger(0, CHART_COLOR_CANDLE_BEAR, clrWhite);
   ChartSetInteger(0, CHART_COLOR_CHART_DOWN,  clrWhite);
   ChartSetInteger(0, CHART_COLOR_CHART_LINE,  clrDodgerBlue);
   ChartSetInteger(0, CHART_COLOR_BID,         C'0,200,200');
   ChartSetInteger(0, CHART_COLOR_ASK,         C'255,80,80');
   ChartSetInteger(0, CHART_COLOR_STOP_LEVEL,  clrOrangeRed);
   ChartRedraw(0);
}

void MakeRect(string name, int x, int y, int w, int h, color bg, color border=clrNONE, int bw=0)
{
   if(ObjectFind(0,name)<0) ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_XSIZE, w);
   ObjectSetInteger(0, name, OBJPROP_YSIZE, h);
   ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bg);
   ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, name, OBJPROP_COLOR, border);
   ObjectSetInteger(0, name, OBJPROP_WIDTH, bw);
   ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, name, OBJPROP_BACK, false);
   ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
   ObjectSetInteger(0, name, OBJPROP_ZORDER, 0);
}

void MakeLabel(string name, int x, int y, string text, string font, int size, color clr)
{
   if(ObjectFind(0,name)<0) ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetString(0, name, OBJPROP_TEXT, text);
   ObjectSetString(0, name, OBJPROP_FONT, font);
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_ANCHOR, ANCHOR_LEFT_UPPER);
   ObjectSetInteger(0, name, OBJPROP_BACK, false);
   ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
   ObjectSetInteger(0, name, OBJPROP_ZORDER, 100);
}

bool SetText(string name, string txt, color clr=CLR_VALUE)
{
   if(ObjectFind(0,name)<0) return false;
   bool changed = false;
   if(ObjectGetString(0,name,OBJPROP_TEXT) != txt)
   {
      ObjectSetString(0, name, OBJPROP_TEXT, txt);
      changed = true;
   }
   if((color)ObjectGetInteger(0,name,OBJPROP_COLOR) != clr)
   {
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
      changed = true;
   }
   return changed;
}

void BuildDashboard()
{
   int y = PANEL_Y;
   int totalH = 400;

   MakeRect(BRT+"BG",     PANEL_X, PANEL_Y, PANEL_W, totalH, CLR_PANEL_BG, CLR_BORDER, 1);
   MakeRect(BRT+"HDR_BG", PANEL_X+1, PANEL_Y+1, PANEL_W-2, HDR_H-1, CLR_HEADER_BG, clrNONE, 0);

   y = PANEL_Y;
   MakeLabel(BRT+"LOGO", LABEL_X, y+7,  SYM_DIAMOND+" Breakout Retest Pro", FONT_TITLE, FSIZE_TITLE, clrWhite);
   MakeLabel(BRT+"VER",  PANEL_X+PANEL_W-55, y+10, "v2.0", FONT_BODY, 7, CLR_DIMMED);
   y += HDR_H + 2;

   MakeRect(BRT+"DIV1", PANEL_X+1, y, PANEL_W-2, 1, CLR_DIVIDER);
   y += 3;
   MakeLabel(BRT+"SEC1", LABEL_X, y, "ACCOUNT", FONT_SECTION, FSIZE_SECTION, CLR_SECTION_TXT);
   y += SEC_H;
   MakeLabel(BRT+"L_BAL", LABEL_X, y, "Balance:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_BAL", VALUE_X, y, "---", FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_EQ",  LABEL_X, y, "Equity:",  FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_EQ",  VALUE_X, y, "---", FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_DPL", LABEL_X, y, "Daily P/L:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_DPL", VALUE_X, y, "---", FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H + 2;

   MakeRect(BRT+"DIV2", PANEL_X+1, y, PANEL_W-2, 1, CLR_DIVIDER);
   y += 3;
   MakeLabel(BRT+"SEC2", LABEL_X, y, "MARKET", FONT_SECTION, FSIZE_SECTION, CLR_SECTION_TXT);
   y += SEC_H;
   MakeLabel(BRT+"L_BIAS", LABEL_X, y, "Bias:",   FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_BIAS", VALUE_X, y, "---",     FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_ATR",  LABEL_X, y, "ATR:",    FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_ATR",  VALUE_X, y, "---",     FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_SPR",  LABEL_X, y, "Spread:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_SPR",  VALUE_X, y, "---",     FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H + 2;

   MakeRect(BRT+"DIV3", PANEL_X+1, y, PANEL_W-2, 1, CLR_DIVIDER);
   y += 3;
   MakeLabel(BRT+"SEC3", LABEL_X, y, "BULL SETUP", FONT_SECTION, FSIZE_SECTION, CLR_SECTION_TXT);
   y += SEC_H;
   MakeLabel(BRT+"L_BPHASE", LABEL_X, y, "Phase:",    FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_BPHASE", VALUE_X, y, "--",        FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_BNECK",  LABEL_X, y, "Neckline:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_BNECK",  VALUE_X, y, "--",        FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H + 2;

   MakeRect(BRT+"DIV4", PANEL_X+1, y, PANEL_W-2, 1, CLR_DIVIDER);
   y += 3;
   MakeLabel(BRT+"SEC4", LABEL_X, y, "BEAR SETUP", FONT_SECTION, FSIZE_SECTION, CLR_SECTION_TXT);
   y += SEC_H;
   MakeLabel(BRT+"L_SPHASE", LABEL_X, y, "Phase:",    FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_SPHASE", VALUE_X, y, "--",        FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_SNECK",  LABEL_X, y, "Neckline:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_SNECK",  VALUE_X, y, "--",        FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H + 2;

   MakeRect(BRT+"DIV5", PANEL_X+1, y, PANEL_W-2, 1, CLR_DIVIDER);
   y += 3;
   MakeLabel(BRT+"SEC5", LABEL_X, y, "POSITIONS", FONT_SECTION, FSIZE_SECTION, CLR_SECTION_TXT);
   y += SEC_H;
   MakeLabel(BRT+"L_POS", LABEL_X, y, "Open:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_POS", VALUE_X, y, "0",      FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_PNL", LABEL_X, y, "P/L:",  FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_PNL", VALUE_X, y, "$0.00", FONT_BODY, FSIZE_BODY, CLR_VALUE);
   y += ROW_H;
   MakeLabel(BRT+"L_SIG", LABEL_X, y, "Last:", FONT_BODY, FSIZE_BODY, CLR_LABEL);
   MakeLabel(BRT+"V_SIG", VALUE_X, y, SYM_BULLET+" Waiting", FONT_BODY, FSIZE_BODY, CLR_WARN);
   y += ROW_H + 2;

   ObjectSetInteger(0, BRT+"BG", OBJPROP_YSIZE, y - PANEL_Y + PAD);
   ChartRedraw(0);
}

void UpdateDashboard(double atr_val, double sma_val, double c1_val)
{
   bool redraw = false;
   string cur = AccountInfoString(ACCOUNT_CURRENCY);
   double bal = AccountInfoDouble(ACCOUNT_BALANCE);
   double eq  = AccountInfoDouble(ACCOUNT_EQUITY);
   double prof= AccountInfoDouble(ACCOUNT_PROFIT);
   int    spread = (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);

   redraw |= SetText(BRT+"V_BAL", DoubleToString(bal,2)+" "+cur, CLR_VALUE);
   redraw |= SetText(BRT+"V_EQ",  DoubleToString(eq,2)+" "+cur, (eq>=bal) ? CLR_PROFIT : CLR_LOSS);
   color  plClr  = (prof>=0) ? CLR_PROFIT : CLR_LOSS;
   string plSign = (prof>=0) ? "+" : "";
   redraw |= SetText(BRT+"V_DPL", plSign+DoubleToString(prof,2)+" "+cur, plClr);

   bool trend_bull = (c1_val > sma_val);
   if(trend_bull)
      redraw |= SetText(BRT+"V_BIAS", SYM_UP+" BULLISH",  CLR_PROFIT);
   else
      redraw |= SetText(BRT+"V_BIAS", SYM_DOWN+" BEARISH", CLR_LOSS);

   redraw |= SetText(BRT+"V_ATR", DoubleToString(atr_val, _Digits), CLR_VALUE);
   redraw |= SetText(BRT+"V_SPR", IntegerToString(spread)+" pts", (spread>30) ? CLR_LOSS : CLR_VALUE);

   string bphase = "--";
   color  bphClr = CLR_DIMMED;
   if(bull_neck > 0 && !bull_broke)       { bphase = "Waiting Break";    bphClr = CLR_WARN;   }
   else if(bull_neck > 0 && bull_broke)   { bphase = "⚡ Waiting Retest"; bphClr = CLR_INFO;   }
   redraw |= SetText(BRT+"V_BPHASE", bphase, bphClr);
   redraw |= SetText(BRT+"V_BNECK", bull_neck > 0 ? DoubleToString(bull_neck, _Digits) : "--", CLR_VALUE);

   string sphase = "--";
   color  sphClr = CLR_DIMMED;
   if(bear_neck > 0 && !bear_broke)       { sphase = "Waiting Break";    sphClr = CLR_WARN;   }
   else if(bear_neck > 0 && bear_broke)   { sphase = "⚡ Waiting Retest"; sphClr = CLR_INFO;   }
   redraw |= SetText(BRT+"V_SPHASE", sphase, sphClr);
   redraw |= SetText(BRT+"V_SNECK", bear_neck > 0 ? DoubleToString(bear_neck, _Digits) : "--", CLR_VALUE);

   int    posCnt = 0;
   double totalPnL = 0;
   for(int i = PositionsTotal()-1; i >= 0; i--)
   {
      if(posInfo.SelectByIndex(i) &&
         posInfo.Symbol() == _Symbol &&
         posInfo.Magic()  == MagicNumber)
      {
         posCnt++;
         totalPnL += posInfo.Profit() + posInfo.Swap();
      }
   }
   redraw |= SetText(BRT+"V_POS", IntegerToString(posCnt), CLR_VALUE);
   color  pnlClr  = (totalPnL >= 0) ? CLR_PROFIT : CLR_LOSS;
   string pnlSign = (totalPnL >= 0) ? "+$" : "-$";
   redraw |= SetText(BRT+"V_PNL", pnlSign+DoubleToString(MathAbs(totalPnL),2), pnlClr);

   if(lastSignal != "None" && lastSignal != "")
   {
      color sigClr = (StringFind(lastSignal, "BUY") >= 0) ? CLR_PROFIT : CLR_LOSS;
      redraw |= SetText(BRT+"V_SIG", SYM_BULLET+" "+lastSignal, sigClr);
   }

   if(redraw) ChartRedraw(0);
}

void DrawNecklineBox(bool isBull, datetime t_start, datetime t_end, double neck, double atr_val)
{
   string name = BRT + "BOX_" + (isBull ? "BULL_" : "BEAR_") + IntegerToString(obj_counter++);
   double top    = neck + atr_val * 0.1;
   double bottom = neck - atr_val * 0.1;
   color  clr    = isBull ? CLR_BULL_BOX : CLR_BEAR_BOX;

   if(ObjectFind(0, name) < 0) ObjectCreate(0, name, OBJ_RECTANGLE, 0, t_start, top, t_end, bottom);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_FILL,  true);
   ObjectSetInteger(0, name, OBJPROP_BACK,  true);
   Obje

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

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

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

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

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

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

Стоимость полного кода
2 515,60₽ ≈ $30.75