FastNLExamples/Src/EAs/NewsTrader/Main.mqh
132 lines
5 KiB
MQL5
Nique_372
2026-11-03 17:10:00 -05:00
//+------------------------------------------------------------------+
//| NewsTraderForecast.mqh |
//| Copyright 2025, Leo. |
//| https://www.mql5.com/es/users/nique_372/news |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Leo."
#property link "https://www.mql5.com/es/users/nique_372/news"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "Global.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
namespace TSN
{
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
ICalendarByLeo* calendar;
CRiskManagemet* risk;
//--- Noticias que se operan de usa
const string cadena_USD_operate =
IPC_NAME + "," +
NFP_NAME + "," +
PBI_NAME + "," +
FedTasaInteres_NAME + "," +
Ventas_Minorista_NAME + "," +
IPP_NAME + "," +
ISM_PMI_MANUFACTURERO_NAME + "," +
ISM_PMI_NO_MANUFACTURERO_NAME + "," +
CORE_CPE + "," +
JOLTS_TRABAJOS + "," +
ADP_CAMBIO + "," +
INDICE_CONFIANZA_CONSUMIDOR;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CNewsTrader : public CStrategyBaseTemplate<CNewsEventsHook>
{
private:
ulong country_id_profit;
void OpenOrder(ENUM_POSITION_TYPE type);
public:
CNewsTrader(ulong magic_number_, string symbol_, ENUM_TIMEFRAMES timeframe_ = PERIOD_CURRENT, long chart_id_ = 0,
int subwindow_ = 0, ulong max_deviation_ = NO_MAX_DEVIATION_DEFINED);
~CNewsTrader() {}
//---
void OnNews(const EconomicEventData& events[], const int res, const datetime curr_time) override final;
void Set(ulong country_id_prof) { this.country_id_profit = country_id_prof;}
//---
void OnNewBar(const datetime curr_time) override final {}
void OnTick(const datetime curr_time) override final {}
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CNewsTrader::CNewsTrader(ulong magic_number_, string symbol_, ENUM_TIMEFRAMES timeframe_ = PERIOD_CURRENT,
long chart_id_ = 0, int subwindow_ = 0, ulong max_deviation_ = 0)
: CStrategyBaseTemplate<CNewsEventsHook>(magic_number_, symbol_, timeframe_, chart_id_,
subwindow_, max_deviation_, "News Trader")
{
Nique_372
2026-11-05 12:09:22 -05:00
m_news_hooks_flags = NEWSBYLEO_HOOK_ON_NEWS;
Nique_372
2026-11-03 17:10:00 -05:00
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CNewsTrader::OpenOrder(ENUM_POSITION_TYPE type)
{
//---
::SymbolInfoTick(m_symbol, m_tick);
//---
if(type == POSITION_TYPE_BUY)
{
double entry = m_tick.ask;
double sl = GetSL(entry, type, m_tick.time);
double tp = GetTP(entry, type, m_tick.time);
risk.SetStopLoss(m_symbol, entry - sl);
double l = m_LOT_SIZE > 0.00 ? m_LOT_SIZE : risk.GetLote(ORDER_TYPE_BUY, entry, m_max_deviation, 0);
m_trade.Buy(l, m_symbol, entry, sl, tp, "Ea Buy");
}
else
{
double entry = m_tick.bid;
double sl = GetSL(entry, type, m_tick.time);
double tp = GetTP(entry, type, m_tick.time);
risk.SetStopLoss(m_symbol, sl - entry);
double l = m_LOT_SIZE > 0.00 ? m_LOT_SIZE : risk.GetLote(ORDER_TYPE_SELL, entry, m_max_deviation, 0);
m_trade.Sell(l, m_symbol, entry, sl, tp, "Ea Sell");
}
}
//+------------------------------------------------------------------+
void CNewsTrader::OnNews(const EconomicEventData& events[], const int res, const datetime curr_time)
{
Nique_372
2026-11-05 12:09:22 -05:00
//---
Nique_372
2026-11-03 17:10:00 -05:00
for(int i = 0; i < ::ArraySize(events); i++)
{
//---
Nique_372
2026-11-04 12:54:16 -05:00
const uint meta = events[i].extra_meta;
Nique_372
2026-11-03 17:10:00 -05:00
const ulong cid = m_calendar.GetEventContryId(NEWSBYLEO_EXTRAMETA_GET_COUNTRY_IDX(meta),
NEWSBYLEO_EXTRAMETA_GET_EVENT_IDX(meta));
//---
const double pred = TeoricMovementOfEvent(events[i], cid, country_id_profit, true);
if(pred > 0.0)
{
OpenOrder(POSITION_TYPE_BUY);
Nique_372
2026-11-05 22:08:32 -05:00
break;
Nique_372
2026-11-03 17:10:00 -05:00
}
else
if(pred < 0.0)
{
OpenOrder(POSITION_TYPE_SELL);
Nique_372
2026-11-05 22:08:32 -05:00
break;
Nique_372
2026-11-03 17:10:00 -05:00
}
}
}
//+------------------------------------------------------------------+
}
//+------------------------------------------------------------------+