From 72536a728411ddf51911396c8aa8085e94c83317 Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Tue, 20 Jan 2026 20:19:45 +0100 Subject: [PATCH] refactor(indicators): Updated to use unified calculator --- .../MyIndicators/TSI_Oscillator_Pro.mq5 | 59 ++++++------------- 1 file changed, 18 insertions(+), 41 deletions(-) diff --git a/Indicators/MyIndicators/TSI_Oscillator_Pro.mq5 b/Indicators/MyIndicators/TSI_Oscillator_Pro.mq5 index b4c1a79..c9ebe44 100644 --- a/Indicators/MyIndicators/TSI_Oscillator_Pro.mq5 +++ b/Indicators/MyIndicators/TSI_Oscillator_Pro.mq5 @@ -1,9 +1,9 @@ //+------------------------------------------------------------------+ //| TSI_Oscillator_Pro.mq5 | -//| Copyright 2025, xxxxxxxx| +//| Copyright 2026, xxxxxxxx| //+------------------------------------------------------------------+ -#property copyright "Copyright 2025, xxxxxxxx" -#property version "3.10" // Fixed missing input parameters +#property copyright "Copyright 2026, xxxxxxxx" +#property version "4.00" // Updated to use unified calculator #property description "TSI Oscillator (Histogram of TSI vs Signal Line) with selectable" #property description "price source (Standard and Heikin Ashi)." @@ -17,14 +17,14 @@ #property indicator_label1 "TSI Oscillator" //--- Include the calculator engine --- -#include +#include //--- Input Parameters --- input group "TSI Calculation Settings" input int InpSlowPeriod = 25; -input ENUM_MA_TYPE InpSlowMAType = EMA; // Added missing input +input ENUM_MA_TYPE InpSlowMAType = EMA; input int InpFastPeriod = 13; -input ENUM_MA_TYPE InpFastMAType = EMA; // Added missing input +input ENUM_MA_TYPE InpFastMAType = EMA; input ENUM_APPLIED_PRICE_HA_ALL InpSourcePrice = PRICE_CLOSE_STD; input group "Signal Line Settings" @@ -35,28 +35,27 @@ input ENUM_MA_TYPE InpSignalMAType = EMA; double BufferOscillator[]; //--- Global calculator object --- -CTSICalculatorOscillator *g_calculator; +CTSICalculator *g_calculator; -//+------------------------------------------------------------------+ -//| Custom indicator initialization function. | //+------------------------------------------------------------------+ int OnInit() { SetIndexBuffer(0, BufferOscillator, INDICATOR_DATA); ArraySetAsSeries(BufferOscillator, false); - g_calculator = new CTSICalculatorOscillator(); - - bool use_ha = (InpSourcePrice <= PRICE_HA_CLOSE); + if(InpSourcePrice <= PRICE_HA_CLOSE) + g_calculator = new CTSICalculator_HA(); + else + g_calculator = new CTSICalculator(); if(CheckPointer(g_calculator) == POINTER_INVALID || - !g_calculator.Init(InpSlowPeriod, InpSlowMAType, InpFastPeriod, InpFastMAType, InpSignalPeriod, InpSignalMAType, use_ha)) + !g_calculator.Init(InpSlowPeriod, InpSlowMAType, InpFastPeriod, InpFastMAType, InpSignalPeriod, InpSignalMAType)) { - Print("Failed to create or initialize TSI Oscillator Calculator object."); + Print("Failed to create or initialize TSI Calculator object."); return(INIT_FAILED); } - string type = use_ha ? " HA" : ""; + string type = (InpSourcePrice <= PRICE_HA_CLOSE) ? " HA" : ""; IndicatorSetString(INDICATOR_SHORTNAME, StringFormat("TSI Osc%s(%d,%d,%d)", type, InpSlowPeriod, InpFastPeriod, InpSignalPeriod)); int draw_begin = InpSlowPeriod + InpFastPeriod + InpSignalPeriod - 1; @@ -67,40 +66,18 @@ int OnInit() } //+------------------------------------------------------------------+ -//| Custom indicator deinitialization function. | -//+------------------------------------------------------------------+ -void OnDeinit(const int reason) - { - if(CheckPointer(g_calculator) != POINTER_INVALID) - delete g_calculator; - } +void OnDeinit(const int reason) { if(CheckPointer(g_calculator) != POINTER_INVALID) delete g_calculator; } //+------------------------------------------------------------------+ -//| Custom indicator calculation function | -//+------------------------------------------------------------------+ -int OnCalculate(const int rates_total, - const int prev_calculated, - const datetime &time[], - const double &open[], - const double &high[], - const double &low[], - const double &close[], - const long &tick_volume[], - const long &volume[], - const int &spread[]) +int OnCalculate(const int rates_total, const int prev_calculated, const datetime&[], const double &open[], const double &high[], const double &low[], const double &close[], const long&[], const long&[], const int&[]) { if(CheckPointer(g_calculator) == POINTER_INVALID) return 0; - ENUM_APPLIED_PRICE price_type; - if(InpSourcePrice <= PRICE_HA_CLOSE) - price_type = (ENUM_APPLIED_PRICE)(-(int)InpSourcePrice); - else - price_type = (ENUM_APPLIED_PRICE)InpSourcePrice; + ENUM_APPLIED_PRICE price_type = (InpSourcePrice <= PRICE_HA_CLOSE) ? (ENUM_APPLIED_PRICE)(-(int)InpSourcePrice) : (ENUM_APPLIED_PRICE)InpSourcePrice; - g_calculator.Calculate(rates_total, prev_calculated, price_type, open, high, low, close, BufferOscillator); + g_calculator.CalculateOscillatorOnly(rates_total, prev_calculated, price_type, open, high, low, close, BufferOscillator); return(rates_total); } //+------------------------------------------------------------------+ -//+------------------------------------------------------------------+