(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)