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