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

Breakout Retest Pro EA

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

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

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

О программе

Breakout Retest Pro EA v2.0 — это торговый советник для MetaTrader 5, реализующий стратегию на основе анализа ценовых пробоев и их возвратов (retest). Советник определяет уровни шейки (neckline) по свингам, подтверждает пробой и открывает позиции при повторном тестировании зоны.

В основе логики лежит обнаружение импульсных свингов с использованием ATR как фильтра значимости, проверка пробоя несколькими закрывающими барами и ожидание отката в зону ретеста. Для покупки и продажи заданы отдельные параметры длины свинга, множителей импульса, подтверждения пробоя и зоны ретеста.

Советник включает систему обнаружения разворотов (Reversal Exit) с поддержкой паттернов «поглощение», трёхбарного разворота и переключения импульса EMA. Доступны фильтр торговой сессии, фильтр тренда по SMA50, автоподбор лота по процентному риску и ограничение количества открытых позиций.

Версия v2.0 добавила визуальную составляющую: тёмную морскую тему, информационную панель дашборда с данными аккаунта и рынка, графические блоки шеи и зоны ретеста, а также метки сигналов BUY/SELL. Торговая логика идентична предыдущей версии — обновлены только визуальные элементы.

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

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