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

Multi purpose trade manager

multi purpose trade manager.mq4

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

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 1 общих теговsma crossover scalper ea for mt4.mq4MQL4 / MetaTrader 4 · 1 общих теговr15 pivot points expert advisor by @fundedmillionairess.mq4MQL4 / MetaTrader 4 · 1 общих теговnewstrader.mq5MQL5 / MetaTrader 5 · 1 общих теговmm3.0_flip_codepro_v3.1_with_cooldown@lifeindreamsworld.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Multi purpose trade manager — это советник для MetaTrader 4, предназначенный для управления уже открытыми торговыми позициями и отложенными ордерами. Он не открывает сделки по собственной торговой стратегии, а применяет к выбранным ордерам набор функций сопровождения: перевод в безубыток, частичное закрытие, прыгающий стоп, обычный и свечной трейлинг, добавление отсутствующих стоп-лосса и тейк-профита, а также скрытые стоп-лосс и тейк-профит. Отбор ордеров для управления выполняется по магическому номеру, комментарию, номеру тикета, текущему инструменту, заданному списку пар или по всем сделкам счёта.

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

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

Исходный код содержит внешние зависимости: библиотеку hgi_lib.ex4 и системную библиотеку user32.dll, используемую для отключения экспертов. Советник предназначен для опытных пользователей, понимающих риски автоматического управления открытыми позициями.

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

НастройкаОписание
gen Заголовок раздела настроек таймера событий.
Set the event timer in seconds. (SetTimerToSeconds) Устанавливает таймер событий в секундах.
Seconds in between calculation loops (EventTimerSeconds) Интервал таймера в секундах между циклами расчёта.
Set the event timer in milliseconds. (SetTimerToMilliSeconds) Устанавливает таймер событий в миллисекундах.
Milliseconds in between calculation loops. Default = half a second (EventTimerMilliSeconds) Интервал таймера в миллисекундах между циклами расчёта; по умолчанию половина секунды.
sep1 Разделитель раздела настроек.
ManagementStyle1 Заголовок раздела выбора стиля управления.
ManagementStyle2 Пояснение, что можно выбрать несколько вариантов управления.
Manage trades by magic number, (ManageByMagicNumber) Управлять сделками с указанным магическим номером.
so long as they have this Magic Number. (MagicNumber) Магический номер, по которому отбираются сделки для управления.
Manage trades by order comment, (ManageByTradeComment) Управлять сделками с указанным комментарием ордера.
so long as they have this comment. (TradeComment) Комментарий ордера, по которому отбираются сделки для управления.
Manage a specific trade by trade ticket number, (ManageByTickeNumber) Управлять одной конкретной сделкой по номеру тикета.
and this is the ticket number to manage. (TicketNumber) Номер тикета сделки, которой нужно управлять.
OverRide Пояснение, что управление только текущей парой перекрывает предыдущие настройки.
OverRide2 Пояснение, что управление текущей парой можно комбинировать с другими вариантами.
Manage only this pair. (ManageThisPairOnly) Управлять только сделками по текущему инструменту графика.
Manage the pairs specified in the next input. (ManageSpecifiedPairs) Управлять парами, перечисленными в следующем параметре.
Enter the pairs you want to manage here, separated by a comma. (PairsToManage) Список инструментов для управления, разделённых запятыми.
OverRide1 Пояснение, что управление всеми сделками перекрывает остальные варианты.
Manage all pairs traded on the account. (ManageAllTrades) Управлять всеми сделками на счёте; перекрывает остальные режимы отбора.
I am using Rene's News event monitor EA. (UseReneMonitor) Указывает, что используется внешний монитор новостей Rene; при наличии его глобальной переменной советник не выполняет действий.
b60 Разделитель раздела настроек.
trh Заголовок раздела настроек времени управления.
tr1 Пояснение, что tradingHours — это список времени начала и окончания, разделённый запятыми.
tr1a Пояснение, что список содержит время начала и окончания.
tr2 Пояснение, что время начала указывается с префиксом '+', а окончания — с '-'.
tr2a Пояснение использовать 24-часовой формат местного времени.
tr3 Пример формата ввода торговых часов.
tr3a Пояснение не оставлять пробелы в строке торговых часов.
tr4 Пояснение, что пустое значение означает круглосуточное управление.
tradingHours Список интервалов времени управления в формате начала и окончания, разделённых запятыми.
bl1 Разделитель раздела настроек.
ManagementFacilities Заголовок раздела выбора функций управления.
slf Заголовок раздела управления стоп-лоссом и тейк-профитом.
BE Заголовок раздела настроек безубытка.
Use Break Even. (UseBreakEven) Включает перевод стоп-лосса в безубыток.
Pips to break even. (BreakEvenPips) Количество пунктов прибыли, при достижении которого стоп-лосс переводится в безубыток.
Pips profit to lock in. (BreakEvenProfitPips) Количество пунктов прибыли, которое фиксируется при переводе в безубыток.
atrb Заголовок раздела настроек безубытка по ATR.
UseAtrBE Использовать ATR для расчёта уровня безубытка.
AtrTimeFrameBE Таймфрейм индикатора ATR для расчёта безубытка.
AtrPeriodBE Период индикатора ATR для расчёта безубытка.
Candle shift defaulting to now. (AtrShiftBE) Сдвиг свечи для расчёта ATR безубытка; по умолчанию используется текущая свеча.
z3 Заголовок раздела частичного закрытия при безубытке.
pcbe Пояснение, что настройки частичного закрытия используются вместе с безубытком.
pcbe1 Пояснение, что частичное закрытие применяется вместе с прыгающим стопом.
Allow partial trade closure at break even. (UsePartClose) Разрешает частичное закрытие сделки при достижении безубытка.
Fraction of the trade lots to close. (Close_LotsFract) Доля объёма сделки, закрываемая при частичном закрытии.
z2 Разделитель раздела настроек.
JSL Заголовок раздела настроек прыгающего стоп-лосса.
Use a jumping stop loss. (UseJumpingStop) Включает прыгающий стоп-лосс.
Jump in this pips increment. (JumpingStopPips) Шаг в пунктах, на который перемещается прыгающий стоп-лосс.
Only jump after break even has been achieved. (JumpAfterBreakevenOnly) Выполнять прыжок стоп-лосса только после достижения безубытка.
z4 Разделитель раздела настроек.
TSL Заголовок раздела настроек трейлинг-стопа.
Only trail after break even has been achieved. (TrailAfterBreakevenOnly) Выполнять трейлинг только после достижения безубытка.
Use a standard trail. (UseStandardTrail) Включает стандартный трейлинг-стоп.
Number of pips to trail. (TrailingStopPips) Количество пунктов для стандартного трейлинг-стопа.
z5 Разделитель раздела настроек.
Use a candlestick trailing stop (UseCandlestickTrail) Включает свечной трейлинг-стоп.
Candlestick time frame (CandlestickTrailTimeFrame) Таймфрейм для расчёта свечного трейлинг-стопа.
How many candles back to trail the stop. (CandleShift) Количество свечей назад для расчёта уровня свечного трейлинг-стопа.
z9 Разделитель раздела настроек.
MSLA Заголовок раздела добавления отсутствующего стоп-лосса.
Add a stop loss to trades that do not have one. (AddMissingStopLoss) Включает добавление стоп-лосса к сделкам, у которых он отсутствует.
Stop loss size in pips. (MissingStopLossPips) Размер добавляемого стоп-лосса в пунктах.
Use ATR to calculate the stop loss. (UseSlAtr) Использовать ATR для расчёта размера стоп-лосса.
ATR stop loss period. (AtrSlPeriod) Период индикатора ATR для расчёта стоп-лосса.
ATR stop loss time frame. (AtrSlTimeFrame) Таймфрейм индикатора ATR для расчёта стоп-лосса.
ATR stop loss multiplier. (AtrSlMultiplier) Множитель ATR при расчёте размера стоп-лосса.
z9a Разделитель раздела настроек.
hsl Заголовок раздела настроек скрытого стоп-лосса.
Hide your stop loss from the broker. (UseHiddenStopLoss) Включает скрытый стоп-лосс, не выставляемый брокеру.
'Real' pips stop loss. (HiddenStopLossPips) Размер скрытого стоп-лосса в пунктах.
z10 Разделитель раздела настроек.
tpi Заголовок раздела настроек тейк-профита.
MTPA Заголовок раздела добавления отсутствующего тейк-профита.
Add a take profit to trades that do not have one. (AddMissingTakeProfit) Включает добавление тейк-профита к сделкам, у которых он отсутствует.
Take profit size in pips. (MissingTakeProfitPips) Размер добавляемого тейк-профита в пунктах.
Use ATR to calculate the take profit. (UseTpAtr) Использовать ATR для расчёта размера тейк-профита.
ATR stop loss period. (AtrTpPeriod) Период индикатора ATR для расчёта тейк-профита.
ATR take profit time frame. (AtrTpTimeFrame) Таймфрейм индикатора ATR для расчёта тейк-профита.
ATR take profit multiplier. (AtrTpMultiplier) Множитель ATR при расчёте размера тейк-профита.
htp Заголовок раздела настроек скрытого тейк-профита.
Hide your take profit from the broker. (UseHiddenTakeProfit) Включает скрытый тейк-профит, не выставляемый брокеру.
'Real' pips take profit. (HiddenTakeProfitPips) Размер скрытого тейк-профита в пунктах.
bl11 Разделитель раздела настроек.
dc1 Заголовок раздела ежедневного закрытия ордеров.
dc2 Пояснение использовать местное время в 24-часовом формате.
Use the Daily Close function. (DailyCloseEnabled) Включает функцию ежедневного закрытия сделок в заданный час.
Closes all market trades, subject to next two inputs. (CloseMarketTrades) Закрывает все рыночные сделки с учётом фильтров по прибыльным и убыточным позициям.
Only close profitable trades. (CloseOnlyWinners) При ежедневном закрытии закрывать только прибыльные сделки.
Only close losing trades. (CloseOnlyLosers) При ежедневном закрытии закрывать только убыточные сделки.
Delete pending trades. (DeletePendingTrades) Удалять отложенные ордера при ежедневном закрытии.
Sunday close hour. >23 or <0 to cancel. (SundayCloseHour) Час закрытия сделок в воскресенье по местному времени; значение больше 23 или меньше 0 отменяет закрытие.
Monday close hour. >23 or <0 to cancel. (MondayCloseHour) Час закрытия сделок в понедельник по местному времени; значение больше 23 или меньше 0 отменяет закрытие.
Tuesday close hour. >23 or <0 to cancel. (TuesdayCloseHour) Час закрытия сделок во вторник по местному времени; значение больше 23 или меньше 0 отменяет закрытие.
Wednesday close hour. >23 or <0 to cancel. (WednesdayCloseHour) Час закрытия сделок в среду по местному времени; значение больше 23 или меньше 0 отменяет закрытие.
Thuysday close hour. >23 or <0 to cancel. (ThursdayCloseHour) Час закрытия сделок в четверг по местному времени; значение больше 23 или меньше 0 отменяет закрытие.
Получить полный код

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

#property version   "1.00"
#property strict
#define   version "Version 1e"

#include <WinUser32.mqh>
#include <stdlib.mqh>
#define  NL    "\n"

#define  AllTrades 10 //Tells CloseAllTrades() to close/delete everything

#import "hgi_lib.ex4"
   enum SIGNAL {NONE=0,TRENDUP=1,TRENDDN=2,RANGEUP=3,RANGEDN=4,RADUP=5,RADDN=6};
   enum SLOPE {UNDEFINED=0,RANGEABOVE=1,RANGEBELOW=2,TRENDABOVE=3,TRENDBELOW=4};
   SIGNAL getHGISignal(string symbol,int timeframe,int shift);
   SLOPE getHGISlope (string symbol,int timeframe,int shift);
#import

#import "user32.dll"
int GetAncestor(int hWnd,int gaFlags);
int PostMessageA(int hWnd,int msg,int wParam,string IpWindow);
#import
int windowHdlFound;
bool expertsDisabeled=false;

#define  slm " stop loss modification failed with error "
#define  tpm " take profit modification failed with error "
#define  ocm " order close failed with error "
#define  odm " order delete failed with error "
#define  pcm " part close failed with error "
#define  spm " shirt-protection close failed with error "
#define  slim " stop loss insertion failed with error "
#define  tpim " take profit insertion failed with error "

extern string  gen="---- Event timer ----";
extern bool    SetTimerToSeconds=true;//Set the event timer in seconds.
extern int     EventTimerSeconds=1;//Seconds in between calculation loops
extern bool    SetTimerToMilliSeconds=false;//Set the event timer in milliseconds.
extern int     EventTimerMilliSeconds=500;//Milliseconds in between calculation loops. Default = half a second

extern string  sep1="================================================================";
extern string  ManagementStyle1              = "-------- Select your management style --------";
extern string  ManagementStyle2              = "You can select more than one option";
extern bool    ManageByMagicNumber           = false;//Manage trades by magic number,
extern int     MagicNumber                   = 0;//so long as they have this Magic Number.
extern bool    ManageByTradeComment          = false;//Manage trades by order comment,
extern string  TradeComment                  = "Trade";//so long as they have this comment.
extern bool    ManageByTickeNumber           = false;//Manage a specific trade by trade ticket number,
extern int     TicketNumber                  = 0;//and this is the ticket number to manage.
extern string  OverRide                      = "Managing this pair only will override all previous";
extern string  OverRide2                     = "or can be used in combination with any of the choices above";
extern bool    ManageThisPairOnly            = false;//Manage only this pair.

extern bool    ManageSpecifiedPairs          = false;//Manage the pairs specified in the next input.
extern string  PairsToManage="AUDJPY,AUDUSD,CHFJPY,EURCHF,EURGBP,EURJPY,EURUSD,GBPCHF,GBPJPY,GBPUSD,NZDJPY,NZDUSD,USDCHF,USDJPY";//Enter the pairs you want to manage here, separated by a comma.

extern string  OverRide1                     = "Managing all trades will override all other choices";
extern bool    ManageAllTrades               = false;//Manage all pairs traded on the account.

extern bool    UseReneMonitor                = false;//I am using Rene's News event monitor EA.

int            OpenTrades=0;

int            FifoTicket[];//Array to store trade ticket numbers in FIFO mode, to cater for

string         GvName="Under management flag";//The name of the GV that tells trading EA's not to send trades whilst the manager is closing them.

string         String;
int            PairsQty;
string         suffix;
string         ManagePair[];

double         bid=0, ask=0, factor=0;
int            digits=0;

string         TicketName                    = "GlobalVariableTicketNo";// For storing ticket numbers in global vars for picking up failed part-closes
bool           GlobalVariablesExist          = false;
bool           ForceTradeClosure=false;

extern string  b60 = "====================================================================";

extern string	trh				               = "---- Trade management times ----";
extern string	tr1				               = "tradingHours is a comma delimited list";
extern string  tr1a                          = "of start and stop times.";
extern string	tr2				               = "Prefix start with '+', stop with '-'";
extern string  tr2a                          = "Use 24H format, local time.";
extern string	tr3				               = "Example: '+07.00,-10.30,+14.15,-16.00'";
extern string	tr3a			                  = "Do not leave spaces";
extern string	tr4				               = "Blank input means 24 hour management.";
extern string	tradingHours="";

double	      TradeTimeOn[];
double	      TradeTimeOff[];

int 	         tradeHours[];
string         tradingHoursDisplay;//tradingHours is reduced to "" on initTradingHours, so this variable saves it for screen display.
bool           TradeTimeOk;

extern string  bl1 = "====================================================================";
extern string  ManagementFacilities          = "Select the management facilities you want";
extern string  slf                           = "-------- Stop Loss & Take Profit Manipulation --------";
extern string  BE                            = "---- Break even settings ----";
extern bool    UseBreakEven                  = false;//Use Break Even.
extern int     BreakEvenPips                 = 50;//Pips to break even.
extern int     BreakEvenProfitPips           = 10;//Pips profit to lock in.
extern string  atrb                          = "-- ATR break even --";
extern bool    UseAtrBE                      = false;
extern ENUM_TIMEFRAMES AtrTimeFrameBE        = PERIOD_D1;
extern int     AtrPeriodBE                   = 14;
extern int     AtrShiftBE                    = 0;//Candle shift defaulting to now.

double  BreakEven=0, BreakEvenProfit=0;

extern string  z3                            = "---- Part-close at breakeven ----";
extern string  pcbe = "Part-close settings is used in";
extern string  pcbe1 = "conjunction with Breakeven and Jumping Stop settings";
extern bool    UsePartClose = false;//Allow partial trade closure at break even.
extern double  Close_LotsFract = 0.5;//Fraction of the trade lots to close.

double         Close_Lots=0, Preserve_Lots=0;

extern string  z2                            = "----------------";
extern string  JSL                           = "---- Jumping stop loss settings ----";
extern bool    UseJumpingStop                = false;//Use a jumping stop loss.
extern int     JumpingStopPips               = 30;//Jump in this pips increment.
extern bool    JumpAfterBreakevenOnly        = false;//Only jump after break even has been achieved.

double         JumpingStop=0;

extern string  z4                            = "----------------";
extern string  TSL                           = "---- Trailing stop loss settings. Use standard of candlestick trail. ----";
extern bool    TrailAfterBreakevenOnly       = false;//Only trail after break even has been achieved.

extern bool    UseStandardTrail              = false;//Use a standard trail.
extern int     TrailingStopPips              = 50;//Number of pips to trail.

double         TrailingStop=0, StopTrailAtProfit=0, StopTrail=0;

extern string  z5                            = "----------------";
extern bool    UseCandlestickTrail           = false;//Use a candlestick trailing stop
extern ENUM_TIMEFRAMES CandlestickTrailTimeFrame = PERIOD_H1;//Candlestick time frame
extern int     CandleShift                   = 1;//How many candles back to trail the stop.

extern string  z9                            = "----------------";
extern string  MSLA                          = "---- Add a missing Stop Loss ----";
extern bool    AddMissingStopLoss            = false;//Add a stop loss to trades that do not have one.
extern int     MissingStopLossPips           = 200;//Stop loss size in pips.
extern bool    UseSlAtr                      = false;//Use ATR to calculate the stop loss.
extern int     AtrSlPeriod                   = 20;//ATR stop loss period.
extern ENUM_TIMEFRAMES AtrSlTimeFrame        = PERIOD_CURRENT;//ATR stop loss time frame.
extern double  AtrSlMultiplier               = 2;//ATR stop loss multiplier.

double         MissingStopLoss=0;
double         AtrVal=0;

extern string  z9a                           = "----------------";
extern string  hsl                           = "---- Hidden stop loss settings ----";
extern bool    UseHiddenStopLoss             = false;//Hide your stop loss from the broker.
extern int     HiddenStopLossPips            = 20;//'Real' pips stop loss.

double         HiddenStopLoss=0;

extern string  z10                           = "----------------";
extern string  tpi                           = "---- Take profit inputs ----";
extern string  MTPA                          = "-- Add a missing Take Profit --";
extern bool    AddMissingTakeProfit          = false;//Add a take profit to trades that do not have one.
extern int     MissingTakeProfitPips         = 200;//Take profit size in pips.
extern bool    UseTpAtr                      = false;//Use ATR to calculate the take profit.
extern int     AtrTpPeriod                   = 20;//ATR stop loss period.
extern ENUM_TIMEFRAMES AtrTpTimeFrame        = PERIOD_CURRENT;//ATR take profit time frame.
extern double  AtrTpMultiplier               = 3;//ATR take profit multiplier.

double         MissingTakeProfit=0;

extern string  htp                           = "-- Hidden take profit settings --";
extern bool    UseHiddenTakeProfit           = false;//Hide your take profit from the broker.
extern int     HiddenTakeProfitPips          = 200;//'Real' pips take profit.

double         HiddenTakeProfit=0;

extern string  bl11 = "====================================================================";
extern string  dc1                           = "---- Daily order close hour ----";
extern string  dc2                           = "Use local time, 24 hour clock";
extern bool    DailyCloseEnabled             = false;//Use the Daily Close function.
extern bool    CloseMarketTrades             = false;//Closes all market trades, subject to next two inputs.
extern bool    CloseOnlyWinners              = false;//Only close profitable trades.
extern bool    CloseOnlyLosers               = false;//Only close losing trades.
extern bool    DeletePendingTrades           = false;//Delete pending trades.
extern int     SundayCloseHour               = 25;//Sunday close hour. >23 or <0 to cancel.
extern int     MondayCloseHour               = 25;//Monday close hour. >23 or <0 to cancel.
extern int     TuesdayCloseHour              = 25;//Tuesday close hour. >23 or <0 to cancel.
extern int     WednesdayCloseHour            = 25;//Wednesday close hour. >23 or <0 to cancel.
extern int     ThursdayCloseHour             = 25;//Thuysday close hour. >23 or <0 to cancel.
extern int     FridayCloseHour               = 25;//Friday close hour. >23 or <0 to cancel.
extern int     SaturdayCloseHour             = 25;//Satday close hour. >23 or <0 to cancel.

int            DayHourClose[8];//Array to hold the close hour choices, set up in OnInit

extern string  bl2 = "====================================================================";
extern string  GOC                           = "---- Global order closure settings ----";
extern bool    GlobalOrderClosureEnabled     = false;//Enable global closure.
extern bool    DisableExpertsAfterClose      = false;//Disable all EA's after global or shirt protection closure.
extern bool    IncludePendingOrdersInClosure = false;//Include pending orders in the closure.
extern bool    ProfitInDollars               = false;//Use a cash take profit.
extern double  DollarProfit                  = 2;//Your cash target.
extern string  DollarDescription             = "Dollars";//Enter a description for your trading currency.
extern bool    ProfitAsPercentageOfBalance   = false;//Use a percentage of balance as your take profit. 
extern double  PercentageProfit              = 2;//Your percentage of the balance to use as your take profit.
extern bool    ProfitInPips                  = false;//Use a pips take profit.
extern int     PipsProfit                    = 50;//Your pips target.
extern bool    UseDynamicPipsProfit          = false;//Calculate your take profit as no_of_trades multiplied by x_pips.
extern int     PipsPerTrade                  = 5;//No of pips per trade.

double         PerTradePips=0;//doubles converter for PipsPerTrade
double         PipsUpl=0, CashUpl=0;
bool           ForceGlobalTradeClosure=false;

bool           GlobalClosureInProgress=false;//Used by CloseAllTrades()
int  CloseCount;

extern string  bl5  = "====================================================================";
extern string  sps                           = "----Shirt-protection settings----";
extern string  spsi                          = "Close all open trades at this cash loss";
extern bool    ShirtProtectionEnabled        = false;//Enable shirt protection.
extern double  MaxLoss                       = -150;//Maximum allowable cash draw down.
extern bool    IncludePendingInClosure       = false;//Delete pending orders in the closure.

bool           ShirtProtectionInProgress;//Used by CloseAllTrades()

extern string  bl6  = "====================================================================";
extern string  hed="---- Hedging ----";
extern bool    UseHedging                    = false;//Allow MPTM to hedge, using one of the filters included.

string         HedgeTradeComment             = "Hedge for ";//mptm adds the ticket number to this for identification
bool           ExitLoop                      = false;//Break out of the timer event if a hedge is opened/closed
int            HedgeTradeTickets[];//Store the ticket numbers of hedge trades
int            TicketNo                      = -1;//TicketNo for SendSingleTrade()

extern string  h1                            = "----------------";
extern string  ssl                           =" -- SuperSlope --";
extern bool    UseSuperSlopeForHedging       = false;//Use SuperSlope.
extern ENUM_TIMEFRAMES SsTimeFrameH          = PERIOD_H1;//SS time frame
extern int     SsMaxBarsH                    = 0;//Max bars.
 bool    SsAutoTimeFrameH                    = true;
extern double  SsDifferenceThresholdH        = 0.0;//Difference threshold.
extern double  SsLevelCrossValueH            = 2.0;//Level cross value.
extern int     SsSlopeMAPeriodH              = 5;//Slope MA period.
extern int     SsSlopeATRPeriodH             = 50;//Slope ATR period.

extern string  h2                            = "----------------";
extern string  hgi                           = " -- HGI --";
extern bool    UseHgiForHedging              = false;//Use HGI.
extern ENUM_TIMEFRAMES HgiTimeFrameH         = PERIOD_H4;//HGI time frame.
extern bool    HgiOnlyConfirmedSignalsH      = false;//Only use 'confirmed' signals.
extern bool    HgiHedgeOnLargeArrowsH        = false;//Hedge/close hedge following large green/red arrows.
extern bool    HgiHedgeOnBlueWavyH           = false;//Hedge/close hedge following blue wavy lines.
extern bool    HgiHedgeOnYellowWavyH         = false;//Hedge/close hedge following yellow wavy lines.

extern string  h3                            = "----------------";
extern string  bhe                           = "-- Bob's H4 240 period moving average --";
extern bool    UseBobForHedging              = false;//Use Bob's moving average.
extern ENUM_TIMEFRAMES MaTFH                 = PERIOD_H4;//Moving average time frame.
 int     MaShiftH                      = 0;
extern int     MaPeriodH                     = 240;//Moving average period.
extern ENUM_MA_METHOD MaMethodH              = MODE_EMA;//Moving average method.
extern ENUM_APPLIED_PRICE MaAppliedPriceH    = PRICE_CLOSE;//Moving average applied price.

extern string  h4                            = "----------------";
extern string  phe                           = "-- Protective hedging --";
extern bool    UseProtectiveHedging          = false;//Use protective hedging.
extern ENUM_DAY_OF_WEEK DayToApplyHedge      = 5;//Day to apply the hedge.
extern int     HourToApplyHedge              = 21;//Hour to apply hedge - use local time.
extern ENUM_DAY_OF_WEEK DayToCloseHedge      = 1;//Day to close the hedge.
extern int     HourToCloseHedge              = 0;//Hour to close hedge - use local time.

extern string  bl10 = "====================================================================";
extern string  clo                           = "---- Indicator-based closures ----";
extern string  c1                            = "----------------";
extern string  csl                           =" -- SuperSlope --";
extern bool    UseSuperSlopeForClosure       = false;//Use SuperSlope to close individual trades.
extern ENUM_TIMEFRAMES SsTimeFrameC          = PERIOD_D1;//SS time frame
extern int     SsMaxBarsC                    = 0;//Max bars.
 bool    SsAutoTimeFrameC                    = true;
extern double  SsDifferenceThresholdC        = 0.0;//Difference threshold.
extern double  SsLevelCrossValueC            = 2.0;//Level cross value.
extern int     SsSlopeMAPeriodC              = 5;//Slope MA period.
extern int     SsSlopeATRPeriodC             = 50;//Slope ATR period.

extern string  ch2                           = "----------------";
extern string  chgi                          = " -- HGI --";
extern bool    UseHgiForClosure              = false;//Use HGI.
extern ENUM_TIMEFRAMES HgiTimeFrameC         = PERIOD_H4;//HGI time frame.
extern bool    HgiOnlyConfirmedSignalsC      = false;//Only use 'confirmed' signals.
extern bool    HgiCloseOnLargeArrowsC        = false;//Close trade following large green/red arrows.
extern bool    HgiCloseOnBlueWavyC           = false;//Close trade following blue wavy lines.
extern bool    HgiCloseOnYellowWavyC         = false;//Close trade following yellow wavy lines.

extern string  c3                            = "----------------";
extern string  che                           = "-- Bob's H4 240 period moving average --";
extern bool    UseBobForClosure              = false;//Use Bob's moving average.
extern ENUM_TIMEFRAMES MaTFC                 = PERIOD_H4;//Moving average time frame.
 int     MaShiftC                      = 0;
extern int     MaPeriodC                     = 240;//Moving average period.
extern ENUM_MA_METHOD MaMethodC              = MODE_EMA;//Moving average method.
extern ENUM_APPLIED_PRICE MaAppliedPriceC    = PRICE_CLOSE;//Moving average applied price.

extern string  bl12 = "====================================================================";
extern string  OtherStuff                    = "---- Other stuff ----";
extern bool    ShowAlerts                    = true;//Show an alert when MPTM carries out a function.

extern bool    ShowComments                  = true;//Show the usual information on your chart.

extern string  se52  ="================================================================";
extern string  oad               ="---- Odds and ends ----";

extern int     DisplayGapSize    = 30; //Left margin size if displaying text as Comments

extern bool    DisplayAsText     = true;//Use the text features to display the feedback instead

extern bool    KeepTextOnTop     = true;
extern int     DisplayX          = 100;
extern int     DisplayY          = 0;
extern int     fontSise          = 14;
extern string  fontName          = "Arial";
extern color   colour            = Yellow;

int            DisplayCount;
string         Gap="", ScreenMessage="";

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

void OnDeinit(const int reason)
{

   EventKillTimer();
   removeAllObjects();

   ArrayFree(FifoTicket);
   ArrayFree(ManagePair);
   ArrayFree(DayHourClose);
   ArrayFree(HedgeTradeTickets);

}

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

int PairsQty()
{
   int i = 0;
   int j=0;
   int qty=0;

   while(i > -1)
      {
         i = StringFind(String, ",",j);
         if (i > -1)
         {
            qty ++;
            j = i+1;            
         }
      }
      return(qty);
}

void DisplayUserFeedback()
{

   string text = "";

   /*static datetime CurrentTime = 0;
   static datetime DisplayNow = 0;
   if (TimeCurrent() < DisplayNow )
      return;
   CurrentTime = TimeCurrent();
   DisplayNow = CurrentTime + ChartRefreshDelaySeconds;*/

   DisplayCount = 1;
   removeAllObjects();

   if(!IsExpertEnabled())
   {
      Comment("                          EXPERTS DISABLED");
      return;
   }//if (!IsExpertEnabled() )

   SM(NL);

   SM("Updates for this EA are to be found at "+NL);
   SM("Feeling generous? Help keep the coder going with a small Paypal donation to p**********r*@hotmail.com"+NL);
   SM("Broker time = "+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+": Local time = "+TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)+NL);
   SM(version+NL);
/*

   SM( TimeToString( iTime(Symbol(), TradingTimeFrame, 0) + TradingTimeFrame * 60 - CurTime(), TIME_MINUTES|TIME_SECONDS ) 
   + " left to bar end" + NL );
  */

  if (!ShowComments)
   return;

  SM(NL); 

   if (tradingHoursDisplay != "") SM("Management hours: " + tradingHoursDisplay + NL);
   else SM("24 hour management: " + NL);

   if (!TradeTimeOk)
   {
      SM(NL);
      SM("---------- OUTSIDE MANAGEMENT HOURS. I WILL DO NOTHING. ----------" + NL + NL);
      return;
   }//if (!TradeTimeOk)

   if (!ManageAllTrades)
   {
      if (ManageByMagicNumber)
         SM("Managing by Magic Number = " + IntegerToString(MagicNumber) + NL);
      if (ManageByTradeComment)
         SM("Managing by Order Comment = " + TradeComment + NL);
      if (ManageByTickeNumber)
         SM("Managing by Order Ticket = " + IntegerToString(TicketNumber) + NL);
      if (ManageThisPairOnly)
         SM("Managing this pair only i.e. " + Symbol() + NL);
      if (ManageSpecifiedPairs)
         SM("Managing these pairs: " + PairsToManage + NL);
   }//if (!ManageAllTrades)

   if (ManageAllTrades)
      SM("Managing all trades on the account. " + NL);     

   text = " trades.";
   if (OpenTrades == 0)
      text = " trades. Hell's Bells, but I am bored.";
   if (OpenTrades == 1)
      text = " trade";
   SM("I am managing " + IntegerToString(OpenTrades) + text + NL);  

   SM(NL);
   if (UseBreakEven)
   {
      text = "Break even set to " + IntegerToString(BreakEvenPips) + " pips. ";
      if (BreakEvenProfitPips > 0)
         text = text + "Locking in " + IntegerToString(BreakEvenProfitPips) + " pips profit at BE.";
      SM(text + NL);   
   }//if (UseBreakEven)

   if (UseJumpingStop)
   {
      text = "Jumping stop set to jump every " + IntegerToString(JumpingStopPips) + " pips. ";
      SM(text + NL);   
   }//if (UseJumpingStop)

   if (UseStandardTrail)
   {
      text = "Using a standard trailing, stop set to " + IntegerToString(TrailingStopPips) + " pips. ";
      SM(text + NL);   
   }//if (UseTrailingStop)

   if (UseCandlestickTrail)
   {
      text = "Using a candlestic trailing stop set to the hilo of " + IntegerToString(CandleShift) + " candle ago.";
      if (CandleShift != 1)
         text = "Using a candlestic trailing stop set to the hilo of " + IntegerToString(CandleShift) + " candles ago.";
      SM(text + NL);   
   }//if (UseJumpingStop)

   if (AddMissingStopLoss)
      SM("Adding missing Stop Loss at " + IntegerToString(MissingStopLossPips) + " pips." + NL);      

   if (AddMissingTakeProfit)
      SM ("Adding missing Take Profit at " + IntegerToString(MissingTakeProfitPips) + " pips." + NL);      

   if (UseHiddenStopLoss)
      SM("Hidden stop loss is enabled. Hidden SL = " + IntegerToString(HiddenStopLossPips) + " pips" + NL);

   if (UseHiddenTakeProfit)
      SM("Hidden take profit is enabled. Hidden TP = " + IntegerToString(HiddenTakeProfitPips) + " pips" + NL);

   if (DailyCloseEnabled)
   {
     int day = TimeDayOfWeek((TimeLocal()));
     SM("DailyCloseEnabled is enabled. Not closing trades today - close hour is " +  IntegerToString(DayHourClose[day]) +  NL);
     if (DayHourClose[day] > -1)
     if (DayHourClose[day] < 24)
     {
         SM("DailyCloseEnabled is enabled. Today's close hour is " + IntegerToString(DayHourClose[day]) );
     }//if (DayHourClose[day] < 24)

   }//if (DailyCloseEnabled)

   if (GlobalOrderClosureEnabled)   
   {
      text = "Global order closure enabled";
      if (IncludePendingOrdersInClosure)
         text = text + ", including pending orders";
      text = text + NL;   
      SM(text);   
      if (DisableExpertsAfterClose)
         SM("I will disable all EA's after a successful closure" + NL);
      if (ProfitInPips) 
      {      
         SM("      Upl is " +  DoubleToStr(PipsUpl, 1) +  " pips. Target profit is " +  
                         IntegerToString(PipsProfit) +  " pips" + NL);
      }//if (ProfitInPips) 

      if (ProfitAsPercentageOfBalance)
      {
         double ProfitPercentage=AccountBalance() * (PercentageProfit/100);
         SM("      Upl is " +  DoubleToStr(PipsUpl, 1) +  " pips. Target profit is " +  
                         DoubleToStr(ProfitPercentage, 2) +  " pips" + NL);
      }

      if (ProfitInDollars)
      {
         SM("          Cash upl is " +  DoubleToStr(CashUpl, 2) +  
            " Target profit is " +  DoubleToStr(DollarProfit, 2) + " " + DollarDescription + NL);
      }

   }
   else SM("Global order closure disabled"  + NL);

   if (ShirtProtectionEnabled)
   {
      SM("Shirt protection enabled at " +  DoubleToStr(MaxLoss, 2) + " dollars upl" + NL);
      if (DisableExpertsAfterClose)
         SM("I will disable all EA's after a successful closure" + NL);
   }
   else
   {
      SM("Shirt protection not enabled" + NL);
   }

   if (UseHedging)
   {
      SM("Hedging is enabled:" + NL);
      if (UseSuperSlopeForHedging)
         SM("          " + "Using SuperSlope."+ NL);

      if (UseHgiForHedging)
         SM("          " + "Using HGI."+ NL);

      if (UseBobForHedging)
         SM("          " + "Using Bob's moving average."+ NL);

      if (UseProtectiveHedging)
         SM("          " + "Using protective hedging."+ NL);

   }//if (UseHedging)

   if (UseSuperSlopeForClosure)
      SM("Using SuperSlope for individual trade closure" + NL);

   if (UseHgiForClosure)
      SM("Using HGI for individual trade closure" + NL);

   if (UseBobForClosure)
      SM("Using Bob's 240 H4 moving average for individual trade closure" + NL);

   Comment(ScreenMessage);

}//void DisplayUserFeedback()

void SM(string message)
{
   if (DisplayAsText) 
   {
      DisplayCount++;
      Display(message);
   }
   else
      ScreenMessage = StringConcatenate(ScreenMessage,Gap, message);

}//End void SM()

void removeAllObjects()
{
   for(int i = ObjectsTotal() - 1; i >= 0; i--)
   if (StringFind(ObjectName(i),"OAM-",0) > -1) 
      ObjectDelete(ObjectName(i));
}//End void removeAllObjects()

void Display(string text)
{
    string lab_str = "OAM-" + IntegerToString(DisplayCount);  
    double ofset = 0;
    string textpart[5];
    uint w,h;

    for (int cc = 0; cc < 5; cc++)
    {
       textpart[cc] = StringSubstr(text,cc*63,64);
       if (StringLen(textpart[cc]) ==0) continue;
       lab_str = lab_str + IntegerToString(cc);

       ObjectCreate(lab_str, OBJ_LABEL, 0, 0, 0);
       ObjectSet(lab_str, OBJPROP_CORNER, 0);
       ObjectSet(lab_str, OBJPROP_XDISTANCE, DisplayX + ofset);
       ObjectSet(lab_str, OBJPROP_YDISTANCE, DisplayY+DisplayCount*(int)(fontSise*1.5));
       ObjectSet(lab_str, OBJPROP_BACK, false);
       ObjectSetText(lab_str, textpart[cc], fontSise, fontName, colour);

       TextSetFont(fontName,-fontSise*10,0,0);
       TextGetSize(textpart[cc],w,h);

       if (StringSubstr(textpart[cc],63,1)==" ")
          ofset+=(int)(w-fontSise*0.3);
       else
          ofset+=(int)(w-fontSise*0.7);

    }//for (int cc = 0; cc < 5; cc++)
}//End void Display(string text)   

bool AreWeManagingThisTrade(int ticket)
{

   if (!BetterOrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
      return(false);//Somehow, the trade was closed.

   int cc = 0;

   if (ManageAllTrades)
      return(true);

   if (ManageSpecifiedPairs)
      for (cc = ArraySize(ManagePair) - 1; cc >= 0; cc--)
      {
         if (OrderSymbol() == ManagePair[cc])
            return(true);
      }//for (cc = ArraySize(ManagePair) - 1; cc >= 0; cc--)

   if (ManageThisPairOnly)
      if (OrderSymbol() == Symbol() )
         return(true);

   if (ManageByMagicNumber)
      if (OrderMagicNumber() == MagicNumber )
         return(true);

   if (ManageByTradeComment)
      if (OrderComment() == TradeComment)
         return(true);

   if (ManageByTickeNumber)
      if (OrderTicket() == TicketNumber)
         return(true);

   return(false);

}//bool AreWeManagingThisTrade()

void GlobalOrderClosure()
{
   bool CloseOrders=false;
   double ProfitPercentage=0;
   ForceGlobalTradeClosure = false;

   if (ProfitInDollars)
   {
      if(AccountProfit()>=DollarProfit) CloseOrders=true;
   }

   if (ProfitAsPercentageOfBalance)
   {
      ProfitPercentage=AccountBalance() * (PercentageProfit/100);
      if (AccountProfit()>= ProfitPercentage) CloseOrders=true;
   }

   if (ProfitInPips)
   {

      if (UseDynamicPipsProfit)
      {
         PipsProfit = OrdersTotal() * PipsPerTrade;         
      }//if (UseDynamicPipsProfit)     

      if (PipsUpl >= PipsProfit) CloseOrders=true;
   }//if (ProfitInPips)

   if (!CloseOrders) return;

   GlobalVariableSet(GvName, 0);

   GlobalClosureInProgress = true;
   CloseAllTrades(AllTrades);

   if (ForceTradeClosure)
   {
      int tries = 0;
      while (ForceTradeClosure)
      {
         CloseAllTrades(AllTrades);
         tries++;
         if (tries > 100)
         {
            ForceGlobalTradeClosure = true;//Force a retry on the next timer event
            return;
         }//if (tries > 100)

      }//if (ForceTradeClosure)

   }//while (ForceTradeClosure)

   GlobalVariableDel(GvName);

   if (ShowAlerts) Alert("Global profit hit your target, so all open trades should have been closed");

} //End of GlobalOrderClosure()

void disableEA()
{

   if(IsExpertEnabled()==true)
     {
      if(windowHdlFound>0) PostMessageA(windowHdlFound,WM_COMMAND,33020,0);

      Sleep(3000);
      if(IsExpertEnabled()==false && expertsDisabeled==false)
        {

         Alert("EquitySL/TP"+": All EAs were disabled at "+TimeToStr(TimeLocal()));
         expertsDisabeled=true;
         CloseCount=0;
        }
      if(IsExpertEnabled()==true)
        {

         Alert("EquitySL/TP"+" was unable to disable all EAs at "+TimeToStr(TimeLocal()));
         expertsDisabeled=false;
        }
     }

}

void CloseAllTrades(int type)
{

   ForceTradeClosure= false;

   if (OrdersTotal() == 0) return;

   bool result = false;
   for (int pass = *; pass <= 1; pass++)
   {
      if (OrdersTotal() == 0 || OpenTrades == 0)
         break;
      for (int cc = ArraySize(FifoTicket) - 1; cc >= 0; cc--)
      {
         if (!BetterOrderSelect(FifoTicket[cc], SELECT_BY_TICKET, MODE_TRADES) ) continue;
         if (OrderType() != type) 
            if (type != AllTrades)
               continue;

         while(IsTradeContextBusy()) Sleep(100);
         if (OrderType() < 2)
         {
            result = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 1000, CLR_NONE);
            if (result) 
            {
               cc++;
               OpenTrades--;
            }//(result) 

            if (!result) ForceTradeClosure= true;
         }//if (OrderType() < 2)

         if (pass == 1)

            if ((GlobalClosureInProgress && IncludePendingOrdersInClosure) || (ShirtProtectionInProgress && IncludePendingInClosure) )
               if (OrderType() > 1) 
               {
                  result = OrderDelete(OrderTicket(), clrNONE);
                  if (result) 
                  {
                     cc++;
                     OpenTrades--;
                  }//(result) 
                  if (!result) ForceTradeClosure= true;
               }//if (OrderType() > 1) 

      }//for (int cc = ArraySize(FifoTicket) - 1; cc >= 0; cc--)
   }//for (int pass = 0; pass <= 1; pass++)

   if (!ForceTradeClosure) 
   {
      CountOpenTrades();
      if (DisableExpertsAfterClose)
         disableEA();
   }//if (!ForceTradeClosure) 

}//End void CloseAllTradesFifo()

bool BetterOrderSelect(int index,int select,int pool=-1)
{
   if (select==SELECT_BY_POS)
   {
      if (pool==-1) //No pool given, so take default
         pool=MODE_TRADES;

      return(OrderSelect(index,select,pool));
   }

   if (select==SELECT_BY_TICKET)
   {
      if (pool==-1) //No pool given, so submit as is
         return(OrderSelect(index,select));

      if (pool==MODE_TRADES) //Only return true for existing open trades
         if(OrderSelect(index,select))
            if(OrderCloseTime()==0)
               return(true);

      if (pool==MODE_HISTORY) //Only return true for existing closed trades
         if(OrderSelect(index,select))
            if(OrderCloseTime()>0)
               return(true);
   }

   return(false);
}//End bool BetterOrderSelect(int index,int select,int pool=-1)

void GetBasics(string symbol)
{

   bid = MarketInfo(symbol, MODE_BID);
   ask = MarketInfo(symbol, MODE_ASK);
   digits = (int)MarketInfo(symbol, MODE_DIGITS);
   factor = GetPipFactor(symbol);

}//End void GetBasics(string symbol)

int GetPipFactor(string Xsymbol)
{

   static const string factor1000[]={"SEK","TRY","ZAR","MXN"};
   static const string factor100[]         = {"JPY","XAG","SILVER","BRENT","WTI"};
   static const string factor10[]          = {"XAU","GOLD","SP500","US500Cash","US500","Bund"};
   static const string factor1[]           = {"UK100","WS30","DAX30","NAS100","CAC40","FRA40","GER30","ITA40","EUSTX50","JPN225","US30Cash","US30"};

   int j = 0;

   int xFactor=10000;       // correct xFactor for most pairs
   if(MarketInfo(Xsymbol,MODE_DIGITS)<=1) xFactor=1;
   else if(MarketInfo(Xsymbol,MODE_DIGITS)==2) xFactor=10;
   else if(MarketInfo(Xsymbol,MODE_DIGITS)==3) xFactor=100;
   else if(MarketInfo(Xsymbol,MODE_DIGITS)==4) xFactor=1000;
   else if(MarketInfo(Xsymbol,MODE_DIGITS)==5) xFactor=10000;
   else if(MarketInfo(Xsymbol,MODE_DIGITS)==6) xFactor=100000;
   else if(MarketInfo(Xsymbol,MODE_DIGITS)==7) xFactor=1000000;
   for(j=0; j<ArraySize(factor1000); j++)
   {
      if(StringFind(Xsymbol,factor1000[j])!=-1) xFactor=1000;
   }
   for(j=0; j<ArraySize(factor100); j++)
   {
      if(StringFind(Xsymbol,factor100[j])!=-1) xFactor=100;
   }
   for(j=0; j<ArraySize(factor10); j++)
   {
      if(StringFind(Xsymbol,factor10[j])!=-1) xFactor=10;
   }
   for(j=0; j<ArraySize(factor1); j++)
   {
      if(StringFind(Xsymbol,factor1[j])!=-1) xFactor=1;
   }

   return (xFactor);
}//End int GetPipFactor(string Xsymbol)

bool CloseEnough(double num1, double num2)
{
   /*
   This function addresses the problem of the way in which mql4 compares doubles. It often messes up the 8th
   decimal point.
   For example, if A = 1.5 and B = 1.5, then these numbers are clearly equal. Unseen by the coder, mql4 may
   actually be giving B the value of 1.50000001, and so the variable are not equal, even though they are.
   This nice little quirk explains some of the problems I have endured in the past when comparing doubles. This
   is common to a lot of program languages, so watch out for it if you program elsewhere.
   Gary (garyfritz) offered this solution, so our thanks to him.
   */

   if (num1 == 0 && num2 == 0) return(true); //0==0
   if (MathAbs(num1 - num2) / (MathAbs(num1) + MathAbs(num2)) < 0.00000001) return(true);

   return(false);

}//End bool CloseEnough(double num1, double num2)

void ReportError(string function, string message)
{

   int err=GetLastError();
   if (err == 1) return;//That bloody 'error but no error' report is a nuisance

   if (ShowAlerts)
      Alert(WindowExpertName(), " ", OrderTicket(), " ", function, message, err,": ",ErrorDescription(err));
   Print(WindowExpertName(), " ", OrderTicket(), " ", function, message, err,": ",ErrorDescription(err));//Log the result just in case

}//void ReportError()

bool ModifyOrder(int ticket, double price, double stop, double take, datetime expiration, color col, string function, string reason)
{

   bool result = OrderModify(ticket, price ,stop , take, expiration, col);

   if (result)
   {
      return(true);
   }//if (result)

   if (!result)
      ReportError(function, reason);

   return(false);

}// End bool ModifyOrder()

bool CloseOrder(int ticket, string function, double CloseLots, string reason)
{   

   while(IsTradeContextBusy()) Sleep(100);
   bool orderselect=OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
   if (!orderselect) return(false);

   bool result = false;

   if (OrderType() < 2) 
   {
      result = OrderClose(ticket, CloseLots, OrderClosePrice(), 1000, clrNONE);
   }//if (OrderType() < 2) 

   if (OrderType() > 1) 
   {
      result = OrderDelete(ticket, clrNONE);
   }//if (OrderType() < 2) 

   if (result)
   {
      return(true);
   }//if (result)

   if (!result)
      ReportError(function, reason);

   return(false);

}//End bool CloseOrder(ticket)

bool HideStopLoss(int ticket)
{

   if (!BetterOrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
      return(false);//Order has closed, so nothing to do.    

   int err = 0;
   bool CloseThisTrade = false, result = false;
   double stop = 0;

   GetBasics(OrderSymbol() );//Make sure the bid and ask are up to date   

   if (OrderType() == OP_BUY)
   {
      stop = NormalizeDouble(OrderOpenPrice() - (HiddenStopLoss / factor), digits);
      if (bid <= stop)
         CloseThisTrade = true;

   }//if (OrderType() = OP_BUY)

   if (OrderType() == OP_SELL)
   {
      stop = NormalizeDouble(OrderOpenPrice() + (HiddenStopLoss / factor), digits);
      if (ask >= stop)
         CloseThisTrade = true;
   }//if (OrderType() = OP_SELL)

   if (CloseThisTrade)
   {
      result = CloseOrder(OrderTicket(), __FUNCTION__,  OrderLots(), ocm );
   }//if (CloseThisTrade)

   return(result);

}//End bool HideStopLoss(int type, int iPipsAboveVisual, double stop )

bool PartCloseOrderFunction()
{

   bool result = CloseOrder(OrderTicket(), __FUNCTION__,  Close_Lots, pcm );

   if (result)
   {
      if (ShowAlerts==true) Alert("Partial close of ", OrderSymbol(), " ticket no ", OrderTicket());
      return(true);
   }//if (result)
   else
   {
      int err=GetLastError();
      if (ShowAlerts==true) Alert("Partial close of ", OrderSymbol(), " ticket no ", OrderTicket()," failed with error (",err,") :  ",ErrorDescription(err));
      Print("Partial close of ", OrderSymbol(), " ticket no ", OrderTicket()," failed with error (",err,") :  ",ErrorDescription(err));
      return(false);
   }//else                         

}// End bool PartCloseOrderFunction()

int GetNextAvailableVariableNumber()
{

      if (GlobalVariablesTotal()==0) return(1);

      for (int cc=1; cc > -1; cc++)
      {
         string ThisGlobalName = StringConcatenate(TicketName,DoubleToStr(cc,0));
         double v1 = GlobalVariableGet(ThisGlobalName);
         if(v1 == 0) return(cc);
         if (cc > 100) return(0);
      }

      return(0);
}//int GetNextAvailableVariableNumber()   

void SetAGlobalTicketVariable()
{

   int cc = GetNextAvailableVariableNumber();
   string GlobalName = StringConcatenate(TicketName,DoubleToStr(cc,0));
   GlobalVariableSet(GlobalName, OrderTicket());
   GlobalVariablesExist = true;

} // End void SetAGlobalTicketVariable();

void TryPartCloseAgain()
{

   GlobalVariablesExist = false;
   if (GlobalVariablesTotal() == 0)
      return;

   string name;
   int index;
   int TN;
   for (int cc=0; cc < GlobalVariablesTotal(); cc++)
   {
      name = GlobalVariableName(cc);// Extract gv name
      index = StringFind(name, TicketName, 0);// Is it relevent to this function?
      if (index > -1)// If so, then retry the part-close
      {
         TN = (int)GlobalVariableGet(name);

         if (BetterOrderSelect(TN, SELECT_BY_TICKET, MODE_TRADES) )
            if (OrderCloseTime() == 0)
            {
               bool PartCloseSuccess = PartCloseOrderFunction();
               if (PartCloseSuccess)
               {
                  GlobalVariableDel(name);
                  cc--;
               }//if (PartCloseSuccess)
               else
                  GlobalVariablesExist = false;
            }//if (OrderCloseTime() == 0)
            else
            {
               GlobalVariableDel(name);
               cc--;
            }//else
      }//if (index>-1)
   }//for (int cc=0; cc < GlobalVariable

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

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

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

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

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

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

Стоимость полного кода
6 378,10₽ ≈ $77.95