Заходи - не бойся, выходи - не плачь...

FOREX

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » FOREX » Про граммирование » Исходный код советника с комментариями легендарного Пирата


Исходный код советника с комментариями легендарного Пирата

Сообщений 1 страница 2 из 2

1

(1/2)

Код:
//--- DLL, необходимая для расчета времени по GMT (стандартная библиотека Windows).
#import "kernel32.dll"
   int GetTimeZoneInformation(int& a[]);
#import

extern string Name = "Forex Shocker ver. 3.2 News Filter Mod by HELLTEAM^Pirat";
extern string Cop = "Copyright © HELLTEAM^Pirat";
extern string Op = "Дата оптимизации";
extern datetime Date = D'24.04.2011'; //--- Сделал чисто для себя, чтобы видеть от какой даты оптимизация (дата забивается вручную)
extern string Op2 = "Оптимизация для пары";
extern string Symbol_Op = "EURUSD m15"; //--- Аналогично.

//--- Основные параметры советника

extern string _SP = "--------------------------------------";

//---

extern string _MM = "Настройка MM";
//---
extern double Lots = 0.1; //--- (!) Рекомендуемый лот к депо 1000 - 0.1, 0.2
extern bool UseMM = FALSE; //--- Включение функции управления капиталом (Money Management)
extern double LotsRiskReductor = 5.0; //-- Процент риска от свободных ср-в депозита
extern double MaxLots = 10.0; //--- Максимальный лот (При включенной ММ, выше заданного значения, объём лота повышаться не будет)
extern bool TradeMicroLots = TRUE; //-- При торговле лотом от 0.01 и до 0,1 с включенной UseMM, рекомендуется включить

//---

extern string _Time = "Настройки времени";
//---
extern bool UseAutoGMToffset = FALSE; //--- Автоматический расчет смещения GMT. В тестере не работает.

//+--------------------------------------------------------------------------------------------------------------+
//+
//|  Как правильно расчитать ManualGMToffset.
//|  
//|  Текущие время по Гринвичу смотрим на сайте http://wwp.greenwichmeantime.com/ в окне GMT (Standard Time),
//|  далее сравниваем время вашего терминала со временем по Гринвичу.
//|  Разницу между временем вашего ДЦ (брокера) и текущем временем по Гринвичу вписываем в поле ManualGMToffset.
//|  
//|  Например на ДЦ Альпари текущие серверное время 17.00, а на сайте http://wwp.greenwichmeantime.com/ 14.00,
//|  то есть ManualGMToffset будет равен 3.
//|  
//|  Вне тестера включите UseAutoGMToffset, разница подсчитывается автоматически (работает только в торговые дни).
//+
//+--------------------------------------------------------------------------------------------------------------+

extern int ManualGMToffset = 3; //--- Ручное выставление смещения GMT. Для Альпари 3, для Интсафорекс 3. Для остальных ДЦ сравнивайте время с первыми двумя.
extern bool UseDST = TRUE; //--- Переход на летнее время. C 13 марта по 6 ноября (13.03 - 06.11) необходимо выставить TRUE.
extern int StartWorkTimeHour = 22; //--- Час начала торговли (Начало временного канала)
extern int StartSessionMinute = 0; //--- Минута начала торговли
extern int EndWorkTimeHour = 23; //--- Час окончания торговли (Конец временного канала. После этого часа новый ордер не откроется)
extern int EndSessionMinute = 0; //--- Минута окончания торговли
extern bool TradeMonday = TRUE; //--- Разрешение на торговлю в понедельник (При False торговля не ведется)
extern bool TradeFriday = FALSE; //--- Разрешение на торговлю в пятницу
extern bool TradeInStartMonth = TRUE; //--- Разрешение на торговлю с 1 по 4 число каждого месяца. Если стоит True, торговля будет вестись.
extern bool TradeInEndMonth = FALSE; //--- Разрешение на торговлю с 26 по 31 число каждого месяца. Если стоит True, торговля будет вестись.

//+--------------------------------------------------------------------------------------------------------------+
//+
//|  В основных входных значениях, задаются параметры, необходимые для принятия решения советником, об открытии
//|  позиции. В зависимости от группы сигналов, советник открывает длинную или короткую позицию.
//|  
//|  Запись вида (3 1 15) предназначена для оптимизации, и означает стартовое значение 3, шаг 1,
//|  и финальное значение 15. То есть оптимизация будет проходить со значения 3 по значение 15 с шагом 1.
//|  
//|  При оптимизации данного советника, необходимо оптимизировать каждую группу сигналов поочереди. То есть,
//|  при оптимизации первой группы сигналов, необходимо напртив Use_PosType_1 поставить значение TRUE,
//|  а напротив Use_PosType_2, Use_PosType_3 и т.д., выставить значение FALSE.
//+
//+--------------------------------------------------------------------------------------------------------------+

extern string _TP = "Основные входные параметры";
//--- Тейк-профит и стоп-лосс для каждой сделки, открываемой советником.
extern int TakeProfit = 4; //--- Параметры оптимизации (3 1 15). Данный параметр не рекомендуется к оптимизации.
extern int StopLoss = 29; //--- Параметры оптимизации (10 5 100). Данный параметр не рекомендуется к оптимизации.

//+--------------------------------------------------------------------------------------------------------------+
//| Значения переменных для первой группы сигналов.
//+--------------------------------------------------------------------------------------------------------------+

extern string _PosType_1 = "Открытие ордера по первому типу сигнала";
//---
extern bool Use_PosType_1 = TRUE; //--- Выключатель открытия позиции по первой группе сигналов на вход.
//---
extern double Filter_iRSI_a_PosType_1 = 21; //--- Параметры оптимизации (10 1 50)
extern double Filter_iRSI_b_PosType_1 = 35; //--- Параметры оптимизации (20 1 60)
//--- Дополнительный фильтр для 1-го типа позиции
extern double NewFilter_PosType_1 = -20.0; //--- Параметры оптимизации (-50 1 50)

//+--------------------------------------------------------------------------------------------------------------+
//| Значения переменных для второй группы сигналов.
//+--------------------------------------------------------------------------------------------------------------+

extern string _PosType_2 = "Открытие ордера по второму типу сигнала";
//---
extern bool Use_PosType_2 = TRUE; //--- Выключатель открытия позиции по второй группе сигналов на вход.
//---
extern double Filter_iRSI_a_PosType_2 = 66; //--- Параметры оптимизации (65 1 85)
extern double Filter_iRSI_b_PosType_2 = 57; //--- Параметры оптимизации (50 1 80)
//--- Дополнительный фильтр для 2-го типа позиции
extern double NewFilter_PosType_2 = -36.0; //--- Параметры оптимизации (-50 1 50)

//+--------------------------------------------------------------------------------------------------------------+
//| Значения переменных для третьей группы сигналов.
//+--------------------------------------------------------------------------------------------------------------+

extern string _PosType_3 = "Открытие ордера по третьему типу сигнала";
//---
extern bool Use_PosType_3 = TRUE; //--- Выключатель открытия позиции по третьей группе сигналов на вход.
//---
extern double Filter_iCCI_c_PosType_3 = 40; //--- Параметры оптимизации (-200 10 200)
//--- Дополнительные фильтры для 3 типа позиций
extern double Filter_iCCI_b_PosType_3 = -110; //--- Параметры оптимизации (-300 10 200)
extern double Filter_iCCI_c_PosType_3_add = -90; //--- Параметры оптимизации (-350 10 200)
extern double Filter_iCCI_a_PosType_3 = -130; //--- Параметры оптимизации (-300 10 200)
extern double NewFilter_PosType_3 = 2.0; //--- Параметры оптимизации (-50 1 50)

//+--------------------------------------------------------------------------------------------------------------+
//| Значения переменных для четвёртой группы сигналов.
//+--------------------------------------------------------------------------------------------------------------+

extern string _PosType_4 = "Открытие ордера по четвертому типу сигнала";
//---
extern bool Use_PosType_4 = TRUE; //--- Выключатель открытия позиции по четвёртой группе сигналов на вход.
//---
extern double Filter_iCCI_a_PosType_4 = -60; //--- Параметры оптимизации (-100 10 400)
//--- Дополнительные фильтры для 4 типа позиций
extern double Filter_iCCI_b_PosType_4 = -110; //--- Параметры оптимизации (-100 10 400)
extern double Filter_iCCI_c_PosType_4_add = -10; //--- Параметры оптимизации (-100 10 400)
extern double Filter_iCCI_c_PosType_4 = 60; //--- Параметры оптимизации (-100 10 400)
extern double NewFilter_PosType_4 = 5.0; //--- Параметры оптимизации (-50 1 50)

//+--------------------------------------------------------------------------------------------------------------+
//| Значения переменных для пятой группы сигналов.
//+--------------------------------------------------------------------------------------------------------------+

extern string _PosType_5 = "Открытие ордера по пятому типу сигнала";
//---
extern bool Use_PosType_5 = TRUE; //--- Выключатель открытия позиции по пятой группе сигналов на вход.
//---
extern double Filter_iMomentum_a_PosType_5 = 100.45; //--- Параметры оптимизации (100 0.05 100.65)
extern double Filter_iCCI_d_PosType_5 = 120.0; //--- Параметры оптимизации (-200 10 400)
//--- Дополнительный фильтр для 5-го типа позиции
extern double NewFilter_PosType_5 = -44.0; //--- Параметры оптимизации (-50 1 50)

//+--------------------------------------------------------------------------------------------------------------+
//| Значения переменных для шестой группы сигналов.
//+--------------------------------------------------------------------------------------------------------------+

extern string _PosType_6 = "Открытие ордера по шестому типу сигнала";
//---
extern bool Use_PosType_6 = TRUE; //--- Выключатель открытия позиции по шестой группе сигналов на вход.
//---
extern double Filter_iWPR_a_PosType_6 = -30; //--- Параметры оптимизации (-300 10 200)
//--- Дополнительный фильтр для 6-го типа позиции
extern double NewFilter_PosType_6 = -22.0; //--- Параметры оптимизации (-50 1 50)

//+--------------------------------------------------------------------------------------------------------------+
//| Значения минимумов закрытия, для просроченных ордеров. Своебразный вывод в безубыток если ордеры просрочены.
//| По сути время жизни длинных и коротких позиций в минутах.
//|
//| Если, например ордер на покупку был открыт более чем Minutes_Buy минут назад, и его профит больше или равен
//| значению Timed_Buy_TakeProfit, то происходит закрытие длинной позиции.
//|
//| При оптимизации, в зависимости от того, какую группу сигналов вы оптимизируете, необходимо попарно оптить
//| значения Minutes_Buy с Timed_Buy_TakeProfit или Minutes_Sell с Timed_Sell_TakeProfit
//+--------------------------------------------------------------------------------------------------------------+

extern string _Ex = "Время жизни ордеров";
//---
extern bool Timed_Closing = TRUE;  //--- Ограничение времени открытия ордеров.
//---
extern int Minutes_Buy = 80; //--- Для 1,3 типа позиций. Параметры оптимизации (10 10 120)
extern int Minutes_Sell = 40; //--- Для 2,4,5,6 типа позиций. Аналогичные параметры оптимизации. 
extern int Timed_Buy_TakeProfit = -5; //--- Для 1,3 типа позиций. Параметры оптимизации (-10 1 0)
extern int Timed_Sell_TakeProfit = -2; //--- Для 2,4,5,6 типа позиций. Аналогичные параметры оптимизации. 

//+--------------------------------------------------------------------------------------------------------------+
//| Magic Numbers. Значения Magic Numbers не должны быть одинаковыми. Также при использовании нескольких
//| советников на одной валютной паре, проверьте чтобы Magic Numbers от данного советника не совпадали с другими.
//| 
//| Magic Numbers данного советника не рекомендуется менять из-за функции комментариев к открываемым ордерам.
//+--------------------------------------------------------------------------------------------------------------+

extern string _MN = "Magic Numbers";
//---
extern int magic1 = 11022011; //--- Magic Number для позиции, открываемой по первой группе сигналов (PosType_1) и так далее...
extern int magic2 = 21022012;
extern int magic3 = 31022013;
extern int magic4 = 41022014;
extern int magic5 = 51022015;
extern int magic6 = 61022016;

//+--------------------------------------------------------------------------------------------------------------+
//| В расширенных настройках вы можете произвести дополнительную настройку советника, под торговые условия
//| вашего брокера или ДЦ.
//+--------------------------------------------------------------------------------------------------------------+

extern string _Add = "Расширенные настройки";

//--- UseStopLevels и UseFakeStopLevels нельзя включать одновременно
extern bool UseStopLevels = FALSE; //--- Включение стоповых ордеров. Если выключена, то работают только виртуальные тейки и лоссы.
extern bool UseFakeStopLevels = FALSE; //-- Выставление поддельных стоп уровней.
extern bool IsMarketExecution = FALSE; //--- Включение рыночного исполнения открытия ордеров (сначало открывает, затем модифицирует)

//+--------------------------------------------------------------------------------------------------------------+
//| Если вы используете сразу все включенные PosType, то, например при значении MaximumTrades = 2, 
//| при положительных сигналах сразу по 3-м группам сигналов, будут открыты ордера только по 2-м группам.
//+--------------------------------------------------------------------------------------------------------------+

extern bool LongTrade = TRUE; //--- Выключатель длинных позиций
extern bool ShortTrade = TRUE; //--- Выключатель коротких позиций
//---
extern int MaximumTrades = 6; //--- Максимальное кол-во ордеров.
//---
extern double MaxSpread = 2.0; //--- Макс спред. Для ДЦ Альпари рекомендую значение не более 1,5-2.
extern int Slippage = 2; //--- Проскальзывание цены. Рекомендую 1-2, не менее и не более.
extern int RequoteAttempts = 3; //--- Максимальное число повторений при открытии/закрытии ордера при реквотах и других ошибках
//---
int RandomOpenTimePercent = 0; //--- Используется при занятом потоке комманд терминала, своебразная рендомная пауза. Выражается в секундах.
string ExpertComment = "Forex Shocker 3.2 NF"; //--- Комментарий для открываемых советником ордеров.
//---
extern bool UseFilterMA = FALSE; //--- Фильтр по Машкам. Включается сразу для всех групп сигналов. Не рекомендуем к влючению и оптимизации.
//---
extern int PeriodFilterMA = 100;
extern int PriceFilterMA = 0;
extern int MethodFilterMA = 0;
//---
extern bool SendEmail = FALSE; //--- Отправка сообщения об открытии/закрытии сделки
extern bool SoundAlert = FALSE; //--- Звуковое оповещение об открытии/закрытии сделки
extern string SoundFileAtOpen = "alert.wav";
extern string SoundFileAtClose = "alert.wav";
extern color OpenBuyColor = Blue;
extern color OpenSellColor = Red;
extern color CloseBuyColor = DodgerBlue;
extern color CloseSellColor = DeepPink;
//---
extern bool WriteLog = FALSE; //--- //--- Включение всплывающих окон в терминале.
extern bool WriteDebugLog = FALSE; //--- Включение всплывающих окон об ошибках в терминале.
extern bool PrintLogOnChart = TRUE; //--- Включение комментариев на графике (при тестировании выключается автоматически)

//+--------------------------------------------------------------------------------------------------------------+
//| Настройка фильтра новостей
//+--------------------------------------------------------------------------------------------------------------+

extern string _NF = "Новостной фильтр";
extern bool AvoidNews = TRUE; //--- Включение фильтра новостей (В тестере не работает, так как новостной индикатор FFCal генерирует текстовый файл каждую неделю, в котором записаны даты и время новостей на текущую неделю).
//--- То есть во время тестирования будут использоваться только даты за текущую неделю. В тестере AvoidNews отключается автоматически.

//--- Параметры фильтра новостей

extern bool High_Impact = TRUE; //--- Важные новости (При True советник не торгует, если были важные новости). Если вы решили не торговать при важных новостях и поставили High_Impact = TRUE, то далее настраиваем временные фильтры.
//---
extern int MinsUntilNextHighNews = 120; //--- Задержка времени (в минутах) до выхода важной новости. То есть за 2 часа до выхода важной новости (в течении этих 2-х часов) советнику будет дан запрет на торговлю.
extern int MinsSincePrevHighNews = 420; //--- Задержка времени (в минутах) после выхода важной новости. То есть в течении 7-ми часов после выхода важной новости, советнику будет дан запрет на торговлю.
//---
extern bool Medium_Impact = FALSE; //--- Обычные новости
//---
extern int MinsUntilNextMediumNews = 90; //--- Задержка времени (в минутах) до выхода обычной новости.
extern int MinsSincePrevMediumNews = 240; //--- Задержка времени (в минутах) после выхода обычной новости.
//---
extern bool Low_Impact = FALSE; //--- Маловажные новости
//---
extern int MinsUntilNextLowNews = 60; //--- Задержка времени (в минутах) до выхода маловажной новости.
extern int MinsSincePrevLowNews = 60; //--- Задержка времени (в минутах) после выхода маловажной новости.
//---
bool AllowTrading = true; // Обнуление разрешения на торговлю (Необходим для фильтра новостей)

//-- Блок переменных периодов, фильтров, комментов, времени.

//+--------------------------------------------------------------------------------------------------------------+
//| Блок переменных, не предназначенных для внешней настройки
//| Настройки индикаторов, времени, языка, ММ и т.д.
//+--------------------------------------------------------------------------------------------------------------+

int MinusEndSessionMinute = 10; //--- Дополнительная настройка к переменной EndSessionMinute. Вычитание из значения EndSessionMinute значение MinusEndSessionMinute (При положительном значении MinusEndSessionMinute происходит суммирование)
//---
bool OpenAddOrderRule = FALSE; //--- При включении данной торговли новые ордера не будут не будут открываться. Необходима если вы решили остановить торговлю, но не хотите чтобы советник терял открытые им ордера.
//---
int LanguageEA = 1; //--- Настройки языка комментариев и сообщений. При 0 English, а при 1 Русский
//---
bool NoErrorEA = TRUE; //--- Обнуление правила проверки на ошибки
bool InitRule; //--- Если все проверки при инициализации советника были пройдены в блоке init (), то происходит выполнение блока start ()
//---
int Dist = 1; //--- Дополнительный фильтр проверки цены после открытия ордера.
int SP; //--- Проскальзывание цены. В блоке init () идет расчет данной переменной для пятизнаков.
double pp; //--- Аналог Points для пятизнаков
int pd; //--- Аналог Digits для пятизнаков
string EASymbol; //--- Текущий символ
double ToPoint = 0.0001; //--- Замена умножению на Points
int CloseSlippage = 3; //--- Проскальзывание для закрытия ордера
double NDMaxSpread; //--- Максимальный спред ввиде пунктов
bool CheckSpreadRule; //--- Правило для проверки спреда перед открытием (Останавливает зацикливание сообщений о превышенном спреде)
//---
int FakeTakeProfit = 40; //--- Поддельный тейк-профит
int PlusRandomTP = 21; //--- Рендомное число для прибавления к тейк-профиту
int FakeStopLoss = 150; //--- Поддельный стоп-лосс
int PlusRandomSL = 21; //--- Рендомное число для прибавления к стоп-лоссу
//---
double MaxLot; //--- Максимальный лот вашего ДЦ
double MinLot; //--- Минимальный лот вашего ДЦ
double LotStep; //--- Шаг лота вашего ДЦ
double NeedMargin; //--- Необходимая свободная маржа
double RiskFactor; //--- Уровень риска при включенной ММ
double Leverage; //--- Плечо вашего счета
int LotDiggits; //--- Кол-во знаков лота после точки (При TradeMicroLots = True, LotDiggits равен 2)
//---
string SendMailOpenOrderEng = "New Trade Information"; //--- Комментарий при отправке на почту сообщения об открытии ордера
string SendMailCloseOrderEng = "New Trade Information";
string SendMailOpenOrderRus = "Новая торговая информация";
string SendMailCloseOrderRus = "Новая торговая информация";
//---
int ServerTime; //--- Параметры времени. Необходимы для дополнительного расчета времени в блоке init ()
int StartWorkTime;
int EndWorkTime;
int Gmt; //--- Зона GMT+
int DST; //--- Корректировка при UseDST = True (летнее время)

//---

//--- Таймфремы и периоды для iRSI_a (1, 2 тип позиций)
int TimeFrame_iRSI_Period1 = 15;
int iRSI_Period1 = 6;
//--- Таймфремы и периоды для iRSI_b (1, 2 тип позиций)
int TimeFrame_iRSI_Period2 = 1;
int iRSI_Period2 = 20;
//--- Таймфремы и периоды для iMA_a (1, 2 тип позиций)
int TimeFrame_iMA_Period1 = 0;
int iMA_Period1 = 8;
int iMA_Shift1 = 0;
//--- Таймфремы и периоды для iMA_b (1, 2 тип позиций)
int TimeFrame_iMA_Period2 = 0;
int iMA_Period2 = 8;
int iMA_Shift2 = 0;
   
//---

//--- Таймфремы и периоды для iCCI_a (3, 4 тип позиций)
int TimeFrame_iCCI_Period1 = 15;
int iCCI_Period1 = 14;
//--- Таймфремы и периоды для iCCI_b (3, 4 тип позиций)
int TimeFrame_iCCI_Period2 = 5;
int iCCI_Period2 = 42;
//--- Таймфремы и периоды для iCCI_c (3, 4 тип позиций)
int TimeFrame_iCCI_Period3 = 1;
int iCCI_Period3 = 210;
   
//---
   
//--- Таймфремы и периоды для iCCI_d (5 тип позиции)
int TimeFrame_iCCI_Period4 = 1;
int iCCI_Period4 = 80;
//--- Таймфремы и периоды для iCCI_d (5 тип позиции)
int TimeFrame_iMomentum = 5;
int iMomentum_Period = 4;
   
//---
   
//--- Таймфремы и периоды для iBands_a (6 тип позиции)
int iBands_TimeFrame = 5;
int iBands_Period = 20;
int iBands_Deviation = 2; //--- Отклонение от основной линии
int iBands_Shift = 0; //--- Сдвиг индикатора относительно ценового графика
//--- Таймфремы и периоды для iMA_c (6 тип позиции)
int TimeFrame_iMA_Period3 = 5;
int iMA_Period3 = 1;
int iMA_Shift3 = 0;
//--- Таймфремы и периоды для iWPR_a (6 тип позиции)
int TimeFrame_iWPR = 5;
int iWPR_Period = 14;
int iWPR_Shift = 0;

//---
   
//--- Фракталы с разными периодами (1, 2, 3 тип ордеров)
double iFractals_b;
double iFractals_a;
double iFractals_d;
double iFractals_c;
//---
double Difference_iFractals = 0.0; //--- Обнуление разницы между фракталами
int MathRound_iFractals = 0; //--- Обнуление мат корня из фракталов
int MathRound_iATR = 0; //--- Обнуление мат корня из ATR (3 типа позиции)
//---
int Filter_MathRound_iFractals = 32; //--- Доп. фильтр для 3 типа позиции
int Filter_MathRound_iATR = 15; //--- Доп. фильтр для 3 типа позиции
//---

//+--------------------------------------------------------------------------------------------------------------+
//| INIT. Инициализация основных функций и переменных советника,
//| также проверка на ошибки
//+--------------------------------------------------------------------------------------------------------------+
int init() {
//+--------------------------------------------------------------------------------------------------------------+

   InitRule = TRUE; //--- Обнуление параметра
   //---
   if (IsTesting() && !IsVisualMode()) PrintLogOnChart = FALSE; //--- Если тестируем, то отключаются комментарии на графике
   if (!PrintLogOnChart) Comment("");
   //---
   if (!IsDllsAllowed()) { //--- Если DLL не разрешены, то выдаётся сообщение
      if (LanguageEA == 0) Comment("Warning: Set Parameter \"AllowDLL Imports\" ON in menu Tools -> Options -> ExpertAdvisors.");
      else Comment("Предупреждение: Установите параметер \"AllowDLL Imports\" ВКЛ в меню Сервис -> Настройки -> Советники.");
      NoErrorEA = FALSE;
      return (0);
   }
   //---
   NoErrorEA = TRUE; //--- Ошибок нет
   if (NoErrorEA < 0) Comment("Логическая переменная меньше нуля.");
   //---
   
   EASymbol = Symbol(); //--- Инициализация текущено символа
   
   //--- Проверка на пятизнак
   if (Digits < 4) {
      pp = 0.01;
      pd = 2;
   } else {
      pp = 0.0001;
      pd = 4;
   }
   //---
   if (pd == 0) Comment("Неверное значение переменной.");
   //---
   SP = Slippage * MathPow(10, Digits - pd); //--- Расчет проскальзывания цены для пятизнака
   NDMaxSpread = NormalizeDouble(MaxSpread * pp, pd + 1); //--- Преобразование значения MaxSpread в пункты
   
   //--- Инициализация основных переменных для ММ
   MaxLot = MarketInfo(EASymbol, MODE_MAXLOT);
   MinLot = MarketInfo(EASymbol, MODE_MINLOT);
   LotStep = MarketInfo(EASymbol, MODE_LOTSTEP);
   NeedMargin = MarketInfo(EASymbol, MODE_MARGINREQUIRED) * LotStep;
   if (TradeMicroLots) LotDiggits = 2;
   else LotDiggits = 1;   
   
   //--- Проверка значений фильтра МА
   if (PeriodFilterMA <= 0) UseFilterMA = FALSE;
   if (PriceFilterMA < PRICE_CLOSE || PriceFilterMA > PRICE_WEIGHTED) UseFilterMA = FALSE;
   if (MethodFilterMA < MODE_SMA || MethodFilterMA > MODE_LWMA) UseFilterMA = FALSE; 
   //---  
   Leverage = AccountLeverage();
   RiskFactor = NormalizeDouble(LotsRiskReductor * (100 / Leverage), 2);
   //---
   return (0);
}

//+--------------------------------------------------------------------------------------------------------------+
//| DEINIT. Удаление объектов, после удаления советника с графика. Но, пока что нечего удалять.
//+--------------------------------------------------------------------------------------------------------------+
int deinit() {
//+--------------------------------------------------------------------------------------------------------------+

   return (0);
}

//+--------------------------------------------------------------------------------------------------------------+
//| START. Проверка и расчет времени, а также старт функции Scalper
//+--------------------------------------------------------------------------------------------------------------+
int start() {
//+--------------------------------------------------------------------------------------------------------------+

   static bool AllowTrading=true; // Разрешение на торговлю
   
   //--- Инициализация фильтра новостей
   if(AvoidNews && !IsTesting()) {
      static int PrevMinute=-1;  
   
      int MinSinceHighNews=iCustom(NULL,0,"FFCal",true,false,false,true,true,1,0);
      int MinUntilHighNews=iCustom(NULL,0,"FFCal",true,false,false,true,true,1,1);
      
      int MinSinceMediumNews=iCustom(NULL,0,"FFCal",false,true,false,true,true,1,0);
      int MinUntilMediumNews=iCustom(NULL,0,"FFCal",false,true,false,true,true,1,1);
      
      int MinSinceLowNews=iCustom(NULL,0,"FFCal",false,false,true,true,true,1,0);
      int MinUntilLowNews=iCustom(NULL,0,"FFCal",false,false,true,true,true,1,1);

      //--- Фильтр новостей
      if(Minute()!=PrevMinute) {
      
          AllowTrading=true;
          PrevMinute=Minute();
          
          if (High_Impact)
             if (MinUntilHighNews <= MinsUntilNextHighNews || MinSinceHighNews <= MinsSincePrevHighNews) AllowTrading=false;
             
          if (Medium_Impact)
             if (MinUntilMediumNews <= MinsUntilNextMediumNews || MinSinceMediumNews <= MinsSincePrevMediumNews) AllowTrading=false;
             
          if (Low_Impact)
             if (MinUntilLowNews <= MinsUntilNextLowNews || MinSinceLowNews <= MinsSincePrevLowNews) AllowTrading=false;    
      }
   } //--- закрытие AvoidNews

   if (InitRule) { //--- Если инициализация прошла успешно,
      
      if (UseDST) DST = 1; //--- Переход на летнее время
      else DST = 0;
      //---
      if (UseAutoGMToffset && !IsTesting()) Gmt = GetGmtOffset() - DST; //--- Автоматический расчет GMT
      else Gmt = ManualGMToffset - DST; //--- Если автоматический расчет отключен, то используем ручной GMT
      
      //--- то начинаем расчитываеть и проверять время начала и время окончания на ошибки
      StartWorkTime = StartWorkTimeHour + Gmt; //--- Расчет времени старта торговли
      EndWorkTime = EndWorkTimeHour + Gmt; //--- Расчет времени окончания торговли
      
      //--- Цикл проверки стартового времени
      while (true) {
         if (StartWorkTime >= 24) { //--- Если время старта получилось большим или равным 24,
            StartWorkTime -= 24; //--- то вычитаем 24, то есть приравниваем его к нулу, или делаем чуть выше ноля.
            continue; //--- Например, если время старта получилось равным 26 часам, то после проверки оно будет равным 2 часам ночи.
         }
         if (StartWorkTime >= 0) break; //--- Если время старта больше или равно нуля, то прерываем цикл.
         StartWorkTime += 24;
      }
      
      //--- Цикл проверки конечного времени, Действия аналогичные проверке стартового времени
      while (true) {
         if (EndWorkTime >= 24) {
            EndWorkTime -= 24;
            continue;
         }
         if (EndWorkTime >= 0) break;
         EndWorkTime += 24;
      }
      
      //--- Проверка минут старта на ошибки
      if (StartSessionMinute < 0 || StartSessionMinute > 59) StartSessionMinute = 0;
      //--- Проверка минут окончания торговли на ошибки
      if (EndSessionMinute < 0 || EndSessionMinute > 59) EndSessionMinute = 0;
      
      //--- Если часы и минуты старта и окончания не равны, то
      if (StartWorkTime != EndWorkTime || StartSessionMinute != EndSessionMinute) {
      
         if (MinusEndSessionMinute > 0) { //--- Вычитаем из минут окончания значение MinusEndSessionMinute
            EndSessionMinute -= MinusEndSessionMinute;
            
            //--- При отрицательном значении EndSessionMinute прибавляем 60 минут,
            if (EndSessionMinute < 0) {
               EndSessionMinute += 60; //--- пока значение не станет положительным или равным нулю
               EndWorkTime--; //--- И тем самым вычитаем 1 час из EndWorkTime 
               
               //--- Далее проверяем EndWorkTime на положительное значение. Если EndWorkTime прибавляем сутки.
               if (EndWorkTime < 0) EndWorkTime += 24;
            }
         }
      }

      Comment(""); //--- Во время проверки времени комментарии не отображаются

      InitRule = FALSE; //--- Обнуляем результат инициализации
      
   } //--- Закрытие if (InitRule)
   
   if (!NoErrorEA) return (0); //--- Если произошли ошибки, повторить процесс инициализации

   Scalper(); //--- Подключаем основную функцию
   //---
   return (0);
}

//+--------------------------------------------------------------------------------------------------------------+
//| SCALPER. Основная функция эксперта. В ней происходит проверка спреда и временного канала, а также
//| из-неё отдаются приказы на открытие.
//+--------------------------------------------------------------------------------------------------------------+
void Scalper() {
//+--------------------------------------------------------------------------------------------------------------+

   int DayWeek; //--- День недели (1 - понедельник, 5 - пятница)
   
   //--- Переменные проверки условия для каждой группы сигналов
   int Open_PosType_1;
   int Open_PosType_2;
   int Open_PosType_3;
   int Open_PosType_4;
   int Open_PosType_5;
   int Open_PosType_6;
   int Open_PosType_7;
   //---
   double iMA_ClosePrice; //--- Цена закрытия нулевого бара по МА 
   int iMA_ClosePriceCount; //--- Счетчик неподходящих баров, необходим для iMA_ClosePrice
   //---
   ServerTime = TimeCurrent(); //--- Текущее серверное время
   //---
   CloseTrades(); //--- Виртуальный тейк-профит и стоп-лосс
   TimedClosing(); //--- Закрытие просроченных ордеров
   if (PrintLogOnChart) ShowComments (); //--- Включение комментариев на графике
   
   //--- Скрываем индикаторы как при тестировании, так и при торговле
   HideTestIndicators(TRUE);  
   
   //--- Выдавание сообщения о превышенном спреде
   if (MaxSpreadFilter() && WriteDebugLog && !CheckSpreadRule) {
   //---
   if (LanguageEA == 0) {
      Print("Trade signal is missed due to invalid high spread.");
      Print("Current spread = ", DoubleToStr(NormalizeDouble(Ask - Bid, Digits), Digits), ",  MaxSpread = ", DoubleToStr(NDMaxSpread, Digits));
      Print("Forex Shocker will try again later when spreads come to normal.");
      } else {
      Print("Торговый сигнал пропущен из-за большого спреда.");
      Print("Текущий спред = ", DoubleToStr(NormalizeDouble(Ask - Bid, Digits), Digits), ",  MaxSpread = ", DoubleToStr(NDMaxSpread, Digits));
      Print("Forex Shocker будет пробовать позже, когда спред станет допустимым.");
      } //--- Закрытие if (LanguageEA
      CheckSpreadRule = TRUE;
   } //--- Закрытие if (MaxSpreadFilter)
   else CheckSpreadRule = FALSE;
   
   //--- Расчет текущего дня
   DayWeek = TimeDayOfWeek(ServerTime - 3600 * Gmt);
      
   //--- Проверка дней недели
   if (DayWeek == 0 || DayWeek > 5) return;
   if (!TradeFriday) //--- Если запрещена торговля в пятницу,
      if (DayWeek >= 5) return; //--- и если сегодня пятница то запрещаем торговать
   if (!TradeMonday)//--- Если запрещена торговля в понедельник,
      if (DayWeek <= 1) return;//--- и если сегодня понедельник то запрещаем торговать
   if (!TradeInStartMonth)//--- Если запрещена торговля в начале месяца,
      if (Day() < 5) return;//--- и если сегодня с 1 по 4 число месяца, то запрещаем торговать
   if (!TradeInEndMonth)//---Если запрещена торговля в конце месяца,
      if (Day() > 25) return;//--- и если сегодня с 26 по 31 число месяца, то запрещаем торговать
      
   //---Дополнительная проверка времени
   if (DayWeek == 1 && TimeHour(ServerTime - 3600 * Gmt) < StartWorkTimeHour || (TimeHour(ServerTime - 3600 * Gmt) == StartWorkTimeHour && TimeMinute(ServerTime) < StartSessionMinute)) return;
   
   //--- Проверка временного канала и текущего спреда
   if (IsTradeTime(ServerTime, StartWorkTime, StartSessionMinute, EndWorkTime, EndSessionMinute) && !MaxSpreadFilter() && OpenTradeCount() && !IsTradeContextBusy() && AllowTrading) {
   //--- Если время и спред подходят, не занят торговый поток и число открытых советником ордеров не превышает MaximumTrades, то начинаем производить расчет сигналов на открытие
   
//+--------------------------------------------------------------------------------------------------------------+
//| Проверка каждой группы сигналов на вход, и последующее открытие позиций  
//+--------------------------------------------------------------------------------------------------------------+
   
   //--- Проверка и открытие по первой группе сигналов (Длинная позиция)
   Open_PosType_1 = Signal_PosType_1();
       
   if (Open_PosType_1 == 1 && LongTrade) { //--- Во входных параметрах можно отключить открытие длинной или короткой позиции, выставив False напротив LongTrade или ShortTrade
      if (!UseFilterMA) iMA_ClosePriceCount = 0; //--- По желанию подключение дополнительного фильтра по МА
         else {
         iMA_ClosePrice = iMA(NULL, 0, PeriodFilterMA, 0, MethodFilterMA, PriceFilterMA, 0);
         if (Close[0] <= iMA_ClosePrice) iMA_ClosePriceCount++;
         }
         if (iMA_ClosePriceCount == 0) {
         OpenPosition(OP_BUY, magic1);
         }
       }

   //--- Проверка и открытие по второй группе сигналов (Короткая позиция)
   Open_PosType_2 = Signal_PosType_2();
   
   if (Open_PosType_2 == 1 && ShortTrade) {
      if (!UseFilterMA) iMA_ClosePriceCount = 0;
         else {
         iMA_ClosePrice = iMA(NULL, 0, PeriodFilterMA, 0, MethodFilterMA, PriceFilterMA, 0);
         if (Close[0] >= iMA_ClosePrice) iMA_ClosePriceCount++;
         }
         if (iMA_ClosePriceCount == 0) {
         OpenPosition(OP_SELL, magic2);
      }
   }
   
   //--- Проверка и открытие по третьей группе сигналов (Длинная позиция)
   Open_PosType_3 = Signal_PosType_3();
       
   if (Open_PosType_3 == 1 && LongTrade) {
      if (!UseFilterMA) iMA_ClosePriceCount = 0;
         else {
         iMA_ClosePrice = iMA(NULL, 0, PeriodFilterMA, 0, MethodFilterMA, PriceFilterMA, 0);
         if (Close[0] <= iMA_ClosePrice) iMA_ClosePriceCount++;
         }
         if (iMA_ClosePriceCount == 0) {
         OpenPosition(OP_BUY, magic3);
      }
   }
   
   //--- Проверка и открытие по четвертой группе сигналов (Короткая позиция)
   Open_PosType_4 = Signal_PosType_4();
   
   if (Open_PosType_4 == 1 && ShortTrade) {
      if (!UseFilterMA) iMA_ClosePriceCount = 0;
         else {
         iMA_ClosePrice = iMA(NULL, 0, PeriodFilterMA, 0, MethodFilterMA, PriceFilterMA, 0);
         if (Close[0] >= iMA_ClosePrice) iMA_ClosePriceCount++;
         }
         if (iMA_ClosePriceCount == 0) {
         OpenPosition(OP_SELL, magic4);
      }
   }
   
   //--- Проверка и открытие по пятой группе сигналов (Короткая позиция)
   Open_PosType_5 = Signal_PosType_5();
   
   if (Open_PosType_5 == 1 && ShortTrade) {
      if (!UseFilterMA) iMA_ClosePriceCount = 0;
         else {
         iMA_ClosePrice = iMA(NULL, 0, PeriodFilterMA, 0, MethodFilterMA, PriceFilterMA, 0);
         if (Close[0] >= iMA_ClosePrice) iMA_ClosePriceCount++;
         }
         if (iMA_ClosePriceCount == 0) {
         OpenPosition(OP_SELL, magic5);
      }
   } 
   
   //--- Проверка и открытие по шестой группе сигналов (Короткая позиция)
   Open_PosType_6 = Signal_PosType_6();
   
   if (Open_PosType_6 == 1 && ShortTrade) {
      if (!UseFilterMA) iMA_ClosePriceCount = 0;
         else {
         iMA_ClosePrice = iMA(NULL, 0, PeriodFilterMA, 0, MethodFilterMA, PriceFilterMA, 0);
         if (Close[0] >= iMA_ClosePrice) iMA_ClosePriceCount++;
         }
         if (iMA_ClosePriceCount == 0) {
         OpenPosition(OP_SELL, magic6);
      }
   }
                
} //--- Закрытие if (IsTradeTime
} //--- Закрытие Scalper()

//+--------------------------------------------------------------------------------------------------------------+
//+
//| Блок проверки каждой группы сигналов. Если возможен вход возвращает True
//+
//+--------------------------------------------------------------------------------------------------------------+
//| Signal_PosType_1. Правила на вход для открытия позиции по первой группе сигналов. Позиция на Buy.
//+--------------------------------------------------------------------------------------------------------------+
int Signal_PosType_1 () {
//+--------------------------------------------------------------------------------------------------------------+

//---
int result = 0;
int result1 = 0;
//---

//--- Расчет индикаторов для 1 типа позиции
   double iRSI_a = iRSI(NULL, TimeFrame_iRSI_Period1, iRSI_Period1, PRICE_CLOSE, 0);
   double iRSI_b = iRSI(NULL, TimeFrame_iRSI_Period2, iRSI_Period2, PRICE_CLOSE, 0);
   double iMA_a = NormalizeDouble(iMA(NULL, TimeFrame_iMA_Period1, iMA_Period1, iMA_Shift1, MODE_SMA, PRICE_WEIGHTED, 1), 4);

//--- Расчет фракталов с разными периодами и модами для позиции 1 типа
   for (int iFractals_Shift3=1; iFractals_Shift3 < Bars; iFractals_Shift3++) {
      if (iFractals(NULL, PERIOD_H1, MODE_LOWER, iFractals_Shift3) != 0.0) {
         iFractals_c = iFractals(NULL, PERIOD_H1, MODE_LOWER, iFractals_Shift3);
         break;
      }
   }
   for (int iFractals_Shift4 = 1; iFractals_Shift4 < Bars; iFractals_Shift4++) {
      if (iFractals(NULL, PERIOD_H1, MODE_UPPER, iFractals_Shift4) != 0.0) {
         iFractals_d = iFractals(NULL, PERIOD_H1, MODE_UPPER, iFractals_Shift4);
         break;
      }
   }

//--- Расчет условий для iFractalsOpenRule
   bool iFractalsOpenRule = FALSE;
   if (Close[0] <= iFractals_d && Close[0] >= iFractals_c) iFractalsOpenRule = TRUE;

//--- Проверка открыт ли уже ордер 1 типа
   int PosType_1 = CheckOpenTrade(magic1);

//--- Проверка цен открытия. Первоначальная проверка на вход.
   if (iOpen(Symbol(), PERIOD_M5, 0) < Ask + 0.001) {
      if (iOpen(Symbol(), PERIOD_M5, 0) > Bid - 0.001) {
         if (iOpen(Symbol(), PERIOD_M5, 1) < Ask + 0.001) {
            if (iOpen(Symbol(), PERIOD_M5, 1) > Bid - 0.001) {
               if (iOpen(Symbol(), PERIOD_M5, 2) < Ask + 0.0012) {
                  if (iOpen(Symbol(), PERIOD_M5, 2) > Bid - 0.0012) {

//--- Проверка фракталов
if (iFractalsOpenRule) {

//--- Проверка условий для открытия позиции по первой группе сигналов
if (iRSI_a < Filter_iRSI_a_PosType_1 || iRSI_b < Filter_iRSI_b_PosType_1 && iMA_a >= Ask + NewFilter_PosType_1 * ToPoint && Use_PosType_1 && !PosType_1) result1 = 1;

} //-- End if (iFractalsOpenRule) {

}}}}}} //--- Закрытие проверки цен открытия

//---
if (result1 == 1) result = 1;
else result = 0;
//---
return (result);
//---
}

//+--------------------------------------------------------------------------------------------------------------+
//| Signal_PosType_2. Правила на вход для открытия позиции по второй группе сигналов. Позиция на Sell.
//+--------------------------------------------------------------------------------------------------------------+
int Signal_PosType_2 () {
//+--------------------------------------------------------------------------------------------------------------+

//---
int result = 0;
int result1 = 0;
//---

//--- Расчет индикаторов для 2 типа позиции
   double iRSI_a = iRSI(NULL, TimeFrame_iRSI_Period1, iRSI_Period1, PRICE_CLOSE, 0);
   double iRSI_b = iRSI(NULL, TimeFrame_iRSI_Period2, iRSI_Period2, PRICE_CLOSE, 0);
   double iMA_b = NormalizeDouble(iMA(NULL, TimeFrame_iMA_Period2, iMA_Period2, iMA_Shift2, MODE_SMA, PRICE_WEIGHTED, 1), 4);
   
//--- Расчет фракталов с разными периодами и модами для позиции 2 типа
   for (int iFractals_Shift3=1; iFractals_Shift3 < Bars; iFractals_Shift3++) {
      if (iFractals(NULL, PERIOD_H1, MODE_LOWER, iFractals_Shift3) != 0.0) {
         iFractals_c = iFractals(NULL, PERIOD_H1, MODE_LOWER, iFractals_Shift3);
         break;
      }
   }
   for (int iFractals_Shift4 = 1; iFractals_Shift4 < Bars; iFractals_Shift4++) {
      if (iFractals(NULL, PERIOD_H1, MODE_UPPER, iFractals_Shift4) != 0.0) {
         iFractals_d = iFractals(NULL, PERIOD_H1, MODE_UPPER, iFractals_Shift4);
         break;
      }
   }

//--- Расчет условий для iFractalsOpenRule
   bool iFractalsOpenRule = FALSE;
   if (Close[0] <= iFractals_d && Close[0] >= iFractals_c) iFractalsOpenRule = TRUE;

//--- Проверка открыт ли уже ордер 2 типа
   int PosType_2 = CheckOpenTrade(magic2);

//--- Проверка цен открытия. Первоначальная проверка на вход.
   if (iOpen(Symbol(), PERIOD_M5, 0) < Ask + 0.001) {
      if (iOpen(Symbol(), PERIOD_M5, 0) > Bid - 0.001) {
         if (iOpen(Symbol(), PERIOD_M5, 1) < Ask + 0.001) {
            if (iOpen(Symbol(), PERIOD_M5, 1) > Bid - 0.001) {
               if (iOpen(Symbol(), PERIOD_M5, 2) < Ask + 0.0012) {
                  if (iOpen(Symbol(), PERIOD_M5, 2) > Bid - 0.0012) {

//--- Проверка фракталов
if (iFractalsOpenRule) {

//--- Проверка условий для открытия позиции по второй группе сигналов                      
if (iRSI_a > Filter_iRSI_a_PosType_2 || iRSI_b > Filter_iRSI_b_PosType_2 && iMA_b <= Bid - NewFilter_PosType_2 * ToPoint && Use_PosType_2 && !PosType_2) result1 = 1;

} //-- End if (iFractalsOpenRule) {

}}}}}} //--- Закрытие проверки цен открытия

//---
if (result1 == 1) result = 1;
else result = 0;
//---
return (result);
//---
}

//+--------------------------------------------------------------------------------------------------------------+
//| Signal_PosType_3. Правила на вход для открытия позиции по третьей группе сигналов. Позиция на Buy.
//+--------------------------------------------------------------------------------------------------------------+
int Signal_PosType_3 () {
//+--------------------------------------------------------------------------------------------------------------+

//---
int result = 0;
int result1 = 0;
//---

//--- Расчет индикаторов для 3 типа позиции
   double iCCI_a = iCCI(Symbol(), TimeFrame_iCCI_Period1, iCCI_Period1, PRICE_CLOSE, 0);
   double iCCI_b = iCCI(Symbol(), TimeFrame_iCCI_Period2, iCCI_Period2, PRICE_CLOSE, 0);
   double iCCI_c = iCCI(Symbol(), TimeFrame_iCCI_Period3, iCCI_Period3, PRICE_CLOSE, 0);
   
//--- Расчет фракталов с разными периодами и модами для позиции 3 типа
   for (int iFractals_Shift1= 1; iFractals_Shift1 < Bars; iFractals_Shift1++) {
      if (iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1) != 0.0) {
         iFractals_a = iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1);
         break;
      }
   }
   for (int iFractals_Shift2= 1; iFractals_Shift2 < Bars; iFractals_Shift2++) {
      if (iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2) != 0.0) {
         iFractals_b = iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2);
         break;
      }
   }
   for (int iFractals_Shift3=1; iFractals_Shift3 < Bars; iFractals_Shift3++) {
      if (iFractals(NULL, PERIOD_H1, MODE_LOWER, iFractals_Shift3) != 0.0) {
         iFractals_c = iFractals(NULL, PERIOD_H1, MODE_LOWER, iFractals_Shift3);
         break;
      }
   }
   for (int iFractals_Shift4 = 1; iFractals_Shift4 < Bars; iFractals_Shift4++) {
      if (iFractals(NULL, PERIOD_H1, MODE_UPPER, iFractals_Shift4) != 0.0) {
         iFractals_d = iFractals(NULL, PERIOD_H1, MODE_UPPER, iFractals_Shift4);
         break;
      }
   }

//--- Расчет фракталов для дополнительных фильтров к 3 типу ордеров
   MathRound_iFractals = MathRound((iFractals_b - iFractals_a) / ToPoint);
   Difference_iFractals = 0;
   Difference_iFractals =(iFractals_b-((iFractals_b-iFractals_a)/2));  
   MathRound_iATR = MathRound(iATR(Symbol(), PERIOD_M15, 4, 0) / ToPoint);
   //---
   bool iFractalsOpenRule = FALSE;
   if (Close[0] <= iFractals_d && Close[0] >= iFractals_c) iFractalsOpenRule = TRUE;

//--- Проверка открыт ли уже ордер 3 типа
   int PosType_3 = CheckOpenTrade(magic3);

//--- Проверка цен открытия. Первоначальная проверка на вход.
   if (iOpen(Symbol(), PERIOD_M5, 0) < Ask + 0.001) {
      if (iOpen(Symbol(), PERIOD_M5, 0) > Bid - 0.001) {
         if (iOpen(Symbol(), PERIOD_M5, 1) < Ask + 0.001) {
            if (iOpen(Symbol(), PERIOD_M5, 1) > Bid - 0.001) {
               if (iOpen(Symbol(), PERIOD_M5, 2) < Ask + 0.0012) {
                  if (iOpen(Symbol(), PERIOD_M5, 2) > Bid - 0.0012) {

//--- Проверка фракталов
if (MathRound_iFractals < Filter_MathRound_iFractals && MathRound_iATR < Filter_MathRound_iATR && iFractalsOpenRule) {

//--- Проверка условий для открытия позиции по третьей группе сигналов                      
if (iCCI_b <= Filter_iCCI_b_PosType_3 && iCCI_c <= Filter_iCCI_c_PosType_3_add || iCCI_a <= Filter_iCCI_a_PosType_3 && iCCI_c <= Filter_iCCI_c_PosType_3 && Bid <= Difference_iFractals - NewFilter_PosType_3 * ToPoint && Use_PosType_3 && !PosType_3) result1 = 1;

} //--- Закрытие тега if (MathRound_iFractals < ...

}}}}}} //--- Закрытие проверки цен открытия

//---
if (result1 == 1) result = 1;
else result = 0;
//---
return (result);
//---
}

//+--------------------------------------------------------------------------------------------------------------+
//| Signal_PosType_4. Правила на вход для открытия позиции по четвертой группе сигналов. Позиция на Sell.
//+--------------------------------------------------------------------------------------------------------------+
int Signal_PosType_4 () {
//+--------------------------------------------------------------------------------------------------------------+

//---
int result = 0;
int result1 = 0;
//---

//--- Расчет индикаторов для 4 типа позиции
   double iCCI_a = iCCI(Symbol(), TimeFrame_iCCI_Period1, iCCI_Period1, PRICE_CLOSE, 0);
   double iCCI_b = iCCI(Symbol(), TimeFrame_iCCI_Period2, iCCI_Period2, PRICE_CLOSE, 0);
   double iCCI_c = iCCI(Symbol(), TimeFrame_iCCI_Period3, iCCI_Period3, PRICE_CLOSE, 0);

//--- Расчет фракталов с разными периодами и модами для позиции 4 типа
   for (int iFractals_Shift1= 1; iFractals_Shift1 < Bars; iFractals_Shift1++) {
      if (iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1) != 0.0) {
         iFractals_a = iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1);
         break;
      }
   }
   for (int iFractals_Shift2= 1; iFractals_Shift2 < Bars; iFractals_Shift2++) {
      if (iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2) != 0.0) {
         iFractals_b = iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2);
         break;
      }
   }

//--- Расчет фракталов для дополнительных фильтров к 4 типу ордеров
   Difference_iFractals = 0;
   Difference_iFractals =(iFractals_b-((iFractals_b-iFractals_a)/2));  
   
//--- Проверка открыт ли уже ордер 4 типа
   int PosType_4 = CheckOpenTrade(magic4);

//--- Проверка цен открытия. Первоначальная проверка на вход.
   if (iOpen(Symbol(), PERIOD_M5, 0) < Ask + 0.001) {
      if (iOpen(Symbol(), PERIOD_M5, 0) > Bid - 0.001) {
         if (iOpen(Symbol(), PERIOD_M5, 1) < Ask + 0.001) {
            if (iOpen(Symbol(), PERIOD_M5, 1) > Bid - 0.001) {
               if (iOpen(Symbol(), PERIOD_M5, 2) < Ask + 0.0012) {
                  if (iOpen(Symbol(), PERIOD_M5, 2) > Bid - 0.0012) {

//--- Проверка условий для открытия позиции по четвертой группе сигналов                      
if (iCCI_b >= Filter_iCCI_b_PosType_4 && iCCI_c >= Filter_iCCI_c_PosType_4_add || iCCI_a >= Filter_iCCI_a_PosType_4 && iCCI_c >= Filter_iCCI_c_PosType_4 && Ask >= Difference_iFractals + NewFilter_PosType_4 * ToPoint && Use_PosType_4 && !PosType_4) result1 = 1;

}}}}}} //--- Закрытие проверки цен открытия

//---
if (result1 == 1) result = 1;
else result = 0;
//---
return (result);
//---
}

Отредактировано Player (2012-06-26 09:33:15)

0

2

(2/2)

Код:
//+--------------------------------------------------------------------------------------------------------------+
//| Signal_PosType_5. Правила на вход для открытия позиции по пятой группе сигналов. Позиция на Sell.
//+--------------------------------------------------------------------------------------------------------------+
int Signal_PosType_5 () {
//+--------------------------------------------------------------------------------------------------------------+

//---
int result = 0;
int result1 = 0;
//---

//--- Расчет индикаторов для 5 типа позиции
   double iCCI_d = iCCI(Symbol(), TimeFrame_iCCI_Period4, iCCI_Period4, PRICE_CLOSE, 0);
   double iMomentum_a = iMomentum(Symbol(), TimeFrame_iMomentum, iMomentum_Period, PRICE_CLOSE, 0);
   
//--- Расчет фракталов с разными периодами и модами для позиции 5 типа
   for (int iFractals_Shift1= 1; iFractals_Shift1 < Bars; iFractals_Shift1++) {
      if (iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1) != 0.0) {
         iFractals_a = iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1);
         break;
      }
   }
   for (int iFractals_Shift2= 1; iFractals_Shift2 < Bars; iFractals_Shift2++) {
      if (iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2) != 0.0) {
         iFractals_b = iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2);
         break;
      }
   }

//--- Расчет фракталов для дополнительных фильтров к 5 типу ордеров
   Difference_iFractals = 0;
   Difference_iFractals =(iFractals_b-((iFractals_b-iFractals_a)/2));  
   
//--- Проверка открыт ли уже ордер 5 типа
   int PosType_5 = CheckOpenTrade(magic5);

//--- Проверка цен открытия. Первоначальная проверка на вход.
   if (iOpen(Symbol(), PERIOD_M5, 0) < Ask + 0.001) {
      if (iOpen(Symbol(), PERIOD_M5, 0) > Bid - 0.001) {
         if (iOpen(Symbol(), PERIOD_M5, 1) < Ask + 0.001) {
            if (iOpen(Symbol(), PERIOD_M5, 1) > Bid - 0.001) {
               if (iOpen(Symbol(), PERIOD_M5, 2) < Ask + 0.0012) {
                  if (iOpen(Symbol(), PERIOD_M5, 2) > Bid - 0.0012) {

//--- Проверка условий для открытия позиции по пятой группе сигналов                      
if (iMomentum_a <= Filter_iMomentum_a_PosType_5 && iCCI_d >= Filter_iCCI_d_PosType_5 && Ask >= Difference_iFractals + NewFilter_PosType_5 * ToPoint && Use_PosType_5 && !PosType_5) result1 = 1;

}}}}}} //--- Закрытие проверки цен открытия

//---
if (result1 == 1) result = 1;
else result = 0;
//---
return (result);
//---
}

//+--------------------------------------------------------------------------------------------------------------+
//| Signal_PosType_6. Правила на вход для открытия позиции по шестой группе сигналов. Позиция на Sell.
//+--------------------------------------------------------------------------------------------------------------+
int Signal_PosType_6 () {
//+--------------------------------------------------------------------------------------------------------------+

//---
int result = 0;
int result1 = 0;
//---

//--- Расчет индикаторов для 6 типа позиции
   double iBands_a = iBands(Symbol(), iBands_TimeFrame, iBands_Period, iBands_Deviation, iBands_Shift, PRICE_WEIGHTED, MODE_UPPER, 1);
   double iMA_c = iMA(Symbol(), TimeFrame_iMA_Period3, iMA_Period3, iMA_Shift3, MODE_EMA, PRICE_HIGH, 0);
   double iWPR_a = iWPR(Symbol(), TimeFrame_iWPR, iWPR_Period, iWPR_Shift);
   
//--- Расчет фракталов с разными периодами и модами для позиции 6 типа
   for (int iFractals_Shift1= 1; iFractals_Shift1 < Bars; iFractals_Shift1++) {
      if (iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1) != 0.0) {
         iFractals_a = iFractals(NULL, PERIOD_M15, MODE_LOWER, iFractals_Shift1);
         break;
      }
   }
   for (int iFractals_Shift2= 1; iFractals_Shift2 < Bars; iFractals_Shift2++) {
      if (iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2) != 0.0) {
         iFractals_b = iFractals(NULL, PERIOD_M15, MODE_UPPER, iFractals_Shift2);
         break;
      }
   }

//--- Расчет фракталов для дополнительных фильтров к 6 типу ордеров
   Difference_iFractals = 0;
   Difference_iFractals =(iFractals_b-((iFractals_b-iFractals_a)/2));  
   
//--- Проверка открыт ли уже ордер 6 типа
   int PosType_6 = CheckOpenTrade(magic6);

//--- Проверка цен открытия. Первоначальная проверка на вход.
   if (iOpen(Symbol(), PERIOD_M5, 0) < Ask + 0.001) {
      if (iOpen(Symbol(), PERIOD_M5, 0) > Bid - 0.001) {
         if (iOpen(Symbol(), PERIOD_M5, 1) < Ask + 0.001) {
            if (iOpen(Symbol(), PERIOD_M5, 1) > Bid - 0.001) {
               if (iOpen(Symbol(), PERIOD_M5, 2) < Ask + 0.0012) {
                  if (iOpen(Symbol(), PERIOD_M5, 2) > Bid - 0.0012) {

//--- Проверка условий для открытия позиции по шестой группе сигналов                      
if (iWPR_a >= Filter_iWPR_a_PosType_6 && iMA_c > iBands_a && Bid >= Difference_iFractals + NewFilter_PosType_6 * ToPoint && Use_PosType_6 && !PosType_6) result1 = 1;

}}}}}} //--- Закрытие проверки цен открытия

//---
if (result1 == 1) result = 1;
else result = 0;
//---
return (result);
//---
}

//+--------------------------------------------------------------------------------------------------------------+
//| OpenPosition. Функция открытия позиции.
//+--------------------------------------------------------------------------------------------------------------+
int OpenPosition(int OpType, int MagicNumber) {
//+--------------------------------------------------------------------------------------------------------------+

   int RandomOpenTime; //--- Задержка по времени на открытие
   color OpenColor; //--- Цвет открытия позиции. Если Buy то голубая, если Sell то красная
   int OpenOrder = 0; //--- Открытие позиции
   int OpenOrderError; //--- Ошибка открытия
   string OpTypeString; //--- Преобразования вида позиции в текстовое значение
   double OpenPrice; //--- Цена открытия
   int    maxtry = RequoteAttempts;
   int    lasterror = 0;
   double price = OpenPrice;
   //---
   string PosTypeСomment = PosTypeToStr(MagicNumber); //--- Получаем текстовое значения исходя из Magic Number
   string OpenOrderComment = ExpertComment + " " + PosTypeСomment; //--- Получаем комментарий для открываемого ордера
   //---
   double TP, SL;
   double OrderTP = NormalizeDouble (TakeProfit * pp , pd); //--- Преобразуем тейк-профит в вид Points
   double OrderSL = NormalizeDouble (StopLoss * pp , pd); //--- Преобразуем стоп-лосс в вид Points
   double FakeOrderTP = NormalizeDouble ((FakeTakeProfit + MathRand() % PlusRandomTP)* pp , pd); //--- Преобразуем поддельный тейк-профит в вид Points
   double FakeOrderSL = NormalizeDouble ((FakeStopLoss + MathRand() % PlusRandomSL)* pp , pd); //--- Преобразуем поддельный стоп-лосс в вид Points
   
   //--- Задержка в секундах между открытиями
   if (RandomOpenTimePercent > 0) {
      MathSrand(TimeLocal());
      RandomOpenTime = MathRand() % RandomOpenTimePercent;
      if (WriteLog) {
         if (LanguageEA == 0) Print("DelayRandomiser: delay ", RandomOpenTime, " seconds.");
         else Print("DelayRandomiser: задержка ", RandomOpenTime, " секунд.");
      }
      Sleep(1000 * RandomOpenTime);
   } //--- Закрытие if (RandomOpenTimePerc
   
   double OpenLotSize = LotsOptimized(); //--- Расчет объёма позиции
   
   //--- Если не хватет средств, возвращаем ошибку
   if (AccountFreeMarginCheck(EASymbol, OpType, OpenLotSize) <= 0.0 || GetLastError() == 134/* NOT_ENOUGH_MONEY */) {
      //---
      if (WriteDebugLog) {
      //---
      if (LanguageEA == 0) {
         Print("You don\'t have free margin.");
         Comment("You don\'t have free margin.");
      } else {
         Print("Для открытия ордера недостаточно свободной маржи.");
         Comment("Для открытия ордера недостаточно свободной маржи.");
      } 
      //---
      }
      return (-1);
   } //--- Закрытие if (AccountFreeMarginCheck  
   
   RefreshRates();
   
   //--- Если длинная позиция, то
   if (OpType == OP_BUY) {
      OpenPrice = NormalizeDouble(Ask,Digits);
      OpenColor = OpenBuyColor;
      
      //---
      if (UseStopLevels && !UseFakeStopLevels) { //--- Если включены стоп-уровни (стоп-лосс и тейк-профит)
      
      TP = OpenPrice + OrderTP; //--- То расчитывает тейк-профит
      SL = OpenPrice - OrderSL; //--- и стоп-лосс
      
      }
      
      //---
      if (UseFakeStopLevels && !UseStopLevels) { //--- Если включены поддельные стоп-уровни
       
      TP = OpenPrice + FakeOrderTP; //--- То расчитывает поддельный тейк-профит
      SL = OpenPrice - FakeOrderSL; //--- и поддельный стоп-лосс
      
      }
      //--- Если UseStopLevels и UseFakeStopLevels оба равны True или False, то используем только вируальное закрытие
      if (!UseFakeStopLevels && !UseStopLevels || UseFakeStopLevels && UseStopLevels) {TP = 0; SL = 0;}
   
   //--- Если короткая позиция, то   
   } else {
      OpenPrice = NormalizeDouble(Bid,Digits);
      OpenColor = OpenSellColor;
      
      //---
      if (UseStopLevels && !UseFakeStopLevels) {
       
      TP = OpenPrice - OrderTP;
      SL = OpenPrice + OrderSL;
      
      }
      
      //---
      if (UseFakeStopLevels && !UseStopLevels) {
       
      TP = OpenPrice - FakeOrderTP;
      SL = OpenPrice + FakeOrderSL;

      }
      //---
      if (!UseFakeStopLevels && !UseStopLevels || UseFakeStopLevels && UseStopLevels) {TP = 0; SL = 0;} 
      
   }

//--- Если тип исполнения Market Execution (рыночное исполнение), то сначало открываем ордер без sl и tp, а после модифицируем его

if (IsMarketExecution && UseStopLevels)
   {
   OpenOrder = OrderSend(EASymbol, OpType, OpenLotSize, OpenPrice, SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor);
   if (OpenOrder > 0)
      {
      OrderModify(OpenOrder,OrderOpenPrice(),SL,TP,0);
      return(OpenOrder);
      }
   }
   
      //--- Если же нет, то сразу открываем с sl и tp
      
      else
   {
   OpenOrder = OrderSend(EASymbol, OpType, OpenLotSize, OpenPrice, SP, SL, TP, OpenOrderComment, MagicNumber, 0, OpenColor);
   if (OpenOrder > 0) return(OpenOrder);
   }

//--- Если тип ордера не верен, то повторяем операцию.

if ((OpType != OP_BUY) && (OpType != OP_SELL)) return(OpenOrder);

//--- Если ордер открылся успешно, то отправляем сообщение на e-mail (если включена отправка)

if (OpenOrder > 0) {
if (SendEmail) {
            if (LanguageEA == 0) { //--- На Англиском
               SendMail(SendMailOpenOrderEng, StringConcatenate("Forex Shocker ver. 3.2 News Filter Mod Trade Information\nCurrency Pair: ", StringSubstr(EASymbol, 0, 6), 
                  "\nTime: ", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS), 
                  "\nOrder Type: ", OrderTypeToStr(OpType), 
                  "\nPrice: ", DoubleToStr(OpenPrice, Digits), 
                  "\nLot size: ", DoubleToStr(OpenLotSize, LotDiggits), 
                  "\nEvent: Trade Opened", 
                  "\n\nCurrent Balance: ", DoubleToStr(AccountBalance(), 2), " ", AccountCurrency(), 
               "\nCurrent Equity: ", DoubleToStr(AccountEquity(), 2), " ", AccountCurrency()));
            } else { //--- Или на Русском
               SendMail(SendMailOpenOrderRus, StringConcatenate("Forex Shocker ver. 3.2 News Filter Mod торговая информация\nВалютная пара: ", StringSubstr(EASymbol, 0, 6), 
                  "\nВремя: ", TimeToStr(TimeCurrent(), TIME_DATE|TIME_MINUTES|TIME_SECONDS), 
                  "\nТип ордера: ", OrderTypeToStr(OpType), 
                  "\nЦена: ", DoubleToStr(OpenPrice, Digits), 
                  "\nРазмер лота: ", DoubleToStr(OpenLotSize, LotDiggits), 
                  "\nСобытие: открытие ордера", 
                  "\n\nТекущий баланс: ", DoubleToStr(AccountBalance(), 2), " ", AccountCurrency(), 
               "\nТекущие средства: ", DoubleToStr(AccountEquity(), 2), " ", AccountCurrency()));
            }
         } //--- Закрытие if (SendEmail)
         
         if (SoundAlert) PlaySound(SoundFileAtOpen); //--- Проигрываение звука, если он включен
}

if (OpenOrder < 0) {
OpenOrderError = GetLastError(); //--- Возвращаем ошибку
         //---
         if (WriteDebugLog) {
            if (OpType == OP_BUY) OpTypeString = "OP_BUY";
            else OpTypeString = "OP_SELL";
            if (LanguageEA == 0) Print("Open: OrderSend(", OpTypeString, ") error = ", ErrorDescription(OpenOrderError)); //--- Код ошибки на Английском
            else Print("Открытие: OrderSend(", OpTypeString, ") ошибка = ", ErrorDescription(OpenOrderError)); //--- Код ошибки на Русском
         } //--- Закрытие if (WriteDebugLog)
}

//--- При реквотах повторяем операцию.

lasterror = GetLastError();
if ((OpenOrder < 0) && ((lasterror == 135) || (lasterror == 138) || (lasterror == 146)))
   {
   Print("Requote. Error" + lasterror + ". Ticket: " + OpenOrder);
   }
      else
   {
   return(OpenOrder);
   }

//--- Цикл открытия ордера при возникновении ошибок (Максимальное число попыток открытия при возникновении ошибок равно значению RequoteAttempts) 

for (int attempt = 1; attempt <= maxtry; attempt++)
   {
   RefreshRates();
   if (OpType == OP_BUY)
      {
      if (Ask <= price)
         {
         if (IsMarketExecution && UseStopLevels)
            {
            OpenOrder = OrderSend(EASymbol, OpType, OpenLotSize, NormalizeDouble(Ask,Digits), SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor);
            if (OpenOrder > 0)
               {
               OrderModify(OpenOrder,OrderOpenPrice(),SL,TP,0);
               return(OpenOrder);
               }
            }
               else
            {
            OpenOrder = OrderSend(EASymbol, OpType, OpenLotSize, NormalizeDouble(Ask,Digits), SP, SL, TP, OpenOrderComment, MagicNumber, 0, OpenColor);
            if (OpenOrder > 0) return(OpenOrder);
            }
         if ((GetLastError() != 135) && (GetLastError() != 138) && (GetLastError() != 146)) return(OpenOrder);
         Print("Requote. " + "Attempt " + (attempt + 1));
         continue;
         }
      }
   if (OpType == OP_SELL)
      {
      if (Bid >= price)
         {
         if (IsMarketExecution && UseStopLevels)
            {
            OpenOrder = OrderSend(EASymbol, OpType, OpenLotSize, NormalizeDouble(Bid,Digits), SP, 0, 0, OpenOrderComment, MagicNumber, 0, OpenColor);
            if (OpenOrder > 0)
               {
               OrderModify(OpenOrder,OrderOpenPrice(),SL,TP,0);
               return(OpenOrder);
               }
            }
               else
            {
            OpenOrder = OrderSend(EASymbol, OpType, OpenLotSize, NormalizeDouble(Bid,Digits), SP, SL, TP, OpenOrderComment, MagicNumber, 0, OpenColor);
            if (OpenOrder > 0) return(OpenOrder);
            }
         if ((GetLastError() != 135) && (GetLastError() != 138) && (GetLastError() != 146)) return(OpenOrder);
         Print("Requote. " + "Attempt " + (OpenOrder + 1));
         }
      }
   }

//---
return(-1);

}

//+--------------------------------------------------------------------------------------------------------------+
//| CloseTrades. Виртуальный тейк-профит и стоп-лосс.
//| Если включена функция UseStopLevels, то используется как функция резервного закрытия.
//+--------------------------------------------------------------------------------------------------------------+
void CloseTrades() {
//+--------------------------------------------------------------------------------------------------------------+

   bool TicketClose; //--- Закрытие ордера
   int total = OrdersTotal();
   //---
   for (int i = total - 1; i >= 0; i--) { //--- Счетчик открытых ордеров
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      
      //--- Закрытие по профиту или лоссу ордеров на покупку
      if (OrderType() == OP_BUY) {
         if (OrderMagicNumber() == magic1 || OrderMagicNumber() == magic3 && OrderSymbol() == Symbol()) {
            if (Bid >= OrderOpenPrice() + TakeProfit * ToPoint || Bid <= OrderOpenPrice() - StopLoss * ToPoint) {
               RefreshRates();
               TicketClose = CloseOrder(OrderTicket(),Bid);
               //--- Если произошла ошибка, то сообщаем об этом
               if (!TicketClose) {
               //---
               if (WriteDebugLog) {
               if (LanguageEA == 0) Print("There was an error closing the trade. Error is:", GetLastError());
               else Print("Произошла ошибка во время закрытия ордера. Причина:", GetLastError());
               } //--- Закрытие if (WriteDebugLog)
                  return;
               }
            }
         }
      } //--- Закрытие if (OrderType() == OP_BUY)
      
      //--- Закрытие по профиту или лоссу ордеров на продажу
      if (OrderType() == OP_SELL) {
         if (OrderMagicNumber() == magic2 || OrderMagicNumber() == magic4 || OrderMagicNumber() == magic5 || OrderMagicNumber() == magic6 && OrderSymbol() == Symbol()) {
            if (Ask <= OrderOpenPrice() - TakeProfit * ToPoint || Ask >= OrderOpenPrice() + StopLoss * ToPoint) {
               RefreshRates();
               TicketClose = CloseOrder(OrderTicket(),Ask);
               if (!TicketClose) {
               //---
               if (WriteDebugLog) {    
                  if (LanguageEA == 0) Print("There was an error closing the trade. Error is:", GetLastError());
                  else Print("Произошла ошибка во время закрытия ордера. Причина:", GetLastError());
                  } //--- Закрытие if (WriteDebugLog)
                  return;
               }
            }
         }
      } //--- Закрытие if (OrderType() == OP_SELL)
   } //--- Закрытие for (int i = total - 1; i >= 0; i--) {
}

//+--------------------------------------------------------------------------------------------------------------+
//| TimedClosing. Своеобразный вывод в безубыток если ордеры просрочены. По сути время жизни длинных и
//| коротких позиций в минутах. Если, например ордер на покупку был открыт более чем Minutes_Buy минут назад,
//| и его профит больше или равен значению Timed_Buy_TakeProfit, то происходит закрытие длинной позиции.
//+--------------------------------------------------------------------------------------------------------------+
void TimedClosing() {
//+--------------------------------------------------------------------------------------------------------------+

   if (!Timed_Closing) return; //--- Если Timed_Closing выключен, то возвращаем пустой результат
   int DC_Digits; //--- Умножение профита на 1 или 10 в зависимости от Digits вашего дц
   bool TicketClose; //--- Закрытие ордера
   int ExpirationBuyTime,ExpirationSellTime,MinBuyProfit,MinSellProfit;
   
   //--- Если цена состоит из 4-x / 5-и цифр
   if (Digits == 4) DC_Digits = 1;
   else
      if (Digits == 5) DC_Digits = 10;
   
   //--- Выставляются значения минимумом закрытия, по истечении временного канала  
    ExpirationBuyTime=Minutes_Buy;
    ExpirationSellTime=Minutes_Sell;
    MinBuyProfit=Timed_Buy_TakeProfit*DC_Digits;
    MinSellProfit=Timed_Sell_TakeProfit*DC_Digits;

   //--- Счетчик откртых ордеров
   int total = OrdersTotal();
   for (int i = total - 1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      
      //--- Минимумы закрытия для длинных позиций (1 и 3 группа сигналов)
      if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == magic1 || OrderMagicNumber() == magic3) {
         if (TimeCurrent() - OrderOpenTime() >= 60 * ExpirationBuyTime && Bid >= OrderOpenPrice() + MinBuyProfit * Point) {
            RefreshRates();
            TicketClose = CloseOrder(OrderTicket(),Bid);
            //--- Если произошла ошибка, то сообщаем об этом
            if (!TicketClose) {
            //---
            if (WriteDebugLog) {
               if (LanguageEA == 0) Print("There was an error closing the trade. Error is:", GetLastError());
               else Print("Произошла ошибка во время закрытия ордера. Причина:", GetLastError());
               } //--- Закрытие if (WriteDebugLog)
               return;
            }
         }
         
         //--- Принудительное закрытие ордеров на покупку в пятницу после 19 часов по серверу.
         if (DayOfWeek() == 5 && Hour() >= 19 && !TradeFriday) {
            RefreshRates();
            TicketClose = CloseOrder(OrderTicket(),Bid);
         }
      } //--- Закрытие if (OrderType() == OP_BUY
      
      //--- Минимумы закрытия для коротких позиций (2, 4, 5, 6 группа сигналов)
      if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == magic2 || OrderMagicNumber() == magic4 || OrderMagicNumber() == magic5 || OrderMagicNumber() == magic6) {
         if (TimeCurrent() - OrderOpenTime() >= 60 * ExpirationSellTime && Ask <= OrderOpenPrice() - MinSellProfit * Point) {
            RefreshRates();
            TicketClose = CloseOrder(OrderTicket(),Ask);
            //---
            if (!TicketClose) {
            //---
            if (WriteDebugLog) {
               if (LanguageEA == 0) Print("There was an error closing the trade. Error is:", GetLastError());
               else Print("Произошла ошибка во время закрытия ордера. Причина:", GetLastError());
               } //--- Закрытие if (WriteDebugLog)
               return;
            }
         }
         
         //--- Принудительное закрытие ордеров на продажу в пятницу после 19 часов по серверу
         if (DayOfWeek() == 5 && Hour() >= 19 && !TradeFriday) {
            RefreshRates();
            TicketClose = CloseOrder(OrderTicket(),Ask);
         }
      } //--- Закрытие if (OrderType() == OP_SELL
   } //--- for (int i = total - 1; i >= 0; i--) {
}

//+--------------------------------------------------------------------------------------------------------------+
//| CloseOrder. Функция закрытия ордера.
//+--------------------------------------------------------------------------------------------------------------+
int CloseOrder(int ticket, double prce) {
//+--------------------------------------------------------------------------------------------------------------+

//--- Инициализация переменных необходимых для повтора открытия при реквотах или простых ошибках.

double price;
int    slippage;
double p = prce;
int    maxtry = RequoteAttempts;
color  CloseColor;

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

int ordtype = OrderType();
if (ordtype == OP_BUY) {price = NormalizeDouble(Bid,Digits); CloseColor = CloseBuyColor;}
if (ordtype == OP_SELL) {price = NormalizeDouble(Ask,Digits); CloseColor = CloseSellColor;}

if (MathAbs(OrderTakeProfit() - price) <= MarketInfo(Symbol(),MODE_FREEZELEVEL) * Point) return(0); //--- Проверка уровней заморозки тейк-профита
if (MathAbs(OrderStopLoss() - price) <= MarketInfo(Symbol(),MODE_FREEZELEVEL) * Point) return(0); //--- Проверка уровней заморозки стоп-лосса

if (OrderClose(ticket,OrderLots(),price,CloseSlippage,CloseColor)) return(1); //--- Если ордер открыт успешно, то возвращаем 1)
if ((GetLastError() != 135) && (GetLastError() != 138) && (GetLastError() != 146)) return(0); //--- Если нет то 0

Print("Requote");

//--- Цикл закрытия ордера при возникновении ошибок (Максимальное число попыток открытия при возникновении ошибок равно значению RequoteAttempts) 

for (int attempt = 1; attempt <= maxtry; attempt++)
   {
   RefreshRates();
   if (ordtype == OP_BUY)
      {
      slippage = MathRound((Bid - p) / pp);
      if (Bid >= p)
         {
         Print("Closing order. Attempt " + (attempt + 1));
         if (OrderClose(ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,CloseColor)) return(1);
         if (!((GetLastError() != 135) && (GetLastError() != 138) && (GetLastError() != 146))) continue;
         return(0);
         }
      }
   if (ordtype == OP_SELL)
      {
      slippage = MathRound((p - Ask) / pp);
      if (p >= Ask)
         {
         Print("Closing order. Attempt " + (attempt + 1));
         if (OrderClose(ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,CloseColor)) return(1);
         if ((GetLastError() != 135) && (GetLastError() != 138) && (GetLastError() != 146)) return(0);
         }
      }
   }
}

//+--------------------------------------------------------------------------------------------------------------+
//| IsTradeTime. Функция проверки торгового канала.
//| Если время подходит для торговли, дает разрешение на открытие.
//+--------------------------------------------------------------------------------------------------------------+
bool IsTradeTime(int fServerTime, int fStartWorkTimeHour, int fStartSessionMinute, int fEndWorkTimeHour, int fEndSessionMinute) {
//+--------------------------------------------------------------------------------------------------------------+
   
   int NewEndWorkTimeHour; //--- Час окончания торговли
   int NewStartWorkTimeMinute; //---Минута начала торговли
   //---
   int ScalperTimeHour = TimeHour(fServerTime); //--- Возвращает час для ServerTime = TimeCurrent()
   int ScalperTimeMinute = TimeMinute(fServerTime); //--- Возвращает минуты для ServerTime = TimeCurrent()
   //---
   if (fStartWorkTimeHour == fEndWorkTimeHour && fStartSessionMinute == fEndSessionMinute) return (TRUE); //--- Если правило выполняется отправляем разрешение на открытие
   //--- Инициализация NewEndWorkTimeHour и NewStartWorkTimeMinute
   if (fEndSessionMinute == 0) {
      if (fEndWorkTimeHour == 0) NewEndWorkTimeHour = 23;
      else NewEndWorkTimeHour = fEndWorkTimeHour - 1;
      NewStartWorkTimeMinute = 59;
   } else {
      NewEndWorkTimeHour = fEndWorkTimeHour;
      NewStartWorkTimeMinute = fEndSessionMinute - 1;
   }
   //--- Проверка NewEndWorkTimeHour и NewStartWorkTimeMinute
   if (fStartWorkTimeHour == NewEndWorkTimeHour) {
      if (fStartSessionMinute == NewStartWorkTimeMinute) return (TRUE);
      //--- Если же условие не выполняется, то возвращаем FALSE
      if (fStartSessionMinute < NewStartWorkTimeMinute) {
         if (ScalperTimeHour != fStartWorkTimeHour) return (FALSE);
         if (ScalperTimeMinute < fStartSessionMinute || ScalperTimeMinute > NewStartWorkTimeMinute) return (FALSE);
         return (TRUE);
      }
      //--- Проверка минут старта торгови
      if (fStartSessionMinute > NewStartWorkTimeMinute) {
         if (ScalperTimeHour == fStartWorkTimeHour)
            //--- Если же условие не выполняется, то возвращаем FALSE
            if (ScalperTimeMinute < fStartSessionMinute && ScalperTimeMinute > NewStartWorkTimeMinute) return (FALSE);
         return (TRUE);
      }
   }
   //--- Если час старта меньше часа окончания, то
   if (fStartWorkTimeHour < NewEndWorkTimeHour) {
      //--- Сравниваем часы
      if (ScalperTimeHour < fStartWorkTimeHour || ScalperTimeHour > NewEndWorkTimeHour) return (FALSE);
      //--- Сравниваем минуты старта
      if (ScalperTimeHour == fStartWorkTimeHour && ScalperTimeMinute < fStartSessionMinute) return (FALSE);
      //--- Дополнительная проверка
      if (ScalperTimeHour == NewEndWorkTimeHour && ScalperTimeMinute > NewStartWorkTimeMinute) return (FALSE);
      return (TRUE);
   }
   //--- Если час старта больше часа окончания, то
   if (fStartWorkTimeHour > NewEndWorkTimeHour) {
      //--- Сравниваем часы
      if (ScalperTimeHour < fStartWorkTimeHour && ScalperTimeHour > NewEndWorkTimeHour) return (FALSE);
      //--- Сравниваем минуты старта
      if (ScalperTimeHour == fStartWorkTimeHour && ScalperTimeMinute < fStartSessionMinute) return (FALSE);
      //--- Дополнительная проверка
      if (ScalperTimeHour == NewEndWorkTimeHour && ScalperTimeMinute > NewStartWorkTimeMinute) return (FALSE);
      return (TRUE);
   }
   //---
   return (TRUE);
}

//+--------------------------------------------------------------------------------------------------------------+
//| MaxSpreadFilter. Функция для расчета размера спреда и сравнения его со значением MaxSpread.
//| Если текущий спред превышен, то возвращаем TRUE.
//+--------------------------------------------------------------------------------------------------------------+
bool MaxSpreadFilter() {
//+--------------------------------------------------------------------------------------------------------------+

   RefreshRates();
   if (NormalizeDouble(Ask - Bid, Digits) > NDMaxSpread) return (TRUE);
   //---
   else return (FALSE);
}

//+--------------------------------------------------------------------------------------------------------------+
//| CheckOpenTrade. Функция для проверки открытого ордера. Проверяет был ли открыт ордер по MagicNumber.
//| Если был открыт,то возвращает 1, если нет, то 0. Проверка идет по MagicNumber (magic1,magic2,magic3...)
//+--------------------------------------------------------------------------------------------------------------+
int CheckOpenTrade(int MagicNumber) {
//+--------------------------------------------------------------------------------------------------------------+

   int total = OrdersTotal();
   for (int i = total - 1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS) == TRUE)
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) return (1);
   }
   //---
   return (0);
}

//+--------------------------------------------------------------------------------------------------------------+
//| OpenTradeCount. Счетчик открытых ордеров. Если число открытых ордеров больше или равно MaximumTrades, то
//| идет запрет на торговлю.
//+--------------------------------------------------------------------------------------------------------------+

bool OpenTradeCount() {
   int count = 0;
   int trade = OrdersTotal() - 1;
   for (int i = trade; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if (OrderMagicNumber() == magic1 || OrderMagicNumber() == magic2 || OrderMagicNumber() == magic3 || OrderMagicNumber() == magic4 || OrderMagicNumber() == magic5 || OrderMagicNumber() == magic6) count++;
   }
   //---
   if (count >= MaximumTrades) return (False);
   else return (True);
}

//+--------------------------------------------------------------------------------------------------------------+
//| LotsOptimized. Функция расчета обьема лота.
//| При включенной UseMM расчитывает объём лота относительно свободных средств.
//+--------------------------------------------------------------------------------------------------------------+
double LotsOptimized() {
//+--------------------------------------------------------------------------------------------------------------+

   if (!UseMM) return (Lots); //--- Если ММ выключена, то возвращает значение Lots
   //---
   double FreeMargin = AccountFreeMargin() * RiskFactor / 100.0; //--- Расчет маржи относительно риска
   double OpLot = NormalizeDouble(MathFloor(FreeMargin / NeedMargin) * LotStep, LotDiggits); //--- Расчет нового объёма
   
   //--- Сравнение нового объёма с MinLot, MaxLot и MaxLots
   if (OpLot < MinLot) OpLot = MinLot;
   if (OpLot > MaxLot) OpLot = MaxLot;
   if (OpLot > MaxLots) OpLot = MaxLots;
   //---
   return (OpLot);
}

//+--------------------------------------------------------------------------------------------------------------+
//| ShowComments. Функция для отображения комментариев на графике.
//+--------------------------------------------------------------------------------------------------------------+
void ShowComments() {
//+--------------------------------------------------------------------------------------------------------------+

datetime MyOpDate = TIME_DATE; //--- Вывод в комментарий даты оптимизации (формат)
double NextLotSize = LotsOptimized();
string EngTypeGMT;
string RusTypeGMT;
int ShowGmt;
//--- Отображение на графике способа расчета смещения GMT
if (UseAutoGMToffset) {
//---
ShowGmt = GetGmtOffset();
EngTypeGMT = " (automatic)";
RusTypeGMT = " (автоматический)";
//---
} else {
ShowGmt = ManualGMToffset;
EngTypeGMT = " (manual)";
RusTypeGMT = " (ручной)";
//---
}

   if (LanguageEA == 0) {
   
         Comment(""
            + "------------------------------------------------"
            + "\n" + Name
            + "\n"
            + "\n" + Cop
            + "\n"
            + "Optimization date: " + TimeToStr (Date, MyOpDate)
            + "\n"
            + "Optimisation for symbol: " + Symbol_Op
            + "\n"
            + "------------------------------------------------"
            + "\n"
            + "EA INFORMATION" 
            + "\n"
            + "GMT Offset: " + ShowGmt + EngTypeGMT
            + "\n"
            + "Current Spread:   " + DoubleToStr(MarketInfo(EASymbol, MODE_SPREAD) / MathPow(10, Digits - pd), Digits - pd) 
            + "\n" 
            + "MaxSpread:  " + DoubleToStr(MaxSpread, Digits - pd) 
            + "\n"
            + "MaximumTrades: " + MaximumTrades
            + "\n"
            + IIFs(UseMM, "Next Lot size: " + DoubleToStr(NextLotSize, 2) + "\n","")
            + IIFs(UseMM == False, "Lot size:   " + DoubleToStr(NextLotSize, 2) + "\n","")
            + "\n"
            + IIFs(UseStopLevels, "Use stop levels" + "\n","")
            + IIFs(UseFakeStopLevels, "Use fake stop levels" + "\n","")
            + IIFs(Timed_Closing, "Use timed closing" + "\n","")
            + IIFs(UseDST, "Use DST" + "\n","")
            + "------------------------------------------------" 
            + "\n" 
            + "BROKER INFORMATION" 
            + "\n" 
            + "Broker Company:   " + AccountCompany() 
            + "\n" 
            + "------------------------------------------------" 
            + "\n" 
            + "ACCOUNT INFORMATION" 
            + "\n" 
            + "Account Name:  " + AccountName() 
            + "\n" 
            + "Account Number:   " + AccountNumber() 
            + "\n" 
            + "Account Leverage: " + "1:" + DoubleToStr(AccountLeverage(), 0) 
            + "\n" 
            + "Account Balance:  " + DoubleToStr(AccountBalance(), 2) 
            + "\n" 
            + "Account Currency: " + AccountCurrency() 
            + "\n" 
            + "Account Equity:   " + DoubleToStr(AccountEquity(), 2) 
            + "\n" 
            + "------------------------------------------------" 
            + "\n" 
            + "MARGIN INFORMATION" 
            + "\n" 
            + "Free Margin:   " + DoubleToStr(AccountFreeMargin(), 2) 
            + "\n" 
            + "Used Margin:   " + DoubleToStr(AccountMargin(), 2) 
            + "\n" 
            + "------------------------------------------------" 
            + "\n" 
            + "Actual Server Time:  " + TimeToStr(TimeCurrent(), TIME_SECONDS) 
            + "\n" 
         + "------------------------------------------------");
}

   else {
   
         Comment(""
            + "------------------------------------------------"
            + "\n" + Name
            + "\n"
            + "\n" + Cop
            + "\n"
            + Op + ": " + TimeToStr (Date, MyOpDate)
            + "\n"
            + Op2 + ": " + Symbol_Op
            + "\n"
            + "------------------------------------------------"
            + "\n"
            + "Информация об эксперте" 
            + "\n"
            + "Смещение по GMT:  " + ShowGmt + RusTypeGMT
            + "\n"
            + "Текущий спред: " + DoubleToStr(MarketInfo(EASymbol, MODE_SPREAD) / MathPow(10, Digits - pd), Digits - pd) 
            + "\n" 
            + "Максимальный спред:  " + DoubleToStr(MaxSpread, Digits - pd) 
            + "\n"
            + "Максимум сделок:  " + MaximumTrades
            + "\n"
            + IIFs(UseMM, "Следующий объём лота:   " + DoubleToStr(NextLotSize, 2) + "\n","")
            + IIFs(UseMM == False, "Лот:  " + DoubleToStr(NextLotSize, 2) + "\n","")
            + "\n"
            + IIFs(UseStopLevels, "Используются стоп-уровни" + "\n","")
            + IIFs(UseFakeStopLevels, "Используются поддельные стоп-уровни" + "\n","")
            + IIFs(Timed_Closing, "Используется закрытие по времени" + "\n","")
            + IIFs(UseDST, "Используется летнее время" + "\n","")
            + "------------------------------------------------" 
            + "\n" 
            + "Информация о брокере" 
            + "\n" 
            + "Брокерская компания: " + AccountCompany() 
            + "\n" 
            + "------------------------------------------------" 
            + "\n" 
            + "Информация о счёте" 
            + "\n" 
            + "Название счёта:   " + AccountName() 
            + "\n" 
            + "Номер счёта:   " + AccountNumber() 
            + "\n" 
            + "Плечо счёта:   " + DoubleToStr(AccountLeverage(), 0) 
            + "\n" 
            + "Баланс:  " + DoubleToStr(AccountBalance(), 2) 
            + "\n" 
            + "Валюта счёта:  " + AccountCurrency() 
            + "\n" 
            + "Средства:   " + DoubleToStr(AccountEquity(), 2) 
            + "\n" 
            + "------------------------------------------------" 
            + "\n" 
            + "Информация о марже" 
            + "\n" 
            + "Свободная маржа:  " + DoubleToStr(AccountFreeMargin(), 2) 
            + "\n" 
            + "Используемая маржа:  " + DoubleToStr(AccountMargin(), 2) 
            + "\n" 
            + "------------------------------------------------" 
            + "\n" 
            + "Текущее время сервера:  " + TimeToStr(TimeCurrent(), TIME_SECONDS)  
            + "\n" 
         + "------------------------------------------------");  
  }
}

//+--------------------------------------------------------------------------------------------------------------+
//| IIFs. Возвращает одно из двух значений взависимости от условия. Используется при выводе комментариев.
//+--------------------------------------------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
//+--------------------------------------------------------------------------------------------------------------+

  if (condition) return(ifTrue); else return(ifFalse);
}

//+--------------------------------------------------------------------------------------------------------------+
//| PosTypeToStr. Возвращает имя позиции в комментарий ордера, исходя из его Magic Number.
//+--------------------------------------------------------------------------------------------------------------+
string PosTypeToStr(int a) {
//+--------------------------------------------------------------------------------------------------------------+

   string SigGroup; // Группа сигналов
   switch (a) {
   case 11022011:
      SigGroup = "PosType_1";
      break;
   case 21022012:
      SigGroup = "PosType_2";
      break;
   case 31022013:
      SigGroup = "PosType_3";
      break;
   case 41022014:
      SigGroup = "PosType_4";
      break;
   case 51022015:
      SigGroup = "PosType_5";
      break;
   case 61022016:
      SigGroup = "PosType_6";
      break;
   default:
      SigGroup = "Unknown";
   }
   //---
   return (SigGroup);
}

//+--------------------------------------------------------------------------------------------------------------+
//| OrderTypeToStr. Возвращает тип ордера из значения int в значение string.
//+--------------------------------------------------------------------------------------------------------------+
string OrderTypeToStr(int a) {
//+--------------------------------------------------------------------------------------------------------------+

   string OType; // Тип ордера, Buy, Sell и т.д.
   switch (a) {
   case 0:
      OType = "Buy";
      break;
   case 1:
      OType = "Sell";
      break;
   case 2:
      OType = "BuyLimit";
      break;
   case 3:
      OType = "SellLimit";
      break;
   case 4:
      OType = "BuyStop";
      break;
   case 5:
      OType = "SellStop";
      break;
   default:
      OType = "Unknown";
   }
   //---
   return (OType);
}

//+--------------------------------------------------------------------------------------------------------------+
//| ErrorDescription. Возвращает описание ошибки по её номеру.
//+--------------------------------------------------------------------------------------------------------------+
string ErrorDescription(int error) {
//+--------------------------------------------------------------------------------------------------------------+

   string ErrorNumber;
   //---
   if (LanguageEA == 0) { //--- На Английском
   switch (error) {
   case 0:
   case 1:     ErrorNumber = "No error";                                                   break;
   case 2:     ErrorNumber = "Common error";                                               break;
   case 3:     ErrorNumber = "Invalid trade parameters";                                   break;
   case 4:    ErrorNumber = "Trade server is busy";                                       break;
   case 5:     ErrorNumber = "Old version of the client terminal";                         break;
   case 6:     ErrorNumber = "No connection with trade server";                            break;
   case 7:     ErrorNumber = "Not enough rights";                                          break;
   case 8:     ErrorNumber = "Too frequent requests";                                      break;
   case 9:     ErrorNumber = "Malfunctional trade operation (never returned error)";       break;
   case 64:	   ErrorNumber = "Account disabled";                                           break;
   case 65:	   ErrorNumber = "Invalid account";                                            break;
   case 128:	ErrorNumber = "Trade timeout";                                              break;
   case 129:	ErrorNumber = "Invalid price";                                              break;
   case 130:	ErrorNumber = "Invalid stops";                                              break;
   case 131:	ErrorNumber = "Invalid trade volume";                                       break;
   case 132:	ErrorNumber = "Market is closed";                                           break;
   case 133:	ErrorNumber = "Trade is disabled";                                          break;
   case 134:	ErrorNumber = "Not enough money";                                           break;
   case 135:	ErrorNumber = "Price changed";                                              break;
   case 136:	ErrorNumber = "Off quotes";                                                 break;
   case 137:	ErrorNumber = "Broker is busy (never returned error)";                      break;
   case 138:	ErrorNumber = "Requote";                                                    break;
   case 139:	ErrorNumber = "Order is locked";                                            break;
   case 140:	ErrorNumber = "Long positions only allowed";                                break;
   case 141:	ErrorNumber = "Too many requests";                                          break;
   case 145:	ErrorNumber = "Modification denied because order too close to market";   	 break;
   case 146:	ErrorNumber = "Trade context is busy";                                      break;
   case 147:	ErrorNumber = "Expirations are denied by broker";	                         break;
   case 148:	ErrorNumber = "Amount of open and pending orders has reached the limit";    break;
   //---- 
   case 4000:  ErrorNumber = "No error (never generated code)";                            break;
   case 4001:	ErrorNumber = "Wrong function pointer";                                     break;
   case 4002:	ErrorNumber = "Array index is out of range";                                break;
   case 4003:	ErrorNumber = "No memory for function call stack";                          break;
   case 4004:	ErrorNumber = "Recursive stack overflow";                                   break;
   case 4005:	ErrorNumber = "Not enough stack for parameter";                             break;
   case 4006:	ErrorNumber = "No memory for parameter string";                             break;
   case 4007:	ErrorNumber = "No memory for temp string";                                  break;
   case 4008:	ErrorNumber = "Not initialized string";                                     break;
   case 4009:	ErrorNumber = "Not initialized string in array";                            break;
   case 4010:	ErrorNumber = "No memory for array\' string";                               break;
   case 4011:	ErrorNumber = "Too long string";                                            break;
   case 4012:	ErrorNumber = "Remainder from zero divide";                                 break;
   case 4013:	ErrorNumber = "Zero divide";                                                break;
   case 4014:	ErrorNumber = "Unknown command";                                            break;
   case 4015:	ErrorNumber = "Wrong jump (never generated error)";                         break;
   case 4016:	ErrorNumber = "Not initialized array";                                      break;
   case 4017:	ErrorNumber = "Dll calls are not allowed";                                  break;
   case 4018:	ErrorNumber = "Cannot load library";                                        break;
   case 4019:	ErrorNumber = "Cannot call function";	                                     break;
   case 4020:	ErrorNumber = "Expert function calls are not allowed";	                   break;
   case 4021:	ErrorNumber = "Not enough memory for temp string returned from function";   break;
   case 4022:	ErrorNumber = "System is busy (never generated error)";                     break;
   case 4050:	ErrorNumber = "Invalid function parameters count";                          break;
   case 4051:	ErrorNumber = "Invalid function parameter value";                           break;
   case 4052:	ErrorNumber = "String function internal error";                             break;
   case 4053:	ErrorNumber = "Some array error";                                           break;
   case 4054:	ErrorNumber = "Incorrect series array using";                               break;
   case 4055:	ErrorNumber = "Custom indicator error";                                     break;
   case 4056:	ErrorNumber = "Arrays are incompatible";                                    break;
   case 4057:	ErrorNumber = "Global variables processing error";                          break;
   case 4058:	ErrorNumber = "Global variable not found";                                  break;
   case 4059:	ErrorNumber = "Function is not allowed in testing mode";                    break;
   case 4060:	ErrorNumber = "Function is not confirmed";                                  break;
   case 4061:	ErrorNumber = "Send mail error";                                            break;
   case 4062:	ErrorNumber = "String parameter expected";                                  break;
   case 4063:	ErrorNumber = "Integer parameter expected";                                 break;
   case 4064:	ErrorNumber = "Double parameter expected";                                  break;
   case 4065:	ErrorNumber = "Array as parameter expected";                                break;
   case 4066:	ErrorNumber = "Requested history data in update state";                     break;
   case 4099:	ErrorNumber = "End of file";                                                break;
   case 4100:	ErrorNumber = "Some file error";                                            break;
   case 4101:	ErrorNumber = "Wrong file name";                                            break;
   case 4102:	ErrorNumber = "Too many opened files";                                      break;
   case 4103:	ErrorNumber = "Cannot open file";                                           break;
   case 4104:	ErrorNumber = "Incompatible access to a file";                              break;
   case 4105:	ErrorNumber = "No order selected";	                                        break;
   case 4106:	ErrorNumber = "Unknown symbol";	                                           break;
   case 4107:	ErrorNumber = "Invalid price parameter for trade function";	                break;
   case 4108:	ErrorNumber = "Invalid ticket";	                                           break;
   case 4109:	ErrorNumber = "Trade is not allowed in the expert properties";     	       break;
   case 4110:	ErrorNumber = "Longs are not allowed in the expert properties";    	       break;
   case 4111:	ErrorNumber = "Shorts are not allowed in the expert properties";	          break;
   case 4200:	ErrorNumber = "Object is already exist";                                    break;
   case 4201:	ErrorNumber = "Unknown object property";                                    break;
   case 4202:	ErrorNumber = "Object is not exist";                                        break;
   case 4203:	ErrorNumber = "Unknown object type";                                        break;
   case 4204:	ErrorNumber = "No object name";                                             break;
   case 4205:	ErrorNumber = "Object coordinates error";                                   break;
   case 4206:  ErrorNumber = "No specified subwindow";                                     break;
   default:	   ErrorNumber = "Unknown error";
   } } else { //--- На Русском
   switch (error) {
   case 0:
   case 1:     ErrorNumber = "Нет ошибки, но результат неизвестен";                        break;
   case 2:     ErrorNumber = "Общая ошибка";                                               break;
   case 3:     ErrorNumber = "Неправильные параметры";                                     break;
   case 4:     ErrorNumber = "Торговый сервер занят";                                      break;
   case 5:     ErrorNumber = "Старая версия клиентского терминала";                        break;
   case 6:     ErrorNumber = "Нет связи с торговым сервером";                              break;
   case 7:     ErrorNumber = "Недостаточно прав";                                          break;
   case 8:     ErrorNumber = "Слишком частые запросы";                                     break;
   case 9:     ErrorNumber = "Недопустимая операция нарушающая функционирование сервера";  break;
   case 64:    ErrorNumber = "Счет заблокирован";                                          break;
   case 65:    ErrorNumber = "Неправильный номер счета";                                   break;
   case 128:   ErrorNumber = "Истек срок ожидания совершения сделки";                      break;
   case 129:   ErrorNumber = "Неправильная цена";                                          break;
   case 130:   ErrorNumber = "Неправильные стопы";                                         break;
   case 131:   ErrorNumber = "Неправильный объем";                                         break;
   case 132:   ErrorNumber = "Рынок закрыт";                                               break;
   case 133:   ErrorNumber = "Торговля запрещена";                                         break;
   case 134:   ErrorNumber = "Недостаточно денег для совершения операции";                 break;
   case 135:   ErrorNumber = "Цена изменилась";                                            break;
   case 136:   ErrorNumber = "Нет цен";                                                    break;
   case 137:   ErrorNumber = "Брокер занят";                                               break;
   case 138:   ErrorNumber = "Новые цены - Реквот";                                        break;
   case 139:   ErrorNumber = "Ордер заблокирован и уже обрабатывается";                    break;
   case 140:   ErrorNumber = "Разрешена только покупка";                                   break;
   case 141:   ErrorNumber = "Слишком много запросов";                                     break;
   case 145:   ErrorNumber = "Модификация запрещена, так как ордер слишком близок к рынку";break;
   case 146:   ErrorNumber = "Подсистема торговли занята";                                 break;
   case 147:   ErrorNumber = "Использование даты истечения ордера запрещено брокером";     break;
   case 148:   ErrorNumber = "Количество открытых и отложенных ордеров достигло предела "; break;
   //---- 
   case 4000:  ErrorNumber = "Нет ошибки";                                                 break;
   case 4001:  ErrorNumber = "Неправильный указатель функции";                             break;
   case 4002:  ErrorNumber = "Индекс массива - вне диапазона";                             break;
   case 4003:  ErrorNumber = "Нет памяти для стека функций";                               break;
   case 4004:  ErrorNumber = "Переполнение стека после рекурсивного вызова";               break;
   case 4005:  ErrorNumber = "На стеке нет памяти для передачи параметров";                break;
   case 4006:  ErrorNumber = "Нет памяти для строкового параметра";                        break;
   case 4007:  ErrorNumber = "Нет памяти для временной строки";                            break;
   case 4008:  ErrorNumber = "Неинициализированная строка";                                break;
   case 4009:  ErrorNumber = "Неинициализированная строка в массиве";                      break;
   case 4010:  ErrorNumber = "Нет памяти для строкового массива";                          break;
   case 4011:  ErrorNumber = "Слишком длинная строка";                                     break;
   case 4012:  ErrorNumber = "Остаток от деления на ноль";                                 break;
   case 4013:  ErrorNumber = "Деление на ноль";                                            break;
   case 4014:  ErrorNumber = "Неизвестная команда";                                        break;
   case 4015:  ErrorNumber = "Неправильный переход";                                       break;
   case 4016:  ErrorNumber = "Неинициализированный массив";                                break;
   case 4017:  ErrorNumber = "Вызовы DLL не разрешены";                                    break;
   case 4018:  ErrorNumber = "Невозможно загрузить библиотеку";                            break;
   case 4019:  ErrorNumber = "Невозможно вызвать функцию";                                 break;
   case 4020:  ErrorNumber = "eВызовы внешних библиотечных функций не разрешены";          break;
   case 4021:  ErrorNumber = "Недостаточно памяти для строки, возвращаемой из функции";    break;
   case 4022:  ErrorNumber = "Система занята";                                             break;
   case 4050:  ErrorNumber = "Неправильное количество параметров функции";                 break;
   case 4051:  ErrorNumber = "Недопустимое значение параметра функции";                    break;
   case 4052:  ErrorNumber = "Внутренняя ошибка строковой функции";                        break;
   case 4053:  ErrorNumber = "Ошибка массива";                                             break;
   case 4054:  ErrorNumber = "Неправильное использование массива-таймсерии";               break;
   case 4055:  ErrorNumber = "Ошибка пользовательского индикатора";                        break;
   case 4056:  ErrorNumber = "Массивы несовместимы";                                       break;
   case 4057:  ErrorNumber = "Ошибка обработки глобальныех переменных";                    break;
   case 4058:  ErrorNumber = "Глобальная переменная не обнаружена";                        break;
   case 4059:  ErrorNumber = "Функция не разрешена в тестовом режиме";                     break;
   case 4060:  ErrorNumber = "Функция не подтверждена";                                    break;
   case 4061:  ErrorNumber = "Ошибка отправки почты";                                      break;
   case 4062:  ErrorNumber = "Ожидается параметр типа string";                             break;
   case 4063:  ErrorNumber = "Ожидается параметр типа integer";                            break;
   case 4064:  ErrorNumber = "Ожидается параметр типа double";                             break;
   case 4065:  ErrorNumber = "В качестве параметра ожидается массив";                      break;
   case 4066:  ErrorNumber = "Запрошенные исторические данные в состоянии обновления";     break;
   case 4067:  ErrorNumber = "Ошибка при выполнении торговой операции";                    break;
   case 4099:  ErrorNumber = "Конец файла";                                                break;
   case 4100:  ErrorNumber = "Ошибка при работе с файлом";                                 break;
   case 4101:  ErrorNumber = "Неправильное имя файла";                                     break;
   case 4102:  ErrorNumber = "Слишком много открытых файлов";                              break;
   case 4103:  ErrorNumber = "Невозможно открыть файл";                                    break;
   case 4104:  ErrorNumber = "Несовместимый режим доступа к файлу";                        break;
   case 4105:  ErrorNumber = "Ни один ордер не выбран";                                    break;
   case 4106:  ErrorNumber = "Неизвестный символ";                                         break;
   case 4107:  ErrorNumber = "Неправильный параметр цены для торговой функции";            break;
   case 4108:  ErrorNumber = "Неверный номер тикета";                                      break;
   case 4109:  ErrorNumber = "Торговля не разрешена";                                      break;
   case 4110:  ErrorNumber = "Длинные позиции не разрешены";                               break;
   case 4111:  ErrorNumber = "Короткие позиции не разрешены";                              break;
   case 4200:  ErrorNumber = "Объект уже существует";                                      break;
   case 4201:  ErrorNumber = "Запрошено неизвестное свойство объекта";                     break;
   case 4202:  ErrorNumber = "Объект не существует";                                       break;
   case 4203:  ErrorNumber = "Неизвестный тип объекта";                                    break;
   case 4204:  ErrorNumber = "Нет имени объекта";                                          break;
   case 4205:  ErrorNumber = "Ошибка координат объекта";                                   break;
   case 4206:  ErrorNumber = "Не найдено указанное подокно";                               break;
   case 4207:  ErrorNumber = "Ошибка при работе с объектом";                               break;
   default:    ErrorNumber = "Неизвестная ошибка";
   }}
   //---
   return (ErrorNumber);
}

//+--------------------------------------------------------------------------------------------------------------+
//| GetGmtOffset. Функция возвращает значение временной зоны по GMT
//+--------------------------------------------------------------------------------------------------------------+
double GetGmtOffset() {
//+--------------------------------------------------------------------------------------------------------------+

   return (TimeZoneServer());
}

//+--------------------------------------------------------------------------------------------------------------+
//| TimeZoneServer. Функция возвращает значение временной зоны по серверному времени
//+--------------------------------------------------------------------------------------------------------------+
double TimeZoneServer() {
//+--------------------------------------------------------------------------------------------------------------+

   int ServerToLocalDiffMinutes = (TimeCurrent() - TimeLocal()) / 60;
   int nHalfHourDiff = MathRound(ServerToLocalDiffMinutes / 30.0);
   ServerToLocalDiffMinutes = 30 * nHalfHourDiff;
   double TimeZoneServerValue = TimeZoneLocal() + ServerToLocalDiffMinutes / 60.0;
   //---
   return (TimeZoneServerValue);
}

//+--------------------------------------------------------------------------------------------------------------+
//| TimeZoneLocal. Функция возвращает значение временной зоны по локальному времени.
//| При расчете используется kernel32.dll.
//+--------------------------------------------------------------------------------------------------------------+
double TimeZoneLocal() {
//+--------------------------------------------------------------------------------------------------------------+

   int TZInfoArray[43];
   switch (GetTimeZoneInformation(TZInfoArray)) {
   case 0:
      return (TZInfoArray[0] / (-60.0));
   case 1:
      return (TZInfoArray[0] / (-60.0));
   case 2:
      return ((TZInfoArray[0] + TZInfoArray[42]) / (-60.0));
   }
   //---
   return (0);
}

0


Вы здесь » FOREX » Про граммирование » Исходный код советника с комментариями легендарного Пирата


Рейтинг форумов | Создать форум бесплатно