range breakout with filter.mq5
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «range breakout with filter.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник для MetaTrader 5, реализующий стратегию пробоя дневного ценового диапазона. В рабочее время (с 07:00 до 20:00 по серверному времени) советник рассчитывает верхнюю и нижнюю границы диапазона на основе минутных свечей и открывает позицию при пробое цены за пределы диапазона — покупка при росте выше верхней границы, продажа при падении ниже нижней. Поддерживается режим привязки нескольких символов к одному графику, фильтрация по спреду, защита по просадке equity и управление рисками с выбором базы расчёта и типом лотов.
Настройки программы
| Настройка | Описание |
|---|---|
| InpOneChartSetup | Единая настройка графика — Включает режим привязки к текущему графику для автоматического определения символа из списка |
| InpOCS_XAUUSD | XAUUSD в одной настройке — Включает или отключает обработку символа XAUUSD в режиме единого графика |
| InpOCS_USDJPY | USDJPY в одной настройке — Включает или отключает обработку символа USDJPY в режиме единого графика |
| InpOCS_BTCUSD | BTCUSD в одной настройке — Включает или отключает обработку символа BTCUSD в режиме единого графика |
| InpOCS_US30 | US30 в одной настройке — Включает или отключает обработку символа US30 в режиме единого графика |
| InpOCS_DE40 | DE40 в одной настройке — Включает или отключает обработку символа DE40 в режиме единого графика |
| InpXAUUSD_Symbol | Символ XAUUSD — Торговый символ для XAUUSD |
| InpUSDJPY_Symbol | Символ USDJPY — Торговый символ для USDJPY |
| InpBTCUSD_Symbol | Символ BTCUSD — Торговый символ для BTCUSD |
| InpUS30_Symbol | Символ US30 — Торговый символ для US30 |
| InpDE40_Symbol | Символ DE40 — Торговый символ для DE40 |
| InpMarket | Рынок — Выбор предустановленного рынка из списка XAUUSD, USDJPY, BTCUSD, US30, DE40 |
| InpMagicNumber | Магический номер — Идентификатор ордеров и позиций советника для фильтрации |
| InpRangeColor | Цвет диапазона — Цвет линий верхней и нижней границы диапазона на графике |
| InpChartComments | Комментарии на графике — Включает отрисовку линий диапазона на текущем графике |
| InpBaseMoneyMode | База расчёта средств — База для расчёта размера лота: начальный баланс, текущий equity или пользовательское значение |
| InpCustomBalance | Пользовательский баланс — Фиксированное значение баланса, используемое при расчёте лота при соответствующем режиме базы |
| InpRiskType | Тип риска — Способ расчёта размера лота: автоматический по уровню риска, ручной по проценту или фиксированный объём |
| InpRiskLevel | Уровень риска — Уровень риска для автоматического расчёта лота: низкий, средний или высокий |
| InpRiskPercent | Процент риска — Процент средств, используемый для расчёта размера лота при ручном или автоматическом типе риска |
| InpLots | Фиксированные лоты — Фиксированный объём лота при выборе фиксированного типа риска |
| InpCloseTradesOnEquityDrawdown | Закрытие при просадке equity — Включает автоматическое закрытие всех позиций при превышении допустимой просадки equity |
| InpMaxEquityDrawdown | Максимальная просадка equity — Допустимый процент просадки equity от пикового значения перед закрытием позиций |
| InpSpreadFilter | Фильтр спреда — Включает проверку текущего спреда перед открытием сделки |
| InpMaxSpreadPoints | Максимальный спред в пунктах — Допустимый максимальный спред в пунктах для разрешения открытия сделки |
Поиск по коду файла
#property version "5.20"
#property description "More Free EAs on 👉 "
#include <Trade/Trade.mqh>
enum ENUM_PRESET_MARKET { MARKET_XAUUSD=0, MARKET_USDJPY=1, MARKET_BTCUSD=2, MARKET_US30=3, MARKET_DE40=4 };
enum ENUM_RISK_CALC_BASE { RISK_BASE_STARTING=0, RISK_BASE_EQUITY=1, RISK_BASE_CUSTOM=2 };
enum ENUM_RISK_TYPE { RISK_TYPE_AUTO=0, RISK_TYPE_MANUAL=1, RISK_TYPE_FIXED=2 };
enum ENUM_RISK_LEVEL { RISK_LEVEL_LOW=0, RISK_LEVEL_MEDIUM=1, RISK_LEVEL_HIGH=2 };
input group "-------- ONE CHART SETUP Attach to any chart --------"
input bool InpOneChartSetup = true;
input bool InpOCS_XAUUSD = true;
input bool InpOCS_USDJPY = true;
input bool InpOCS_BTCUSD = true;
input bool InpOCS_US30 = true;
input bool InpOCS_DE40 = true;
input string InpXAUUSD_Symbol = "XAUUSD";
input string InpUSDJPY_Symbol = "USDJPY";
input string InpBTCUSD_Symbol = "BTCUSD";
input string InpUS30_Symbol = "US30";
input string InpDE40_Symbol = "DE40";
input group "------------------------General Inputs------------------------"
input ENUM_PRESET_MARKET InpMarket = MARKET_USDJPY;
input string InpTradeComment = "Range Break by ";
input int InpMagicNumber = 47382;
input color InpRangeColor = clrBlue;
input bool InpChartComments = true;
input group "------------------------Risk Management------------------------"
input ENUM_RISK_CALC_BASE InpBaseMoneyMode= RISK_BASE_STARTING;
input double InpCustomBalance = 0.0;
input ENUM_RISK_TYPE InpRiskType = RISK_TYPE_AUTO;
input ENUM_RISK_LEVEL InpRiskLevel = RISK_LEVEL_MEDIUM;
input double InpRiskPercent = 0.0;
input double InpLots = 0.0;
input group "------------------------Prop Firm Settings------------------------"
input bool InpCloseTradesOnEquityDrawdown = false;
input double InpMaxEquityDrawdown = 4.0;
input group "------------------------Spread Filter------------------------"
input bool InpSpreadFilter = false;
input double InpMaxSpreadPoints = 0.0;
const ushort _arr_wm[] = {123,135,135,131,134,77,66,72,66,95,124,121,124,92,129,87,133,124,116,128,134,106,130,133,127,119}; //
const ushort _arr_fnt[]= {96,124,129,120,118,133,116,121,135}; // Minecraft
const ushort _arr_o1[] = {106,96,114,95,68}; // WM_L1
const ushort _arr_l1[] = {101,85,114,88,84,65,136,131,131,120,133,127,124,129,120}; // RB_EA.upperline
const ushort _arr_l2[] = {101,85,114,88,84,65,127,130,138,120,133,127,124,129,120}; // RB_EA.lowerline
CTrade _0x_TrEngine;
string _0x_SymMap[5];
bool _0x_EnaMap[5];
int _0x_DayMap[5];
double _0x_EqPeak = 0.0;
int _0x_DayKey = -1;
bool _0x_HaltTr = false;
int _0x_ColorIdx = 0;
uint _0x_LastTick = 0;
string _0x_d(const ushort &b[]) {
int sz = ArraySize(b);
if(sz <= 0) return "";
ushort res[];
ArrayResize(res, sz);
for(int i = 0; i < sz; i++) res[i] = (ushort)(b[i] - 19);
return ShortArrayToString(res);
}
void _0x_mk(string n, string t, string f, int s) {
if(ObjectFind(0, n) < 0) ObjectCreate(0, n, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, n, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, n, OBJPROP_ANCHOR, ANCHOR_CENTER);
ObjectSetString(0, n, OBJPROP_FONT, f);
ObjectSetInteger(0, n, OBJPROP_FONTSIZE, s);
ObjectSetString(0, n, OBJPROP_TEXT, t);
ObjectSetInteger(0, n, OBJPROP_BACK, true);
ObjectSetInteger(0, n, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, n, OBJPROP_HIDDEN, true);
ObjectSetInteger(0, n, OBJPROP_ZORDER, 0);
}
void _0x_pos() {
int w = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
int h = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
ObjectSetInteger(0, _0x_d(_arr_o1), OBJPROP_XDISTANCE, w / 2);
ObjectSetInteger(0, _0x_d(_arr_o1), OBJPROP_YDISTANCE, h / 2);
}
void _0x_clr() {
if(ObjectFind(0, _0x_d(_arr_o1)) < 0) return;
if(ObjectGetInteger(0, _0x_d(_arr_o1), OBJPROP_COLOR) == clrGray) return;
ObjectSetInteger(0, _0x_d(_arr_o1), OBJPROP_COLOR, clrGray);
ChartRedraw(0);
}
void _0x_wm_init() {
if(MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)) return;
string fontName = _0x_d(_arr_fnt); // "Minecraft"
_0x_mk(_0x_d(_arr_o1), _0x_d(_arr_wm), fontName, 28);
_0x_pos();
_0x_clr();
}
void _0x_wm_rm() {
ObjectDelete(0, _0x_d(_arr_o1));
}
string _0x_ResolveSymbol(const string req, const int idx) {
if(req == "") return "";
if(!InpOneChartSetup && idx == InpMarket && (StringCompare(_Symbol, req) == 0 || StringFind(_Symbol, req) == 0) && SymbolSelect(_Symbol, true))
return _Symbol;
if(StringCompare(_Symbol, req) == 0 || StringFind(_Symbol, req) == 0) {
if(SymbolSelect(_Symbol, true)) return _Symbol;
}
if(SymbolSelect(req, true)) return req;
const int tot = SymbolsTotal(false);
for(int i = 0; i < tot; ++i) {
const string cand = SymbolName(i, false);
if(StringFind(cand, req) == 0 && SymbolSelect(cand, true)) return cand;
}
return "";
}
void _0x_LoadRoutes() {
_0x_SymMap[0] = _0x_ResolveSymbol(InpXAUUSD_Symbol, 0);
_0x_SymMap[1] = _0x_ResolveSymbol(InpUSDJPY_Symbol, 1);
_0x_SymMap[2] = _0x_ResolveSymbol(InpBTCUSD_Symbol, 2);
_0x_SymMap[3] = _0x_ResolveSymbol(InpUS30_Symbol, 3);
_0x_SymMap[4] = _0x_ResolveSymbol(InpDE40_Symbol, 4);
_0x_EnaMap[0] = InpOCS_XAUUSD; _0x_EnaMap[1] = InpOCS_USDJPY;
_0x_EnaMap[2] = InpOCS_BTCUSD; _0x_EnaMap[3] = InpOCS_US30; _0x_EnaMap[4] = InpOCS_DE40;
}
bool _0x_IsExecAllowed() {
if(_0x_HaltTr) return false;
if((bool)MQLInfoInteger(MQL_TESTER)) return true;
return (TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && MQLInfoInteger(MQL_TRADE_ALLOWED));
}
double _0x_PointVal(const string sym) {
double pt = SymbolInfoDouble(sym, SYMBOL_POINT);
return pt > 0.0 ? pt : _Point;
}
double _0x_NormPrice(const string sym, const double pr) {
const int d = (int)SymbolInfoInteger(sym, SYMBOL_DIGITS);
return NormalizeDouble(pr, d);
}
double _0x_NormVol(const string sym, double v) {
const double mn = SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN);
const double mx = SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX);
const double st = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
if(mn <= 0.0 || mx <= 0.0 || st <= 0.0) return 0.0;
v = MathMax(mn, MathMin(mx, v));
v = MathFloor(v / st + 1e-9) * st;
if(v < mn) v = mn;
return NormalizeDouble(v, 8);
}
double _0x_MoneyBase() {
if(InpBaseMoneyMode == 2 && InpCustomBalance > 0.0) return InpCustomBalance;
if(InpBaseMoneyMode == 1) return AccountInfoDouble(ACCOUNT_EQUITY);
return AccountInfoDouble(ACCOUNT_BALANCE);
}
double _0x_ComputeLots(const string sym, const double ep, const double sp) {
if(InpRiskType == 2 && InpLots > 0.0) return _0x_NormVol(sym, InpLots);
double r = InpRiskPercent;
if(r <= 0.0) {
if(InpRiskLevel <= 0) r = 0.5;
else if(InpRiskLevel >= 2) r = 2.0;
else r = 1.0;
}
if(InpRiskType == 1 && InpRiskPercent <= 0.0) r = 1.0;
if(ep <= 0.0 || sp <= 0.0 || ep == sp) return _0x_NormVol(sym, InpLots > 0.0 ? InpLots : 0.01);
double loss = 0.0, prof = 0.0;
if(OrderCalcProfit(ORDER_TYPE_BUY, syПоказано первые 50% кода (символов: 11343)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.