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