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