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

Blessing 3 v3.9.6.05

blessing_3_v3_9_6.mq4

Похожие материалы по тегам

blessing_3_v3.9.6.15.mq4MQL4 / MetaTrader 4 · 4 общих теговblessing_3_v3.9.6.23.mq4MQL4 / MetaTrader 4 · 4 общих теговblessing 3 v4.mq4MQL4 / MetaTrader 4 · 4 общих теговblessing_3_v3.9.6.21.mq4MQL4 / MetaTrader 4 · 4 общих теговblessing_3_v3.9.6.18.mq4MQL4 / MetaTrader 4 · 4 общих теговblessinglite-gamma.mq4MQL4 / MetaTrader 4 · 4 общих тегов
Вы автор или правообладатель?

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

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

О программе

Blessing 3 v3.9.6.05 — торговый советник для MetaTrader 4, реализующий сеточную стратегию управления корзиной сделок. Советник анализирует ценовые данные с помощью нескольких технических индикаторов — скользящей средней, CCI, полос Боллинджера, стохастика и MACD — для формирования сигналов на вход в сделки. Поддерживается как традиционный режим входа с отложенными ордерами, так и прямой вход по рыночным ценам.

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

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

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

НастройкаОписание
TradeComment Комментарий сделки — Текстовый комментарий, добавляемый к каждой открываемой сделке.
Enter a unique number to identify this EA (EANumber) Номер EA — Уникальное целое число для идентификации данного экземпляра советника.
Setting this to true will close all open orders immediately (EmergencyCloseAll) Аварийное закрытие всех — При значении true все открытые ордера закрываются немедленно.
LabelAcc Метка настроек аккаунта — Текстовая метка, обозначающая группу настроек аккаунта.
Setting this to true will stop the EA trading after any open trades have been closed (ShutDown) Остановка после закрытия — При true советник прекращает торговлю после закрытия всех открытых сделок.
percent of account balance lost before trading stops (StopTradePercent) Процент остановки торговли — Процент баланса аккаунта, потеря которого приводит к остановке торговли.
Percentage of account you want to trade on this pair (PortionPC) Доля аккаунта для торговли — Процент баланса аккаунта, выделяемый для торговли на данной паре.
Percent of portion for max drawdown level. (MaxDDPercent) Максимальный процент просадки — Максимальный допустимый процент просадки от выделенной доли баланса.
Maximum allowed spread while placing trades (MaxSpread) Максимальный спред — Максимально допустимый спред в пипсах для размещения сделок.
Will shutdown over holiday period (UseHolidayShutdown) Остановка на праздники — При true советник автоматически останавливает торговлю в указанные праздничные даты.
List of holidays, each seperated by a comma, [day]/[mth]-[day]/[mth], dates inclusive (Holidays) Праздничные даты — Список праздничных периодов в формате [день]/[мес]-[день]/[мес], разделённых запятыми, даты включительно.
will sound alarms (PlaySounds) Воспроизведение звуков — При true советник воспроизводит звуковые оповещения о событиях.
Alarm sound to be played (AlertSound) Звук оповещения — Имя файла звука, воспроизводимого при срабатывании оповещений.
LabelIES Метка настроек индикаторов — Текстовая метка, обозначающая группу настроек индикаторов и входов.
Stop/Limits for entry if true, Buys/Sells if false (B3Traditional) Традиционный режим входа — При true используются отложенные ордера (Stop/Limit) для входа, при false — рыночные ордера Buy/Sell.
Market condition 0=uptrend 1=downtrend 2=range 3=off (ForceMarketCond) Принудительное условие рынка — Задаёт принудительное условие рынка: 0 — восходящий, 1 — нисходящий, 2 — флэт, 3 — без принудительного условия.
true = ANY entry can be used to open orders, false = ALL entries used to open orders (UseAnyEntry) Любой вход — При true любой сработавший вход может открыть сделку, при false — все входы должны сработать одновременно.
0 = Off, 1 = will base entry on MA channel, 2 = will trade in reverse (MAEntry) Вход по MA — 0 — выключено, 1 — вход на основе канала скользящей средней, 2 — торговля в обратном направлении.
0 = Off, 1 = will base entry on CCI indicator, 2 = will trade in reverse (CCIEntry) Вход по CCI — 0 — выключено, 1 — вход на основе индикатора CCI, 2 — торговля в обратном направлении.
0 = Off, 1 = will base entry on BB, 2 = will trade in reverse (BollingerEntry) Вход по Боллинджеру — 0 — выключено, 1 — вход на основе полос Боллинджера, 2 — торговля в обратном направлении.
0 = Off, 1 = will base entry on Stoch, 2 = will trade in reverse (StochEntry) Вход по Стохастику — 0 — выключено, 1 — вход на основе стохастика, 2 — торговля в обратном направлении.
0 = Off, 1 = will base entry on MACD, 2 = will trade in reverse (MACDEntry) Вход по MACD — 0 — выключено, 1 — вход на основе MACD, 2 — торговля в обратном направлении.
LabelLS Метка настроек лота — Текстовая метка, обозначающая группу настроек размера лота.
Money Management (UseMM) Управление рисками — При true включает автоматическое управление размером лота в зависимости от баланса аккаунта.
Adjusts MM base lot for large accounts (LAF) Коэффициент для крупных аккаунтов — Корректирующий коэффициент для расчёта базового лота при крупных размерах аккаунта.
Starting lots if Money Management is off (Lot) Начальный лот — Начальный размер лота при выключенном управлении рисками.
Multiplier on each level (Multiplier) Множитель уровня — Множитель, применяемый к размеру лота на каждом следующем уровне сетки.
LabelGS Метка настроек сетки — Текстовая метка, обозначающая группу настроек размера сетки.
Auto calculation of TakeProfit and Grid size; (AutoCal) Автоматический расчёт — При true Take Profit и размер сетки рассчитываются автоматически на основе ATR.
LabelATRTFr Метка таймфрейма ATR — Текстовая метка с описанием доступных таймфреймов для расчёта ATR.
TimeFrame for ATR calculation (ATRTF) Таймфрейм ATR — Таймфрейм, используемый для расчёта ATR при автоматическом определении размера сетки.
Number of periods for the ATR calculation (ATRPeriods) Периоды ATR — Количество периодов, используемых для расчёта среднеквадратичного отклонения цены.
Widens/Squishes Grid on increments/decrements of .1 (GAF) Коэффициент сетки — Множитель, расширяющий или сжимающий шаг сетки при изменении на 0.1.
Time Grid in seconds, to avoid opening of lots of levels in fast market (EntryDelay) Задержка входа — Задержка в секундах между размещением ордеров разных уровней сетки.
In pips, used in conjunction with logic to offset first trade entry (EntryOffset) Смещение входа — Смещение первого ордера входа в пипсах от текущей цены.
True = use RSI/MA calculation for next grid order (UseSmartGrid) Умная сетка — При true следующий ордер сетки размещается на основе расчёта RSI и скользящей средней.
LabelTS Метка торговых настроек — Текстовая метка, обозначающая группу торговых настроек.
Maximum number of trades to place (stops placing orders when reaches MaxTrades) (MaxTrades) Максимум сделок — Максимальное количество сделок в корзине, при достижении которого новые ордера не размещаются.
Close All level, when reaches this level, doesn't wait for TP to be hit (BreakEvenTrade) Уровень безубыточности — Номер уровня, при достижении которого вся корзина закрывается без ожидания срабатывания Take Profit.
Pips added to Break Even Point before BE closure (BEPlusPips) Пипсы к безубыточности — Количество пипсов, добавляемых к точке безубыточности перед закрытием сделки.
True = will close the oldest open trade after CloseTradesLevel is reached (UseCloseOldest) Закрытие старых сделок — При true после достижения CloseTradesLevel закрывается самая старая открытая сделка.
will start closing oldest open trade at this level (CloseTradesLevel) Уровень закрытия сделок — Количество сделок, начиная с которого активируется закрытие старых ордеров.
Will close the oldest trade whether it has potential profit or not (ForceCloseOldest) Принудительное закрытие старых — При true самая старая сделка закрывается вне зависимости от наличия потенциальной прибыли.
Maximum number of oldest trades to close (MaxCloseTrades) Максимум закрываемых сделок — Максимальное количество старых сделок, которые могут быть закрыты за один раз.
After Oldest Trades have closed, Forces Take Profit to BE +/- xx Pips (CloseTPPips) TP после закрытия старых — После закрытия старых сделок принудительный Take Profit в пипсах от точки безубыточности.
Force Take Profit to BE +/- xx Pips (ForceTPPips) Принудительный TP — Принудительный Take Profit в пипсах от точки безубыточности.
Ensure Take Profit is at least BE +/- xx Pips (MinTPPips) Минимальный TP — Гарантированный минимальный Take Profit в пипсах от точки безубыточности.
LabelHS Метка настроек хеджирования — Текстовая метка, обозначающая группу настроек хеджирования.
Enter the Symbol of the same/correlated pair EXACTLY as used by your broker. (HedgeSymbol) Символ хеджа — Точный символ коррелированной пары, используемой для хеджирования, как указанный у брокера.
Number of days for checking Hedge Correlation (CorrPeriod) Период корреляции — Количество дней, используемых для проверки корреляции между основной парой и хедж-парой.
Turns DD hedge on/off (UseHedge) Использовать хедж — Включает или выключает хеджирование для снижения максимальной просадки.
DD = start hedge at set DD; Level = Start at set level (DDorLevel) DD или уровень — Определяет триггер хеджирования: DD — по проценту просадки, Level — по уровню сделок.
DD Percent or Level at which Hedge starts (HedgeStart) Начало хеджа — Процент просадки или уровень сделок, при достижении которых запускается хеджирование.
Hedge Lots = Open Lots * hLotMult (hLotMult) Множитель лота хеджа — Множитель, определяющий размер хедж-лота как произведение от открытых лотов.
DD Hedge maximum pip loss - also hedge trailing stop (hMaxLossPips) Макс. убыток хеджа в пипсах — Максимальный допустимый убыток хедж-сделки в пипсах, также используется как трейлинг-стоп хеджа.
true = fixed SL at hMaxLossPips (hFixedSL) Фиксированный SL хеджа — При true стоп-лосс хедж-сделки фиксируется на уровне hMaxLossPips.
Hedge Take Profit (hTakeProfit) TP хеджа — Тейк-профит хедж-сделки в пипсах от цены открытия.
Increase to HedgeStart to stop early re-entry of the hedge (hReEntryPC) Повторный вход хеджа — Процент увеличения HedgeStart для предотвращения раннего повторного входа хедж-сделки.
True = Trailing Stop will stop at BE; False = Hedge will continue into profit (StopTrailAtBE) Стоп трейл на безубыточности — При true трейлинг-стоп хедж-сделки останавливается на уровне безубыточности.
False = Trailing Stop is Fixed; True = Trailing Stop will reduce after BE is reached (ReduceTrailStop) Снижающийся трейл-стоп — При true трейлинг-стоп хедж-сделки уменьшается после достижения безубыточности, при false остаётся фиксированным.
LabelES Метка настроек выхода — Текстовая метка, обозначающая группу настроек раннего выхода.
Turns on TP move and Profit Trailing Stop Feature (MaximizeProfit) Максимизация прибыли — Включает функцию перемещения Take Profit и трейлинг-стопа прибыли.
Locks in Profit at this percent of Total Profit Potential (ProfitSet) Фиксация прибыли — Процент от потенциальной прибыли, при достижении которого позиция фиксируется.
Moves TP this amount in pips (MoveTP) Сдвиг TP — Величина сдвига Take Profit в пипсах при каждом перемещении.
Number of times you want TP to move before stopping movement (TotalMoves) Количество сдвигов TP — Максимальное число раз, которое Take Profit может быть сдвинут.
Use Stop Loss and/or Trailing Stop Loss (UseStopLoss) Использовать стоп-лосс — При true включается фиксированный стоп-лосс и/или трейлинг-стоп от точки безубыточности.
Pips for fixed StopLoss from BE, 0=off (SLPips) SL в пипсах — Фиксированный стоп-лосс в пипсах от точки безубыточности, 0 означает отключение.
Pips for trailing stop loss from BE + TSLPips: +ve = fixed trail; -ve = reducing trail; 0=off (TSLPips) TP трейлинг-стопа в пипсах — Трейлинг-стоп в пипсах от безубыточности; положительное значение — фиксированный, отрицательное — уменьшающийся, 0 — выключен.
Minimum trailing stop pips if using reducing TS (TSLPipsMin) Мин. TP трейлинг-стопа — Минимальное значение трейлинг-стопа в пипсах при уменьшающемся режиме.
Transmits a SL in case of internet loss (UsePowerOutSL) SL при отключении — При true в случае потери связи с сервером передаётся стоп-лосс на открытые сделки.
Power Out Stop Loss in pips (POSLPips) SL при отключении в пипсах — Размер стоп-лосса, передаваемого при отключении, в пипсах.
UseFIFO Использовать FIFO — При true при закрытии сделок используется метод FIFO (First In First Out).
LabelEE Метка настроек раннего выхода — Текстовая метка, обозначающая группу настроек раннего выхода.
Reduces ProfitTarget by a percentage over time and number of levels open (UseEarlyExit) Ранний выход — При true целевая прибыль постепенно уменьшается со временем и по количеству уровней.
Number of Hours to wait before EE over time starts (EEStartHours) Часы начала раннего выхода — Количество часов ожидания перед началом постепенного уменьшения целевой прибыли.
true = StartHours from FIRST trade: false = StartHours from LAST trade (EEFirstTrade) Начало от первой сделки — При true отсчёт часов начинается от момента открытия первой сделки, при false — от последней.
Percentage reduction per hour (0 = OFF) (EEHoursPC) Процент уменьшения в час — Процентное уменьшение целевой прибыли за каждый час (0 — отключено).
Number of Open Trades before EE over levels starts (EEStartLevel) Уровень начала раннего выхода — Количество открытых сделок, начиная с которого активируется постепенное уменьшение TP по уровням.
Percentage reduction at each level (0 = OFF) (EELevelPC) Процент уменьшения на уровне — Процентное уменьшение целевой прибыли на каждом уровне (0 — отключено).
true = Will allow the basket to close at a loss : false = Minimum profit is Break Even (EEAllowLoss) Разрешить убыток при раннем выходе — При true корзина может закрыться с убытком, при false минимальная прибыль — безубыточность.
LabelAdv Метка расширенных настроек — Текстовая метка для группы расширенных настроек.
LabelGrid Метка настроек сетки — Текстовая метка, обозначающая группу настроек размера сетки.
Specifies number of open trades in each block (separated by a comma) (SetCountArray) Массив количества сделок — Задаёт количество открытых сделок в каждом блоке, разделённых запятой.
Specifies number of pips away to issue limit order (separated by a comma) (GridSetArray) Массив расстояний сетки — Задаёт расстояние в пипсах для размещения лимитных ордеров, разделённых запятой.
Take profit for each block (separated by a comma) (TP_SetArray) Массив TP сетки — Значения Take Profit для каждого блока, разделённых запятой.
LabelMA Метка настроек MA — Текстовая метка, обозначающая группу настроек скользящей средней.
Period of MA (H4 = 100, H1 = 400) (MAPeriod) Период MA — Период расчёта скользящей средней, используемой для определения направления тренда.
Distance from MA to be treated as Ranging Market (MADistance) Расстояние от MA — Дистанция от скользящей средней, при превышении которой рынок считается ранжирующим.
LabelCCI Метка настроек CCI — Текстовая метка, обозначающая группу настроек индикатора CCI.
Period for CCI calculation (CCIPeriod) Период CCI — Период расчёта индикатора CCI.
LabelBBS Метка настроек Боллинджера — Текстовая метка, обозначающая группу настроек полос Боллинджера.
Period for Bollinger (BollPeriod) Период Боллинджера — Период расчёта средней линии полос Боллинджера.
Up/Down spread (BollDistance) Расстояние Боллинджера — Дополнительное расстояние в пипсах от средней линии до границ канала.
Standard deviation multiplier for channel (BollDeviation) Отклонение Боллинджера — Множитель стандартного отклонения для расчёта ширины канала полос Боллинджера.
LabelSto Метка настроек Стохастика — Текстовая метка, обозначающая группу настроек стохастика.
Determines Overbought and Oversold Zones (BuySellStochZone) Зоны Стохастика — Определяет уровень зон перекупленности и перепроданности стохастика.
Stochastic KPeriod (KPeriod) Период K Стохастика — Период расчёта линии %K стохастика.
Stochastic DPeriod (DPeriod) Период D Стохастика — Период расчёта линии %D стохастика.
Stochastic Slowing (Slowing) Замедление Стохастика — Период замедления (сглаживания) линии стохастика.
LabelMACD Метка настроек MACD — Текстовая метка, обозначающая группу настроек индикатора MACD.
Получить полный код

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

#include <stdlib.mqh>
#include <stderror.mqh>
#include <WinUser32.mqh>

#define A 1 //All (Basket + Hedge)
#define B 2 //Basket
#define H 3 //Hedge
#define T 4 //Ticket
#define P 5 //Pending

extern string   Version.3.9.6.05    = "EA Settings:";
extern string   TradeComment        = "Blessing 3.9.6";
extern int      EANumber            = 1;        // Enter a unique number to identify this EA
extern bool     EmergencyCloseAll   = false;    // Setting this to true will close all open orders immediately

extern string   LabelAcc            = "Account Trading Settings:";
extern bool     ShutDown            = false;    // Setting this to true will stop the EA trading after any open trades have been closed
extern double   StopTradePercent    = 10;       // percent of account balance lost before trading stops
extern bool     NanoAccount         = false;    // set to true for nano "penny a pip" account (contract size is $10,000)
extern double   PortionPC           = 100;      // Percentage of account you want to trade on this pair
extern double   MaxDDPercent        = 50;       // Percent of portion for max drawdown level.
extern double   MaxSpread           = 5;        // Maximum allowed spread while placing trades
extern bool     UseHolidayShutdown  = true;     // Will shutdown over holiday period
extern string   Holidays            = "18/12-01/01"; // List of holidays, each seperated by a comma, [day]/[mth]-[day]/[mth], dates inclusive
extern bool     PlaySounds          = false;    // will sound alarms
extern string   AlertSound          = "Alert.wav";  // Alarm sound to be played

extern string   LabelIES            = "Indicator / Entry Settings:";
extern bool     B3Traditional       = true;     // Stop/Limits for entry if true, Buys/Sells if false
extern int      ForceMarketCond     = 3;        // Market condition 0=uptrend 1=downtrend 2=range 3=off
extern bool     UseAnyEntry         = false;    // true = ANY entry can be used to open orders, false = ALL entries used to open orders
extern int      MAEntry             = 1;        // 0 = Off, 1 = will base entry on MA channel, 2 = will trade in reverse
extern int      CCIEntry            = 0;        // 0 = Off, 1 = will base entry on CCI indicator, 2 = will trade in reverse
extern int      BollingerEntry      = 0;        // 0 = Off, 1 = will base entry on BB, 2 = will trade in reverse
extern int      StochEntry          = 0;        // 0 = Off, 1 = will base entry on Stoch, 2 = will trade in reverse
extern int      MACDEntry           = 0;        // 0 = Off, 1 = will base entry on MACD, 2 = will trade in reverse

extern string   LabelLS             = "Lot Size Settings:";
extern bool     UseMM               = true;    // Money Management
extern double   LAF                 = 0.5;      // Adjusts MM base lot for large accounts
extern double   Lot                 = 0.01;     // Starting lots if Money Management is off
extern double   Multiplier          = 1.4;      // Multiplier on each level

extern string   LabelGS             = "Grid Settings:";
extern bool     AutoCal             = false;    // Auto calculation of TakeProfit and Grid size;
extern string   LabelATRTFr         = "0:Chart, 1:M1, 2:M5, 3:M15, 4:M30, 5:H1, 6:H4, 7:D1, 8:W1, 9:MN1";
extern int      ATRTF               = 0;        // TimeFrame for ATR calculation
extern int      ATRPeriods          = 21;       // Number of periods for the ATR calculation
extern double   GAF                 = 1.0;      // Widens/Squishes Grid on increments/decrements of .1
extern int      EntryDelay          = 2400;     // Time Grid in seconds, to avoid opening of lots of levels in fast market
extern double   EntryOffset         = 5;        // In pips, used in conjunction with logic to offset first trade entry
extern bool     UseSmartGrid        = true;     // True = use RSI/MA calculation for next grid order

extern string   LabelTS             = "Trading Settings:";
extern int      MaxTrades           = 15;       // Maximum number of trades to place (stops placing orders when reaches MaxTrades)
extern int      BreakEvenTrade      = 12;       // Close All level, when reaches this level, doesn't wait for TP to be hit
extern double   BEPlusPips          = 2;        // Pips added to Break Even Point before BE closure
extern bool     UseCloseOldest      = false;    // True = will close the oldest open trade after CloseTradesLevel is reached
extern int      CloseTradesLevel    = 5;        // will start closing oldest open trade at this level
extern bool     ForceCloseOldest    = true;     // Will close the oldest trade whether it has potential profit or not
extern int      MaxCloseTrades      = 4;        // Maximum number of oldest trades to close
extern double   CloseTPPips         = 10;       // After Oldest Trades have closed, Forces Take Profit to BE +/- xx Pips
extern double   ForceTPPips         = 0;        // Force Take Profit to BE +/- xx Pips
extern double   MinTPPips           = 0;        // Ensure Take Profit is at least BE +/- xx Pips

extern string   LabelHS             = "Hedge Settings:";
extern string   HedgeSymbol         = "";       // Enter the Symbol of the same/correlated pair EXACTLY as used by your broker.
extern int      CorrPeriod          = 30;       // Number of days for checking Hedge Correlation
extern bool     UseHedge            = false;    // Turns DD hedge on/off
extern string   DDorLevel           = "DD";     // DD = start hedge at set DD; Level = Start at set level
extern double   HedgeStart          = 20;       // DD Percent or Level at which Hedge starts
extern double   hLotMult            = 0.8;      // Hedge Lots = Open Lots * hLotMult
extern double   hMaxLossPips        = 30;       // DD Hedge maximum pip loss - also hedge trailing stop
extern bool     hFixedSL            = false;    // true = fixed SL at hMaxLossPips
extern double   hTakeProfit         = 30;       // Hedge Take Profit
extern double   hReEntryPC          = 5;        // Increase to HedgeStart to stop early re-entry of the hedge
extern bool     StopTrailAtBE       = true;     // True = Trailing Stop will stop at BE; False = Hedge will continue into profit
extern bool     ReduceTrailStop     = true;     // False = Trailing Stop is Fixed; True = Trailing Stop will reduce after BE is reached

extern string   LabelES             = "Exit Settings:";
extern bool     MaximizeProfit      = false;    // Turns on TP move and Profit Trailing Stop Feature
extern double   ProfitSet           = 70;       // Locks in Profit at this percent of Total Profit Potential
extern double   MoveTP              = 30;       // Moves TP this amount in pips
extern int      TotalMoves          = 2;        // Number of times you want TP to move before stopping movement
extern bool     UseStopLoss         = false;    // Use Stop Loss and/or Trailing Stop Loss
extern double   SLPips              = 30;       // Pips for fixed StopLoss from BE, 0=off
extern double   TSLPips             = 10;       // Pips for trailing stop loss from BE + TSLPips: +ve = fixed trail; -ve = reducing trail; 0=off
extern double   TSLPipsMin          = 3;        // Minimum trailing stop pips if using reducing TS
extern bool     UsePowerOutSL       = false;    // Transmits a SL in case of internet loss
extern double   POSLPips            = 600;      // Power Out Stop Loss in pips
extern bool     UseFIFO             = false;    // 

extern string   LabelEE             = "Early Exit Settings:";
extern bool     UseEarlyExit        = false;    // Reduces ProfitTarget by a percentage over time and number of levels open
extern double   EEStartHours        = 3;        // Number of Hours to wait before EE over time starts
extern bool     EEFirstTrade        = true;     // true = StartHours from FIRST trade: false = StartHours from LAST trade
extern double   EEHoursPC           = 0.5;      // Percentage reduction per hour (0 = OFF)
extern int      EEStartLevel        = 5;        // Number of Open Trades before EE over levels starts
extern double   EELevelPC           = 10;       // Percentage reduction at each level (0 = OFF)
extern bool     EEAllowLoss         = false;    // true = Will allow the basket to close at a loss : false = Minimum profit is Break Even

extern string   LabelAdv            = "Advanced Settings Change sparingly";

extern string   LabelGrid           = "Grid Size Settings:";
extern string   SetCountArray       = "4,4";    // Specifies number of open trades in each block (separated by a comma)
extern string   GridSetArray        = "25,50,100"; // Specifies number of pips away to issue limit order (separated by a comma)
extern string   TP_SetArray         = "50,100,200"; // Take profit for each block (separated by a comma)

extern string   LabelMA             = "MA Entry Settings:";
extern int      MAPeriod            = 100;      // Period of MA (H4 = 100, H1 = 400)
extern double   MADistance          = 10;       // Distance from MA to be treated as Ranging Market

extern string   LabelCCI            = "CCI Entry Settings:";
extern int      CCIPeriod           = 14;       // Period for CCI calculation

extern string   LabelBBS            = "Bollinger Bands Entry Settings:";
extern int      BollPeriod          = 10;       // Period for Bollinger
extern double   BollDistance        = 10;       // Up/Down spread
extern double   BollDeviation       = 2.0;      // Standard deviation multiplier for channel

extern string   LabelSto            = "Stochastic Entry Settings:";
extern int      BuySellStochZone    = 20;       // Determines Overbought and Oversold Zones
extern int      KPeriod             = 10;       // Stochastic KPeriod
extern int      DPeriod             = 2;        // Stochastic DPeriod
extern int      Slowing             = 2;        // Stochastic Slowing

extern string   LabelMACD           = "MACD Entry Settings:";
extern string   LabelMACDTF         = "0:Chart, 1:M1, 2:M5, 3:M15, 4:M30, 5:H1, 6:H4, 7:D1, 8:W1, 9:MN1";
extern int      MACD_TF             = 0;        // Time frame for MACD calculation
extern int      FastPeriod          = 12;       // MACD EMA Fast Period
extern int      SlowPeriod          = 26;       // MACD EMA Slow Period
extern int      SignalPeriod        = 9;        // MACD EMA Signal Period
extern int      MACDPrice           = 0;        // 0=close, 1=open, 2=high, 3=low, 4=HL/2, 5=HLC/3 6=HLCC/4

extern string   LabelSG             = "Smart Grid Settings:";
extern string   LabelSGTF           = "0:Chart, 1:M1, 2:M5, 3:M15, 4:M30, 5:H1, 6:H4, 7:D1, 8:W1, 9:MN1";
extern int      RSI_TF              = 3;        // Timeframe for RSI calculation - should be less than chart TF.
extern int      RSI_Period          = 14;       // Period for RSI calculation
extern int      RSI_Price           = 0;        // 0=close, 1=open, 2=high, 3=low, 4=HL/2, 5=HLC/3 6=HLCC/4
extern int      RSI_MA_Period       = 10;       // Period for MA of RSI calculation
extern int      RSI_MA_Method       = 0;        // 0=Simple MA, 1=Exponential MA, 2=Smoothed MA, 3=Linear Weighted MA

extern string   LabelOS             = "Other Settings:";
extern bool     RecoupClosedLoss    = true;     // true = Recoup any Hedge/CloseOldest losses: false = Use original profit target.
extern int      Level               = 7;        // Largest Assumed Basket size.  Lower number = higher start lots
extern int      slip                = 99;       // Adjusts opening and closing orders by "slipping" this amount
extern bool     SaveStats           = false;    // true = will save equity statistics
extern int      StatsPeriod         = 3600;     // seconds betwen stats entries - off by default
extern bool     StatsInitialise     = true;     // true for backtest - false for foward/live to ACCUMULATE equity traces

extern string   LabelUE             = "Email Settings:";
extern bool     UseEmail            = false;
extern string   LabelEDD            = "At what DD% would you like Email warnings (Max: 49, Disable: 0)?";
extern double   EmailDD1            = **;
extern double   EmailDD2            = **;
extern double   EmailDD3            = **;
extern string   LabelEH             = "Number of hours before DD timer resets";
extern double   EmailHours          = **;       // Minimum number of hours between emails

extern string   LabelDisplay        = "Used to Adjust Overlay";
extern bool     displayOverlay      = true;     // Turns the display on and off
extern bool     displayLogo         = true;     // Turns off copyright and icon
extern bool     displayCCI          = true;     // Turns off the CCI display
extern bool     displayLines        = true;     // Show BE, TP and TS lines
extern int      displayXcord        = 100;      // Moves display left and right
extern int      displayYcord        = 22;       // Moves display up and down
extern int      displayCCIxCord     = 10;       // Moves CCI display left and right
extern string   displayFont         = "Arial Bold";//Display font
extern int      displayFontSize     = 9;        // Changes size of display characters
extern int      displaySpacing      = 14;       // Changes space between lines
extern double   displayRatio        = 1;        // Ratio to increase label width spacing
extern color    displayColor        = DeepSkyBlue; // default color of display characters
extern color    displayColorProfit  = Green;    // default color of profit display characters
extern color    displayColorLoss    = Red;      // default color of loss display characters
extern color    displayColorFGnd    = White;    // default color of ForeGround Text display characters

extern bool     Debug               = false;

extern string   LabelOpt            = "These values can only be used while optimizing";
extern bool     UseGridOpt          = false;    // Set to true if you want to be able to optimize the grid settings.
extern int      SetArray1           = 4;        // These values will replace the normal SetCountArray,
extern int      SetArray2           = 4;        // GridSetArray and TP_SetArray during optimization.
extern int      SetArray3           = 0;        // The default values are the same as the normal array defaults
extern int      SetArray4           = 0;
extern int      GridArray1          = 25;       // REMEMBER:
extern int      GridArray2          = 50;       // There must be one more value for GridArray and TPArray
extern int      GridArray3          = 100;      // than there is for SetArray
extern int      GridArray4          = 0;
extern int      GridArray5          = 0;
extern int      TPArray1            = 50;
extern int      TPArray2            = 100;
extern int      TPArray3            = 200;
extern int      TPArray4            = 0;
extern int      TPArray5            = 0;

int         ca;
int         Magic,hMagic;
int         CbT,CpT,ChT;
double      Pip,hPip;
int         POSLCount;
double      SLbL;
int         Moves;
double      MaxDD;
double      SLb;
int         AccountType;
double      StopTradeBalance;
double      InitialAB;
bool        Testing,Visual;
bool        AllowTrading;
bool        EmergencyWarning;
double      MaxDDPer;
int         Error,y;
int         Set1Level,Set2Level,Set3Level,Set4Level;
int         EmailCount;
string      sTF;
datetime    EmailSent;
int         GridArray[,2];
double      Lots[],MinLotSize,LotStep,LotDecimal;
int         LotMult,MinMult;
bool        PendLot;
string      CS,UAE;
int         HolShutDown;
datetime    HolArray[,4];
datetime    HolFirst,HolLast,NextStats,OTbF;
double      RSI[];
int         Digit[,2],TF[10]={0,1,5,15,30,60,240,1440,10080,43200};

double      Email[3];
double      EETime,PbC,PhC,hDDStart,PbMax,PbMin,PhMax,PhMin,LastClosedPL,ClosedPips,SLh,hLvlStart,StatLowEquity,StatHighEquity;
int         hActive,EECount,TbF,CbC,CaL,FileHandle;
bool        TradesOpen,FileClosed,HedgeTypeDD,hThisChart,hPosCorr,dLabels,FirstRun;
string      FileName,ID,StatFile;
double      TPb,StopLevel,TargetPips,LbF,bTS;

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

int deinit()
{	switch(UninitializeReason())
	{	case REASON_REMOVE:
		case REASON_CHARTCLOSE:
		case REASON_CHARTCHANGE:
			if(CpT>0)while(CpT>0)CpT-=ExitTrades(P,displayColorLoss,"Blessing Removed");
			GlobalVariablesDeleteAll(ID);
		case REASON_RECOMPILE:
		case REASON_PARAMETERS:
		case REASON_ACCOUNT:
			if(!Testing)LabelDelete();
			Comment("");
	}
	return(0);
}

int start()
{
      // код доступен только после оплаты
   }	int     CbB          =0;     // Count buy
	int     CbS          =0;     // Count sell
	int     CpBL         =0;     // Count buy limit
	int     CpSL         =0;     // Count sell limit
	int     CpBS         =0;     // Count buy stop
	int     CpSS         =0;     // Count sell stop
	double  LbB          =0;     // Count buy lots
	double  LbS          =0;     // Count sell lots
	double  LbT          =0;     // total lots out
	double  OPpBL        =0;     // Buy limit open price
	double  OPpSL        =0;     // Sell limit open price
	double  SLbB         =0;     // stop losses are set to zero if POSL off
	double  SLbS         =0;     // stop losses are set to zero if POSL off
	double  BCb,BCh,BCa;         // Broker costs (swap + commission)
	double  ProfitPot    =0;     // The Potential Profit of a basket of Trades
	double  PipValue,PipVal2;
	double  OrderLot;
	double  OPbL,OPhO;           // last open price
	int     OTbL;                // last open time
	double  g2,tp2,Entry,RSI_MA,LhB,LhS,LhT,OPbO,OTbO,OThO,TbO,ThO;
	int     Ticket,ChB,ChS,IndEntry;
	double  Pb,Ph,PaC,PbPips,PbTarget,DrawDownPC,BEb,BEh,BEa;
	bool    BuyMe,SellMe,Success,SetPOSL;
	string  IndicatorUsed;

	PipValue=MarketInfo(Symbol(),MODE_TICKVALUE)/MarketInfo(Symbol(),MODE_TICKSIZE)*Pip;
	PipVal2=PipValue/Pip;
	StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
	for(y=0;y<OrdersTotal();y++)
	{	if(!OrderSelect(y,SELECT_BY_POS,MODE_TRADES))continue;
		int Type=OrderType();
		if(OrderMagicNumber()==hMagic)
		{	Ph+=OrderProfit();
			BCh+=OrderSwap()+OrderCommission();
			BEh+=OrderLots()*OrderOpenPrice();
			if(OrderOpenTime()<OThO||OThO==0)
			{	OThO=OrderOpenTime();
				ThO=OrderTicket();
				OPhO=OrderOpenPrice();
			}
			if(Type==OP_BUY)
			{	ChB++;
				LhB+=OrderLots();
			}
			else if(Type==OP_SELL)
			{	ChS++;
				LhS+=OrderLots();
			}
			continue;
		}
		if(OrderMagicNumber()!=Magic||OrderSymbol()!=Symbol())continue;
		if(OrderTakeProfit()>0)ModifyOrder(OrderOpenPrice(),OrderStopLoss());
		if(Type<=OP_SELL)
		{	Pb+=OrderProfit();
			BCb+=OrderSwap()+OrderCommission();
			BEb+=OrderLots()*OrderOpenPrice();
			if(OrderOpenTime()>=OTbL)
			{	OTbL=OrderOpenTime();
				OPbL=OrderOpenPrice();
			}
			if(OrderOpenTime()<OTbF||TbF==0)
			{	OTbF=OrderOpenTime();
				TbF=OrderTicket();
				LbF=OrderLots();
			}
			if(OrderOpenTime()<OTbO||OTbO==0)
			{	OTbO=OrderOpenTime();
				TbO=OrderTicket();
				OPbO=OrderOpenPrice();
			}
			if(UsePowerOutSL&&(POSLPips>0&&OrderStopLoss()==0)||(POSLPips==0&&OrderStopLoss()>0))SetPOSL=true;
			if(Type==OP_BUY)
			{	CbB++;
				LbB+=OrderLots();
				continue;
			}
			else
			{	CbS++;
				LbS+=OrderLots();
				continue;
			}
		}
		else
		{	if(Type==OP_BUYLIMIT)
			{	CpBL++;
				OPpBL=OrderOpenPrice();
				continue;
			}
			else if(Type==OP_SELLLIMIT)
			{	CpSL++;
				OPpSL=OrderOpenPrice();
				continue;
			}
			else if(Type==OP_BUYSTOP)CpBS++;
			else CpSS++;
		}
	}
	CbT=CbB+CbS;
	LbT=LbB+LbS;
	Pb=ND(Pb+BCb,2);
	ChT=ChB+ChS;
	LhT=LhB+LhS;
	Ph=ND(Ph+BCh,2);
	CpT=CpBL+CpSL+CpBS+CpSS;
	BCa=BCb+BCh;

	if(LbT>0)
	{	BEb=ND(BEb/LbT,Digits);
		if(BCa<0)BEb-=ND(BCa/PipVal2/(LbB-LbS),Digits);
		if(Pb>PbMax||PbMax==0)PbMax=Pb;
		if(Pb<PbMin||PbMin==0)PbMin=Pb;
		if(!TradesOpen)
		{	FileHandle=FileOpen(FileName,FILE_BIN|FILE_WRITE);
			if(FileHandle>-1)
			{	FileWriteInteger(FileHandle,TbF);
				FileClose(FileHandle);
				TradesOpen=true;
				if(Debug)Print(FileName+" File Written: "+TbF);
			}
		}
	}
	else if(TradesOpen)
	{	TPb=0;
		PbMax=0;
		PbMin=0;
		OTbF=0;
		TbF=0;
		LbF=0;
		PbC=0;
		PhC=0;
		PaC=0;
		ClosedPips=0;
		CbC=0;
		CaL=0;
		bTS=0;
		if(HedgeTypeDD)hDDStart=HedgeStart;
		else hLvlStart=HedgeStart;
		EmailCount=*;
		EmailSent=*;
		FileHandle=FileOpen(FileName,FILE_BIN|FILE_READ);
		if(FileHandle>-1)
		{	FileClose(FileHandle);
			Error=GetLastError();
			FileDelete(FileName);
			Error=GetLastError();
			if(Error==ERR_NO_ERROR)
			{	if(Debug)Print(FileName+" File Deleted");
				TradesOpen=false;
			}
			else Print("Error deleting file: "+FileName+" "+Error+" "+ErrorDescription(Error));
		}
		else TradesOpen=false;
	}
	if(LhT>0)
	{	BEh=ND(BEh/LhT,Digits);
		if(Ph>PhMax||PhMax==0)PhMax=Ph;
		if(Ph<PhMin||PhMin==0)PhMin=Ph;
	}
	else
	{	PhMax=0;
		PhMin=0;
		SLh=0;
	}

	if(CbT==0&&ChT==0&&ShutDown)
	{	if(CpT>0)
		{	ExitTrades(P,displayColorLoss,"Blessing is shutting down");
			return;
		}
		if(AllowTrading)
		{	Print("Blessing has ShutDown. Set ShutDown = 'false' to continue trading");
			if(PlaySounds)PlaySound(AlertSound);
			AllowTrading=false;
		}
		if(UseEmail&&EmailCount<4&&!Testing)
		{	SendMail("Blessing EA","Blessing has shut down on "+Symbol()+" "+sTF+
					". Trading has been suspended. To resume trading, set ShutDown to false.");
			Error=GetLastError();
			if(Error>0)Print("Error sending Email: "+Error+" "+ErrorDescription(Error));
			else EmailCount=*;
		}
	}
	if(!AllowTrading)
	{	static bool LDelete;
		if(!LDelete)
		{	LDelete=true;
			LabelDelete();
			if(ObjectFind("B3LStop")==-1)CreateLabel("B3LStop","Trading has been stopped on this pair.",10,0,0,3,displayColorLoss);
			if(Testing)string Tab="Tester Journal";
			else Tab="Terminal Experts";
			if(ObjectFind("B3LExpt")==-1)CreateLabel("B3LExpt","Check the "+Tab+" tab for the reason why.",10,0,0,6,displayColorLoss);
			if(ObjectFind("B3LResm")==-1)CreateLabel("B3LResm","Reset Blessing to resume trading.",10,0,0,9,displayColorLoss);
		}
		return;
	}
	else
	{	LDelete=false;
		ObjDel("B3LStop");
		ObjDel("B3LExpt");
		ObjDel("B3LResm");
	}

	double PortionBalance=ND(AccountBalance()*PortionPC,2);
	if(Pb+Ph<0)DrawDownPC=-(Pb+Ph)/PortionBalance;
	if(!FirstRun&&DrawDownPC>=MaxDDPercent/100)
	{	ExitTrades(A,displayColorLoss,"Equity Stop Loss Reached");
		if(PlaySounds)PlaySound(AlertSound);
		return;
	}
	if(-(Pb+Ph)>MaxDD)MaxDD=-(Pb+Ph);
	MaxDDPer=MathMax(MaxDDPer,DrawDownPC*100);
	if(SaveStats)Stats(false,TimeCurrent()<NextStats,PortionBalance,Pb+Ph);

	double StepAB=InitialAB*(1+StopTradePercent);
	double StepSTB=AccountBalance()*(1-StopTradePercent);
	double NextISTB=StepAB*(1-StopTradePercent);
	if(StepSTB>NextISTB)
	{	InitialAB=StepAB;
		StopTradeBalance=StepSTB;
	}
	double InitialAccountMultiPortion=StopTradeBalance*PortionPC;
	if(PortionBalance<InitialAccountMultiPortion)
	{	if(CbT==0)
		{	AllowTrading=false;
			if(PlaySounds)PlaySound(AlertSound);
			Print("Portion Balance dropped below stop trade percent");
			MessageBox("Reset Blessing, account balance dropped below stop trade percent on "+Symbol()+Period(),"Blessing 3: Warning",48);
			return(0);
		}
		else if(!ShutDown&&!RecoupClosedLoss)
		{	ShutDown=true;
			if(PlaySounds)PlaySound(AlertSound);
			Print("Portion Balance dropped below stop trade percent");
			return(0);
		}
	}

	int Trend;
	string ATrend;
	double ima_0=iMA(Symbol(),0,MAPeriod,0,MODE_EMA,PRICE_CLOSE,0);
	if(ForceMarketCond==3)
	{	if(Bid>ima_0+MADistance)Trend=0;
		else if(Ask<ima_0-MADistance)Trend=1;
		else Trend=2;
	}
	else
	{	Trend=ForceMarketCond;
		if(Trend!=0&&Bid>ima_0+MADistance)ATrend="U";
		if(Trend!=1&&Ask<ima_0-MADistance)ATrend="D";
		if(Trend!=2&&(Bid<ima_0+MADistance&&Ask>ima_0-MADistance))ATrend="R";
	}

	double Pa=Pb;
	PaC=PbC+PhC;
	if(hActive==1&&ChT==0)
	{	PhC=FindClosedPL(H);
		hActive=0;
		return;
	}
	else if(hActive==0&&ChT>0)hActive=1;
	if(LbT>0)
	{	if(PbC>0||(PbC<0&&RecoupClosedLoss))
		{	Pa+=PbC;
			BEb-=ND(PbC/PipVal2/(LbB-LbS),Digits);
		}
		if(PhC>0||(PhC<0&&RecoupClosedLoss))
		{	Pa+=PhC;
			BEb-=ND(PhC/PipVal2/(LbB-LbS),Digits);
		}
		if(Ph>0||(Ph<0&&RecoupClosedLoss))Pa+=Ph;
	}

	if(UseCloseOldest&&CbT>=CloseTradesLevel&&CbC<MaxCloseTrades)
	{	if(!FirstRun&&TPb>0&&(ForceCloseOldest||(CbB>0&&OPbO>TPb)||(CbS>0&&OPbO<TPb)))
		{	y=ExitTrades(T,DarkViolet,"Close Oldest Trade",TbO);
			if(y==1)
			{	OrderSelect(TbO,SELECT_BY_TICKET);
				PbC+=OrderProfit()+OrderSwap()+OrderCommission();
				ca=0;
				CbC++;
				return;
			}
		}
	}

	if(AutoCal)
	{	double GridTP;
		double GridATR=iATR(NULL,TF[ATRTF],ATRPeriods,0)/Pip;
		if((CbT+CbC>Set4Level)&&Set4Level>0)
		{	g2=GridATR*12;    //GS*2*2*2*1.5
			tp2=GridATR*18;   //GS*2*2*2*1.5*1.5
		}
		else if((CbT+CbC>Set3Level)&&Set3Level>0)
		{	g2=GridATR*8;     //GS*2*2*2
			tp2=GridATR*12;   //GS*2*2*2*1.5
		}
		else if((CbT+CbC>Set2Level)&&Set2Level>0)
		{	g2=GridATR*4;     //GS*2*2
			tp2=GridATR*8;    //GS*2*2*2
		}
		else if((CbT+CbC>Set1Level)&&Set1Level>0)
		{	g2=GridATR*2;     //GS*2
			tp2=GridATR*4;    //GS*2*2
		}
		else
		{	g2=GridATR;
			tp2=GridATR*2;
		}
		GridTP=GridATR*2;
	}
	else
	{	y=MathMax(MathMin(CbT+CbC,MaxTrades)-1,0);
		g2=GridArray[y,0];
		tp2=GridArray[y,1];
		GridTP=GridArray[0,1];
	}
	g2=ND(MathMax(g2*GAF*Pip,Pip),Digits);
	tp2=ND(tp2*GAF*Pip,Digits);
	GridTP=ND(GridTP*GAF*Pip,Digits);

	if(UseMM)
	{	if(CbT>0)
		{	if(GlobalVariableCheck(ID+"LotMult"))LotMult=GlobalVariableGet(ID+"LotMult");
			if(LbF!=LotSize(Lots[0]*LotMult))
			{	LotMult=LbF/Lots[0];
				GlobalVariableSet(ID+"LotMult",LotMult);
				Print("LotMult reset to "+DTS(LotMult,0));
			}
		}
		if(CbT==0)
		{	double Contracts,Factor,Lotsize;
			Contracts=PortionBalance/10000;
			if(Multiplier<=1)Factor=Level;
			else Factor=(MathPow(Multiplier,Level)-Multiplier)/(Multiplier-1);
			Lotsize=LAF*AccountType*Contracts/(1+Factor);
			LotMult=MathMax(MathFloor(Lotsize/Lot),MinMult);
			GlobalVariableSet(ID+"LotMult",LotMult);
		}
	}
	else if(CbT==0)LotMult=MinMult;

	static double BCaL,BEbL;
	double nLots=LbB-LbS;
	if(CbT>0&&(TPb==0||CbT+ChT!=CaL||BEbL!=BEb||BCa!=BCaL||FirstRun))
	{	string sCalcTP="Set New TP:  BE: "+DTS(BEb,Digits);
		double NewTP,BasePips;
		CaL=CbT+ChT;
		BCaL=BCa;
		BEbL=BEb;
		BasePips=ND(Lot*LotMult*GridTP*(CbT+CbC)/nLots,Digits);
		if(CbB>0)
		{	if(ForceTPPips>0)
			{	NewTP=BEb+ForceTPPips;
				sCalcTP=sCalcTP+" +Force TP ("+DTS(ForceTPPips,Digits)+") ";
			}
			else if(CbC>0&&CloseTPPips>0)
			{	NewTP=BEb+CloseTPPips;
				sCalcTP=sCalcTP+" +Close TP ("+DTS(CloseTPPips,Digits)+") ";
			}
			else if(BEb+BasePips>OPbL+tp2)
			{	NewTP=BEb+BasePips;
				sCalcTP=sCalcTP+" +Base TP: ("+DTS(BasePips,Digits)+") ";
			}
			else
			{	NewTP=OPbL+tp2;
				sCalcTP=sCalcTP+" +Grid TP: ("+DTS(tp2,Digits)+") ";
			}
			if(MinTPPips>0)
			{	NewTP=MathMax(NewTP,BEb+MinTPPips);
				sCalcTP=sCalcTP+" >Minimum TP: ";
			}
			NewTP+=MoveTP*Moves;
			if(BreakEvenTrade>0&&CbT+CbC>=BreakEvenTrade)
			{	NewTP=BEb+BEPlusPips;
				sCalcTP=sCalcTP+" >BreakEven: ("+DTS(BEPlusPips,Digits)+") ";
			}
			if(BCa<0)
			{	double TPAdj=ND(BCa/PipVal2/nLots,Digits);
				NewTP-=TPAdj;
				sCalcTP=sCalcTP+" +BC: ("+DTS(-TPAdj,Digits)+") :";
			}
			sCalcTP=(sCalcTP+"Buy: TakeProfit: ");
		}
		else if(CbS>0)
		{	if(ForceTPPips>0)
			{	NewTP=BEb-ForceTPPips;
				sCalcTP=sCalcTP+" -Force TP ("+DTS(ForceTPPips,Digits)+") ";
			}
			else if(CbC>0&&CloseTPPips>0)
			{	NewTP=BEb-CloseTPPips;
				sCalcTP=sCalcTP+" -Close TP ("+DTS(CloseTPPips,Digits)+") ";
			}
			else if(BEb+BasePips<OPbL-tp2)
			{	NewTP=BEb+BasePips;
				sCalcTP=sCalcTP+" -Base TP: ("+DTS(BasePips,Digits)+") ";
			}
			else
			{	NewTP=OPbL-tp2;
				sCalcTP=sCalcTP+" -Grid TP: ("+DTS(tp2,Digits)+") ";
			}
			if(MinTPPips>0)
			{	NewTP=MathMin(NewTP,BEb-MinTPPips);
				sCalcTP=sCalcTP+" >Minimum TP: ";
			}
			NewTP-=MoveTP*Moves;
			if(BreakEvenTrade>0&&CbT+CbC>=BreakEvenTrade)
			{	NewTP=BEb-BEPlusPips;
				sCalcTP=sCalcTP+" >BreakEven: ("+DTS(BEPlusPips,Digits)+") ";
			}
			if(BCa<0)
			{	TPAdj=ND(BCa/PipVal2/nLots,Digits);
				NewTP-=TPAdj;
				sCalcTP=sCalcTP+" -BC: ("+DTS(-TPAdj,Digits)+") :";
			}
			sCalcTP=(sCalcTP+"Sell: TakeProfit: ");
		}
		if(TPb!=NewTP)
		{	TPb=NewTP;
			if(nLots>0)TargetPips=ND(TPb-BEb,Digits);
			else TargetPips=ND(BEb-TPb,Digits);
			if(Debug)Print(sCalcTP+DTS(NewTP,Digits));
			return;
		}
	}
	PbTarget=TargetPips/Pip;
	ProfitPot=ND(TargetPips*PipVal2*MathAbs(nLots),2);
	if(CbB>0)PbPips=ND((Bid-BEb)/Pip,1);
	if(CbS>0)PbPips=ND((BEb-Ask)/Pip,1);

	double hAsk=MarketInfo(HedgeSymbol,MODE_ASK);
	double hBid=MarketInfo(HedgeSymbol,MODE_BID);
	double hSpread=hAsk-hBid;
	if(hThisChart)nLots+=LhB-LhS;
	if(hActive==1)
	{	double TPa,PhPips;
		if(nLots==0)
		{	BEa=0;
			TPa=0;
		}
		else if(hThisChart)
		{	if(nLots>0)
			{	if(CbB>0)BEa=ND((BEb*LbT-(BEh-hSpread)*LhT)/(LbT-LhT),Digits);
				else BEa=ND(((BEb-(Ask-Bid))*LbT-BEh*LhT)/(LbT-LhT),Digits);
				TPa=ND(BEa+TargetPips,Digits);
			}
			else
			{	if(CbS>0)BEa=ND((BEb*LbT-(BEh+hSpread)*LhT)/(LbT-LhT),Digits);
				else BEa=ND(((BEb+Ask-Bid)*LbT-BEh*LhT)/(LbT-LhT),Digits);
				TPa=ND(BEa-TargetPips,Digits);
			}
		}
		else
		{	
		}
		if(ChB>0)PhPips=ND((hBid-BEh)/hPip,1);
		if(ChS>0)PhPips=ND((BEh-hAsk)/hPip,1);
	}
	else
	{	BEa=BEb;
		TPa=TPb;
	}

	if(UseEarlyExit&&CbT>0)
	{	double EEpc,EEopt,EEStartTime,TPaF;
		if(EEFirstTrade)EEopt=OTbF;
		else EEopt=OTbL;
		if(DayOfWeek()<TimeDayOfWeek(EEopt))EEStartTime=2*24*3600;
		EEStartTime+=EEopt+EEStartHours*3600;
		if(EEHoursPC>0&&TimeCurrent()>=EEStartTime)EEpc=EEHoursPC*(TimeCurrent()-EEStartTime)/3600;
		if(EELevelPC>0&&(CbT+CbC)>=EEStartLevel)EEpc+=EELevelPC*(CbT+CbC-EEStartLevel+1);
		EEpc=1-EEpc;
		if(!EEAllowLoss&&EEpc<0)EEpc=0;
		PbTarget*=EEpc;
		TPaF=ND((TPa-BEa)*EEpc+BEa,Digits);
		if(displayOverlay&&displayLines&&(hActive!=1||(hActive==1&&hThisChart))&&(!Testing||(Testing&&Visual))&&EEpc<1
			&&(CbT+CbC+ChT>EECount||EETime!=Time[0])&&(EEHoursPC>0&&EEopt+EEStartHours*3600<Time[0])||(EELevelPC>0&&CbT+CbC>=EEStartLevel))
		{	EETime=Time[0];
			EECount=CbT+CbC+ChT;
			if(ObjectFind("B3LEELn")<0)
			{	ObjectCreate("B3LEELn",OBJ_TREND,0,0,0);
				ObjectSet("B3LEELn",OBJPROP_COLOR,Yellow);
				ObjectSet("B3LEELn",OBJPROP_WIDTH,1);
				ObjectSet("B3LEELn",OBJPROP_STYLE,0);
				ObjectSet("B3LEELn",OBJPROP_RAY,false);
			}
			if(EEHoursPC>0)ObjectMove("B3LEELn",0,MathFloor(EEopt/3600+EEStartHours)*3600,TPa);
			else ObjectMove("B3LEELn",0,MathFloor(EEopt/3600)*3600,TPaF);
			ObjectMove("B3LEELn",1,Time[1],TPaF);
			if(ObjectFind("B3VEELn")<0)
			{	ObjectCreate("B3VEELn",OBJ_TEXT,0,0,0);
				ObjectSet("B3VEELn",OBJPROP_COLOR,Yellow);
				ObjectSet("B3VEELn",OBJPROP_WIDTH,1);
				ObjectSet("B3VEELn",OBJPROP_STYLE,0);
			}
			ObjSetTxt("B3VEELn","              "+DTS(TPaF,Digits),-1,Yellow);
			ObjectSet("B3VEELn",OBJPROP_PRICE1,TPaF+2*Pip);
			ObjectSet("B3VEELn",OBJPROP_TIME1,Time[1]);
		}
		else if((!displayLines||EEpc==1||(!EEAllowLoss&&EEpc==0)||(EEHoursPC>0&&EEopt+EEStartHours*3600>=Time[0])))
		{	ObjDel("B3LEELn");
			ObjDel("B3VEELn");
		}
	}
	else
	{	TPaF=TPa;
		EETime=0;
		EECount=0;
		ObjDel("B3LEELn");
		ObjDel("B3VEELn");
	}

	if(MaximizeProfit)
	{	if(CbT==0)
		{	SLbL=0;
			Moves=0;
			SLb=0;
		}
		if(!FirstRun&&CbT>0)
		{	if(Pb+Ph<0&&SLb>0)SLb=0;
			if(SLb>0&&((nLots>0&&Bid<SLb)||(nLots<0&&Ask>SLb)))
			{	ExitTrades(A,displayColorProfit,"Profit Trailing Stop Reached ("+DTS(ProfitSet*100,2)+"%)");
				return;
			}
			if(PbTarget>0)
			{	double TPbMP=ND(BEa+(TPa-BEa)*ProfitSet,Digits);
				if((nLots>0&&Bid>TPbMP)||(nLots<0&&Ask<TPbMP))SLb=TPbMP;
			}
			if(SLb>0&&SLb>SLbL&&MoveTP>0&&TotalMoves>Moves)
			{	TPb=0;
				Moves++;
				if(Debug)Print("MoveTP");
				SLbL=SLb;
				if(PlaySounds)PlaySound(AlertSound);
				return;
			}
		}
	}
	if(!FirstRun&&TPaF>0)
	{	if((nLots>0&&Bid>=TPaF)||(nLots<0&&Ask<=TPaF))
		{	ExitTrades(A,displayColorProfit,"Profit Target Reached @ "+DTS(TPaF,Digits));
			return;
		}
	}
	if(!FirstRun&&UseStopLoss)
	{	double bSL;
		if(SLPips>0)
		{	if(nLots>0)
			{	bSL=BEa-SLPips;
				if(Bid<=bSL)
				{	ExitTrades(A,displayColorProfit,"Stop Loss Reached");
					return;
				}
			}
			else if(nLots<0)
			{	bSL=BEa+SLPips;
				if(Ask>=bSL)
				{	ExitTrades(A,displayColorProfit,"Stop Loss Reached");
					return;
				}
			}
		}
		if(TSLPips!=0)
		{	if(nLots>0)
			{	if(TSLPips>0&&Bid>BEa+TSLPips)bTS=MathMax(bTS,Bid-TSLPips);
				if(TSLPips<0&&Bid>BEa-TSLPips)bTS=MathMax(bTS,Bid-MathMax(TSLPipsMin,-TSLPips*(1-(Bid-BEa+TSLPips)/(-TSLPips*2))));
				if(bTS>0&&Bid<=bTS)
				{	ExitTrades(A,displayColorProfit,"Trailing Stop Reached");
					return;
				}
			}
			else if(nLots<0)
			{	if(TSLPips>0&&Ask<BEa-TSLPips)
				{	if(bTS>0)bTS=MathMin(bTS,Ask+TSLPips);
				   else bTS=Ask+TSLPips;
				}
				if(TSLPips<0&&Ask<BEa+TSLPips)bTS=MathMin(bTS,Ask+MathMax(TSLPipsMin,-TSLPips*(1-(BEa-Ask+TSLPips)/(-TSLPips*2))));
				if(bTS>0&&Ask>=bTS)
				{	ExitTrades(A,displayColorProfit,"Trailing Stop Reached");
					return;
				}
			}
		}
	}

	if(CbT==0&&!PendLot)
	{	PendLot=true;
		for(y=OrdersTotal()-1;y>=0;y--)
		{	if(!OrderSelect(y,SELECT_BY_POS,MODE_TRADES))continue;
			if(OrderMagicNumber()!=Magic||OrderType()<=OP_SELL)continue;
			if(OrderLots()>Lots[0]*LotMult)
			{	PendLot=false;
				while(IsTradeContextBusy())Sleep(100);
				if(IsStopped())return(-1);
				Success=OrderDelete(OrderTicket());
				if(Success)
				{	PendLot=true;
					if(Debug)Print("Delete pending > Lot");
				}
			}
		}
		return;
	}
	else if((CbT>0||(CbT==0&&CpT>0&&!B3Traditional))&&PendLot)
	{	PendLot=false;
		for(y=OrdersTotal()-1;y>=0;y--)
		{	if(!OrderSelect(y,SELECT_BY_POS,MODE_TRADES))continue;
			if(OrderMagicNumber()!=Magic||OrderType()<=OP_SELL)continue;
			if(OrderLots()==Lots[0]*LotMult)
			{	PendLot=true;
				while(IsTradeContextBusy())Sleep(100);
				if(IsStopped())return(-1);
				Success=OrderDelete(OrderTicket());
				if(Success)
				{	PendLot=false;
					if(Debug)Print("Delete pending = Lot");
				}
			}
		}
		return;
	}

	switch(ca)
	{	case B:  if(CbT==0&&CpT==0)ca=0;break;
		case H:  if(ChT==0)ca=0;break;
		case A:  if(CbT==0&&CpT==0&&ChT==0)ca=0;break;
		case P:  if(CpT==0)ca=0;break;
		case T:  break;
		default: break;
	}
	if(ca>0)
	{	ExitTrades(ca,displayColorLoss,"Close All ("+DTS(ca,0)+")");
		return;
	}
	if(CbT==0&&ChT>0)
	{	ExitTrades(H,displayColorLoss,"Basket Closed");
		return;
	}
	if(EmergencyCloseAll)
	{	ExitTrades(A,displayColorLoss,"Emergency Close All Trades");
		EmergencyCloseAll=false;
		return;
	}

	if(UseHolidayShutdown)
	{	if(HolShutDown>0&&TimeCurrent()>=HolLast&&HolLast>0)
		{	Print("Blessing has resumed after the holidays. From: "+TimeToStr(HolFirst,TIME_DATE)+" To: "+TimeToStr(HolLast,TIME_DATE));
			HolShutDown=0;
			LabelDelete();
			LabelCreate();
			if(PlaySounds)PlaySound(AlertSound);
		}
		if(HolShutDown==3)
		{	if(ObjectFind("B3LStop")==-1)
				CreateLabel("B3LStop","Trading has been stopped on this pair for the holidays.",10,0,0,3,displayColorLoss);
			if(ObjectFind("B3LResm")==-1)
				CreateLabel("B3LResm","Blessing will resume trading after "+TimeToStr(HolLast,TIME_DATE)+".",10,0,0,9,displayColorLoss);
			return;
		}
		else if((HolShutDown==0&&TimeCurrent()>=HolLast)||HolFirst==0)
		{	for(y=0;y<ArraySize(HolArray);y++)
			{	datetime TempHolFirst=StrToTime(Year()+"."+HolArray[y,0]+"."+HolArray[y,1]);
				datetime TempHolLast=StrToTime(Year()+"."+HolArray[y,2]+"."+HolArray[y,3]+" 23:59:59");
				if(TempHolFirst>TempHolLast)
				{	if(TimeCurrent()<TempHolLast)TempHolFirst=StrToTime(DTS(Year()-1,0)+"."+HolArray[y,0]+"."+HolArray[y,1]);
					else TempHolLast=StrToTime(DTS(Year()+1,0)+"."+HolArray[y,2]+"."+HolArray[y,3]+" 23:59:59");
				}
				if(TimeCurrent()<TempHolLast&&(TempHolLast<HolLast||HolLast==0))
				{	HolFirst=TempHolFirst;
					HolLast=TempHolLast;
				}
			}
			if(TimeCurrent()>=HolFirst&&TimeCurrent()<=HolLast)
			{	Comment("");
				HolShutDown=1;
			}
		}
		else if(HolShutDown==0&&TimeCurrent()>=HolFirst&&TimeCurrent()<HolLast)HolShutDown=1;
		if(HolShutDown==1&&CbT==0)
		{	Print("Blessing has shut down for the holidays. From: "+TimeToStr(HolFirst,TIME_DATE)+
					" To: "+TimeToStr(HolLast,TIME_DATE));
			if(CpT>0)
			{	y=ExitTrades(P,displayColorLoss,"Holiday Shutdown");
				if(y==CpT)ca=0;
			}
			HolShutDown=2;
			ObjDel("B3LClos");
		}
		else if(HolShutDown==1)
		{	if(ObjectFind("B3LClos")==-1)CreateLabel("B3LClos","",5,0,0,23,displayColorLoss);
			ObjSetTxt("B3LClos","Blessing will shutdown for the holidays when this basket closes",5);
		}
		if(HolShutDown==2)
		{	LabelDelete();
			if(PlaySounds)PlaySound(AlertSound);
			HolShutDown=3;
		}
		if(HolShutDown==3)
		{	if(ObjectFind("B3LStop")==-1)
				CreateLabel("B3LStop","Trading has been stopped on this pair for the holidays.",10,0,0,3,displayColorLoss);
			if(ObjectFind("B3LResm")==-1)
				CreateLabel("B3LResm","Blessing will resume trading after "+TimeToStr(HolLast,TIME_DATE)+".",10,0,0,9,displayColorLoss);
			Comment("");
			return;
		}
	}

	if(SetPOSL)
	{	if(UsePowerOutSL&&POSLPips>0)
		{	double POSL=MathMin(PortionBalance*(MaxDDPercent+1)/100/PipVal2/LbT,POSLPips);
			SLbB=ND(BEb-POSL,Digits);
			SLbS=ND(BEb+POSL,Digits);
		}
		else
		{	SLb

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

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

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

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

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

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

Стоимость полного кода
8 102,90₽ ≈ $99.05