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

breakout retest pro ea source code.mq4

Вы автор или правообладатель?

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

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

О программе

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

В состав инструмента входят средства управления рисками: авто-расчёт лота по процентному риску от депозита, стоп-лосс и тейк-профит на базе ATR, ограничение максимального количества открытых позиций. Доступны фильтры торговой сессии по часам серверного времени и фильтр тренда на основе SMA50.

Советник поддерживает обнаружение разворотов для принудительного закрытия позиций: поглощающие свечи, трёхбарный разворот, переворот импульса EMA и ATR-движение против торговли. Визуальная составляющая включает тёмную тему графика, информационную панель с данными аккаунта и рынка, графические уровни neckline и зоны ретеста, а также метки BUY/SELL.

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

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

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

#property version   "2.00"
#property strict

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

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

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

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

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

extern bool   ApplyTheme         = true;  // Apply Navy Dark Theme
extern bool   ShowDashboard      = true;  // Show Dashboard Panel
extern bool   ShowBoxes          = true;  // Show Neckline / Retest Boxes
extern 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      clrLime
#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     "◆"    
#define SYM_BULLET      "●"    
#define SYM_UP          "▲"    
#define SYM_DOWN        "▼"    
#define SYM_CHECK       "✓"    
#define SYM_CROSS       "✗"    

#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;

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);
}

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);
}

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 = AccountCurrency();
   double bal = AccountBalance();
   double eq  = AccountEquity();
   double prof= AccountProfit();
   int    spread = (int)MarketInfo(_Symbol, MODE_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 = OrdersTotal()-1; i >= 0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == _Symbol && OrderMagicNumber() == MagicNumber)
         {
            posCnt++;
            totalPnL += OrderProfit() + OrderSwap() + OrderCommission();
         }
      }
   }
   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)
{
   str

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

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

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

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

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

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

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