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

XAUUSDBOTS PROPORTIONAL GRID

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

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

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

О программе

XAUUSDBOTS PROPORTIONAL GRID — торговый советник для платформы MetaTrader 5, работающий на инструменте XAUUSD (золото) в таймфрейме M1. Советник реализует стратегию сетки с пропорциональным ценообразованием, размещая отложенные ордера Buy Stop и Sell Stop вокруг центральной цены в заданном количестве уровней.

Сетка автоматически масштабирует шаг в зависимости от текущей рыночной цены относительно заданной опорной цены. Советник поддерживает гибкое управление размером лота — фиксированный режим или автоматический расчёт на основе баланса счёта с возможностью удвоения лота при подтверждённом тренде.

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

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

НастройкаОписание
Official channel (display only) (BrandInfo) Официальный канал — Текстовая строка для отображения ссылки на канал в интерфейсе советника
InpMagicNumber Магический номер — Уникальный идентификатор ордеров и позиций, размещаемых советником
InpSlippagePoints Слияние в пунктах — Допустимое отклонение цены при исполнении ордеров в пунктах
InpEnableLogging Вести журнал — Включить или выключить вывод информационных сообщений в журнал терминала
InpShowDashboard Показывать панель — Отображать или скрывать информационную панель на графике
InpGridLevels Уровней сетки — Количество уровней сетки в каждом направлении от центральной цены
InpGridStep Шаг сетки — Базовый размер шага сетки в ценовых единицах
InpPriceProportional Пропорциональная цена — Масштабировать шаг сетки пропорционально текущей цене относительно опорной
InpReferencePrice Опорная цена — Цена, используемая как база для пропорционального расчёта шага сетки
InpMinGridStep Минимальный шаг сетки — Минимально допустимый размер шага сетки
InpMaxPendingOrders Максимум отложенных ордеров — Максимальное количество активных отложенных ордеров советника
InpLotMode Режим лота — Режим расчёта размера лота: фиксированный или автоматический
InpFixedLot Фиксированный лот — Размер лота при фиксированном режиме
InpAutoLotBaseBalance Базовый баланс для авто-лота — Базовый баланс, используемый для расчёта автоматического размера лота
InpAutoLotPerBalance Лот на баланс — Количество лота на каждую единицу базового баланса
InpMaxLot Максимальный лот — Максимально допустимый размер лота
InpMinLot Минимальный лот — Минимально допустимый размер лота
InpTrendDoubleLot Удвоение лота по тренду — Удваивать размер лота при наличии подтверждённого направления тренда
InpUseBasketTarget Целевая прибыль корзины — Включить отслеживание суммарной прибыли по всем позициям советника
InpBasketTargetUSD Цель корзины в USD — Целевая сумма прибыли корзины в долларах для срабатывания
InpCloseAllOnBasket Закрывать всё при корзине — Закрывать все позиции при достижении целевой прибыли корзины
InpResetOnBasket Сброс при корзине — Сбрасывать состояние сетки при достижении целевой прибыли корзины
InpUseDailyLimits Дневные лимиты — Включить ограничения по дневной прибыли и убыткам
InpDailyProfitLimitUSD Лимит прибыли в USD — Дневной лимит прибыли в долларах
InpDailyLossLimitUSD Лимит убытков в USD — Дневной лимит убытков в долларах
InpDailyProfitLimitPct Лимит прибыли в % — Дневной лимит прибыли в процентах от баланса
InpDailyLossLimitPct Лимит убытков в % — Дневной лимит убытков в процентах от баланса
InpHardStopOnDailyLoss Жёсткая остановка при убытке — Жёстко останавливать торговлю при достижении дневного лимита убытков
InpNoTradeMinutesAfterLoss Пауза после убытка в минутах — Длительность паузы в минутах после срабатывания дневного лимита убытков
InpResetDailyOnNewDay Сброс при новом дне — Сбрасывать дневные лимиты и состояние в начале нового торгового дня
InpNextDayLotMultiplier Множитель лота на следующий день — Множитель размера лота на следующий день после срабатывания лимита убытков
InpUsePerLotSL Стоп-лосс на лот — Включить защиту по максимальному допустимому убытку на каждый лот
InpMaxLossPer001Lot Макс. убыток на 0.01 лота — Максимально допустимый убыток на 0.01 лота
InpUseTrailing Трейлинг-стоп — Включить трейлинг-стоп для открытых позиций
InpTrailActivateSteps Активация трейлинга в шагах — Количество шагов сетки для активации трейлинга
InpTrailStep Шаг трейлинга — Размер сдвига стоп-лосса при трейлинге
InpTrailEquityCondition Условие по средствам для трейлинга — Учитывать разницу между средствами и балансом при активации трейлинга
InpMinEquityLeadUSD Минимальный перевес средств — Минимальная разница между средствами и балансом для активации трейлинга
InpUseTrendFilter Фильтр тренда — Включить определение направления тренда для фильтрации торговых сигналов
InpTrendTF Таймфрейм тренда — Таймфрейм, используемый для определения направления тренда
InpTrendBars Баров для тренда — Количество баров для расчёта направления тренда
InpTrendMoveThreshold Порог движения тренда — Порог изменения цены для определения направления тренда
InpRestrictToTrend Ограничить сетку по тренду — Размещать сетку только в направлении подтверждённого тренда
InpPauseOnStrongMove Пауза при сильном движении — Приостанавливать торговлю при резком движении цены
InpStrongMoveThreshold Порог сильного движения — Порог сильного движения цены для приостановки торговли
InpFridayTradingEnabled Торговля в пятницу — Разрешить или запретить торговлю в пятницу
InpFridayCutoffHour Час окончания в пятницу — Час, после которого советник прекращает торговлю в пятницу
InpFridayCutoffMinute Минута окончания в пятницу — Минуты, после которых советник прекращает торговлю в пятницу
InpCloseOnFridayCutoff Закрывать при пятничном лимите — Закрывать все позиции при достижении пятничного времени окончания
InpStopOrdersAfterCutoff Останавливать ордера после пятницы — Отменять отложенные ордера после пятничного времени окончания
InpUseRecovery Восстановление позиции — Включить механизм открытия дополнительных позиций при убытке корзины
InpMaxRecoveryOrders Макс. ордеров восстановления — Максимальное количество ордеров восстановления за цикл
InpRecoveryLot Лот восстановления — Размер лота для ордеров восстановления
InpRecoveryTargetUSD Цель восстановления в USD — Целевая прибыль для завершения цикла восстановления в долларах
InpUseRescue Аварийное восстановление — Включить восстановление сетки при сильном отклонении цены от якоря
InpUseHedge Хеджирование — Включить возможность открытия хеджирующих позиций
InpAutoResetEnabled Автосброс цикла — Автоматически сбрасывать состояние сетки по заданным условиям
ShowBrandPanel Панель бренда — Показывать или скрыть панель с информацией о бренде на графике
PanelX Позиция X панели — Горизонтальная координата панели бренда на графике
PanelY Позиция Y панели — Вертикальная координата панели бренда на графике
PanelWidth Ширина панели — Ширина панели бренда в пикселях
PanelHeight Высота панели — Высота панели бренда в пикселях
Получить полный код

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

#property version   "1.20"
#property description "XAUUSDBOTS PROPORTIONAL GRID - Price-proportional straddle grid (M1)"
#property description "Official channel: "
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>

const string EA_BRAND_COMMENT = "t.me/freexauusdforexea";
const string EA_BRAND_LINK    = "t.me/freexauusdforexea";
const string EA_BRAND_NAME    = "XAUUSD BOTS";
const string PANEL_PREFIX     = "XAUUSDBOTS_BRAND_";
const string DASH_PREFIX      = "XAUGRID_";

input group "=== XAUUSD BOTS ==="
input string   BrandInfo            = "t.me/freexauusdforexea"; // Official channel (display only)

input group "=== GENERAL ==="
input int      InpMagicNumber           = 20260330;
input int      InpSlippagePoints        = 30;
input bool     InpEnableLogging         = true;
input bool     InpShowDashboard         = true;

input group "=== GRID SETTINGS ==="
input int      InpGridLevels            = 30;
input double   InpGridStep              = 1.0;
input bool     InpPriceProportional     = true;
input double   InpReferencePrice        = 4000.0;
input double   InpMinGridStep           = 0.30;
input int      InpMaxPendingOrders      = 60;

input group "=== LOT SIZING ==="
enum ENUM_LOT_MODE { LOT_FIXED = 0, LOT_AUTO = 1 };
input ENUM_LOT_MODE InpLotMode          = LOT_FIXED;
input double   InpFixedLot              = 0.01;
input double   InpAutoLotBaseBalance    = 1000.0;
input double   InpAutoLotPerBalance     = 0.01;
input double   InpMaxLot                = 2.0;
input double   InpMinLot                = 0.01;
input bool     InpTrendDoubleLot        = true;

input group "=== BASKET PROFIT ==="
input bool     InpUseBasketTarget       = true;
input double   InpBasketTargetUSD       = 50.0;
input bool     InpCloseAllOnBasket      = true;
input bool     InpResetOnBasket         = true;

input group "=== DAILY LIMITS ==="
input bool     InpUseDailyLimits        = true;
input double   InpDailyProfitLimitUSD   = 200.0;
input double   InpDailyLossLimitUSD     = 150.0;
input double   InpDailyProfitLimitPct   = 0.0;
input double   InpDailyLossLimitPct     = 0.0;
input bool     InpHardStopOnDailyLoss   = true;
input int      InpNoTradeMinutesAfterLoss = 60;
input bool     InpResetDailyOnNewDay    = true;
input double   InpNextDayLotMultiplier  = 1.0;

input group "=== PER-LOT LOSS PROTECTION ==="
input bool     InpUsePerLotSL           = true;
input double   InpMaxLossPer001Lot      = 10.0;

input group "=== TRAILING STOP ==="
input bool     InpUseTrailing           = true;
input double   InpTrailActivateSteps    = 5.0;
input double   InpTrailStep             = 2.0;
input bool     InpTrailEquityCondition  = false;
input double   InpMinEquityLeadUSD      = 5.0;

input group "=== TREND AWARENESS ==="
input bool     InpUseTrendFilter        = true;
input ENUM_TIMEFRAMES InpTrendTF        = PERIOD_M1;
input int      InpTrendBars             = 20;
input double   InpTrendMoveThreshold    = 5.0;
input bool     InpRestrictToTrend       = false;
input bool     InpPauseOnStrongMove     = true;
input double   InpStrongMoveThreshold   = 15.0;

input group "=== FRIDAY CONTROLS ==="
input bool     InpFridayTradingEnabled  = true;
input int      InpFridayCutoffHour      = 22;
input int      InpFridayCutoffMinute    = 0;
input bool     InpCloseOnFridayCutoff   = true;
input bool     InpStopOrdersAfterCutoff = true;

input group "=== RECOVERY ENGINE ==="
input bool     InpUseRecovery           = false;
input int      InpMaxRecoveryOrders     = 3;
input double   InpRecoveryLot           = 0.02;
input double   InpRecoveryTargetUSD     = 20.0;

input group "=== RESCUE / HEDGE ==="
input bool     InpUseRescue             = false;
input bool     InpUseHedge              = false;

input group "=== CYCLE RESET ==="
input bool     InpAutoResetEnabled      = true;

input group "=== Brand Panel ==="
input bool     ShowBrandPanel           = true;
input int      PanelX                   = 10;
input int      PanelY                   = 20;
input int      PanelWidth               = 320;
input int      PanelHeight          = 70;

CTrade         trade;
CPositionInfo  pos;
COrderInfo     ord;
CSymbolInfo    sym;
CAccountInfo   acc;

double         g_anchorPrice      = 0.0;
double         g_effectiveStep    = 0.0;
double         g_lotMultiplier    = 1.0;
int            g_trendDirection   = 0;
bool           g_tradingAllowed   = true;
bool           g_fridayCutoffHit  = false;
bool           g_dailyLossHit     = false;
bool           g_dailyProfitHit   = false;
datetime       g_lastDay          = 0;
datetime       g_noTradeUntil     = 0;
double         g_dayStartEquity   = 0.0;
double         g_basketMaxProfit  = 0.0;
double         g_basketMinProfit  = 0.0;
int            g_recoveryCount    = 0;

void CreateBrandPanel()
{
   if(!ShowBrandPanel) { ObjectsDeleteAll(0, PANEL_PREFIX); return; }
   string box = PANEL_PREFIX + "BOX";
   if(ObjectFind(0, box) < 0)
      ObjectCreate(0, box, OBJ_RECTANGLE_LABEL, 0, 0, 0);
   ObjectSetInteger(0, box, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, box, OBJPROP_XDISTANCE, PanelX);
   ObjectSetInteger(0, box, OBJPROP_YDISTANCE, PanelY);
   ObjectSetInteger(0, box, OBJPROP_XSIZE, PanelWidth);
   ObjectSetInteger(0, box, OBJPROP_YSIZE, PanelHeight);
   ObjectSetInteger(0, box, OBJPROP_BGCOLOR, C'10,20,40');
   ObjectSetInteger(0, box, OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0, box, OBJPROP_COLOR, C'255,200,40');
   ObjectSetInteger(0, box, OBJPROP_WIDTH, 2);
   ObjectSetInteger(0, box, OBJPROP_BACK, false);
   ObjectSetInteger(0, box, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, box, OBJPROP_HIDDEN, true);
   PutLabel(PANEL_PREFIX + "T1", PanelX + 12, PanelY + 10, EA_BRAND_NAME, 14, C'255,215,0');
   PutLabel(PANEL_PREFIX + "T2", PanelX + 12, PanelY + 36, EA_BRAND_LINK, 13, clrAqua);
}

void PutLabel(string name, int x, int y, string text, int size, color clr)
{
   if(ObjectFind(0, name) < 0)
      ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
   ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
   ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
   ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
   ObjectSetString(0, name, OBJPROP_TEXT, text);
   ObjectSetString(0, name, OBJPROP_FONT, "Arial Bold");
   ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size);
   ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
   ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, name, OBJPROP_HIDDEN, true);
}

void LogMsg(string s)
{
   if(InpEnableLogging)
      Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), " | ", s);
}

int OnInit()
{
      // код доступен только после оплаты
   }

void OnDeinit(const int reason)
{
   DeleteDashboard();
   ObjectsDeleteAll(0, PANEL_PREFIX);
}

void OnTick()
{
      // код доступен только после оплаты
   }

void RecalculateAnchorAndStep()
{
   double bid = sym.Bid();
   double ask = sym.Ask();
   g_anchorPrice = NormalizeDouble((bid + ask) * 0.5, _Digits);
   if(InpPriceProportional && InpReferencePrice > 0.0)
      g_effectiveStep = InpGridStep * (g_anchorPrice / InpReferencePrice);
   else
      g_effectiveStep = InpGridStep;
   if(g_effectiveStep < InpMinGridStep) g_effectiveStep = InpMinGridStep;
   g_effectiveStep = NormalizeDouble(g_effectiveStep, _Digits);
}

double CalculateLot()
{
   double lots = InpFixedLot;
   if(InpLotMode == LOT_AUTO && InpAutoLotBaseBalance > 0.0)
      lots = (acc.Balance() / InpAutoLotBaseBalance) * InpAutoLotPerBalance;
   lots *= g_lotMultiplier;
   if(InpTrendDoubleLot && g_trendDirection != 0) lots *= 2.0;

   double step = sym.LotsStep();
   if(step <= 0) step = 0.01;
   lots = MathFloor(lots / step) * step;
   if(lots < InpMinLot) lots = InpMinLot;
   if(lots > InpMaxLot) lots = InpMaxLot;
   if(lots > sym.LotsMax()) lots = sym.LotsMax();
   if(lots < sym.LotsMin()) lots = sym.LotsMin();
   return NormalizeDouble(lots, 2);
}

void CancelAllManagedPendings()
{
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!ord.SelectByIndex(i)) continue;
      if(ord.Symbol() != _Symbol || ord.Magic() != InpMagicNumber) continue;
      long ty = ord.OrderType();
      if(ty == ORDER_TYPE_BUY_STOP || ty == ORDER_TYPE_SELL_STOP)
         trade.OrderDelete(ord.Ticket());
   }
}

int CountOurPendings()
{
   int cnt = 0;
   for(int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if(!ord.SelectByIndex(i)) continue;
      if(ord.Symbol() != _Symbol || ord.Magic() != InpMagicNumber) continue;
      long ty = ord.OrderType();
      if(ty == ORDER_TYPE_BUY_STOP || ty == ORDER_TYPE_SELL_STOP) cnt++;
   }
   return cnt;
}

void PlaceOrRefreshGrid()
{
   CancelAllManagedPendings();
   if(!g_tradingAllowed || g_fridayCutoffHit || g_dailyLossHit || g_dailyProfitHit) return;

   double lot = CalculateLot();
   int placed = 0;

   for(int i = 1; i <= InpGridLevels; i++)
   {
      if(InpRestrictToTrend && g_trendDirection < 0) break;
      double price = NormalizeDouble(g_anchorPrice + i * g_effectiveStep, _Digits);
      if(price <= sym.Ask()) continue;
      if(trade.BuyStop(lot, price, _Symbol, 0, 0, ORDER_TIME_GTC, 0, EA_BRAND_COMMENT))
         placed++;
      if(placed >= InpMaxPendingOr

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

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

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

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

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

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

Стоимость полного кода
1 591,40₽ ≈ $19.45