xauusd_keylevels_ea.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «xauusd_keylevels_ea.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Программа представляет собой торгового советника для MetaTrader 5, предназначенного для работы с инструментом XAUUSD. Советник автоматически анализирует исторические данные цен и выявляет уровни поддержки и сопротивления на основе паттернов свинг-хай и свинг-лоу с настраиваемыми окнами подтверждения.
Обнаруженные уровни отображаются на графике в виде визуальных объектов: активные уровни рисуются цветными лучами, а пробитые — сегментами. На основании активных уровней советник размещает отложенные ордера Buy Stop и Sell Stop с фиксированными стоп-лоссом и тейк-профитом, при условии что спред не превышает заданный порог.
Советник включает систему управления рисками с автоматическим расчётом размера лота на основе процента риска от собственного капитала или фиксированного размера лота. Также реализован механизм трейлинг-стопа с пошаговым смещением и резервный механизм виртуальных стопов. Панель мониторинга отображает статистику за день и неделю.
Настройки программы
| Настройка | Описание |
|---|---|
| InpPivotLeftWindow | Количество баров слева от пика для определения силы паттерна |
| InpPivotRightWindow | Количество баров справа от пика для подтверждения уровня |
| InpMaxLookbackBars | Максимальный диапазон просмотра исторических баров назад для поиска уровней |
| InpMinPushPrice | Минимальное ценовое смещение для подтверждения значимости уровня |
| InpZoneThreshold | Пороговое значение в цене для предотвращения наложения близко расположенных уровней |
| InpMaxLevels | Максимальное количество активных уровней отображения на каждую сторону |
| InpResColor | Цвет отображения активных уровней сопротивления |
| InpSupColor | Цвет отображения активных уровней поддержки |
| InpBrokenColor | Цвет отображения исторических пробитых зон |
| InpLineWidth | Толщина линий уровней на графике |
| InpUseRiskPercent | Переключатель: включает автоматический расчёт размера лота на основе процента риска от собственного капитала |
| InpRiskPercent | Процент риска от собственного капитала на одну сделку |
| InpLotSize | Резервный размер лота, используется если расчёт риска в процентах отключён |
| InpMagicNumber | Магический номер для идентификации ордеров и позиций советника |
| InpMaxSpreadPoints | Максимальный допустимый спред в пунктах для фильтрации входа в сделку |
| InpStopLossPoints | Фиксированный стоп-лосс в пунктах для отложенных ордеров |
| InpTakeProfitPoints | Фиксированный тейк-профит в пунктах для отложенных ордеров |
| InpTrailingStart | Расстояние в пунктах от цены открытия для начала трейлинг-стопа |
| InpTrailingStep | Шаг смещения стоп-лосса при трейлинге в пунктах |
Поиск по коду файла
#property version "12.09"
#property strict
#include <Trade\Trade.mqh>
#include <Canvas\Canvas.mqh>
input group "--- SNR Detection Inputs ---"
input int InpPivotLeftWindow = 20; // Required Bars to Left (Pattern Strength)
input int InpPivotRightWindow = 5; // Bars to Wait for Confirmation
input int InpMaxLookbackBars = 1000; // Max Lookback Range (Bars back to scan)
input double InpMinPushPrice = 5.00; // Minimum Displacement ($5.00)
input double InpZoneThreshold = 0.75; // Zone Buffer ($0.75 threshold to prevent overlapping)
input int InpMaxLevels = 5; // Max Active Levels to display per side
input group "--- Visual Inputs ---"
input color InpResColor = clrRed; // Active Resistance Color
input color InpSupColor = clrDeepSkyBlue;// Active Support Color
input color InpBrokenColor = clrGray; // Historical Broken Zone Color
input int InpLineWidth = 2; // Line Width
input group "--- Risk Management Inputs ---"
input bool InpUseRiskPercent = true; // Enable Auto Risk % Compounding
input double InpRiskPercent = 1.0; // Risk % per Trade (e.g., 1.0 = 1% of Equity)
input double InpLotSize = 0.01; // Fallback Lot Size (if Risk % is false)
input group "--- EA Trading Inputs ---"
input ulong InpMagicNumber = 888123; // Magic Number
input int InpMaxSpreadPoints = 30; // Max Spread Filter (Points/Pips-equivalent)
input int InpStopLossPoints = 75; // Fixed SL = 75 points (7.5 pips)
input int InpTakeProfitPoints = 375; // Fixed TP = 375 points (37.5 pips)
input int InpTrailingStart = 50; // Trailing Start = 50 points (5.0 pips)
input int InpTrailingStep = 25; // Trailing Step = 2.5 pips
CTrade trade;
CCanvas hudCanvas;
bool isTesterMode = false;
bool isVisualMode = false;
struct TVirtualTrail
{
ulong ticket;
double virtualSL;
long type;
bool engine1Failed;
};
TVirtualTrail virtualStops[];
int OnInit()
{
// код доступен только после оплаты
}
void OnDeinit(const int reason)
{
if(!isTesterMode || isVisualMode)
{
EventKillTimer();
hudCanvas.Destroy();
}
ObjectsDeleteAll(0, "XAU_SoftSR_");
}
void OnTick()
{
// код доступен только после оплаты
}
void OnTimer()
{
if(!isTesterMode || isVisualMode)
UpdateDashboardStats();
}
void UpdateDashboardStats()
{
static double todayWin = 0, todayLoss = 0, todayNet = 0, todayComm = 0, weekNet = 0;
static int todayOrders = 0;
static int lastTotalDeals = -1;
datetime now = TimeCurrent();
MqlDateTime dt;
TimeToStruct(now, dt);
dt.hour = 0; dt.min = 0; dt.sec = 0;
datetime startOfDay = StructToTime(dt);
datetime startOfWeek = now - (7 * 86400);
HistorySelect(startOfWeek, now);
int currentTotalDeals = HistoryDealsTotal();
if(currentTotalDeals == lastTotalDeals && lastTotalDeals != -1)
{
if(!isTesterMode || isVisualMode)
DrawLuxuryHUD(todayWin, todayLoss, todayOrders, todayNet, todayComm, weekNet);
return;
}
lastTotalDeals = currentTotalDeals;
todayWin = 0; todayLoss = 0; todayNet = 0; todayComm = 0; weekNet = 0;
todayOrders = 0;
for(int i = 0; i < currentTotalDeals; i++)
{
ulong ticket = HistoryDealGetTicket(i);
if(ticket > 0)
{
if(HistoryDealGetInteger(ticket, DEAL_MAGIC) == InpMagicNumber)
{
datetime dealTime = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
double swap = HistoryDealGetDouble(ticket, DEAL_SWAP);
double comm = HistoryDealGetDouble(ticket, DEAL_COMMISSION);
double totalDealProfit = profit + swap + comm;
long entry = HistoryDealGetInteger(ticket, DEAL_ENTRY);
if(entry == DEAL_ENTRY_OUT || entry == DEAL_ENTRY_INOUT)
{
if(dealTime >= startOfDay)
{
todayOrders++;
todayComm += comm;
todayNet += totalDealProfit;
if(profit >= 0) todayWin += profit;
else todayLoss += profit;
}
if(dealTime >= startOfWeek)
{
weekNet += totalDealProfit;
}
}
}
}
}
if(!isTesterMode || isVisualMode)
DrawLuxuryHUD(todayWin, todayLoss, todayOrders, todayNet, todayComm, weekNet);
}
void DrawLuxuryHUD(double tWin, double tLoss, int tOrders, double tNet, double tComm, double wNet)
{
hudCanvas.Erase(ColorToARGB(C'12, 13, 18', 248));
uint champagneGold = ColorToARGB(C'212, 175, 55', 255);
uint softGold = ColorToARGB(C'235, 205, 110', 200);
uint platinumSilver= ColorToARGB(C'185, 195, 210', 255);
uint textWhite = ColorToARGB(clrWhite, 255);
uint textGreen = ColorToARGB(C'0, 230, 130', 255);
uint textRed = ColorToARGB(C'255, 95, 110', 255);
hudCanvas.Rectangle(0, 0, 329, 249, champagneGold);
hudCanvas.Rectangle(2, 2, 327, 247, ColorToARGB(C'50, 55, 70', 255));
hudCanvas.Line(0, 0, 30, 0, champagneGold);
hudCanvas.Line(0, 0, 0, 30, champagneGold);
hudCanvas.Line(299, 249, 329, 249, champagneGold);
hudCanvas.Line(329, 219, 329, 249, champagneGold);
hudCanvas.FillRectangle(3, 3, 326, 42, ColorToARGB(C'22, 24, 32', 255));
hudCanvas.FontSet("Consolas", 18, FW_BOLD);
hudCanvas.TextOut(15, 10, "Aspect Quant // XAUUSD", softGold);
hudCanvas.Line(15, 50, 315, 50, ColorToARGB(C'60, 65, 85', 255));
int y = 60;
int rowHeight = 23;
int labelX = 15;
int valueX = 175;
hudCanvas.FontSet("Consolas", 12, FW_BOLD);
hudCanvas.TextOut(labelX, y, "TODAY TOTAL WIN:", platinumSilver);
hudCanvas.TextOut(valueX, y, StringFormat("$%.2f", tWin), textGreen);
y += rowHeight;
hudCanvas.TextOut(labelX, y, "TODAY TOTAL LOSS:", platinumSilver);
hudCanvas.TextOut(valueX, y, StringFormat("$%.2f", tLoss), textRed);
y += rowHeight;
hudCanvas.TextOut(labelX, y, "TODAY TOTAL ORDERS:", platinumSilver);
hudCanvas.TextOut(valueX, y, IntegerToString(tOrders), textWhite);
y += rowHeight;
hudCanvas.TextOut(labelX, y, "TODAY NET PROFIT:", platinumSilver);
uint netColor = (tNet >= 0) ? textGreen : textRed;
hudCanvas.TextOut(valueX, y, StringFormat("$%.2f", tNet), netColor);
y += rowHeight;
hudCanvas.TextOut(labelX, y, "TODAY COMMISSION:", platinumSilver);
hudCanvas.TextOut(valueX, y, StringFormat("$%.2f", tComm), textWhite);
y += rowHeight;
hudCanvas.TextOut(labelX, y, "1-WEEK TOTAL NET:", platinumSilver);
uint weekColor = (wNet >= 0) ? textGreen : textRed;
hudCanvas.TextOut(valueX, y, StringFormat("$%.2f", wNet), weekColor);
y += 20;
hudCanvas.Line(15, y, 315, y, ColorToARGB(C'60, 65, 85', 255));
hudCanvas.FontSet("Consolas", 11, FW_BOLD);
hudCanvas.TextOut(labelX, y + 12, "Made By Mark_TH1911", champagneGold);
uint t = GetTickCount();
int planeX = 245;
int planeY = 220;
int bounce = (int)(MathSin(t / 90.0) * 2.0);
int py = planeY + bounce;
uint jetBody = ColorToARGB(C'200, 210, 225', 255); // Titanium Silver Body
uint jetDark = ColorToARGB(C'90, 100, 115', 255); // Dark Metallic Details
uint canopyColor = ColorToARGB(C'50, 180, 255', 255); // Glowing Cyan Canopy
uint wingColor = ColorToARGB(C'140, 155, 175', 255); // Swept Wings
uint coreFlame = ColorToARGB(C'200, 230, 255', 255); // Bright white-blue core
uint blueFlame = ColorToARGB(C'0, 140, 255', 220); // Electric Blue Flame
uint purpleFlame = ColorToARGB(C'140, 40, 255', 180); // Deep Purple Outer Glow
int windSpeed = (int)((t / 8) % 40);
for(int i = 0; i < 5; i++) {
int lineX = 210 + (i * 25) - windSpeed;
if(lineX > 215 && lineX < 320) {
int lineY = py - 20 + (i * 10);
hudCanvas.FillRectangle(lineX, lineY, lineX + 8, lineY + 1, ColorToARGB(C'150, 180, 220', 100));
}
}
int flicker = (int)((t / 25) % 3);
for(int p = 0; p < 4; p++) {
int pxOffset = planeX - 12 - (p * 6) - (flicker * 2);
if(pxOffset > 215) {
uchar alpha = (uchar)(160 - (p * 40));
uint particleClr = ColorToARGB(C'138, 43, 226', alpha);
hudCanvas.FillRectangle(pxOffset, py - 3 - (p/2), pxOffset + 4, py + 3 + (p/2), particleClr);
}
}
hudCanvas.FillRectangle(planeX - 10 - flicker, py - 2, planeX, py + 2, blueFlame);
hudCanvas.FillRectangle(planeX - 5, py - 1, planeX, py + 1, coreFlame);
hudCanvas.FillRectangle(planeX - 16 - flicker, py - 4, planeX - 8, py + 4, purpleFlame);
hudCanvas.FillRectangle(planeX, py - 4, planeX + 50, py + 4, jetBody);
hudCanvas.FillRectangle(planeX + 50, py - 3, planeX + 58, py + 3, jetBody);
hudCanvas.FillRectangle(planeX + 58, py - 1, planeX + 62, py + 1, jetDark);
hudCanvas.FillRectangle(planeX + 25, py - 7, planeX + 38, py - 4, canopyColor);
hudCanvas.FillRectangle(planeX + 15, py - 14, planeX + 32, py - 4, wingColor);
hudCanvas.FillRectangle(planeX + 15, py + 4, planeX + 32, py + 14, wingColor);
hudCanvas.FillRectangle(planeX + 2, py - 9, planeX + 10, py - 4, jetDark);
hudCanvas.FillRectangle(planeX, py - 2, planeX + 6, py + 2, jetDark);
hudCanvas.Update();
}
double CalculateLotSize(double slPoints)
{
if(!InpUseRiskPercent)
return InpLotSize;
double accountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
double riskMoney = accountEquity * (InpRiskPercent / 100.0);
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
if(tickSize <= 0 || tickValue <= 0 || slPoints <= 0)
return InpLotSize;
double slPriceDistance = slPoints * _Point;
double lossPerOneLot = (slPriceDistance / tickSize) * tickValue;
if(lossPerOneLot <= 0)
return minLot;
double calculatedLot = riskMoney / lossPerOneLot;
calculatedLot = MathFloor(calculatedLot / lotStep) * lotStep;
if(calculatedLot < minLot) calculatedLot = minLot;
if(calculatedLot > maxLot) calculatedLot = maxLot;
int digits = 2;
if(lotStep == 0.1) digits = 1;
else if(lotStep == 0.01) digits = 2;
else if(lotStep == 0.001) digits = 3;
else if(lotStep == 1.0) digits = 0;
return NormalizeDouble(calculatedLot, digits);
}
void ScanAndDrawSNR(const MqlRates &rates[], int totalBars, double &activeRes[], double &activeSup[])
{
ObjectsDeleteAll(0, "XAU_SoftSR_");
int resCount = 0;
int supCount = 0;
int brokenResCount = 0;
int brokenSupCount = 0;
int start_idx = totalBars - 1 - InpPivotRightWindow;
int limit_idx = totalBars - InpMaxLookbackBars;
if(limit_idx < InpPivotLeftWindow)
limit_idx = InpPivotLeftWindow;
for(int i = start_idx; i >= limit_idx; i--)
{
bool isResPivotPattern = true;
for(int j = 1; j <= InpPivotLeftWindow; j++)
{
if(rates[i].high < rates[i - j].high) { isResPivotPattern = false; break; }
}
for(int j = 1; j <= InpPivotRightWindow; j++)
{
if(rates[i].high < rates[i + j].high) { isResPivotPattern = false; break; }
}
if(isResPivotPattern)
{
bool isBroken = Показано первые 50% кода (символов: 17819)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.