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

Breakout Retest Pro EA

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

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

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

О программе

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

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

НастройкаОписание
Buy Swing Length (Buy_SwingLength) Длина свинга покупки — Длина свинг-высоты для определения уровня шеи при формировании бычьей настройки
Buy Impulse ATR Mult (Buy_ImpulseMult) Множитель импульса покупки — Множитель ATR для определения минимального импульса свинга покупки
Buy Break Confirm Bars (Buy_BreakConfirm) Подтверждение разрыва покупки — Количество баров с закрытием выше шеи для подтверждения разрыва бычьей линии
Buy Retest Zone (ATR) (Buy_RetestATR) Зона ретеста покупки (ATR) — Множитель ATR для определения зоны ретеста шеи при покупке
Buy Max Retest Bars (Buy_RetestBars) Максимум баров ретеста покупки — Максимальное количество баров ожидания ретеста шеи для покупки
Buy SL ATR Mult (Buy_SL_Mult) Множитель SL покупки — Множитель ATR для установки стоп-лосса при покупке
Buy TP ATR Mult (Buy_TP_Mult) Множитель TP покупки — Множитель ATR для установки тейк-профита при покупке
Sell Swing Length (Sell_SwingLength) Длина свинга продажи — Длина свинг-нижи для определения уровня шеи при формировании медвежьей настройки
Sell Impulse ATR Mult (Sell_ImpulseMult) Множитель импульса продажи — Множитель ATR для определения минимального импульса свинга продажи
Sell Break Confirm Bars (Sell_BreakConfirm) Подтверждение разрыва продажи — Количество баров с закрытием ниже шеи для подтверждения разрыва медвежьей линии
Sell Retest Zone (ATR) (Sell_RetestATR) Зона ретеста продажи (ATR) — Множитель ATR для определения зоны ретеста шеи при продаже
Sell Max Retest Bars (Sell_RetestBars) Максимум баров ретеста продажи — Максимальное количество баров ожидания ретеста шеи для продажи
Sell SL ATR Mult (Sell_SL_Mult) Множитель SL продажи — Множитель ATR для установки стоп-лосса при продаже
Sell TP ATR Mult (Sell_TP_Mult) Множитель TP продажи — Множитель ATR для установки тейк-профита при продаже
Enable Reversal Exit (Use_Reversal) Включить выход при развороте — Включает детекцию разворотных сигналов для закрытия позиций
Consecutive Reversal Bars (Rev_ConsecBars) Количество баров разворота — Минимальное количество последовательных баров против тренда для подтверждения разворота
Min ATR Move Against Trade (Rev_ATR_Move) Минимальное движение ATR против сделки — Минимальное движение цены в единицах ATR против открытой позиции для разворотного выхода
Detect Engulfing Candle (Use_Engulf) Определять поглощающую свечу — Включает детекцию поглощающей свечи как сигнала разворота
Detect Three Bar Reversal (Use_ThreeBar) Определять трёхбарный разворот — Включает детекцию трёх последовательных баров в одну сторону как сигнала разворота
Detect EMA Momentum Flip (Use_MomentumFlip) Определять переключение импульса EMA — Включает детекцию пересечения быстрой и медленной EMA как сигнала разворота
Fast EMA Period (EMA_Fast) Период быстрой EMA — Период быстрой экспоненциальной скользящей средней для анализа импульса
Slow EMA Period (EMA_Slow) Период медленной EMA — Период медленной экспоненциальной скользящей средней для анализа импульса
Lot Size (LotSize) Размер лота — Фиксированный размер лота для сделок
Use Auto Lot (% risk) (UseAutoLot) Использовать автоматический лот (% риска) — Включает расчёт размера лота на основе процента риска от баланса
Risk % per trade (RiskPercent) Риск % на сделку — Процент баланса, используемый для расчёта размера лота при автоматическом расчёте
Max open positions (MaxPositions) Максимум открытых позиций — Максимальное количество одновременно открытых позиций на символе
Slippage (points) (Slippage) Проскальзывание (пункты) — Максимально допустимое проскальзывание в пунктах при открытии и закрытии позиций
Magic Number (MagicNumber) Магический номер — Идентификатор магического номера для отслеживания позиций советника
Use Session Filter (UseSessionFilter) Использовать фильтр сессии — Включает фильтрацию торгов по времени серверной сессии
Session Start Hour (Server) (SessionStartHour) Час начала сессии (сервер) — Начальный час серверного времени для активности торгов
Session End Hour (Server) (SessionEndHour) Час окончания сессии (сервер) — Конечный час серверного времени для активности торгов
Use SMA50 Trend Filter (UseTrendFilter) Использовать фильтр тренда SMA50 — Включает фильтрацию направления торговли по SMA с заданным периодом
Trend SMA Period (TrendSMA) Период SMA фильтра тренда — Период простой скользящей средней для определения направления тренда
Apply Navy Dark Theme (ApplyTheme) Применить тёмную тему Navy — Включает тёмную навигационную тему оформления графика
Show Dashboard Panel (ShowDashboard) Показать панель дашборда — Отображает информационную панель с данными аккаунта, рынка и позиций
Show Neckline / Retest Boxes (ShowBoxes) Показать линии шеи и зоны ретеста — Отображает графические прямоугольники уровней шеи и зон ретеста на графике
Show BUY/SELL Labels (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