Blessing 3 v3.9.6.09
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «blessing 3 v4.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Blessing 3 v3.9.6.09 — торговый советник для MetaTrader 4, реализующий сеточную торговлю с несколькими уровнями лотов. Советник анализирует ценовые данные с помощью технических индикаторов и размещает ордера в виде корзины или хеджа на коррелированных парах. Поддерживается автоматический расчёт размера сетки и уровней стоп-лосс/тейк-профит.
Входные сигналы формируются на основе скользящей средней, CCI, полос Боллинджера, стохастика и MACD. Можно использовать любую комбинацию индикаторов или требовать совпадение всех сигналов. Советник работает с корзиной ордеров, увеличивая лоты по сетке, и при достижении заданного уровня безубыточности переключается на закрытие позиций.
Присутствует функция хеджирования для защиты от просадки, управление рисками через процент потерь и стоп-торговлю, а также ранний выход из позиции с постепенным снижением целевой прибыли. Поддерживаются уведомления, сохранение статистики и отображение информационного overlay на графике.
Настройки программы
| Настройка | Описание |
|---|---|
| Version_3_9_6 | Версия — Текстовый заголовок, обозначающий версию настроек советника. |
| TradeComment | Комментарий сделки — Строка комментария, добавляемая к открываемым ордерам для идентификации. |
| EANumber | Номер EA — Уникальное число для идентификации экземпляра советника на счёте. |
| EmergencyCloseAll | Аварийное закрытие всех — При включении немедленно закрывает все открытые ордера. |
| LabelAcc | Метка настроек аккаунта — Разделитель группы настроек, связанных с аккаунтом. |
| ShutDown | Остановка — Останавливает торговлю после закрытия всех открытых ордеров. |
| StopTradePercent | Процент остановки торговли — Процент убытка от баланса, при достижении которого торговля прекращается. |
| PortionPC | Процент портфеля — Процент от баланса аккаунта, используемый для торговли на данной паре. |
| PortionChange | Изменение доли — Разрешает или запрещает изменение доли при открытой корзине. |
| MaxDDPercent | Максимальный процент просадки — Порог максимальной допустимой просадки в процентах. |
| MaxSpread | Максимальный спред — Максимально допустимый спред в пунктах для размещения ордеров. |
| UseHolidayShutdown | Использовать остановку на праздники — Включает автоматическую остановку торговли в указанные праздничные даты. |
| Holidays | Праздники — Список праздничных периодов в формате день/месяц-день/месяц через запятую. |
| PlaySounds | Воспроизведение звуков — Включает или отключает звуковые оповещения о событиях. |
| AlertSound | Звук оповещения — Имя файла звука для воспроизведения при событиях советника. |
| LabelIES | Метка настроек индикаторов и входов — Разделитель группы настроек индикаторов и входов в рынок. |
| B3Traditional | Традиционный режим B3 — Определяет режим работы: стоп-лимиты при true или покупки/продажи при false. |
| ForceMarketCond | Принудительное состояние рынка — Принудительно задаёт состояние рынка: 0 — восходящий, 1 — нисходящий, 2 — диапазон, 3 — выкл. |
| UseAnyEntry | Использовать любой вход — При true достаточно одного сигнала индикатора для входа, при false требуются все. |
| MAEntry | Вход по MA — 0 — выкл, 1 — вход на основе канала MA, 2 — торговля в обратном направлении. |
| CCIEntry | Вход по CCI — 0 — выкл, 1 — вход на основе CCI, 2 — торговля в обратном направлении. |
| BollingerEntry | Вход по Боллинджеру — 0 — выкл, 1 — вход на основе полос Боллинджера, 2 — обратная торговля. |
| StochEntry | Вход по стохастику — 0 — выкл, 1 — вход на основе стохастика, 2 — обратная торговля. |
| MACDEntry | Вход по MACD — 0 — выкл, 1 — вход на основе MACD, 2 — обратная торговля. |
| LabelLS | Метка настроек размера лота — Разделитель группы настроек размера лота. |
| UseMM | Использовать управление рисками — Включает автоматический расчёт размера лота на основе баланса и риска. |
| LAF | Коэффициент размера лота — Множитель для базового размера лота при больших аккаунтах. |
| Lot | Базовый лот — Начальный размер лота при отключённом управлении рисками. |
| Multiplier | Множитель — Множитель увеличения лота на каждом уровне сетки. |
| LabelGS | Метка настроек сетки — Разделитель группы настроек сетки. |
| AutoCal | Автоматический расчёт — Включает автоматический расчёт сетки и уровней стоп-лосс/тейк-профит на основе ATR. |
| LabelATRTFr | Таймфрейм для ATR — Выбор таймфрейма для расчёта ATR: 0 — график, 1 — M1 и т.д. |
| ATRTF | Таймфрейм ATR — Таймфрейм для расчёта ATR в числовом формате. |
| ATRPeriods | Период ATR — Количество периодов для расчёта ATR. |
| GAF | Коэффициент сетки — Множитель для расширения или сжатия шага сетки. |
| EntryDelay | Задержка входа — Задержка в секундах между размещением ордеров сетки. |
| EntryOffset | Смещение входа — Смещение первого ордера в пипсах от текущей цены. |
| UseSmartGrid | Использовать умную сетку — При true использует RSI и MA для определения направления следующего ордера сетки. |
| LabelTS | Метка торговых настроек — Разделитель группы торговых настроек. |
| MaxTrades | Максимум сделок — Максимальное количество ордеров в корзине, при достижении которого новые ордера не размещаются. |
| BreakEvenTrade | Сделка безубыточности — Количество сделок, при достижении которого активируется переход на безубыточность. |
| BEPlusPips | Пипсы выше безубыточности — Количество пипсов, добавляемых к уровню безубыточности для закрытия. |
| UseCloseOldest | Закрывать самую старую — При true закрывает самую старую сделку при достижении заданного уровня. |
| CloseTradesLevel | Уровень закрытия сделок — Количество сделок, при достижении которого начинается закрытие самых старых. |
| ForceCloseOldest | Принудительное закрытие старых — При true закрывает самую старую сделку независимо от наличия прибыли. |
| MaxCloseTrades | Максимум закрываемых сделок — Максимальное количество сделок, закрываемых за один раз. |
| CloseTPPips | Пипсы тейк-профита при закрытии — Отклонение тейк-профита от безубыточности после закрытия старых сделок. |
| ForceTPPips | Принудительные пипсы ТП — Фиксированное отклонение тейк-профита от безубыточности. |
| MinTPPips | Минимальные пипсы ТП — Гарантированное минимальное отклонение тейк-профита от безубыточности. |
| LabelHS | Метка настроек хеджа — Разделитель группы настроек хеджирования. |
| HedgeSymbol | Символ хеджа — Тикет коррелированной пары для хеджирования. |
| CorrPeriod | Период корреляции — Количество дней для проверки корреляции между парами. |
| UseHedge | Использовать хедж — Включает или отключает функцию хеджирования при просадке. |
| DDorLevel | DD или уровень — Определяет триггер хеджа по просадке или по уровню сделок. |
| HedgeStart | Начало хеджа — Процент просадки или уровень сделок, при котором запускается хедж. |
| hLotMult | Множитель лота хеджа — Множитель размера лота хеджа относительно открытого лота. |
| hMaxLossPips | Макс. убыток хеджа в пипсах — Максимальный допустимый убыток хеджа в пипсах. |
| hFixedSL | Фиксированный стоп хеджа — При true использует фиксированный стоп-лосс для хеджа. |
| hTakeProfit | Тейк-профит хеджа — Уровень прибыли в пипсах для закрытия хедж-ордеров. |
| hReEntryPC | Процент повторного входа хеджа — Процент, увеличивающий порог для повторного входа хеджа. |
| StopTrailAtBE | Стоп-трейл на безубыточности — При true останавливает трейлинг-стоп на уровне безубыточности. |
| ReduceTrailStop | Снижающийся стоп-трейл — При true трейлинг-стоп уменьшается после достижения безубыточности. |
| LabelES | Метка настроек выхода — Разделитель группы настроек выхода из позиции. |
| MaximizeProfit | Максимизация прибыли — Включает перемещение тейк-профита и трейлинг-стоп для максимизации прибыли. |
| ProfitSet | Установка прибыли — Процент от потенциальной прибыли, при котором фиксируется часть прибыли. |
| MoveTP | Перемещение ТП — Размер перемещения тейк-профита в пипсах при срабатывании. |
| TotalMoves | Общее количество перемещений — Максимальное количество перемещений тейк-профита. |
| UseStopLoss | Использовать стоп-лосс — Включает фиксированный стоп-лосс и/или трейлинг-стоп-лосс. |
| SLPips | Пипсы стоп-лосса — Расстояние стоп-лосса от безубыточности в пипсах. |
| TSLPips | Пипсы трейлинг-стопа — Расстояние трейлинг-стопа от безубыточности в пипсах. |
| TSLPipsMin | Минимум пипсов трейлинг-стопа — Минимальное расстояние трейлинг-стопа при использовании уменьшающегося режима. |
| UsePowerOutSL | Использовать стоп-лосс при отключении — При true устанавливает стоп-лосс при потере связи с сервером. |
| POSLPips | Пипсы стоп-лосса при отключении — Расстояние стоп-лосса в пипсах при срабатывании защиты от отключения. |
| UseFIFO | Использовать FIFO — При true закрывает сделки в порядке FIFO (первым пришёл — первым закрыт). |
| LabelEE | Метка настроек раннего выхода — Разделитель группы настроек раннего выхода. |
| UseEarlyExit | Использовать ранний выход — Включает постепенное снижение целевой прибыли со временем и по уровням. |
| EEStartHours | Часы начала раннего выхода — Количество часов ожидания перед началом снижения цели по времени. |
| EEFirstTrade | Первый торг для раннего выхода — При true отсчёт начинается от первой сделки, при false — от последней. |
| EEHoursPC | Процент снижения в час — Процент снижения целевой прибыли за каждый час. |
| EEStartLevel | Уровень начала раннего выхода — Количество открытых сделок, при котором начинается снижение цели по уровням. |
| EELevelPC | Процент снижения на уровне — Процент снижения целевой прибыли на каждом дополнительном уровне. |
| EEAllowLoss | Разрешить убыток при раннем выходе — При true позволяет закрыть корзину с убытком, при false минимум — безубыточность. |
| LabelAdv | Метка расширенных настроек — Разделитель для предупреждения о расширенных настройках. |
| LabelGrid | Метка настроек сетки — Разделитель группы настроек размера сетки. |
| SetCountArray | Массив количества сделок — Количество открытых сделок в каждом блоке, разделённое запятыми. |
| GridSetArray | Массив сетки — Расстояние в пипсах для лимитных ордеров каждого блока, разделённое запятыми. |
| TP_SetArray | Массив ТП — Тейк-профит для каждого блока, разделённый запятыми. |
| LabelMA | Метка настроек MA — Разделитель настроек входа по скользящей средней. |
| MAPeriod | Период MA — Период расчёта скользящей средней. |
| MADistance | Дистанция MA — Отклонение цены от MA в пипсах для определения диапазонного рынка. |
| LabelCCI | Метка настроек CCI — Разделитель настроек входа по CCI. |
| CCIPeriod | Период CCI — Период расчёта индикатора CCI. |
| LabelBBS | Метка настроек Боллинджера — Разделитель настроек входа по полосам Боллинджера. |
| BollPeriod | Период Боллинджера — Период расчёта полос Боллинджера. |
| BollDistance | Дистанция Боллинджера — Дополнительное расстояние от канала Боллинджера для входа в пипсах. |
| BollDeviation | Отклонение Боллинджера — Множитель стандартного отклонения для ширины канала Боллинджера. |
| LabelSto | Метка настроек стохастика — Разделитель настроек входа по стохастику. |
| BuySellStochZone | Зона стохастика — Уровень зоны перекупленности/перепроданности стохастика. |
| KPeriod | Период K стохастика — Период линии %K стохастика. |
| DPeriod | Период D стохастика — Период линии %D стохастика. |
Поиск по коду файла
#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 = "EA Settings:";
extern string TradeComment = "Blessing 3.9.6.09";
extern int EANumber = 1;
extern bool EmergencyCloseAll = false;
extern string LabelAcc = "Account Trading Settings:";
extern bool ShutDown = false;
extern double StopTradePercent = 10;
extern bool NanoAccount = false;
extern double PortionPC = 100;
extern int PortionChange = 1;
extern double MaxDDPercent = 50;
extern double MaxSpread = 5;
extern bool UseHolidayShutdown = true;
extern string Holidays = "18/12-01/01";
extern bool PlaySounds = false;
extern string AlertSound = "Alert.wav";
extern string LabelIES = "Indicator / Entry Settings:";
extern bool B3Traditional = true;
extern int ForceMarketCond = 3;
extern bool UseAnyEntry = false;
extern int MAEntry = 1;
extern int CCIEntry = 0;
extern int BollingerEntry = 0;
extern int StochEntry = 0;
extern int MACDEntry = 0;
extern string LabelLS = "Lot Size Settings:";
extern bool UseMM = true;
extern double LAF = 0.5;
extern double Lot = 0.01;
extern double Multiplier = 1.4;
extern string LabelGS = "Grid Settings:";
extern bool AutoCal = false;
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;
extern int ATRPeriods = 21;
extern double GAF = 1.0;
extern int EntryDelay = 2400;
extern double EntryOffset = 5;
extern bool UseSmartGrid = true;
extern string LabelTS = "Trading Settings:";
extern int MaxTrades = 15;
extern int BreakEvenTrade = 12;
extern double BEPlusPips = 2;
extern bool UseCloseOldest = false;
extern int CloseTradesLevel = 5;
extern bool ForceCloseOldest = true;
extern int MaxCloseTrades = 4;
extern double CloseTPPips = 10;
extern double ForceTPPips = 0;
extern double MinTPPips = 0;
extern string LabelHS = "Hedge Settings:";
extern string HedgeSymbol = "";
extern int CorrPeriod = 30;
extern bool UseHedge = false;
extern string DDorLevel = "DD";
extern double HedgeStart = 20;
extern double hLotMult = 0.8;
extern double hMaxLossPips = 30;
extern bool hFixedSL = false;
extern double hTakeProfit = 30;
extern double hReEntryPC = 5;
extern bool StopTrailAtBE = true;
extern bool ReduceTrailStop = true;
extern string LabelES = "Exit Settings:";
extern bool MaximizeProfit = false;
extern double ProfitSet = 70;
extern double MoveTP = 30;
extern int TotalMoves = 2;
extern bool UseStopLoss = false;
extern double SLPips = 30;
extern double TSLPips = 10;
extern double TSLPipsMin = 3;
extern bool UsePowerOutSL = false;
extern double POSLPips = 600;
extern bool UseFIFO = false;
extern string LabelEE = "Early Exit Settings:";
extern bool UseEarlyExit = false;
extern double EEStartHours = 3;
extern bool EEFirstTrade = true;
extern double EEHoursPC = 0.5;
extern int EEStartLevel = 5;
extern double EELevelPC = 10;
extern bool EEAllowLoss = false;
extern string LabelAdv = "Advanced Settings Change sparingly";
extern string LabelGrid = "Grid Size Settings:";
extern string SetCountArray = "4,4";
extern string GridSetArray = "25,50,100";
extern string TP_SetArray = "50,100,200";
extern string LabelMA = "MA Entry Settings:";
extern int MAPeriod = 100;
extern double MADistance = 10;
extern string LabelCCI = "CCI Entry Settings:";
extern int CCIPeriod = 14;
extern string LabelBBS = "Bollinger Bands Entry Settings:";
extern int BollPeriod = 10;
extern double BollDistance = 10;
extern double BollDeviation = 2.0;
extern string LabelSto = "Stochastic Entry Settings:";
extern int BuySellStochZone = 20;
extern int KPeriod = 10;
extern int DPeriod = 2;
extern int Slowing = 2;
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;
extern int FastPeriod = 12;
extern int SlowPeriod = 26;
extern int SignalPeriod = 9;
extern int MACDPrice = 0;
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;
extern int RSI_Period = 14;
extern int RSI_Price = 0;
extern int RSI_MA_Period = 10;
extern int RSI_MA_Method = 0;
extern string LabelOS = "Other Settings:";
extern bool RecoupClosedLoss = true;
extern int Level = 7;
extern int slip = 99;
extern bool SaveStats = false;
extern int StatsPeriod = 3600;
extern bool StatsInitialise = true;
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 = **;
extern string LabelDisplay = "Used to Adjust Overlay";
extern bool displayOverlay = true;
extern bool displayLogo = true;
extern bool displayCCI = true;
extern bool displayLines = true;
extern int displayXcord = 100;
extern int displayYcord = 22;
extern int displayCCIxCord = 10;
extern string displayFont = "Arial Bold";
extern int displayFontSize = 9;
extern int displaySpacing = 14;
extern double displayRatio = 1;
extern color displayColor = DeepSkyBlue;
extern color displayColorProfit = Green;
extern color displayColorLoss = Red;
extern color displayColorFGnd = White;
extern bool Debug = false;
extern string LabelOpt = "These values can only be used while optimizing";
extern bool UseGridOpt = false;
extern int SetArray1 = 4;
extern int SetArray2 = 4;
extern int SetArray3 = 0;
extern int SetArray4 = 0;
extern int GridArray1 = 25;
extern int GridArray2 = 50;
extern int GridArray3 = 100;
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,PortionBalance;
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,ASK,BID;
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;
PipVal2=MarketInfo(Symbol(),MODE_TICKVALUE)/MarketInfo(Symbol(),MODE_TICKSIZE);
PipValue=PipVal2*Pip;
StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
ASK=ND(MarketInfo(Symbol(),MODE_ASK),MarketInfo(Symbol(),MODE_DIGITS));
BID=ND(MarketInfo(Symbol(),MODE_BID),MarketInfo(Symbol(),MODE_DIGITS));
if(ASK==0||BID==0)return(0);
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(0);
}
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(0);
}
else
{ LDelete=false;
ObjDel("B3LStop");
ObjDel("B3LExpt");
ObjDel("B3LResm");
}
double NewPortionBalance=ND(AccountBalance()*PortionPC,2);
if(CbT==0||PortionChange<0||(PortionChange>0&&NewPortionBalance>PortionBalance))PortionBalance=NewPortionBalance;
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(0);
}
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(0);
}
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(0);
}
}
}
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)+") ";
}
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)+") ";
}
sCalcTP=(sCalcTP+"Sell: TakeProfit: ");
}
if(TPb!=NewTP)
{ TPb=NewTP;
if(nLots>0)TargetPips=ND(TPb-BEb,Digits);
else TargetPips=ND(BEb-TPb,Digits);
Print(sCalcTP+DTS(NewTP,Digits));
return(0);
}
}
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(0);
}
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(0);
}
}
}
if(!FirstRun&&TPaF>0)
{ if((nLots>0&&BID>=TPaF)||(nLots<0&&ASK<=TPaF))
{ ExitTrades(A,displayColorProfit,"Profit Target Reached @ "+DTS(TPaF,Digits));
return(0);
}
}
if(!FirstRun&&UseStopLoss)
{ double bSL;
if(SLPips>0)
{ if(nLots>0)
{ bSL=BEa-SLPips;
if(BID<=bSL)
{ ExitTrades(A,displayColorProfit,"Stop Loss Reached");
return(0);
}
}
else if(nLots<0)
{ bSL=BEa+SLPips;
if(ASK>=bSL)
{ ExitTrades(A,displayColorProfit,"Stop Loss Reached");
return(0);
}
}
}
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(0);
}
}
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(0);
}
}
}
}
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(ND(OrderLots(),LotDecimal)>ND(Lots[0]*LotMult,LotDecimal))
{ PendLot=false;
while(IsTradeContextBusy())Sleep(100);
if(IsStopped())return(-1);
Success=OrderDelete(OrderTicket());
if(Success)
{ PendLot=true;
if(Debug)Print("Delete pending > Lot");
}
}
}
return(0);
}
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(ND(OrderLots(),LotDecimal)==ND(Lots[0]*LotMult,LotDecimal))
{ PendLot=true;
while(IsTradeContextBusy())Sleep(100);
if(IsStopped())return(-1);
Success=OrderDelete(OrderTicket());
if(Success)
{ PendLot=false;
if(Debug)Print("Delete pending = Lot");
}
}
}
return(0);
}
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(0);
}
if(CbT==0&&ChT>0)
{ ExitTrades(H,displayColorLoss,"Basket Closed");
return(0);
}
if(EmergencyCloseAll)
{ ExitTrades(A,displayColorLoss,"Emergency Close All Trades");
EmergencyCloseAll=false;
return(0);
}
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(0);
}
else if((HolShutDown==0&&TimeCurrent()>=HolLast)||HolFirst==0)
{ for(y=0;y<ArraySize(HolArray);y++)
{ HolFirst=StrToTime(Year()+"."+HolArray[y,0]+"."+HolArray[y,1]);
HolLast=StrToTime(Year()+"."+HolArray[y,2]+"."+HolArray[y,3]+" 23:59:59");
if(TimeCurrent()<HolFirst)
{ if(HolFirst>HolLast)HolLast=StrToTime(DTS(Year()+1,0)+"."+HolArray[y,2]+"."+HolArray[y,3]+" 23:59:59");
break;
}
if(TimeCurrent()<HolLast)
{ if(HolFirst>HolLast)HolFirst=StrToTime(DTS(Year()-1,0)+"."+HolArray[y,0]+"."+HolArray[y,1]);
break;
}
if(TimeCurrent()>HolFirst&&HolFirst>HolLast)
{ HolLast=StrToTime(DTS(Year()+1,0)+"."+HolArray[y,2]+"."+HolArray[y,3]+" 23:59:59");
if(TimeCurrent()<HolLast)break;
}
}
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(0);
}
}
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
{ SLbB=0;
SLbS=0;
}
for(y=0;y<OrdersTotal();y++)
{ if(!OrderSelect(y,SELECT_BY_POS,MODE_TRADES))continue;
if(OrderMagicNumber()!=Magic||OrderSymbol()!=Symbol()||OrderType()>OP_SELL)continue;
if(OrderType()==OP_BUY&&OrderStopLoss()!=SLbB)
{ Success=ModifyOrder(OrderOpenPrice(),SLbB,Purple);
if(Debug&&Success)Print("Order: "+OrderTicket()+" Sync POSL Buy");
}
else if(OrderType()==OP_SELL&&OrderStopLoss()!=SLbS)
{ Success=ModifyOrder(OrderOpenPrice(),SLbS,Purple);
if(Debug&&Success)Print("Order: "+OrderTicket()+" Sync POSL Sell");
}
}
}
if(MAEntry>0&&CbT==0&&CpT<2)
{ if(BID>ima_0+MADistance&&(!B3Traditional||(B3Traditional&&Trend!=2)))
{ if(MAEntry==1)
{ if(ForceMarketCond!=1&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&BuyMe)))BuyMe=true;
else BuyMe=false;
if(!UseAnyEntry&&IndEntry>0&&SellMe&&(!B3Traditional||(B3Traditional&&Trend!=2)))SellMe=false;
}
else if(MAEntry==2)
{ if(ForceMarketCond!=0&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&SellMe)))SellMe=true;
else SellMe=false;
if(!UseAnyEntry&&IndEntry>0&&BuyMe&&(!B3Traditional||(B3Traditional&&Trend!=2)))BuyMe=false;
}
}
else if(ASK<ima_0-MADistance&&(!B3Traditional||(B3Traditional&&Trend!=2)))
{ if(MAEntry==1)
{ if(ForceMarketCond!=0&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&SellMe)))SellMe=true;
else SellMe=false;
if(!UseAnyEntry&&IndEntry>0&&BuyMe&&(!B3Traditional||(B3Traditional&&Trend!=2)))BuyMe=false;
}
else if(MAEntry==2)
{ if(ForceMarketCond!=1&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&BuyMe)))BuyMe=true;
else BuyMe=false;
if(!UseAnyEntry&&IndEntry>0&&SellMe&&(!B3Traditional||(B3Traditional&&Trend!=2)))SellMe=false;
}
}
else if(B3Traditional&&Trend==2)
{ if(ForceMarketCond!=1&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&BuyMe)))BuyMe=true;
if(ForceMarketCond!=0&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&SellMe)))SellMe=true;
}
else
{ BuyMe=false;
SellMe=false;
}
if(IndEntry>0)IndicatorUsed=IndicatorUsed+UAE;
IndEntry++;
IndicatorUsed=IndicatorUsed+" MA ";
}
if(CCIEntry>0)
{ double cci_01=iCCI(Symbol(),PERIOD_M5,CCIPeriod,PRICE_CLOSE,0);
double cci_02=iCCI(Symbol(),PERIOD_M15,CCIPeriod,PRICE_CLOSE,0);
double cci_03=iCCI(Symbol(),PERIOD_M30,CCIPeriod,PRICE_CLOSE,0);
double cci_04=iCCI(Symbol(),PERIOD_H1,CCIPeriod,PRICE_CLOSE,0);
double cci_11=iCCI(Symbol(),PERIOD_M5,CCIPeriod,PRICE_CLOSE,1);
double cci_12=iCCI(Symbol(),PERIOD_M15,CCIPeriod,PRICE_CLOSE,1);
double cci_13=iCCI(Symbol(),PERIOD_M30,CCIPeriod,PRICE_CLOSE,1);
double cci_14=iCCI(Symbol(),PERIOD_H1,CCIPeriod,PRICE_CLOSE,1);
}
if(CCIEntry>0&&CbT==0&&CpT<2)
{ if(cci_11>0&&cci_12>0&&cci_13>0&&cci_14>0&&cci_01>0&&cci_02>0&&cci_03>0&&cci_04>0)
{ if(ForceMarketCond==3)Trend=0;
if(CCIEntry==1)
{ if(ForceMarketCond!=1&&(UseAnyEntry||IndEntry==0||(!UseAnyEntry&&IndEntry>0&&BuyMe)))BuyMe=true;
else BuyMe=false;
if(!UseAnyEntry&&IndEntry>0&&SellMe&&(!B3Traditional||(B3Traditional&&Trend!=2)))SellMe=false;
}
else if(CCIEntry==2)
{ if(ForceMarketCond!=0&&(UseAnyEntry||IndEntry==0||(!UseAnyEntrПоказано первые 50% кода (символов: 76637)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.