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

  • Автор темы Автор темы urdala
  • Дата начала Дата начала

Олег К

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

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

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

loopsider

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

Вложения

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

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

Вложения

Последнее редактирование:

loopsider

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

Вложения

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
 

Посмотрели (3) Посмотреть

Верх