ICTLibraryExamples/TTrades/EasySb/Main.mqh
Nique_372 Nique_372 728d4506d0
2026-11-05 18:16:32 -05:00
222 라인
7.8 KiB
MQL5
//+------------------------------------------------------------------+
//| Main.mqh |
//| Copyright 2025, Niquel Mendoza. |
//| https://www.mql5.com/es/users/nique_372/news |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, Niquel Mendoza."
#property link "https://www.mql5.com/es/users/nique_372/news"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "Defines.mqh"
// Source: https://www.youtube.com/watch?v=o0v4KQxZbpU&t=183s
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CEstrategia : public TSN::CStrategyBase
{
private:
bool m_operate;
ENUM_EASYSB_STATE m_state;
double m_max_9;
double m_min_9;
//---
void Clean();
void OpenOrder(ENUM_POSITION_TYPE type);
public:
CEstrategia(ulong magic_number_, string symbol_, ENUM_TIMEFRAMES timeframe_ = PERIOD_CURRENT, long chart_id_ = 0,
int subwindow_ = 0, ulong max_deviation_ = NO_MAX_DEVIATION_DEFINED);
~CEstrategia(void);
//---
void OnNewBar(const datetime curr_time) override;
void OnNewWeek(const datetime curr_time) override;
void OnInterupcion();
void OnTick(const datetime curr_time) override {}
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CEstrategia::CEstrategia(ulong magic_number_, string symbol_, ENUM_TIMEFRAMES timeframe_ = PERIOD_CURRENT, long chart_id_ = 0, int subwindow_ = 0, ulong max_deviation_ = 0)
: CStrategyBase(magic_number_, symbol_, timeframe_, chart_id_, subwindow_, max_deviation_, "TTRdes sb")
{
CBasicEvents::RegisterEvent(&this, BASICEVENT_REG_FLAG_ON_NEW_WEEK);
Clean();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CEstrategia::~CEstrategia(void)
{
if(CBasicEvents::IsActive()) // CONSULTAMOS si aun esta activo
{
// Si esta activo entonces nos desuscribirremos
CBasicEvents::UnregisterEvent(&this, BASICEVENT_REG_FLAG_ON_NEW_WEEK);
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CEstrategia::OnNewWeek(const datetime curr_time)
{
g_bos_choch.DeleteAll();
g_bloque1.DeleteAll();
g_bloque2.DeleteAll();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CEstrategia::Clean(void)
{
m_state = EASYSB_STATE_BUSCAR_MANIPULACION;
m_max_9 = 0.000;
m_min_9 = 0.000;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CEstrategia::OnInterupcion()
{
g_bloque1.SetParo();
g_bloque2.SetParo();
g_bos_choch.SetParo();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CEstrategia::OnNewBar(const datetime curr_time)
{
if(risk.GetPositionsTotal() > 0)
return;
//---
if(g_sesion.EnSesion())
{
//--- Al inciar la sesion
if(g_sesion.IsInitSession())
{
LogInfo("Inicio de sesion", FUNCION_ACTUAL);
m_max_9 = ::iHigh(m_symbol, PERIOD_H1, 1);
m_min_9 = ::iLow(m_symbol, PERIOD_H1, 1);
m_operate = false;
}
//---
if(m_operate)
return;
//---
// NOTA: noramltle el stado se setea cuando cumple la condicion y reicne en la siguinte call (osea la siuinte vela) es donde comenzamos
// en teoria se podira hacer ahora "mismo" con un do while(false) pero es para seguir las reglas
//--- Ahora si logica de la estrategia
switch(m_state)
{
//--- Inicamte indecismos no sabemos que bsucamos solo sbucamos una maniapcion ya hi decidimos direccion
case EASYSB_STATE_BUSCAR_MANIPULACION:
{
const double prev_high = ::iHigh(m_symbol, m_timeframe, 1);
const double prev_low = ::iLow(m_symbol, m_timeframe, 1);
if(prev_high > m_max_9) // manipula el high
{
m_state = EASYSB_STATE_BUSCAR_CONFIRMACION_BOS_BAJISTA;
}
else
if(m_min_9 > prev_low) // manipula el low
{
m_state = EASYSB_STATE_BUSCAR_CONFIRMACION_BOS_ALCISTA;
}
break;
}
//--- Busqueda de la confirmacion
case EASYSB_STATE_BUSCAR_CONFIRMACION_BOS_ALCISTA:
{
if(g_bos_choch.NuevaRopturaAlAlza())
{
m_state = EASYSB_STATE_BUSCAR_PDA_ALCISTA; // pda alcista
}
break;
}
case EASYSB_STATE_BUSCAR_CONFIRMACION_BOS_BAJISTA:
{
if(g_bos_choch.NuevaRopturaAlaBaja())
{
m_state = EASYSB_STATE_BUSCAR_PDA_BAJISTA; // pda bajista
}
break;
}
//--- Entrada final
case EASYSB_STATE_BUSCAR_PDA_ALCISTA:
{
if(g_bloque1.SizeAlcistasMitigados() > 0 || g_bloque2.SizeAlcistasMitigados() > 0)
OpenOrder(POSITION_TYPE_BUY);
break;
}
case EASYSB_STATE_BUSCAR_PDA_BAJISTA:
{
if(g_bloque1.SizeBajistasMitigados() > 0 || g_bloque2.SizeBajistasMitigados() > 0)
OpenOrder(POSITION_TYPE_SELL);
break;
}
default:
break;
}
}
else
if(g_sesion.IsEndSession())
{
LogInfo("Fin de sesion", FUNCION_ACTUAL);
Clean();
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Open Order Default |
//+------------------------------------------------------------------+
void CEstrategia::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
if(type == POSITION_TYPE_SELL)
{
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");
}
Clean();
m_operate = true;
}
//+------------------------------------------------------------------+