Имя пользователя:

Пароль:



MQL Функции фильтров и сигналов

MQL Функции фильтров и сигналов

Номер сообщения:#1  Непрочитанное сообщение the1arty » 06 сен 2013, 05:46

Важное сообщение
В эту тему выкладываем функции фильтров и сигналов, подаваемыми различными индикаторами, для открытия ордеров. Нам нужно разработать и взять за основу в своем будущем советнике, какие индикаторы мы будем использовать и какие фильтры подключать в различные моменты рынка.


Adept писал(а):

Kordan писал(а):

Собрать такие фильтры в базу и использовать при необходимости в своих разрабатываемых роботах.


Ну один из первых и самых простых фильтров предлагаю использовать так называемый "Фильтр дней недели". Пару лет назад, не вспомню уже название системы (ручная была система), но там тоже принятие торгового решения основывалось на бальной системе. Так вот, первый фильтр был - Дни недели.
Понедельник - 1 балл
Вторник - 2 балла
Среда - 2 балла
Четверг - 2 балла
Пятница - 0 баллов
Я считаю что такая градация дней вполне имеет право на существование, ведь очевидно что по степени риска торговли эти дни как раз с такими баллами и должны быть
Система из которой я это взял была внутридневная. позиции рекомендовалось закрывать к концу дня, не перенося на следующий. Но и нам подходит, к примеру Пятница имеет 0 баллов - Рисковый день, кто захочет открывать колена и увеличивать лот и просадку в Пятницу, неизвестно будет ли гэп в Понедельник и в какую сторону, да и просто сэкономить немного на свопах, перенос через выходные. А если счет ECN, то там вообще в пятницу к концу дня уровень StopOut до 100% подскакивает, так что иметь открытые новые позиции не особо выгодно.


1-Разбор полета.
Поскольку форум посвящен работе с Мартинами, наверняка у многих тут имеются в наличии таблицы и графики для расчета количества колен, рисков, начальных лотов и необходимых депозитов чтобы выдержать просадку на определенное кол-во пунктов.
К примеру (мой случай) при депозите 3000 и стартовом лоте 0,02 , экспо 2,0 , пипстеп 30 - Слив наступает через 210 пунктов безотката при открытии 7 колена. (На самом деле при 6 колене просадка достигает 50%, и остальные 50% улетают буквально через 30 пип при открытии 7 колена) ДА, можно надеяться что не будет безотката в 200пп, ДА можно рассчитывать на частичное закрытие последних лотов на миниоткатах по 10пп (если повезет то миниоткат на 10пп случится сразу после открытия колена, а если он случится чуть подальше то частичное закрытие не произойдет и просадка продолжается), ДА великолепная идея с накопительным буфером заслуживает отдельной авации. Но тем не менее Интегра (у меня была 2,8,5) открывает почти без разбору новые колена через каждые 30-45 пунктов (я так понял открытие колен фильтруется по cci, а в те моменты когда она открывает не четко с шагом 30 пип а больше, к примеру 45, то лот значительно увеличивается, такое ощущение что и экспонента увеличивается с 2 до 2.2)
Итого мы имеем ход безоткатного движения в 210 пп. Понижение начального лота с 0.02 до 0.01 особо преимуществ не дает, ход увеличится до 240 пунктов и с 7 до 8 колен. На 8 колене слив 3000$ с целью заработать 10$

2-Предложение
♦ После 2-3 колена включить более точную систему отслеживания разворота (отката). Более точную чем по CCI
Это могут быть Дивергенции на ТФ 15-30 мин (Есть готовые индикаторы которые рисуют дивергенции, можно включить их код в интегру и использовать в качестве фильтра). Так же это могут быть какие-то пересечения МА, иногда отсутствие простейшего пересечения МА на маленьком ТФ при быстром или безоткатном движении может уберечь от открывания колен в неподходящем месте.
♦ Так же может быть полезным отслеживать длину свечей, зачем открываться против движения если свеча явно слишком вытянутая и явно понятно что на этом дело не закончится и будет продолжение движения.
Еще можно отслеживать резкие скачки цены, обычно на новостях, когда в одной 15 минутной свече происходят скачки на пару десятков пунктов, и свеча за 15 минут несколько раз может измениться от бычей до медвежей и назад.
♦Еще одним из вариантов фильтра может служить отслеживание не сложных но эффективных свечных комбинаций, типа когда предыдущая свеча полностью закрывается телом последующей свечи другого цвета, и так далее.

§ Понятное дело что включив все фильтры можно тупо перегрузить советника излишними условиями и он годами будет ждать совпадение всех условий чтобы открыть колено которое уже ничего не спасет, цена уйдет слишком далеко. В связи с этим предлагаю сделать СИСТЕМУ БАЛЛОВ в советнике. Например: имеем 5 фильтров, выполнение условия каждого фильтра дает 1 балл. НО для входа нам необходимо всего 2 или 3 балла. Соответственно выполнение условий всех 5 фильтров не требуется, достаточно 2-3.
Или более расширенный вариант Бальной системы - Некоторые более точные фильтры могут иметь 2-3 балла при выполнении их условий и менее точные фильтры соответственно меньшее количество баллов.

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

Ниже я попробую приложить пару картинок-скриншотов того безотката по EURUSD (пару дней назад был, сегодня 4 сентября в среду только первые признаки отката появились, кстати хорошо подтвержденные дивергенцией) который довел интегру 2.8.5 до 5 колена без единого полузакрытия и прсадкой под 50% депо. И график увеличения просадки где видно что конец приходит через 210 пипов. Если будет необходимость приложу файл ексель таблицы где производил рассчет колен, а так же несколько индикаторов рисующих дивергенции, если кому понадобится.
-----------------------------------------------------------------------

Кстати фильтрами могут служить не только индикаторы указывающие на разворот и откат, но так же и трендовые, но их сигналы будут давать баллы с отрицательными значениями. Поясню, к примеру мы имеем в качестве фильтра трендовый индикатор указывающий на то что сейчас идет сильное движение, прорыв, тренд. Соответственно для мартина открывать новые колена против шерсти не имеет смысла, индикатор дает -1 или -2 балла, и колено не открывается. К примеру индикатор "Канал боллинджера", при сильном движении цена выходит за границы канала, и было бы совсем неуместно открывать колено в этот момент.

**Относительно самой системы учета быллов, баллы могут накопляться и просто суммироваться в буфере, типа накопительного буфера как в Интегре 2.8.5, и при достижении определенного количества баллов, суммы всех плюсов и минусов, давать сигнал true - разрешение на открытие колена
Последний раз редактировалось the1arty 06 сен 2013, 05:50, всего редактировалось 1 раз.
Аватар пользователя
the1arty

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#2  Непрочитанное сообщение vunicorn » 06 сен 2013, 16:08

Добавлю свои пять копеек: фильтр по свечной модели. Думаю что если мы в этой ветке кроме шаблона бальной ситтемы будем выкладывать функции фильтрации то это никому не помешает. И даст возможность кому то начать работу по "бальному" шаблону и его развитию.
CPI_v2.mq4
Сорри, нашел ошибку выложил новую версию

К стате говоря, а для такой бальной системы фильтрации, считаю, что нейронные сети самое то будут.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось vunicorn 06 сен 2013, 16:21, всего редактировалось 1 раз.
Аватар пользователя
vunicorn

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#3  Непрочитанное сообщение the1arty » 06 сен 2013, 16:16

vunicorn писал(а):

Добавлю свои пять копеек: фильтр по свечной модели. Думаю что если мы в этой ветке кроме шаблона бальной ситтемы будем выкладывать функции фильтрации то это никому не помешает. И даст возможность кому то начать работу по "бальному" шаблону и его развитию.
CPI_v1.mq4


К стате говоря, а для такой бальной системы фильтрации, считаю, что нейронные сети самое то будут.



А как это использовать ? это скрипт, индикатор то на графике не вижу..
Аватар пользователя
the1arty

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#4  Непрочитанное сообщение vunicorn » 06 сен 2013, 16:19

Это просто функции MQL можно использовать в советнике, сами по себе ничего не выводят и не показывают, просто выдернуты из советника.
Аватар пользователя
vunicorn

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#5  Непрочитанное сообщение Kordan » 06 сен 2013, 17:54

Изменил тему на более обширную. Незачем привязываться к Интегре. Хочется собрать такую базу из командных функций, функции из которой можно будет проверять и использовать в различных советниках. Также здесь можно и подумать о разработке сигнальщиков с системой значимости, силы, подаваемых ими сигналов. Может это будет и бальная система, а может и более плавная.
Из плавной системы силы сигнала, я уже озвучивал мысли. Это объединить трендовый сигнальщик с канальным. На выходе получать разностный сигнал дисбаланса, т.е. силу и приоритет направления торговли.

Сообщение добавлено... спустя 3 минуты 42 секунды:
vunicorn писал(а):

Добавлю свои пять копеек: фильтр по свечной модели. Думаю что если мы в этой ветке кроме шаблона бальной ситтемы будем выкладывать функции фильтрации то это никому не помешает. И даст возможность кому то начать работу по "бальному" шаблону и его развитию.
CPI_v2.mq4
Сорри, нашел ошибку выложил новую версию

К стате говоря, а для такой бальной системы фильтрации, считаю, что нейронные сети самое то будут.

Желательно выкладывать в
Код: выделить все · Развернуть
КОДЕ
, а не файле, т.к. не все будут скачивать и форум не загружать лишними объемами.
Аватар пользователя
Kordan
.
.
Сообщений: 2451
Возраст: 49
Зарегистрирован: 63 месяцев и 28 дней
Откуда: Саратов
Национальный флаг:
Russia
Благодарил (а): 667 раз.
Поблагодарили: 1220 раз.
Имя: Валерий
Пункты репутации: 25
Молодой трейдерМолодой трейдерМолодой трейдер

MQL Функции фильтров и сигналов

Номер сообщения:#6  Непрочитанное сообщение the1arty » 06 сен 2013, 19:16

Kordan писал(а):

Изменил тему на более обширную. Незачем привязываться к Интегре. Хочется собрать такую базу из командных функций, функции из которой можно будет проверять и использовать в различных советниках. Также здесь можно и подумать о разработке сигнальщиков с системой значимости, силы, подаваемых ими сигналов. Может это будет и бальная система, а может и более плавная.
Из плавной системы силы сигнала, я уже озвучивал мысли. Это объединить трендовый сигнальщик с канальным. На выходе получать разностный сигнал дисбаланса, т.е. силу и приоритет направления торговли.

Сообщение добавлено... спустя 3 минуты 42 секунды:
vunicorn писал(а):

Добавлю свои пять копеек: фильтр по свечной модели. Думаю что если мы в этой ветке кроме шаблона бальной ситтемы будем выкладывать функции фильтрации то это никому не помешает. И даст возможность кому то начать работу по "бальному" шаблону и его развитию.
CPI_v2.mq4
Сорри, нашел ошибку выложил новую версию

К стате говоря, а для такой бальной системы фильтрации, считаю, что нейронные сети самое то будут.

Желательно выкладывать в
Код: выделить все · Развернуть
КОДЕ
, а не файле, т.к. не все будут скачивать и форум не загружать лишними объемами.



Ну просто если все будут кидать фильтры будет полный бардак ! А так фильтры которые могут подходит на интегру, потому что в роботе есть хорошая идея и ее надо просто доработать. И не все фильтры и т.д. пойдут интегре на помощь. Я бы все таки отнес эту тему больше к интегре :)
Аватар пользователя
the1arty

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#7  Непрочитанное сообщение Kordan » 06 сен 2013, 19:25

Отсюда и будем брать фильтры, которые будут лучше подходить и к Интегре и к другим советникам. Куда девать хорошие фильтры, которые не подходят к Интегре? Фильтры для Интегры будем обсуждать в ее ветке.
Аватар пользователя
Kordan
.
.
Сообщений: 2451
Возраст: 49
Зарегистрирован: 63 месяцев и 28 дней
Откуда: Саратов
Национальный флаг:
Russia
Благодарил (а): 667 раз.
Поблагодарили: 1220 раз.
Имя: Валерий
Пункты репутации: 25
Молодой трейдерМолодой трейдерМолодой трейдер

MQL Функции фильтров и сигналов

Номер сообщения:#8  Непрочитанное сообщение coder-ex » 23 окт 2013, 10:14

У кого есть код фильтра на основе ADX или другого индикатора тренда? Выложите тут если не сложно.
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 14 месяцев и 28 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL Функции фильтров и сигналов

Номер сообщения:#9  Непрочитанное сообщение 0xFX » 25 окт 2013, 10:00

Такой подойдет??
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
0xFX

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#10  Непрочитанное сообщение 0xFX » 25 окт 2013, 10:51

Это индикатор тренда..Из ветки Баскет Буль на альпари, автор Захаров Вадим Юрич.. Поставь на дневной график или на 4 часа,.
по этому поводу согласен с автором, показания индикаторов тренда менее 4 часового периода самообман, так что в качестве фильтра
по тренду его вполне можно использовать,. он совсем новый, Юрич его около месяца назад анонсировал.
Аватар пользователя
0xFX

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#11  Непрочитанное сообщение coder-ex » 25 окт 2013, 11:41

Я тут вчера прикрутил фильтр тренда на основе индикатора A/D, сделал оптимизацию в т.ч. по ТФ и действительно, на ТФ Н4 и выше улучшает точность входа. Этот индикатор позже опробую, сейчас занят другим - в советнике нужно функцию создать по разруливанию зависших ордеров. Изучаю антилок, буду технологию по откусыванию ордеров оттуда выдирать :tipa:
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 14 месяцев и 28 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL Функции фильтров и сигналов

Номер сообщения:#12  Непрочитанное сообщение 0xFX » 25 окт 2013, 13:00

Kisa писал(а):

на ТФ Н4 и выше улучшает точность входа

На этих тф даже встроенный в мт MACD Simple работает-))..
Kisa писал(а):

буду технологию по откусыванию ордеров оттуда выдирать

Технологию я нашел.. вот отсюда взял., в оригинале он кусает профит частями,. я на лосей переделал.
Во вложении оригинал, буду дома переделанный выложу.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
0xFX

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#13  Непрочитанное сообщение coder-ex » 25 окт 2013, 13:23

И алгоритм распиши если не сложно, мне для понимания как лучше все интегрировать :)
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 14 месяцев и 28 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL Функции фильтров и сигналов

Номер сообщения:#14  Непрочитанное сообщение 0xFX » 25 окт 2013, 14:54

Странно не дает сообщение прошлое редактировать.. Вот то что щас во вложении берет из внешних строковых переменных
значения при какой просадке позиции сколько откусить от нее в процентах. Это просто заготовка, откусить то
не проблема, проблема где то запомнить что было откушено,.и при следующем условии откусить еще часть.Так здесь
это реализовано через комментарии в ордерах from #102297454 >to #102297454 по тикетам. Единственный гемор что автор
реализовал все это, через массивы со строковыми значениями,. если сможешь то переделай на int, double.
Давно хотел выложить это в тему по разрулу , что бы самим состряпать нормального сова с нормальным индикатором для
получения профита, из которого лосей можно дробить на куски.
Описание что и как закрывется есть в комментах,. только там вместо "прибыль", читай "убыток", так как он изначально
делался для частичного закрытия профита, а не убытка.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
0xFX

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#15  Непрочитанное сообщение Kordan » 25 окт 2013, 15:32

0xFX писал(а):

Странно не дает сообщение прошлое редактировать..

Не дает, потому что на сообщение уже дан ответ.
И еще. Желательно функции в открытом коде выкладывать. Проще посмотреть, а то приходится скачивать, запускать в редакторе, которого нет на компе...
Аватар пользователя
Kordan
.
.
Сообщений: 2451
Возраст: 49
Зарегистрирован: 63 месяцев и 28 дней
Откуда: Саратов
Национальный флаг:
Russia
Благодарил (а): 667 раз.
Поблагодарили: 1220 раз.
Имя: Валерий
Пункты репутации: 25
Молодой трейдерМолодой трейдерМолодой трейдер

MQL Функции фильтров и сигналов

Номер сообщения:#16  Непрочитанное сообщение SVG » 25 окт 2013, 18:27

А еще лучше все разработки вести в Привате, опять сообщение об исключении за распространение на других форумах наших разработок.
Возврат спреда делать здесь!!! ..... платят.
Аватар пользователя
SVG
.
.
Сообщений: 1430
Возраст: 45
Зарегистрирован: 62 месяцев и 20 дней
Откуда: Khimki Left coast
Национальный флаг:
Russia
Благодарил (а): 454 раз.
Поблагодарили: 805 раз.
Имя: Владимир
Пункты репутации: 29
Молодой трейдерМолодой трейдерМолодой трейдер

MQL Функции фильтров и сигналов

Номер сообщения:#17  Непрочитанное сообщение 0xFX » 26 окт 2013, 20:06

Фильтр по новостям..поскольку он давно валяется на форексистем в привате не вижу смысла выкладывать.
Библиотека
Код: выделить все · Развернуть
//+------------------------------------------------------------------+
//|                                                       #_lib_news |
//| based on                                         Urdala_News.mq4 |
//|                                                   [email protected] |
//|   VAY [email protected]
//+------------------------------------------------------------------+
#import "wininet.dll"
int InternetAttemptConnect (int x);
  int InternetOpenA(string sAgent, int lAccessType,
                    string sProxyName = "", string sProxyBypass = "",
                    int lFlags = 0);
  int InternetOpenUrlA(int hInternetSession, string sUrl,
                       string sHeaders = "", int lHeadersLength = 0,
                       int lFlags = 0, int lContext = 0);
  int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead,
                       int& lNumberOfBytesRead[]);
  int InternetCloseHandle(int hInet);
#import
//---------------------------------------------------------------------

extern int GMToffset = 2; // часовой пояс. 0-GMT
extern int TimeBeforeLow = 15;
extern int TimeBeforeMedium = 15;
extern int TimeBeforeHigh = 15;
extern int TimeAfterLow = 15;
extern int TimeAfterMedium = 15;
extern int TimeAfterHigh = 15;

datetime TimeNews[300];
string Valuta[300];
string News[300];
string Vazn[300];
int nom;

int nCurSymbol = 8;
string CurSymbol[300];

//
//====================
//   Ищем ближайшие новости
//   устанавливаем флаги и глобалаьные переменные
void SetNextNews() {
   int i;
   int iCur;
   string Cur;
   string Importance;
   string infoline;
   int TimeNextNews;
   int TimeLastNews;
   int TimeLeft;
   int TimeSince;   
   int AlertFlag;
//
   CurSymbol[1] = "EUR";
   CurSymbol[2] = "USD";
   CurSymbol[3] = "JPY";
   CurSymbol[4] = "GBP";
   CurSymbol[5] = "CHF";
   CurSymbol[6] = "CAD";
   CurSymbol[7] = "AUD";
   CurSymbol[8] = "NZD";
//
//   Low importance
//
   for (iCur=1; iCur<=nCurSymbol; iCur++) {
      Cur = CurSymbol[iCur];
      AlertFlag = 0;

      TimeNextNews = 0;
      for (i=1; i<nom; i++) {
         if (Valuta[i] != Cur) continue;
         if (Vazn[i] != "LOW") continue;
         if (TimeNews[i]>=TimeCurrent() && (TimeNextNews==0 || TimeNews[i]<TimeNextNews)) {
            TimeNextNews = TimeNews[i];
            TimeLeft = TimeNextNews - TimeCurrent();
            if (TimeLeft <= TimeBeforeLow*60) AlertFlag = 1;
         }
      }

      TimeLastNews = TimeCurrent()-7*24*3600;
      for (i=1; i<nom; i++) {
         if (Valuta[i] != Cur) continue;
         if (Vazn[i] != "LOW") continue;
         if (TimeNews[i]<=TimeCurrent() && TimeNews[i]>TimeCurrent()-TimeAfterLow*60 && TimeNews[i]>TimeLastNews) {
            TimeLastNews = TimeNews[i];
            TimeSince = TimeCurrent()-TimeLastNews;
            if (TimeSince <= TimeAfterLow*60) AlertFlag = 1;
         }
      }

      GlobalVariableSet("NextNewsTime" + Cur + "_Low",TimeNextNews);  // время следующей новости
      GlobalVariableSet("NewsAlertFlag" + Cur,AlertFlag);
   }
//
//   MEDIUM importance
//
   for (iCur=1; iCur<=nCurSymbol; iCur++) {
      Cur = CurSymbol[iCur];
      AlertFlag = GlobalVariableGet("NewsAlertFlag" + Cur);

      TimeNextNews = 0;
      for (i=1; i<nom; i++) {
         if (Valuta[i] != Cur) continue;
         if (Vazn[i] != "MEDIUM") continue;
         if (TimeNews[i]>=TimeCurrent() && (TimeNextNews==0 || TimeNews[i]<TimeNextNews)) {
            TimeNextNews = TimeNews[i];
            TimeLeft = TimeNextNews - TimeCurrent();
            if (TimeLeft <= TimeBeforeMedium*60) AlertFlag = 2;
         }
      }

      TimeLastNews = TimeCurrent()-7*24*3600;
      for (i=1; i<nom; i++) {
         if (Valuta[i] != Cur) continue;
         if (Vazn[i] != "MEDIUM") continue;
         if (TimeNews[i]<=TimeCurrent() && TimeNews[i]>TimeCurrent()-TimeAfterMedium*60 && TimeNews[i]>TimeLastNews) {
            TimeLastNews = TimeNews[i];
            TimeSince = TimeCurrent()-TimeLastNews;
            if (TimeSince <= TimeAfterMedium*60) AlertFlag = 2;
         }
      }

      GlobalVariableSet("NextNewsTime" + Cur + "_Medium",TimeNextNews);  // время следующей новости
      GlobalVariableSet("NewsAlertFlag" + Cur,AlertFlag);
   }
//
//   HIGH importance
//
   for (iCur=1; iCur<=nCurSymbol; iCur++) {
      Cur = CurSymbol[iCur];
      AlertFlag = GlobalVariableGet("NewsAlertFlag" + Cur);

      TimeNextNews = 0;
      for (i=1; i<nom; i++) {
         if (Valuta[i] != Cur) continue;
         if (Vazn[i] != "HIGH") continue;
         if (TimeNews[i]>=TimeCurrent() && (TimeNextNews==0 || TimeNews[i]<TimeNextNews)) {
            TimeNextNews = TimeNews[i];
            TimeLeft = TimeNextNews - TimeCurrent();
            if (TimeLeft <= TimeBeforeHigh*60) AlertFlag = 3;
         }
      }

      TimeLastNews = TimeCurrent()-7*24*3600;
      for (i=1; i<nom; i++) {
         if (Valuta[i] != Cur) continue;
         if (Vazn[i] != "HIGH") continue;
         if (TimeNews[i]<=TimeCurrent() && TimeNews[i]>TimeCurrent()-TimeAfterHigh*60 && TimeNews[i]>TimeLastNews) {
            TimeLastNews = TimeNews[i];
            TimeSince = TimeCurrent()-TimeLastNews;
            if (TimeSince <= TimeAfterHigh*60) AlertFlag = 3;
         }
      }

      GlobalVariableSet("NextNewsTime" + Cur + "_High",TimeNextNews);  // время следующей новости
      GlobalVariableSet("NewsAlertFlag" + Cur,AlertFlag);
   }
}

//
//====================
//   Заносим данные из файла на диске в массивы
void FillData(int handle) {
   if (handle < 0) return;

   nom=StrToInteger(FileReadString(handle));
   string Hand;
   for(int i=1;i<=8;i++)Hand=FileReadString(handle);
   string data,time,month,poyas;
   int YearFile=TimeYear(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   string text = "";

   for(i=1;i<=nom;i++) {
       data=FileReadString(handle);
       time=FileReadString(handle);
       if (time == "") continue;
       
       month=StringSubstr(data,4,3);
       if(month=="Jan") month="01";
       if(month=="Feb") month="02";
       if(month=="Mar") month="03";
       if(month=="Apr") month="04";
       if(month=="May") month="05";
       if(month=="Jun") month="06";
       if(month=="Jul") month="07";
       if(month=="Aug") month="08";
       if(month=="Sep") month="09";
       if(month=="Oct") month="10";
       if(month=="Nov") month="11";
       if(month=="Dec") month="12";
       TimeNews[i]=StrToTime(YearFile+"."+month+"."+StringSubstr(data,8,2)+" "+time)+GMToffset*3600;
       
       text=FileReadString(handle);
       
       Valuta[i]=FileReadString(handle);
       if(Valuta[i]=="eur") Valuta[i]="EUR";
       if(Valuta[i]=="usd") Valuta[i]="USD";
       if(Valuta[i]=="jpy") Valuta[i]="JPY";
       if(Valuta[i]=="gbp") Valuta[i]="GBP";
       if(Valuta[i]=="chf") Valuta[i]="CHF";
       if(Valuta[i]=="cad") Valuta[i]="CAD";
       if(Valuta[i]=="aud") Valuta[i]="AUD";
       if(Valuta[i]=="nzd") Valuta[i]="NZD";
       if(Valuta[i]=="cny") Valuta[i]="CNY";
       
       News[i]=FileReadString(handle);
       
       Vazn[i]=FileReadString(handle);
       if (Vazn[i]!="High" && Vazn[i]!="HIGH" && Vazn[i]!="Medium" && Vazn[i]!="MEDIUM"  && Vazn[i]!="MED" && Vazn[i]!="Low" && Vazn[i]!="LOW")Vazn[i]=FileReadString(handle);
       if (Vazn[i]!="High" && Vazn[i]!="HIGH" && Vazn[i]!="Medium" && Vazn[i]!="MEDIUM"  && Vazn[i]!="MED" && Vazn[i]!="Low" && Vazn[i]!="LOW")Vazn[i]=FileReadString(handle);
       if (Vazn[i]!="High" && Vazn[i]!="HIGH" && Vazn[i]!="Medium" && Vazn[i]!="MEDIUM"  && Vazn[i]!="MED" && Vazn[i]!="Low" && Vazn[i]!="LOW")Vazn[i]=FileReadString(handle);

       if (Vazn[i]=="High") Vazn[i]="HIGH";
       if (Vazn[i]=="Medium" || Vazn[i]=="MED") Vazn[i] = "MEDIUM";
       if (Vazn[i]=="Low") Vazn[i]="LOW";
       
       while(!IsStopped()) {
          text=FileReadString(handle);
          if (FileIsLineEnding(handle)){
//            Print(Valuta[i],"   ",TimeToStr(TimeNews[i],TIME_DATE|TIME_SECONDS),"  ",text);
            break;
          }
       }
   }
   FileClose(handle);
}

//
//====================
//   если файл есть на диске, открываем; если нет, пытаемся скачать
int GetHandle(string FileName) {
   int handle=FileOpen(FileName,FILE_CSV|FILE_READ,";");
   if (handle<0)   {
      Print("Downloading the calendar file " + FileName + " from http://www.dailyfx.com");
         //-----Скачиваем календарь ---------------------------------------------------------------------   
      string url="http://www.dailyfx.com/files/Calendar-"+FileName; 
         //-------Функция читает исходный код страницы сайта в строку------------------------------------
      if(!IsDllsAllowed()) {
         Alert("Необходимо в настройках разрешить использование DLL");
         return(-1);
      }
      int rv = InternetAttemptConnect(0);
      if(rv != 0)   {
         Alert("Ошибка при вызове InternetAttemptConnect()");
         return(-1);
      }
      int hInternetSession = InternetOpenA("Microsoft Internet Explorer",0, "", "", 0);
      if(hInternetSession <= 0)  {
         Alert("Ошибка при вызове InternetOpenA()");
         return(-1);         
      }
      int hURL = InternetOpenUrlA(hInternetSession, url, "", 0, 0, 0);
      if(hURL <= 0) {
         Alert("Ошибка при вызове InternetOpenUrlA()");
         InternetCloseHandle(hInternetSession);
         return(-1);         
      }
         //------------------------------------------------------------------------     
      handle=FileOpen(FileName,FILE_CSV|FILE_WRITE,";");
      int dwBytesRead[1],N1,N2,N3,N4;
      string text = "";
      string Str[10];
      for(int y=0;y<9;y++)Str[y]="";
      nom=0;
      int x=0;
      while(!IsStopped()) {
         int cBuffer[256];
         bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);
         if(dwBytesRead[0] == 0) break;
         for(int i = 0; i < 256; i++) {
            N1=cBuffer[i] & 0x000000FF;
            N2=cBuffer[i] >> 8 & 0x000000FF;
            N3=cBuffer[i] >> 16 & 0x000000FF;
            N4=cBuffer[i] >> 24 & 0x000000FF;
            if (N1!=44 && N1!=10)Str[x]=Str[x]+CharToStr(N1);
               else x++;
            if (N1==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
            if ((i*4)==dwBytesRead[0])break;
            if (N2!=44 && N2!=10)Str[x]=Str[x]+CharToStr(N2);
               else x++;
            if (N2==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
            if ((i*4)+1==dwBytesRead[0])break;
            if (N3!=44 && N3!=10)Str[x]=Str[x]+CharToStr(N3);
               else x++;
            if (N3==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
            if ((i*4)+2==dwBytesRead[0])break;
            if (N4!=44 && N4!=10)Str[x]=Str[x]+CharToStr(N4);
               else x++;
            if (N4==10){nom++;x=0;FileWrite(handle,Str[0],Str[1],Str[2],Str[3],Str[4],Str[5],Str[6],Str[7],Str[8]);for(y=0;y<9;y++)Str[y]="";}
            if ((i*4)+3==dwBytesRead[0])break;
         }
      }
      InternetCloseHandle(hInternetSession);
      FileSeek(handle,0,SEEK_SET);
      FileWrite(handle,nom);
      FileClose(handle);
      handle=FileOpen(FileName,FILE_CSV|FILE_READ,";");
   }
   return(handle);
}


Ну и реализация самого фильтра
Код: выделить все · Развернуть
#include <#_lib_news.mq4>

int prevstatus;
int prevtime;
string FileNamePrev;
int TimeNextNewsPrev;

int start()  {
          // работаем на открытии М1 баров
   if (prevtime == iTime(NULL,PERIOD_M1,0)) return;
   prevtime = iTime(NULL,PERIOD_M1,0);

         // имя файла календаря
   int DayFile=TimeDay(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   if (DayFile<10)string DF="0"+DayFile;
       else DF=DayFile;
   int MonthFile=TimeMonth(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   if (MonthFile<10)string MF="0"+MonthFile;
       else MF=MonthFile;
   int YearFile=TimeYear(TimeCurrent()-TimeDayOfWeek(TimeCurrent())*86400);
   string DateFile=MF+"-"+DF+"-"+YearFile;
   string FileName=DateFile+".csv";

   if (FileName != FileNamePrev) {
      Print("Reading the next news calendar file: " + FileName);
      FileNamePrev = FileName;
         // открываем или закачиваем файл
      int handle = GetHandle(FileName);
      if (handle < 0) {
         if (prevstatus > 0) {
            Print ("Error opening file " + FileName);
            prevstatus = -1;
         }
         return;
      }
      prevstatus = 0;   
        // засасываем данные
      FillData(handle);
      Print("OK");
   }
   
        // устанавливаем флаги
   SetNextNews();
//
// Вывод на экран
//
   int time1 = GlobalVariableGet("NextNewsTime" + StringSubstr(Symbol(),0,3) + "_High");
   int time2 = GlobalVariableGet("NextNewsTime" + StringSubstr(Symbol(),3,3) + "_High");

   int TimeNextNews;
   if (time1 != 0) TimeNextNews = time1;
   if (time2 != 0 && time2 < time1) TimeNextNews = time2;

   if (TimeNextNews != 0 && TimeNextNews != TimeNextNewsPrev) {
      TimeNextNewsPrev = TimeNextNews;
      Print("Got the next news at " + TimeToStr(TimeNextNews,TIME_DATE|TIME_SECONDS));
      string objName = DoubleToStr(TimeNextNews,0);
      ObjectCreate(objName,0,OBJ_VLINE,TimeNextNews,0);
      ObjectSet(objName,OBJPROP_COLOR,Red);
      ObjectSet(objName,OBJPROP_STYLE,2);
   }

   return;
}




Работает на истории.. и в онлайне
Аватар пользователя
0xFX

      Автор темы

MQL Функции фильтров и сигналов

Номер сообщения:#18  Непрочитанное сообщение Kordan » 14 дек 2013, 18:49

Временной фильтр, который можно встроить в любой советник.

Код: выделить все · Развернуть
extern string t7 =            "Фильтр времени";
extern bool   UseFilterTime      =       FALSE;      // Использовать запрет торговли в пятницу после и в понедельник до указанных времен
extern bool   UseFilterDate      =       FALSE;      // Использовать запрет торговли в конце и начале месяца
extern int    StartHourMonday    =           7;      // Время начала торговли в понедельник
extern int    EndHourFriday      =          19;      // Время конца  торговли в пятницу
extern int    StartMonth         =           2;      // Начать торги после N дней начала  месяца
extern int    EndMonth           =           2;      // Закончит торговлю за N дней до конца месяца включительно


Код: выделить все · Развернуть
bool time()
  {
   if((DayOfWeek()==0 || DayOfWeek()==6) && (UseFilterTime || UseFilterDate))             return(0); // Не торговать в выходные
   if(((Hour()<StartHourMonday && DayOfWeek()==1) ||
      (Hour()>=EndHourFriday && DayOfWeek()==5)) && UseFilterTime)                        return(0);
   if((Day()<StartMonth+1 || ((Day()<7)&& Month()==1)) && UseFilterDate)                  return(0);
   if((Day()>31-EndMonth || ((Day()>28-EndMonth) && Month()==2) || (Day()>30-EndMonth &&
      ((Month()==4) || (Month()==6) || (Month()==9) || (Month()==11)))) && UseFilterDate) return(0);
   return (1);
  }
Аватар пользователя
Kordan
.
.
Сообщений: 2451
Возраст: 49
Зарегистрирован: 63 месяцев и 28 дней
Откуда: Саратов
Национальный флаг:
Russia
Благодарил (а): 667 раз.
Поблагодарили: 1220 раз.
Имя: Валерий
Пункты репутации: 25
Молодой трейдерМолодой трейдерМолодой трейдер

MQL Функции фильтров и сигналов

Номер сообщения:#19  Непрочитанное сообщение coder-ex » 14 дек 2013, 19:19

Этот фильтр обязательно нужно будет прикрутить к сове :)
А я еще пользуюсь для тестов в выходные такой штукой
Код: выделить все · Развернуть
   /*Для тестов в выходные*/
   int dt=StrToInteger(TimeToStr(TimeCurrent(), TIME_MINUTES));
   if(TimeDayOfWeek(TimeCurrent())==5) {
      if(dt>=21) {
         OnTick();
      }
   }
Си — это причудливый, несовершенный, но невероятно успешный язык.
— Dennis M. Ritchie.
Аватар пользователя
coder-ex
.
.
Сообщений: 849
Возраст: 47
Зарегистрирован: 14 месяцев и 28 дней
Откуда: Томск
Национальный флаг:
Russia
Благодарил (а): 10 раз.
Поблагодарили: 21 раз.
Имя: Константин
Пункты репутации: 2
Ученик трейдера

MQL Функции фильтров и сигналов

Номер сообщения:#20  Непрочитанное сообщение 0xFX » 21 дек 2013, 10:06

Переделал вот индикатор по относительной силе валют. Можно использовать как фильтр для начала движения
по инструменту в настройках. В настройках прописывается пара по которой сигналить вход, и ее индексы которые
нужно рассчитывать
Код: выделить все · Развернуть
extern string PairAlert = "USDJPY";  //инструмент
extern string Idx1       = "USD";       // индекс 1
extern string Idx2       = "JPY";        // индекс 2
extern double delta     = 3;             // разница между индексами
результат выводится в глобальные переменные
текущие значения индексов и сигнал по паре 0 флет , -1 продажа , 1 покупка
Единственно что не сделал это нахождение из всех индексов максимально двигающийся инструмент..
для мультивалютных систем. Надо делать выборку и сравнение из строковых массивов, пока знаний не
хватает. А сравнивать в лобовую как то не эстетично и гора кода получится, может кто допишет.
Вот народ помог зарисовку сделать
Код: выделить все · Развернуть
void sg_Max(){
double MasGV[8];
string a;
string b;
                      //объявляешь одномерный массив типа double с размерностью 8
MasGV[0] = GlobalVariableGet("AUD");  // присваиваешь значение GlobalVariableGet("AUD") массиву MasGV по адресу [0]
MasGV[1] = GlobalVariableGet("USD");
MasGV[2] = GlobalVariableGet("NZD");
MasGV[3] = GlobalVariableGet("JPY");
MasGV[4] = GlobalVariableGet("GBP");
MasGV[5] = GlobalVariableGet("EUR");
MasGV[6] = GlobalVariableGet("CAD");
MasGV[7] = GlobalVariableGet("CHF");
ArraySort(MasGV,WHOLE_ARRAY,0,MODE_ASCEND);
double max = MasGV[7];//получили минимальное значение
double min = MasGV[0];//получмлм максимальное значение
У вас нет доступа для просмотра вложений в этом сообщении.
Аватар пользователя
0xFX

      Автор темы


Вернуться в Программное обеспечение



Кто сейчас на форуме

Пользователь просматривает форум: нет зарегистрированных пользователей

  • Объявления
cron