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