//+------------------------------------------------------------------+ //| Swings.mq5 | //| Copyright 2026, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372 | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #include "..\\Src\\Defines.mqh" //+------------------------------------------------------------------+ //| Global variables | //+------------------------------------------------------------------+ //--- Swing structure buffers double g_swing_high_buffer[]; double g_swing_low_buffer[]; //--- Market structure buffers (HH / HL / LH / LL) double g_hh_buffer[]; double g_hl_buffer[]; double g_lh_buffer[]; double g_ll_buffer[]; //--- Indicator handle int g_handle = INVALID_HANDLE; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Load ICT SMC indicator ResetLastError(); g_handle = iCustom(_Symbol, _Period, ICTSMCIND_NAME_RES); if(g_handle == INVALID_HANDLE) { PrintFormat("Failed to load TheSmcIctIndicator, last error = %d", GetLastError()); return INIT_FAILED; } else { Print("Successful loading TheSmcIctIndicator"); } //--- Set all buffers as series ArraySetAsSeries(g_swing_high_buffer, true); ArraySetAsSeries(g_swing_low_buffer, true); ArraySetAsSeries(g_hh_buffer, true); ArraySetAsSeries(g_hl_buffer, true); ArraySetAsSeries(g_lh_buffer, true); ArraySetAsSeries(g_ll_buffer, true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release handle to free resources if(g_handle != INVALID_HANDLE) IndicatorRelease(g_handle); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- Only process on new bar open static datetime last_time = 0; const datetime new_time = iTime(_Symbol, _Period, 0); if(last_time == new_time) return; //--- Copy last closed bar (index 1) from each buffer ResetLastError(); if(CopyBuffer(g_handle, ICTSMCIND_BUFFER_SWING_HIGH, 1, 1, g_swing_high_buffer) != 1 || CopyBuffer(g_handle, ICTSMCIND_BUFFER_SWING_LOW, 1, 1, g_swing_low_buffer) != 1 || CopyBuffer(g_handle, ICTSMCIND_BUFFER_HH, 1, 1, g_hh_buffer) != 1 || CopyBuffer(g_handle, ICTSMCIND_BUFFER_HL, 1, 1, g_hl_buffer) != 1 || CopyBuffer(g_handle, ICTSMCIND_BUFFER_LH, 1, 1, g_lh_buffer) != 1 || CopyBuffer(g_handle, ICTSMCIND_BUFFER_LL, 1, 1, g_ll_buffer) != 1) { Print("Error copying indicator data, last error = ", GetLastError()); return; } //--- Swing High / Swing Low if(g_swing_high_buffer[0] > ICTSMCIND_VOID_BUFFER_VALUE) Print("New Swing High detected, price = ", g_swing_high_buffer[0]); if(g_swing_low_buffer[0] > ICTSMCIND_VOID_BUFFER_VALUE) Print("New Swing Low detected, price = ", g_swing_low_buffer[0]); //--- Market structure: Higher High / Higher Low if(g_hh_buffer[0] > ICTSMCIND_VOID_BUFFER_VALUE) Print("Higher High (HH) confirmed, price = ", g_hh_buffer[0]); if(g_hl_buffer[0] > ICTSMCIND_VOID_BUFFER_VALUE) Print("Higher Low (HL) confirmed, price = ", g_hl_buffer[0]); //--- Market structure: Lower High / Lower Low if(g_lh_buffer[0] > ICTSMCIND_VOID_BUFFER_VALUE) Print("Lower High (LH) confirmed, price = ", g_lh_buffer[0]); if(g_ll_buffer[0] > ICTSMCIND_VOID_BUFFER_VALUE) Print("Lower Low (LL) confirmed, price = ", g_ll_buffer[0]); //--- Update timestamp last_time = new_time; } //+------------------------------------------------------------------+