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

BlessingLite 3

blessinglite-gamma.mq4

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

blessing_3_v3_9_6.mq4MQL4 / MetaTrader 4 · 4 общих тегов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 3 v3.9.6.34 gamma — это торговый советник для MetaTrader 4, предназначенный для мультивалютной торговли корзинами ордеров. Советник работает по тиковой модели, обрабатывая событие OnTick, и поддерживает одновременное сопровождение до 28 валютных пар по умолчанию либо собственного списка, задаваемого пользователем. Логика построена на сеточном подходе: после первого входа советник выставляет отложенные ордера на заданном расстоянии, увеличивая объём позиции согласно множителю, и управляет корзиной как единым целым.

Для входа в рынок могут использоваться несколько технических индикаторов: скользящая средняя, CCI, полосы Боллинджера, стохастик и MACD. Каждый индикатор можно отключить, включить в прямом направлении или инвертировать. Режим UseAnyEntry позволяет открывать ордера при срабатывании любого из включённых сигналов, тогда как по умолчанию требуется совпадение всех активных условий. Управление корзиной включает расчёт точки безубыточности, автоматическую корректировку тейк-профита, ранний выход с постепенным снижением целевой прибыли, трейлинг-стоп по прибыли и защиту от просадки.

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

Программа предназначена для работы на реальных и тестовых счетах MetaTrader 4 и не даёт гарантий доходности. Все параметры задаются через входные переменные советника.

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

НастройкаОписание
Version_3_9_6_34_gamma Текстовая метка с названием версии советника.
TradeComment Комментарий, добавляемый к торговым ордерам советника.
Notes Произвольный текст заметок пользователя, не влияющий на работу советника.
EANumber Уникальный идентификатор (магическое число) советника для различения его ордеров.
UseDefaultPairs Использовать стандартный набор из 28 валютных пар вместо собственного списка.
OwnPairs Список валютных пар, разделённых запятыми, для торговли вместо стандартного набора.
Debug Включает вывод отладочной информации в журнал.
EmergencyCloseAll Немедленно закрывает все открытые позиции и удаляет отложенные ордера советника.
s1 Текстовая метка-разделитель между группами настроек.
ShutDown Запрещает открытие новых сделок, не закрывая уже существующие позиции.
s2 Текстовая метка-разделитель между группами настроек.
LabelAcc Текстовая метка-разделитель для группы настроек счёта.
StopTradePercent Процент потери баланса, при достижении которого торговля останавливается.
PortionPC Процент от баланса счёта, выделяемый для торговли по данной паре.
PortionChange Разрешает изменение выделенной части счёта при открытой корзине: без изменений, только увеличение или увеличение и уменьшение.
MaxDDPercent Процент от выделенной части счёта, при котором достигается максимальный уровень просадки.
MaxSpread Максимально допустимый спред в пунктах при выставлении ордеров.
UseHolidayShutdown Включает приостановку торговли в заданные праздничные периоды.
Holidays Список праздничных периодов в формате день/месяц-день/месяц, разделённых запятыми, во время которых торговля приостанавливается.
PlaySounds Включает воспроизведение звуковых оповещений при событиях советника.
AlertSound Имя звукового файла, воспроизводимого при срабатывании уведомлений.
eopb Текстовая метка-разделитель для группы настроек, оптимизированных для режима 'только цены открытия'.
EnableOncePerBar Ограничивает выполнение некоторых проверок одним разом на бар.
UseMinMarginPercent Включает проверку минимального уровня маржи перед открытием новых сделок.
MinMarginPercent Минимальный уровень маржи в процентах, ниже которого новые сделки не открываются.
eopb1 Текстовая метка-разделитель, завершающая группу настроек режима открытия.
B3Traditional Определяет способ входа: при включении используются стоп- и лимит-ордера, при отключении — рыночные покупки и продажи.
UseAnyEntry Определяет условие входа: при включении достаточно любого сигнала, при отключении требуется совпадение всех активных сигналов.
LabelLS Текстовая метка-разделитель для группы настроек размера лота.
UseMM Включает управление капиталом для автоматического расчёта размера лота.
LAF Коэффициент корректировки базового лота для крупных счетов при использовании управления капиталом.
Lot Начальный размер лота при отключённом управлении капиталом.
Multiplier Множитель объёма лота на каждом последующем уровне сетки.
LabelGS Текстовая метка-разделитель для группы настроек сетки.
AutoCal Включает автоматический расчёт размера сетки и тейк-профита на основе ATR вместо использования фиксированных значений.
ATRTF Таймфрейм, на котором рассчитывается ATR для автоматической калибровки сетки.
ATRPeriods Количество периодов для расчёта ATR при автоматическом определении размера сетки и тейк-профита.
GAF Коэффициент, расширяющий или сужающий размер сетки с шагом 0.1.
EntryDelay Минимальный интервал в секундах между выставлением новых уровней сетки для предотвращения частых входов на быстром рынке.
EntryOffset Смещение в пунктах, применяемое к цене первого входа.
UseSmartGrid Использует расчёт RSI и скользящей средней для определения момента выставления следующего ордера сетки.
LabelTS Текстовая метка-разделитель для группы торговых настроек.
MaxTrades Максимальное количество сделок в корзине; при достижении этого числа новые ордера не выставляются.
BreakEvenTrade Уровень корзины, при достижении которого все позиции закрываются по безубытку, не дожидаясь тейк-профита.
BEPlusPips Количество пунктов, добавляемых к точке безубыточности перед закрытием корзины по безубытку.
UseCloseOldest Включает закрытие старейшей открытой сделки после достижения заданного уровня корзины.
CloseTradesLevel Уровень корзины, при достижении которого начинается закрытие старейших открытых сделок.
ForceCloseOldest Принудительно закрывает старейшую сделку независимо от наличия потенциальной прибыли.
MaxCloseTrades Максимальное количество старейших сделок, которые могут быть закрыты.
CloseTPPips Количество пунктов для принудительной установки тейк-профита относительно безубытка после закрытия старейших сделок.
ForceTPPips Принудительно устанавливает тейк-профит на заданном расстоянии в пунктах от безубытка.
MinTPPips Минимальное расстояние в пунктах от безубытка, на котором устанавливается тейк-профит.
LabelES Текстовая метка-разделитель для группы настроек выходов.
MaximizeProfit Включает функцию перемещения тейк-профита и трейлинг-стопа по прибыли.
ProfitSet Процент от потенциальной общей прибыли, при котором срабатывает трейлинг-стоп по прибыли.
MoveTP Величина в пунктах, на которую перемещается тейк-профит при максимизации прибыли.
TotalMoves Максимальное количество перемещений тейк-профита при максимизации прибыли.
UseStopLoss Включает использование стоп-лосса и/или трейлинг-стоп-лосса.
SLPips Количество пунктов для фиксированного стоп-лосса от точки безубытка; 0 отключает.
TSLPips Количество пунктов для трейлинг-стопа от точки безубытка; положительное значение — фиксированный трейлинг, отрицательное — уменьшающийся, 0 отключает.
TSLPipsMin Минимальное количество пунктов трейлинг-стопа при использовании уменьшающегося трейлинга.
UsePowerOutSL Устанавливает защитный стоп-лосс на случай потери связи с сервером.
POSLPips Расстояние в пунктах для защитного стоп-лосса, устанавливаемого на случай потери связи.
UseFIFO Закрывать сделки в порядке FIFO (первым открыт — первым закрыт).
LabelEE Текстовая метка-разделитель для группы настроек раннего выхода.
UseEarlyExit Включает функцию раннего выхода, постепенно снижающую целевую прибыль в зависимости от времени и количества открытых уровней.
EEStartHours Количество часов ожидания перед началом снижения целевой прибыли по времени.
EEFirstTrade Определяет точку отсчёта времени для раннего выхода: от первой сделки или от последней сделки.
EEHoursPC Процент снижения целевой прибыли за каждый час после начала раннего выхода.
EEStartLevel Количество открытых сделок, при котором начинается снижение целевой прибыли по уровням.
EELevelPC Процент снижения целевой прибыли на каждом уровне открытых сделок при раннем выходе.
EEAllowLoss Разрешает закрытие корзины с убытком при раннем выходе; при отключении минимальная прибыль равна безубытку.
LabelAdv Текстовая метка-разделитель дополнительных настроек.
LabelGrid Текстовая метка-разделитель для группы настроек размера сетки.
SetCountArray Список количества открытых сделок в каждом блоке сетки, разделённых запятыми.
GridSetArray Список расстояний в пунктах до выставления лимитных ордеров для каждого блока сетки, разделённых запятыми.
TP_SetArray Список значений тейк-профита в пунктах для каждого блока сетки, разделённых запятыми.
LabelEST0 Текстовая метка-разделитель перед группой настроек входа.
LabelEST Текстовая метка-разделитель для группы настроек входа.
LabelMA Текстовая метка-разделитель для группы настроек скользящей средней.
MAEntry Режим использования сигналов скользящей средней для входа: отключено, включено или инвертировано.
MAPeriod Период расчёта скользящей средней.
MADistance Расстояние в пунктах от скользящей средней, при котором рынок считается боковым.
LabelCCI Текстовая метка-разделитель для группы настроек CCI.
CCIEntry Режим использования сигналов CCI для входа: отключено, включено или инвертировано.
CCIPeriod Период расчёта индикатора CCI.
LabelBBS Текстовая метка-разделитель для группы настроек полос Боллинджера.
BollingerEntry Режим использования сигналов полос Боллинджера для входа: отключено, включено или инвертировано.
BollPeriod Период расчёта полос Боллинджера.
BollDistance Дополнительное расстояние в пунктах от границ полос Боллинджера для формирования сигнала входа.
BollDeviation Множитель стандартного отклонения для построения канала полос Боллинджера.
LabelSto Текстовая метка-разделитель для группы настроек стохастика.
StochEntry Режим использования сигналов стохастика для входа: отключено, включено или инвертировано.
BuySellStochZone Значение, определяющее границы зон перекупленности и перепроданности для стохастика.
KPeriod Период K для расчёта стохастика.
DPeriod Период D для расчёта стохастика.
Slowing Параметр замедления для расчёта стохастика.
LabelMACD Текстовая метка-разделитель для группы настроек MACD.
MACDEntry Режим использования сигналов MACD для входа: отключено, включено или инвертировано.
MACD_TF Таймфрейм для расчёта индикатора MACD.
Получить полный код

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

#property version   "396.34"
#property strict

#include <stdlib.mqh>
#include <stderror.mqh>
#include <WinUser32.mqh>
#include <ChartObjects\ChartObjectsTxtControls.mqh>

#define A 1                     //All (Basket of all pairs)
#define B 2                     //Basket
#define T 4                     //Ticket
#define P 5                     //Pending

enum portChgs
  {
   no_change = 0,              // No changes
   increase = 1,               // Increase only
   any = -1,                   // Increase / decrease
  };

enum entType
  {
   disable = 0,                // Disabled
   enable = 1,                 // Enabled
   reverse = 2                 // Reverse
  };

enum tFrame
  {
   current = 0,                // Current
   m1 = 1,                     // M1
   m5 = 2,                     // M5
   m15 = 3,                    // M15
   m30 = 4,                    // M30
   h1 = 5,                     // H1
   h4 = 6,                     // H4
   d1 = 7,                     // Daily
   w1 = 8,                     // Weekly
   mn1 = 9                     // Monthly
  };

input string Version_3_9_6_34_gamma = "EA Settings:";
input string TradeComment = "BlessingLite 3.9.6.34 gamma";
input string Notes = "";
input int EANumber = 1681348112;         // EA Magic Number
input bool   UseDefaultPairs = true; // Use the default 28 pairs
input string OwnPairs = ""; // Comma separated own pair list

input bool Debug = false;

input bool EmergencyCloseAll = false;   // *** CLOSE ALL NOW ***

input string s1 = "";           //.
input bool ShutDown = false;    // *** NO NEW TRADES ***
input string s2 = "";           //.

input string LabelAcc = "";     // ==   ACCOUNT SETTINGS   ==
input double StopTradePercent = 10;    // Percentage of balance lost before trading stops

input bool NanoAccount = false;        // Small Lot Account (0.01)
input double PortionPC = 100;  // Percentage of account you want to trade (on this pair) -->divided by Numer of Pairs?
input portChgs PortionChange = increase;       // Permitted Portion change with open basket

input double MaxDDPercent = 90;        // Percent of portion for max drawdown level.
input double MaxSpread = 10;    // Maximum allowed spread while placing trades
input bool UseHolidayShutdown = false;  // Enable holiday shut-downs
input string Holidays = "18/12-01/01"; // Comma-separated holiday list (format: [day]/[mth]-[day]/[mth])
input bool PlaySounds = false; // Audible alerts
input string AlertSound = "Alert.wav"; // Alert sound

input string eopb = "";         // -- Opt. with 'Open prices only' --

input bool EnableOncePerBar = true;
input bool UseMinMarginPercent = false;
input double MinMarginPercent = 1500;
input string eopb1 = "";        //. 

input bool B3Traditional = true;       // Stop/Limits for entry if true, Buys/Sells if false

input bool UseAnyEntry = false;        // true = ANY entry can be used to open orders, false = ALL entries used to open orders

input string LabelLS = "";      // -----------   LOT SIZE   -----------
input bool UseMM = false;        // UseMM   (Money Management)
input double LAF = 0.5;        // Adjusts MM base lot for large accounts
input double Lot = 0.01;       // Starting lots if Money Management is off
input double Multiplier = 3.0; // Multiplier on each level

input string LabelGS = "";      // ------     GRID SETTINGS    ------
input bool AutoCal = false;    // Auto calculation of TakeProfit and Grid size;
input tFrame ATRTF = 0;        // TimeFrame for ATR calculation
input int ATRPeriods = 5;     // Number of periods for the ATR calculation
input double GAF = 1.1;        // Widens/Squishes Grid in increments/decrements of .1
input int EntryDelay = 1200;   // Time Grid in seconds, avoid opening lots of levels in fast market
input double EntryOffset = 0;  // In pips, used in conjunction with logic to offset first trade entry
input bool UseSmartGrid = false;        // True = use RSI/MA calculation for next grid order

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

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

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

input string LabelAdv = "";     //.
input string LabelGrid = "";    // ---------    GRID SIZE   ---------
input string SetCountArray = "3,2,2,2";    // Specifies number of open trades in each block (separated by a comma)
input string GridSetArray = "55,100,115,160";       // Specifies number of pips away to issue limit order (separated by a comma)
input string TP_SetArray = "10,15,15,15";       // Take profit for each block (separated by a comma)

input string LabelEST0 = "";    // .
input string LabelEST = "";     // ==  ENTRY PARAMETERS  ==
input string LabelMA = "";      // -------------     MA     -------------
input entType MAEntry = 0;     // MA Entry
input int MAPeriod = 100;      // Period of MA (H4 = 100, H1 = 400)
input double MADistance = 10;  // Distance from MA to be treated as Ranging Market

input string LabelCCI = "";     // -------------     CCI     -------------
input entType CCIEntry = 0;    // CCI Entry
input int CCIPeriod = 14;      // Period for CCI calculation

input string LabelBBS = "";     // -----   BOLLINGER BANDS   -----
input entType BollingerEntry = 1;      // Bollinger Entry
input int BollPeriod = 20;     // Period for Bollinger
input double BollDistance = -1;        // Up/Down spread
input double BollDeviation = 3.0;      // Standard deviation multiplier for channel

input string LabelSto = "";     // ---------   STOCHASTIC   --------
input entType StochEntry = 0;  // Stochastic Entry
input int BuySellStochZone = 20;       // Determines Overbought and Oversold Zones
input int KPeriod = 10;        // Stochastic KPeriod
input int DPeriod = 2;         // Stochastic DPeriod
input int Slowing = 2;         // Stochastic Slowing

input string LabelMACD = "";    //  ------------    MACD    ------------
input entType MACDEntry = 0;   // MACD Entry
input tFrame MACD_TF = 0;      // Time frame for MACD calculation

input int FastPeriod = 12;     // MACD EMA Fast Period
input int SlowPeriod = 26;     // MACD EMA Slow Period
input int SignalPeriod = 9;    // MACD EMA Signal Period
input ENUM_APPLIED_PRICE MACDPrice = PRICE_CLOSE;        // MACD Applied Price

input string LabelSG = "";      // ---------   SMART GRID   ---------
input tFrame RSI_TF = 3;       // Timeframe for RSI calculation (should be lower than chart TF)
input int RSI_Period = 14;     // Period for RSI calculation
input ENUM_APPLIED_PRICE RSI_Price = PRICE_CLOSE;        // RSI Applied Price

input int RSI_MA_Period = 10;  // Period for MA of RSI calculation
input ENUM_MA_METHOD RSI_MA_Method = MODE_SMA;        // RSI MA Method

input string LabelOS0 = "";     //.
input string LabelOS = "";      // ------------   OTHER   -----------
input bool RecoupClosedLoss = true;    // true = Recoup any CloseOldest losses: false = Use original profit target.
input int Level = 7;           // Largest Assumed Basket size.  Lower number = higher start lots
int slip = 99;
input bool SaveStats = false;  // true = will save equity statistics
input int StatsPeriod = 3600;  // seconds between stats entries - off by default
input bool StatsInitialise = true;     // true for backtest - false for forward/live to ACCUMULATE equity traces

input string LabelUE = "";      // ------------   EMAIL   ------------
input bool UseEmail = false;
input string LabelEDD = "At what DD% would you like Email warnings (Max: 49, Disable: 0)?";     //.
input double EmailDD1 = **;
input double EmailDD2 = **;
input double EmailDD3 = **;

input string LabelEH = "Hours before DD timer resets";  //.
input double EmailHours = **;  // Minimum number of hours between emails

string LabelDisplay = ""; // ------------   DISPLAY   -----------

bool displayOverlay = true;      // Enable display
bool displayLogo = true; // Display copyright and icon
string displayFont = "Courier Bold";        //Display font
int displayFontSize = 9; // Changes size of display characters
int displaySpacing = 14; // Changes space between lines

color displayColorProfit = Green;        // default color of profit display characters
color displayColorLoss = Red;    // default color of loss display characters
color displayColorFGnd = White;  // default color of ForeGround Text display characters

string DefaultPairs[] = {"AUDCAD","AUDCHF","AUDJPY","AUDNZD","AUDUSD","CADCHF","CADJPY","CHFJPY","EURAUD","EURCAD","EURCHF","EURGBP","EURJPY","EURNZD","EURUSD","GBPAUD","GBPCAD","GBPCHF","GBPJPY","GBPNZD","GBPUSD","NZDCAD","NZDCHF","NZDJPY","NZDUSD","USDCAD","USDCHF","USDJPY"};
string TradePairs[];

int Magic;
int AccountType;

double StopTradeBalance;
bool Testing, Visual;
bool AllowTrading;
bool EmergencyWarning;
int Error;

int ca; //close all type

int Set1Level, Set2Level, Set3Level, Set4Level;
int EmailCount;
string sTF;
datetime EmailSent;

int GridArray[, 2];

string CS, UAE;
int HolShutDown;

int HolArray[, 4];
datetime HolFirst, HolLast, NextStats;
int Digit[, 2], TF[10] = { 0, 1, 5, 15, 30, 60, 240, 1440, 10080, 43200 };
double InitialAB;               // Initial Account Balance --> global variable?
double Email[3];
double  StatLowEquity, StatHighEquity;
datetime EETime;
int  EECount, FileHandle;
bool FileClosed, FirstRun, dLabels;
string FileName, ID, StatFile;

bool checkResult;

string suffix="";
string prefix="";

struct pairinf
  {
   int               CbB;                // Count buy
   int               CbS;                // Count sell
   int               CpBL;               // Count buy limit
   int               CpSL;               // Count sell limit
   int               CpBS;               // Count buy stop
   int               CpSS;               // Count sell stop
   double            LbB;             // Count buy lots
   double            LbS;             // Count sell lots

   double            OPpBL;           // Buy limit open price
   double            OPpSL;           // Sell limit open price
   double            SLbB;            // stop losses are set to zero if POSL off
   double            SLbS;            // stop losses are set to zero if POSL off
   double            BCb, BCa;       // Broker costs (swap + commission)
   double            ProfitPot;       // The Potential Profit of a basket of Trades
   double            PipValue, PipVal2, ASK, BID;
   double            OrderLot;
   double            OPbL;  // last open price
   datetime          OTbL;          // last open time
   datetime          OTbO;
   double            g2, tp2, Entry, RSI_MA, OPbO;
   int               Ticket, IndEntry, TbO;
   double            Pb, PaC, PbPips, PbTarget, DrawDownPC, BEb, BEa;
   bool              TradesOpen, BuyMe, SellMe, Success, SetPOSL;
   string            IndicatorUsed;
   double            EEpc, OPbN, nLots;
   double            bSL, TPa, TPbMP;
   int               Trend;
   string            ATrend;
   double            cci_01, cci_02, cci_03, cci_04;
   double            cci_11, cci_12, cci_13, cci_14;
   double            StopLevel;
   datetime          OTbF;
   int               CaL, CbC, TbF;
   double            bTS, TPb, LbF, PbC, ClosedPips;
   int               CbT, CpT;              // Count basket Total,Count pending Total
   double            PbMax, PbMin, PortionBalance, MaxDD, MaxDDPer;
   int               LotDecimal, MinMult, LotMult;
   double            Lots[];
   double            RSI[];
   double            TargetPips;
   double            SLbL;                    // Stop Loss basket Last
   double            SLb;                     // Stop Loss
   int               Moves;
   bool              PendLot;
   datetime          OncePerBarTime;
   double            Pip;
   double            MoveTP_;
   double            EntryOffset_;
   double            MADistance_;
   double            BollDistance_;
   double            POSLPips_;
   double            CloseTPPips_;
   double            ForceTPPips_;
   double            MinTPPips_;
   double            BEPlusPips_;
   double            SLPips_;
   double            TSLPips_;
   double            TSLPipsMin_;
   double            Lot_;
   double            MinLotSize, LotStep;
   double            GridTP;

   double            BCaL, BEbL;
  };
pairinf pairinfo[];

int EANumber_;
double StopTradePercent_;
double ProfitSet_;
double EEHoursPC_;
double EELevelPC_;
double PortionPC_;
bool Debug_; //okay

entType MAEntry_;
entType CCIEntry_;
entType BollingerEntry_;
entType StochEntry_;
entType MACDEntry_;

int MaxCloseTrades_;
double Multiplier_;
string SetCountArray_;
string GridSetArray_;
string TP_SetArray_;
bool EmergencyCloseAll_;
bool ShutDown_;

double LbT = 0;                 // total lots out
double previous_stop_trade_amount;
double stop_trade_amount;

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

void OnDeinit(const int reason)
  {
   switch(reason)
     {
      case REASON_REMOVE:
      case REASON_CHARTCLOSE:
      case REASON_CHARTCHANGE:

      for (int Index=0;Index<ArraySize(TradePairs);Index++){
         if(pairinfo[Index].CpT > 0)
           {
            while(pairinfo[Index].CpT > 0)
               pairinfo[Index].CpT -= ExitTrades(P, displayColorLoss, "Blessing Removed",0,ca,TradePairs[Index]+suffix);
           }
      }
         GlobalVariablesDeleteAll(ID);
      case REASON_RECOMPILE:
      case REASON_PARAMETERS:
      case REASON_ACCOUNT:;

         Comment("Reason:"+IntegerToString(reason));

     }

   return;
  }

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

int DoStart()

{	if (Debug_) printf("!!!!!!!!!!!!!!!!!!!start!!!!!!!!!!!!");

      if(UseHolidayShutdown)
        {
         if(HolShutDown > 0 && TimeCurrent() >= HolLast && HolLast > 0)
           {
            Print("Trading has resumed after the ", TimeToStr(HolFirst, TIME_DATE), " - ", TimeToStr(HolLast, TIME_DATE), " holidays.");
            HolShutDown = 0;

            if(PlaySounds)
               PlaySound(AlertSound);
           }

         if(HolShutDown == 3)
           {

            return (0);
           }
         else
            if((HolShutDown == 0 && TimeCurrent() >= HolLast) || HolFirst == 0)
              {
               for(int Index = 0; Index < ArraySize(HolArray); Index++)
                 {

                  string tts = (string) Year() + "." + (string) HolArray[Index, 0] + "." + (string) HolArray[Index, 1];
                  Print("tts: " + tts + "  *******************************************************");
                  HolFirst = StrToTime(tts);

                  HolLast = StrToTime((string) Year() + "." + (string) HolArray[Index, 2] + "." + (string) HolArray[Index, 3] + " 23:59:59");

                  if(TimeCurrent() < HolFirst)
                    {
                     if(HolFirst > HolLast)
                        HolLast = StrToTime(DTS(Year() + 1, 0) + "." + (string) HolArray[Index, 2] + "." + (string) HolArray[Index, 3] + " 23:59:59");

                     break;
                    }

                  if(TimeCurrent() < HolLast)
                    {
                     if(HolFirst > HolLast)
                        HolFirst = StrToTime(DTS(Year() - 1, 0) + "." + (string) HolArray[Index, 0] + "." + (string) HolArray[Index, 1]);

                     break;
                    }

                  if(TimeCurrent() > HolFirst && HolFirst > HolLast)
                    {
                     HolLast = StrToTime(DTS(Year() + 1, 0) + "." + (string) HolArray[Index, 2] + "." + (string) HolArray[Index, 3] + " 23:59:59");

                     if(TimeCurrent() < HolLast)
                        break;
                    }
                 }

               if(TimeCurrent() >= HolFirst && TimeCurrent() <= HolLast)
                 {

                  HolShutDown = 1;
                 }
              }
            else
               if(HolShutDown == 0 && TimeCurrent() >= HolFirst && TimeCurrent() < HolLast)
                  HolShutDown = 1;
         }

   for(int i=0;i<ArraySize(TradePairs);i++){

if (Debug_)   printf("TradePair:"+IntegerToString(i)+TradePairs[i]+suffix);
if (Debug_)   Print("MinLotSize: ", DTS(pairinfo[i].MinLotSize, 2), " LotStep: ", DTS(pairinfo[i].LotStep, 2), " MinLot: ", DTS(MathMin(pairinfo[i].MinLotSize, pairinfo[i].LotStep), 2), " StartLot: ", DTS(pairinfo[i].Lot_, 2), " LotMult: ", DTS(pairinfo[i].LotMult, 0), " Lot Decimal: ", DTS(pairinfo[i].LotDecimal, 0));

   pairinfo[i].CbB          =0;     // Count buy
 	pairinfo[i].CbS          =0;     // Count sell
 	pairinfo[i].CpBL         =0;     // Count buy limit
  	pairinfo[i].CpSL         =0;     // Count sell limit
	pairinfo[i].CpBS         =0;     // Count buy stop
	pairinfo[i].CpSS         =0;     // Count sell stop
	pairinfo[i].LbB          =0;     // Count buy lots
	pairinfo[i].LbS          =0;     // Count sell lots
	pairinfo[i].OPpBL        =0;     // Buy limit open price
	pairinfo[i].OPpSL        =0;     // Sell limit open price
	pairinfo[i].SLbB         =0;     // stop losses are set to zero if POSL off
	pairinfo[i].SLbS         =0;     // stop losses are set to zero if POSL off
	pairinfo[i].ProfitPot    =0;     // The Potential Profit of a basket of Trades
 	pairinfo[i].BCb          =0;
	pairinfo[i].BCa          =0;       // Broker costs (swap + commission)
	pairinfo[i].OPbL = 0;
	pairinfo[i].OTbL = 0;          // last open time
	pairinfo[i].OTbO = 0;
	pairinfo[i].RSI_MA = 0;
	pairinfo[i].OPbO = 0;
	pairinfo[i].Ticket = 0;
	pairinfo[i].IndEntry = 0;
	pairinfo[i].TbO = 0;
	pairinfo[i].Pb = 0;
	pairinfo[i].PaC = 0;
	pairinfo[i].PbPips = 0;	
	pairinfo[i].PbTarget = 0;
	pairinfo[i].DrawDownPC = 0;
	pairinfo[i].BEb = 0;
	pairinfo[i].BEa = 0;
	pairinfo[i].BuyMe = false; 
	pairinfo[i].SellMe = false;
	pairinfo[i].EEpc = 0;
	pairinfo[i].OPbN = 0;
	pairinfo[i].nLots = 0;
	pairinfo[i].bSL = 0;
	pairinfo[i].TPa = 0;
	pairinfo[i].TPbMP = 0;
	pairinfo[i].Trend = 0;
	pairinfo[i].cci_01 = 0;
	pairinfo[i].cci_02 = 0;
	pairinfo[i].cci_03 = 0;
	pairinfo[i].cci_04 = 0;
	pairinfo[i].cci_11 = 0;
	pairinfo[i].cci_12 = 0;
	pairinfo[i].cci_13 = 0;
	pairinfo[i].cci_14 = 0;

   if (MarketInfo(TradePairs[i]+suffix, MODE_TICKSIZE) !=0) pairinfo[i].PipVal2 = MarketInfo(TradePairs[i]+suffix, MODE_TICKVALUE) / MarketInfo(TradePairs[i]+suffix, MODE_TICKSIZE);
   else printf("No MarketInfo for "+TradePairs[i]+suffix+DoubleToStr(MarketInfo(TradePairs[i]+suffix,MODE_TICKSIZE)));
   pairinfo[i].PipValue = pairinfo[i].PipVal2 * pairinfo[i].Pip;
   pairinfo[i].StopLevel = MarketInfo(TradePairs[i]+suffix, MODE_STOPLEVEL) * Point;
   pairinfo[i].ASK = ND(MarketInfo(TradePairs[i]+suffix, MODE_ASK), (int) MarketInfo(TradePairs[i]+suffix, MODE_DIGITS));
   pairinfo[i].BID = ND(MarketInfo(TradePairs[i]+suffix, MODE_BID), (int) MarketInfo(TradePairs[i]+suffix, MODE_DIGITS));

   if(pairinfo[i].ASK == 0 || pairinfo[i].BID == 0)
      return (0);

   for(int Order = 0; Order < OrdersTotal(); Order++)
     {
      if(!OrderSelect(Order, SELECT_BY_POS, MODE_TRADES))
         continue;

      int Type = OrderType();

      if(OrderMagicNumber() != Magic || OrderSymbol() != TradePairs[i]+suffix)
         continue;

      if(OrderTakeProfit() > 0)
         ModifyOrder(OrderOpenPrice(), OrderStopLoss(),0,i);

      if(Type <= OP_SELL)
        {
         pairinfo[i].Pb += OrderProfit();
         pairinfo[i].BCb += OrderSwap() + OrderCommission();
         pairinfo[i].BEb += OrderLots() * OrderOpenPrice();

         if(OrderOpenTime() >= pairinfo[i].OTbL)
           {
            pairinfo[i].OTbL = OrderOpenTime();
            pairinfo[i].OPbL = OrderOpenPrice();
           }

         if(OrderOpenTime() < pairinfo[i].OTbF || pairinfo[i].TbF == 0)
           {
            pairinfo[i].OTbF = OrderOpenTime();
            pairinfo[i].TbF = OrderTicket();
            pairinfo[i].LbF = OrderLots();
           }

         if(OrderOpenTime() < pairinfo[i].OTbO || pairinfo[i].OTbO == 0)
           {
            pairinfo[i].OTbO = OrderOpenTime();
            pairinfo[i].TbO = OrderTicket();
            pairinfo[i].OPbO = OrderOpenPrice();
           }

         if(UsePowerOutSL && ((pairinfo[i].POSLPips_ > 0 && OrderStopLoss() == 0) || (pairinfo[i].POSLPips_ == 0 && OrderStopLoss() > 0)))
            pairinfo[i].SetPOSL = true;

         if(Type == OP_BUY)
           {
            pairinfo[i].CbB++;
            pairinfo[i].LbB += OrderLots();
            continue;
           }
         else
           {
            pairinfo[i].CbS++;
            pairinfo[i].LbS += OrderLots();
            continue;
           }
        }
      else
        {
         if(Type == OP_BUYLIMIT)
           {
            pairinfo[i].CpBL++;
            pairinfo[i].OPpBL = OrderOpenPrice();
            continue;
           }
         else
            if(Type == OP_SELLLIMIT)
              {
               pairinfo[i].CpSL++;
               pairinfo[i].OPpSL = OrderOpenPrice();
               continue;
              }
            else
               if(Type == OP_BUYSTOP)
                  pairinfo[i].CpBS++;
               else
                  pairinfo[i].CpSS++;
        }
     }

   pairinfo[i].CbT = pairinfo[i].CbB + pairinfo[i].CbS;
   LbT = pairinfo[i].LbB + pairinfo[i].LbS;
   pairinfo[i].Pb = ND(pairinfo[i].Pb + pairinfo[i].BCb, 2);
   pairinfo[i].CpT = pairinfo[i].CpBL + pairinfo[i].CpSL + pairinfo[i].CpBS + pairinfo[i].CpSS;
   pairinfo[i].BCa = pairinfo[i].BCb;

   if(LbT > 0)
     {
      pairinfo[i].BEb = ND(pairinfo[i].BEb / LbT, Digits);

      if(pairinfo[i].BCa < 0)
         pairinfo[i].BEb -= ND(pairinfo[i].BCa / pairinfo[i].PipVal2 / (pairinfo[i].LbB - pairinfo[i].LbS), Digits);

      if(pairinfo[i].Pb > pairinfo[i].PbMax || pairinfo[i].PbMax == 0)
         pairinfo[i].PbMax = pairinfo[i].Pb;

      if(pairinfo[i].Pb < pairinfo[i].PbMin || pairinfo[i].PbMin == 0)
         pairinfo[i].PbMin = pairinfo[i].Pb;

      if(!pairinfo[i].TradesOpen)
        {
         FileHandle = FileOpen(FileName, FILE_BIN | FILE_WRITE);

         if(FileHandle > -1)
           {
            FileWriteInteger(FileHandle, pairinfo[i].TbF);
            FileClose(FileHandle);
            pairinfo[i].TradesOpen = true;

            if(Debug_)
               Print(FileName, " File Written: ", pairinfo[i].TbF);
           }
        }
     }
   else
      if(pairinfo[i].TradesOpen)
        {
         pairinfo[i].TPb = 0;
         pairinfo[i].PbMax = 0;
         pairinfo[i].PbMin = 0;
         pairinfo[i].OTbF = 0; //wirklich Index???? oder alle Index?
         pairinfo[i].TbF = 0;
         pairinfo[i].LbF = 0;
         pairinfo[i].PbC = 0;
         pairinfo[i].PaC = 0;
         pairinfo[i].ClosedPips = 0;
         pairinfo[i].CbC = 0;
         pairinfo[i].CaL = 0;
         pairinfo[i].bTS = 0;

         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");

               pairinfo[i].TradesOpen = false;
              }
            else
               Print("Error ", Error, " {", ErrorDescription(Error), ") deleting file ", FileName);
           }
         else
            pairinfo[i].TradesOpen = false;
        }

   if(pairinfo[i].CbT == 0 && ShutDown_)
     {
      if(pairinfo[i].CpT > 0)
        {
         ExitTrades(P, displayColorLoss, "Blessing is shutting down",0,ca,"");
         return (0);
        }

      if(AllowTrading)
        {
         Print("Blessing has shut down. Set ShutDown = 'false' to resume trading");

         if(PlaySounds)
            PlaySound(AlertSound);

         AllowTrading = false;
        }

      if(UseEmail && EmailCount < 4 && !Testing)
        {
         SendMail("Blessing EA", "Blessing has shut down on " + TradePairs[i]+suffix + " " + sTF + ". To resume trading, change ShutDown to false.");
         Error = GetLastError();

         if(Error > 0)
            Print("Error ", Error, " (", ErrorDescription(Error), ") sending email");
         else
            EmailCount = *;
        }
     }

   double NewPortionBalance = ND(AccountBalance() * PortionPC_, 2);

   if(pairinfo[i].CbT == 0 || PortionChange < 0 || (PortionChange > 0 && NewPortionBalance > pairinfo[i].PortionBalance))
      pairinfo[i].PortionBalance = NewPortionBalance;

   if(OncePerBar(pairinfo[i].OncePerBarTime)&& (pairinfo[i].PortionBalance !=0))
     {
      if(pairinfo[i].Pb < 0)
         pairinfo[i].DrawDownPC = -(pairinfo[i].Pb) / pairinfo[i].PortionBalance;   // opb
      if(!FirstRun && pairinfo[i].DrawDownPC >= MaxDDPercent / 100)
        {
         ExitTrades(A, displayColorLoss, "Equity StopLoss Reached",0,ca,"");
         if(PlaySounds)
            PlaySound(AlertSound);
         return (0);
        }

      if(-(pairinfo[i].Pb) > pairinfo[i].MaxDD)
         pairinfo[i].MaxDD = -(pairinfo[i].Pb);

      pairinfo[i].MaxDDPer = MathMax(pairinfo[i].MaxDDPer, pairinfo[i].DrawDownPC * 100);

      if(SaveStats)
         Stats(false, TimeCurrent() < NextStats, pairinfo[i].PortionBalance, pairinfo[i].Pb);

      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_;
      stop_trade_amount = InitialAccountMultiPortion;

      if(pairinfo[i].PortionBalance < InitialAccountMultiPortion)
        {
         if(pairinfo[i].CbT == 0)
           {
            AllowTrading = false;

            if(PlaySounds)
               PlaySound(AlertSound);

            Print("Portion Balance dropped below stop-trading percentage");
            MessageBox("Reset required - account balance dropped below stop-trading percentage on " + DTS(AccountNumber(), 0) + " " + TradePairs[i]+suffix + " " + (string) Period(), "Blessing 3: Warning", 48);
            return (0);
           }
         else
            if(!ShutDown_ && !RecoupClosedLoss)
              {
               ShutDown_ = true;

               if(PlaySounds)
                  PlaySound(AlertSound);

               Print("Portion Balance dropped below stop-trading percentage");

               return (0);
              }
        }

      double ima_0 = iMA(TradePairs[i]+suffix, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);

         if(pairinfo[i].BID > ima_0 + pairinfo[i].MADistance_)
            pairinfo[i].Trend = 0;
         else
            if(pairinfo[i].ASK < ima_0 - pairinfo[i].MADistance_)
               pairinfo[i].Trend = 1;
            else
               pairinfo[i].Trend = 2;

      double Pa = pairinfo[i].Pb;
      pairinfo[i].PaC = pairinfo[i].PbC;

      if(LbT > 0)
        {
         if(pairinfo[i].PbC > 0 || (pairinfo[i].PbC < 0 && RecoupClosedLoss))
           {
            Pa += pairinfo[i].PbC;
            pairinfo[i].BEb -= ND(pairinfo[i].PbC / pairinfo[i].PipVal2 / (pairinfo[i].LbB - pairinfo[i].LbS), Digits);
           }         
        }

      if(UseCloseOldest && pairinfo[i].CbT >= CloseTradesLevel && pairinfo[i].CbC < MaxCloseTrades_)
        {
         if(!FirstRun && pairinfo[i].TPb > 0 && (ForceCloseOldest || (pairinfo[i].CbB > 0 && pairinfo[i].OPbO > pairinfo[i].TPb) || (pairinfo[i].CbS > 0 && pairinfo[i].OPbO < pairinfo[i].TPb)))
           {
            int Index = ExitTrades(T, DarkViolet, "Close Oldest Trade", pairinfo[i].TbO, ca,TradePairs[i]);

            if(Index == 1)
              {
               if(OrderSelect(pairinfo[i].TbO, SELECT_BY_TICKET))      // yoh check return
                 {
                  pairinfo[i].PbC += OrderProfit() + OrderSwap() + OrderCommission();
                  ca = 0;
                  pairinfo[i].CbC++;
                 }
               else
                  Print("OrderSelect error ", GetLastError());    // yoh

               return (0);
              }
           }
        }

      if(AutoCal)
        {
         double GridATR = iATR(TradePairs[i]+suffix, TF[ATRTF], ATRPeriods, 0) / pairinfo[i].Pip;

         if((pairinfo[i].CbT + pairinfo[i].CbC > Set4Level) && Set4Level > 0)
           {
            pairinfo[i].g2 = GridATR * 12;      //GS*2*2*2*1.5
            pairinfo[i].tp2 = GridATR * 18;     //GS*2*2*2*1.5*1.5
           }
         else
            if((pairinfo[i].CbT + pairinfo[i].CbC > Set3Level) && Set3Level > 0)
              {
               pairinfo[i].g2 = GridATR * 8;       //GS*2*2*2
               pairinfo[i].tp2 = GridATR * 12;     //GS*2*2*2*1.5
              }
            else
               if((pairinfo[i].CbT + pairinfo[i].CbC > Set2Level) && Set2Level > 0)
                 {
                  pairinfo[i].g2 = GridATR * 4;       //GS*2*2
                  pairinfo[i].tp2 = GridATR * 8;      //GS*2*2*2
                 }
               else
                  if((pairinfo[i].CbT + pairinfo[i].CbC > Set1Level) && Set1Level > 0)
                    {
                     pairinfo[i].g2 = GridATR * 2;       //GS*2
                     pairinfo[i].tp2 = GridATR * 4;      //GS*2*2
                    }
                  else
                    {
                     pairinfo[i].g2 = GridATR;
                     pairinfo[i].tp2 = GridATR * 2;
                    }

         pairinfo[i].GridTP = GridATR * 2;
        }
      else
        {
         int Index = (int) MathMax(MathMin(pairinfo[i].CbT + pairinfo[i].CbC, MaxTrades) - 1, 0);
         pairinfo[i].g2 = GridArray[Index, 0];
         pairinfo[i].tp2 = GridArray[Index, 1];
         pairinfo[i].GridTP = GridArray[0, 1];
        }

      pairinfo[i].g2 = ND(MathMax(pairinfo[i].g2 * GAF * pairinfo[i].Pip, pairinfo[i].Pip), Digits);
      pairinfo[i].tp2 = ND(pairinfo[i].tp2 * GAF * pairinfo[i].Pip, Digits);
      pairinfo[i].GridTP = ND(pairinfo[i].GridTP * GAF * pairinfo[i].Pip, Digits);

      if(UseMM)
        {
         if(pairinfo[i].CbT > 0)         // Count basket
           {
            if(GlobalVariableCheck(ID + "LotMult"))
               pairinfo[i].LotMult = (int) GlobalVariableGet(ID + "LotMult");

            if(pairinfo[i].LbF != LotSize(pairinfo[i].Lots[0] * pairinfo[i].LotMult,i,pairinfo[i].LotDecimal,pairinfo[i].MinLotSize))
              {
               pairinfo[i].LotMult = (int)(pairinfo[i].LbF / pairinfo[i].Lots[0]);
               GlobalVariableSet(ID + "LotMult", pairinfo[i].LotMult);
               Print("LotMult reset to " + DTS(pairinfo[i].LotMult, 0));
              }
           }
         else
            if(pairinfo[i].CbT == 0)
              {
               double Contracts, Factor, Lotsize;
               Contracts = pairinfo[i].PortionBalance / 10000;     // MarketInfo(TradePairs[i]+suffix, MODE_LOTSIZE); ??

               if(Multiplier_ <= 1)
                  Factor = Level;
               else
                  Factor = (MathPow(Multiplier_, Level) - Multiplier_) / (Multiplier_ - 1);

               Lotsize = LAF * AccountType * Contracts / (1 + Factor);
               pairinfo[i].LotMult = (int) MathMax(MathFloor(Lotsize / pairinfo[i].Lot_), pairinfo[i].MinMult);
               GlobalVariableSet(ID + "LotMult", pairinfo[i].LotMult);
              }
        }
      else
         if(pairinfo[i].CbT == 0)
            pairinfo[i].LotMult = pairinfo[i].MinMult;

      pairinfo[i].nLots = pairinfo[i].LbB - pairinfo[i].LbS;

      if(pairinfo[i].CbT > 0 && (pairinfo[i].TPb == 0 || pairinfo[i].CbT != pairinfo[i].CaL || pairinfo[i].BEbL != pairinfo[i].BEb || pairinfo[i].BCa != pairinfo[i].BCaL || FirstRun))
        {
         string sCalcTP = TradePairs[i]+"Set New TP:  BE: " + DTS(pairinfo[i].BEb, Digits);
         double NewTP = 0, BasePips=0; //set BasePips to Zero, don't know if this will have an impact
         pairinfo[i].CaL = pairinfo[i].CbT;
         pairinfo[i].BCaL = pairinfo[i].BCa;
         pairinfo[i].BEbL = pairinfo[i].BEb;
         if(pairinfo[i].nLots == 0)
           {
            pairinfo[i].nLots = 1;
           }                   // divide by zero error fix ... r.f.
         BasePips = ND(pairinfo[i].Lot_ * pairinfo[i].LotMult * pairinfo[i].GridTP * (pairinfo[i].CbT + pairinfo[i].CbC) / pairinfo[i].nLots, Digits);

         if(pairinfo[i].CbB > 0)
           {
            if(pairinfo[i].ForceTPPips_ > 0)
              {
               NewTP = pairinfo[i].BEb + pairinfo[i].ForceTPPips_;
               sCalcTP = sCalcTP + " +Force TP (" + DTS(pairinfo[i].ForceTPPips_, Digits) + ") ";
              }
            else
               if(pairinfo[i].CbC > 0 && pairinfo[i].CloseTPPips_ > 0)
                 {
                  NewTP = pairinfo[i].BEb + pairinfo[i].CloseTPPips_;
                  sCalcTP = sCalcTP + " +Close TP (" + DTS(pairinfo[i].CloseTPPips_, Digits) + ") ";
                 }
               else
                  if(pairinfo[i].BEb + BasePips > pairinfo[i].OPbL + pairinfo[i].tp2)
                    {
                     NewTP = pairinfo[i].BEb + BasePips;
                     sCalcTP = sCalcTP + " +Base TP: (" + DTS(BasePips, Digits) + ") ";
                    }
                  else
                    {
                     NewTP = pairinfo[i].OPbL + pairinfo[i].tp2;
                     sCalcTP = sCalcTP + " +Grid TP: (" + DTS(pairinfo[i].tp2, Digits) + ") ";
                    }

            if(pairinfo[i].MinTPPips_ > 0)
              {
               NewTP = MathMax(NewTP, pairinfo[i].BEb + pairinfo[i].MinTPPips_);
               sCalcTP = sCalcTP + " >Minimum TP: ";
              }

            NewTP += pairinfo[i].MoveTP_ * pairinfo[i].Moves;

            if(BreakEvenTrade > 0 && pairinfo[i].CbT + pairinfo[i].CbC >= BreakEvenTrade)
              {
               NewTP = pairinfo[i].BEb + pairinfo[i].BEPlusPips_;
               sCalcTP = sCalcTP + " >BreakEven: (" + DTS(pairinfo[i].BEPlusPips_, Digits) + ") ";
              }

            sCalcTP = (sCalcTP + "Buy: TakeProfit: ");
           }
         else
            if(pairinfo[i].CbS > 0)
              {
               if(pairinfo[i].ForceTPPips_ > 0)
                 {
                  NewTP = pairinfo[i].BEb - pairinfo[i].ForceTPPips_;
                  sCalcTP = sCalcTP + " -Force TP (" + DTS(pairinfo[i].ForceTPPips_, Digits) + ") ";
                 }
               else
                  if(pairinfo[i].CbC > 0 && pairinfo[i].CloseTPPips_ > 0)
                    {
                     NewTP = pairinfo[i].BEb - pairinfo[i].CloseTPPips_;
                     sCalcTP = sCalcTP + " -Close TP (" + DTS(pairinfo[i].CloseTPPips_, Digits) + ") ";
                    }
                  else
                     if(pairinfo[i].BEb + BasePips < pairinfo[i].OPbL - pairinfo[i].tp2)
                       {
                        NewTP = pairinfo[i].BEb + BasePips;
                        sCalcTP = sCalcTP + " -Base TP: (" + DTS(BasePips, Digits) + ") ";
                       }
                     else
                       {
                        NewTP = pairinfo[i].OPbL - pairinfo[i].tp2;
                        sCalcTP = sCalcTP + " -Grid TP: (" + DTS(pairinfo[i].tp2, Digits) + ") ";
                       }

               if(pairinfo[i].MinTPPips_ > 0)
                 {
                  NewTP = MathMin(NewTP, pairinfo[i].BEb - pairinfo[i].MinTPPips_);
                  sCalcTP = sCalcTP + " >Minimum TP: ";
                 }

               NewTP -= pairinfo[i].MoveTP_ * pairinfo[i].Moves;

               if(BreakEvenTrade > 0 && pairinfo[i].CbT + pairinfo[i].CbC >= BreakEvenTrade)
                 {
                  NewTP = pairinfo[i].BEb - pairinfo[i].BEPlusPips_;
                  sCalcTP = sCalcTP + " >BreakEven: (" + DTS(pairinfo[i].BEPlusPips_, Digits) + ") ";
                 }

               sCalcTP = (sCalcTP + "Sell: TakeProfit: ");
              }

         if(pairinfo[i].TPb != NewTP)
           {
            pairinfo[i].TPb = NewTP;

            if(pairinfo[i].nLots > 0)
               pairinfo[i].TargetPips = ND(pairinfo[i].TPb - pairinfo[i].BEb, Digits);
            else
               pairinfo[i].TargetPips = ND(pairinfo[i].BEb - pairinfo[i].TPb, Digits);

            Print(sCalcTP + DTS(NewTP, Digits));

            return (0);
           }
        }

      pairinfo[i].PbTarget = pairinfo[i].TargetPips / pairinfo[i].Pip;
      pairinfo[i].ProfitPot = ND(pairinfo[i].TargetPips * pairinfo[i].PipVal2 * MathAbs(pairinfo[i].nLots), 2);

      if(pairinfo[i].CbB > 0)
         pairinfo[i].PbPips = ND((pairinfo[i].BID - pairinfo[i].BEb) / pairinfo[i].Pip, 1);

      if(pairinfo[i].CbS > 0)
         pairinfo[i].PbPips = ND((pairinfo[i].BEb - pairinfo[i].ASK) / pairinfo[i].Pip, 1);

         pairinfo[i].BEa = pairinfo[i].BEb;
         pairinfo[i].TPa = pairinfo[i].TPb;

      double EEStartTime = 0, TPaF;

      if(UseEarlyExit && pairinfo[i].CbT > 0)
        {
         datetime EEopt;

         if(EEFirstTrade)
            EEopt = pairinfo[i].OTbF;
         else
        

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

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

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

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

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

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

Стоимость полного кода
7 363₽ ≈ $89.99