Новостной индикатор Urdala_News

Олег К

Заблокирован
Можете считать меня старомодным, но я считаю что для сигналов нужно использовать индикатор.
Для торговли нужно использовать советник.
А вот использовать советник для сигналов это уже извращение полнейшее.

Ладно, будим искать=)

Это каким образом использовать советник для сигналов :rolf: лично мой бот использует сигналы.
 

loopsider

Активный участник
Теперь все работает в тестере.
urdala_news_4EA_3.1.mq4 - эксперт (см. мой пост выше). Требует #_lib_news.mq4 (класть в experts\include). Будучи запущенным в тестере, только скачает файлы прошлых новостей с сервера. В реальном времени работает как раньше.
test_news_4EA_3.1.mq4 - эксперт, пример того, как работать с новостями. Будучи запущенным в тестере, закачает прошлые новости и нарисует моменты выхода важных новостей по истории.
 

Вложения

  • urdala_news_4EA_3.1.mq4
    4,2 КБ · Просмотры: 181
  • #_lib_news.mq4
    11,4 КБ · Просмотры: 185
  • test_news_4EA_3.1.mq4
    2,5 КБ · Просмотры: 151

S I P

Новичок форума
Теперь все работает в тестере.
urdala_news_4EA_3.1.mq4 - эксперт (см. мой пост выше). Требует #_lib_news.mq4 (класть в experts\include). Будучи запущенным в тестере, только скачает файлы прошлых новостей с сервера. В реальном времени работает как раньше.
test_news_4EA_3.1.mq4 - эксперт, пример того, как работать с новостями. Будучи запущенным в тестере, закачает прошлые новости и нарисует моменты выхода важных новостей по истории.
urdala_news_4EA_3.1.mq4 и test_news_4EA_3.1.mq4не вешается на график как эксперт
 

Malvin86

Новичок форума
Всем привет, есть тут кто живой?)

В общем прикрутил фильтр новостей к своему советнику, сделал это таким образом:
Код:
#include <#_lib_news.mq4>
...
extern bool   UseWorkNewsHigh       = false;
extern int    HighBefore            = 30;
extern int    HighAfter             = 30;
extern bool   UseWorkNewsMedium     = false;
extern int    MediumBefore          = 15;
extern int    MediumAfter           = 15;
extern bool   UseWorkNewsLow        = false; 
extern int    LowBefore             = 5; 
extern int    LowAfter              = 5;

       int    prevstatus, prevtime;
       string FileNamePrev;
...
int start()
  {
  if (Urdala_News() == 0) открываем ордер
  }
...
int Urdala_News() {
  GlobalVariableSet("TimeZone", TimeZone);
  GlobalVariableSet("HighBefore", HighBefore);
  GlobalVariableSet("HighAfter", HighAfter);
  GlobalVariableSet("MediumBefore", MediumBefore);
  GlobalVariableSet("MediumAfter", MediumAfter);
  GlobalVariableSet("LowBefore", LowBefore);
  GlobalVariableSet("LowAfter", LowAfter);
  int UNs = 0;
  if (UseWorkNewsHigh == false || UseWorkNewsMedium == false || UseWorkNewsLow == false) {
    // работаем на открытии М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();
    // используем фильтр для ограничения торговли
    if (UseWorkNewsHigh == false) {
      if (GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(), 0, 3)) == 3 && GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(), 3, 3)) == 3) {
        UNs = 1;
      }
    }
    if (UseWorkNewsMedium == false) {
      if (GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(), 0, 3)) == 2 && GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(), 3, 3)) == 2) {
        UNs = 1;
      }
    }
    if (UseWorkNewsLow == false) {
      if (GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(), 0, 3)) == 1 && GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(), 3, 3)) == 1) {
        UNs = 1;
      }
    }
  }
return(UNs);
}

Проблема в следующем, при включенных параметрах UseWorkNewsHigh/UseWorkNewsMedium/UseWorkNewsLow (т.е. фильтр не используется) - советник тестится как положено, при выключении одного или нескольких этих параметров (т.е. при включении фильтра новостей) выдается один и тот же результат, как будто включаются фильтры сразу по всем новостям.
Мне почему-то кажется что проблема связана с глобальными переменными, но других способов передать переменную нет, разве что весь исполняемый код перенести в советник...

В самом файле #_lib_news.mq4 заменил переменные:
Код:
extern int GMToffset = 3; // часовой пояс. 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;
на:
Код:
GlobalVariableGet("TimeZone");
GlobalVariableGet("HighBefore");
GlobalVariableGet("HighAfter");
GlobalVariableGet("MediumBefore");
GlobalVariableGet("MediumAfter");
GlobalVariableGet("LowBefore");
GlobalVariableGet("LowAfter");
 
Последнее редактирование:

urdala

Местный житель
А почему просто не воспользоваться функцией iCustum? Я думаю так было бы проще.
 

Malvin86

Новичок форума
Короче как оказалось все что написано ниже // используем фильтр для ограничения торговли вообще ни на что не влияет, даже при удалении кода результат такой же получается :(
urdala напишите как, я попробую :)
 

urdala

Местный житель
iCustom(Symbol(),0,"Urdala_News",TimeDo,TimePosle, ChasPoyas,Vhigh,Vmedium,Vlow,0,0);
в первом посте я писал об этом.
 

Malvin86

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

urdala

Местный житель
Читал. А почему не пользуешь базовый индикатор?
 

Malvin86

Новичок форума
Как только басовый индюк научится теститься на истории, так сразу начну пользоваться им :)
 

loopsider

Активный участник
В общем прикрутил фильтр новостей к своему советнику, сделал это таким образом:
Не, не так. Все гораздо проще. Берешь test_news_4EA_3.1 из поста выше. Добавляешь ключи, какие новости тебе нужны
Код:
extern bool   UseWorkNewsHigh       = true;
extern bool   UseWorkNewsMedium    = false;
extern bool   UseWorkNewsLow        = false;
Дальше проверяешь флаг новости и, если флаг не установлен, открываешь свои ордера
Код:
int alert1 = GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(),0,3));
int alert2 = GlobalVariableGet("NewsAlertFlag" + StringSubstr(Symbol(),3,3));
bool timeout = (UseWorkNewsHigh && (alert1 ==3 || alert2 ==3 )) ||
                    (UseWorkNewsMedium && (alert1 ==2 || alert2 ==2 )) ||
                    (UseWorkNewsLow && (alert1 ==1 || alert2 ==1 ));
if (!timeout) {
   открываем ордер, если есть сигнал
}
Все! Внешние переменные из #_lib_news.mq4 в советник переносить не надо, все и так будет видно в свойствах сова.
 

Malvin86

Новичок форума
Ага, так в этот раз вы пишите alert1 ==3 || alert2 ==3, а в своем примере страницу назад было указано &&, хотя этот вариант я уже пробовал на самом деле.
Что же касается "Берешь test_news_4EA_3.1", я и так его взял в неизменном виде, добавил несколько условий в начале для проверки включения той или иной новости.
А глобальные переменные ввел чтобы менять параметры в самом советнике не залезая в #_lib_news.mq4

Что же касается самой функции, то мне так удобнее интегрировать проверку на новости, чем добавлять строки кода для каждого случая по отдельности.
В общем щас буду пробовать, спасибо за совет :)
 

loopsider

Активный участник
А глобальные переменные ввел чтобы менять параметры в самом советнике не залезая в #_lib_news.mq4
Директива include просто добавляет содержимое указанного файла в твой код. Поэтому, внешние переменные в #_lib_news.mq4 на самом деле уже в твоем советнике и будут доступны в его свойствах.
 

Malvin86

Новичок форума
loopsider Разницы вашего примера с моей функцией судя по результатам абсолютно никакой нет.
Либо советник блочит все новости без разбора, либо не блочит никакие. Ни время до/после выхода новостей, ни параметр важности этих новостей не работает :(

Прикрепляю эксперта, сделанного по вашим рекомендациям:
 

Вложения

  • Local2.mq4
    7,5 КБ · Просмотры: 71
Последнее редактирование:

loopsider

Активный участник

Вложения

  • test_news_filter_1.1.mq4
    2,6 КБ · Просмотры: 114

Malvin86

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

dave0

Новичок форума
Hi
Can someone ADD :
Close profitable trades before news
Close All trades before news
please give example code for expert advisor

external parameters:?
start parameters:?
Function parameters:?

I would like to use this newsfilter in my expert.
You can use Local.mq4 above and edit please and also show the 30 mins before external parameter.

thanks
 
Верх