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

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 и перейдите к оплате.

Стоимость полного кода
1 781,90₽ ≈ $21.78