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