class CNewsEvent
Класс, представляющий новостное событие с названием, страной, временем и уровнем влияния.
Сообщите нам, если считаете, что материал размещён без разрешения.
Обращение по товару «cnewsfilter.mqh» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
CNewsFilter — это библиотека на языке MQL для платформы MetaTrader, предназначенная для фильтрации торговых операций в зависимости от экономических новостей. Она скачивает данные календаря событий из XML-источника, анализирует их и позволяет определить, следует ли ограничивать торговлю в ближайшее время.
Библиотека содержит два класса. CNewsEvent хранит информацию о конкретном новостном событии — название, страну, время и уровень влияния. CNewsFilter управляет загрузкой и обработкой новостных данных, а также предоставляет интерфейс для проверки текущей торговой ситуации.
Основные параметры настройки включают временные окна до и после новостей, фильтрацию по уровням влияния, смещение часового пояса GMT и опцию закрытия прибыльных позиций перед новостями. Функция GetNews возвращает информацию о ближайшем событии и флаг, разрешающий или запрещающий торговлю.
| Настройка | Описание |
|---|---|
| __news__ | Идентификатор фильтра новостей — Текстовый идентификатор, используемый для обозначения фильтра новостей в глобальных переменных. |
| UseNewsFilter | Использовать фильтр новостей — Включает или отключает фильтрацию торговых операций по новостному календарю. |
| MinsBeforeNews | Минуты до новости — Количество минут до выхода новости, в течение которых торговля ограничивается. |
| MinsAfterNews | Минуты после новости — Количество минут после выхода новости, в течение которых торговля ограничивается. |
| IncludeHigh | Включать высокое влияние — Включает учёт новостей с высоким уровнем влияния на рынок. |
| IncludeMedium | Включать среднее влияние — Включает учёт новостей со средним уровнем влияния на рынок. |
| IncludeLow | Включать низкое влияние — Включает учёт новостей с низким уровнем влияния на рынок. |
| OffsetHoursGMT | Смещение часового пояса GMT — Смещение часового пояса относительно GMT для корректного сопоставления времени событий. |
| CloseProfitableTradesBeforeNews | Закрытие прибыльных позиций перед новостями — Включает или отключает автоматическое закрытие прибыльных позиций перед выходом новостей. |
Классов: 2 · методов: 5 · конструкторов: 1 · деструкторов: 1 · отдельных функций: 0
class CNewsEvent
Класс, представляющий новостное событие с названием, страной, временем и уровнем влияния.
class CNewsFilter
Основной класс библиотеки для управления загрузкой и фильтрацией новостных данных.
string GetImpact()
Возвращает текстовое представление уровня влияния новостного события.
CNewsFilter()
Конструктор класса CNewsFilter, инициализирующий хранилище событий.
~CNewsFilter()
Деструктор класса CNewsFilter, освобождающий память событий.
void DownloadNews()
Скачивает новостной календарь из XML-источника при наличии интернет-соединения.
void Parse(string news)
Обрабатывает загруженные XML-данные и формирует список новостных событий.
void Check()
Запускает загрузку новостей при необходимости, учитывая настройки фильтра.
bool GetNews(string symbol, string& news, NEWS_IMPACT& newsImpact)
Возвращает информацию о ближайшем новостном событии и статус возможности торговли.
#property strict
#include <CDownloadFile.mqh>;
extern string __news__ = "--- FFCal News Filter --- ";
extern bool UseNewsFilter = true;
extern int MinsBeforeNews = 30;
extern int MinsAfterNews = 30;
extern bool IncludeHigh = true;
extern bool IncludeMedium = true;
extern bool IncludeLow = false;
extern int OffsetHoursGMT = 0;
extern bool CloseProfitableTradesBeforeNews = false;
enum NEWS_IMPACT
{
IMPACT_NONE = 0,
IMPACT_HIGH = 1,
IMPACT_MEDIUM = 2,
IMPACT_LOW = 3
};
class CNewsEvent
{
public:
string Title;
string Country;
datetime DateTime;
NEWS_IMPACT Impact;
string GetImpact()
{
if (Impact == IMPACT_HIGH) return "High ";
if (Impact == IMPACT_MEDIUM) return "Medium ";
if (Impact == IMPACT_LOW) return "Low ";
return "";
}
};
class CNewsFilter
{
private:
CNewsEvent* _newsEvents[];
int _maxEvents;
datetime _lastDownloaded;
datetime _lastDownloadRetry;
string MakeDateTime(string strDate, string strTime)
{
int n1stDash = StringFind(strDate, "-");
int n2ndDash = StringFind(strDate, "-", n1stDash+1);
string strMonth = StringSubstr(strDate, 0, 2);
string strDay = StringSubstr(strDate, 3, 2);
string strYear = StringSubstr(strDate, 6, 4);
int nTimeColonPos = StringFind(strTime, ":");
string strHour = StringSubstr(strTime, 0, nTimeColonPos);
string strMinute = StringSubstr(strTime, nTimeColonPos+1, 2);
string strAM_PM = StringSubstr(strTime, StringLen(strTime)-2);
int nHour24 = StrToInteger(strHour);
if ((strAM_PM == "pm" || strAM_PM == "PM") && nHour24 != 12)
{
nHour24 += 12;
}
if ((strAM_PM == "am" || strAM_PM == "AM") && nHour24 == 12)
{
nHour24 = 0;
}
string strHourPad = "";
if (nHour24 < 10)
strHourPad = "0";
return(StringConcatenate(strYear, ".", strMonth, ".", strDay, " ", strHourPad, nHour24, ":", strMinute));
}
datetime TimeGMTFIX()
{
return(TimeGMT()+(OffsetHoursGMT * 3600));
}
public:
CNewsFilter()
{
_maxEvents = 0;
_lastDownloaded = 0;
_lastDownloadRetry =0;
ArrayResize(_newsEvents, 500);
}
~CNewsFilter()
{
for (int i=0; i < _maxEvents;++i)
delete _newsEvents[i];
_maxEvents=0;
}
void DownloadNews()
{
if (!IsConnected())
{
return;
}
double timeSpanMins = (double)(TimeCurrent() - _lastDownloaded);
timeSpanMins /= 60.0;
if (_maxEvents == 0 || timeSpanMins >= (60*24) )
{
timeSpanMins = (double)(TimeCurrent() - _lastDownloadRetry);
timeSpanMins /= 60.0;
if (timeSpanMins < 5)
{
return;
}
_lastDownloadRetry = TimeCurrent();
string url= "";
string news="";
CDownloadFile* downloader = new CDownloadFile();
bool result = downloader.GrabWeb(url, news);
delete downloader;
int end = StringFind(news, "</weeklyevents>", 0);
if (end <= 0)
{
Print("-- unable to download news --");
return ;
}
else
{
_lastDownloaded = TimeCurrent();
Parse(news);
}
}
}
void Parse(string news)
{
for (int i=0; i < _maxEvents;++i)
delete _newsEvents[i];
_maxEvents=0;
int BoEvent = 0;
int end=0;
string sTags[7] = { "<title>", "<country>", "<date>", "<time>", "<impact>", "<forecast>", "<previous>" };
string eTags[7] = { "</title>", "</country>", "</date>", "</time>", "</impact>", "</forecast>", "</previous>" };
while (true)
{
BoEvent = StringFind(news, "<event>", BoEvent);
if (BoEvent == -1) break;
BoEvent += 7;
int next = StringFind(newsПоказано первые 50% кода (символов: 4908)
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.