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