/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // ---------------------------------------------- // Name: XSCX121EA // Description: an Expert Class which // used X121 Setup ... // // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://www.saherelm.ir" #property version "1.00" #property strict // // START Definitions ... // // // END Definitions ... // // // START Import and Inclused requirements ... // // // Includes ... #include "../Classes/x-saherelm.xea.class.mq5" #include "../Libraries/x-saherelm.x121.draw.lib.mq5" #include "../Classes/x-saherelm.x121.provider.class.mq5" // // END Import and Inclused requirements ... // // // START Overrides ... // // // END Overrides ... // // // an Expert Advisor Class by X121Provider ... class XSCX121EA : public XSCBaseEA { // // Public ... public: // // Props ... XSCX121Provider *mProvider; // // Constructor ... void XSCX121EA( string symbol, // Trading Symbol ENUM_TIMEFRAMES period, // Trading Time Frame ulong magic, // Magic Number int slippage, // Slippgae OnStopLoss onStopLossTriggered = NULL, // On StopLoass Triggered Event Handler OnTakeProfit onTakeProfitTriggered = NULL, // On TakeProfit Triggered Event Handler OnDealsChanged onDealsChangedHandler = NULL, // On Deals Changed Event Handler OnOrdersChanged onOrdersChangedHandler = NULL, // On Orders Changed Event Handler OnPositionsChanged onPositionsChangedHandler = NULL, // On Positions Changed Event Handler OnTradeStateChanged onTradeStateChangedHandler = NULL, // On Trade State Changed Event Handler TOnSignalConditions onSignalConditions = NULL // On SignalConditions Event Handler ) : XSCBaseEA(symbol, period, magic, slippage, onStopLossTriggered, onTakeProfitTriggered, onDealsChangedHandler, onOrdersChangedHandler, onPositionsChangedHandler, onTradeStateChangedHandler) { // mOnSignalConditions = onSignalConditions; // InitProvider(); } // // DeConstructor ... void ~XSCX121EA() { delete mProvider; } // // START Inheritance Functions ... // // void PrepareTag() { mTag = "X121EA:" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; } // bool CheckGuard(XGuard &guards[]) { return mProvider.GuardCheck(guards); } // bool SignalCheck(XSignal &signals[]) { // // Detect Pivot Points ... int foundedPivots = mProvider.CountPivots(); int reuiredPivots = mProvider.GetMinPivots(); if (foundedPivots < reuiredPivots) { // mProvider.ProccessPivotPoints(); // LogMessage("Founding Pivots: " + ToString(foundedPivots) + "/" + ToString(reuiredPivots)); return false; } // X121MarketConditions conditions; bool result = mProvider.ProcessTick(conditions); // if (result) { // // TODO: Here we Do all Signal Preparations such as TP/SL Calculations // or Support and Resistance usage or Volume Calculations ... // then pass prepared Signal to Execution ... // ulong mTicket = MathRand() * 100000; // DrawSignal( mTicket, conditions.signal); // DrawSupportResistance( 0, conditions.supportResistances, conditions.signal.providers[0]); // // IGNORE SIGNAL EXECUTTION ... return false; // Add( conditions.signal, signals); } // return result; } // // END Inheritance Functions ... // // // START Provided Actions ... // // // END Provided Actions ... // // // Protected ... protected: // // Private ... private: // // Props ... X121ProviderInputs mProviderConfig; TOnSignalConditions mOnSignalConditions; // // Actions ... // // Prepare Default Configurations for X121Provider Setup ... void PrepareProviderConfig() { // // XCT ... // Candle Timing ... mProviderConfig.xctConfig.clr = clrBlueViolet; mProviderConfig.xctConfig.corner = CORNER_RIGHT_UPPER; mProviderConfig.xctConfig.showCandleTime = true; // // XCC ... // Candle Styling ... mProviderConfig.xccConfig.upColor = clrLime; mProviderConfig.xccConfig.downColor = clrRed; mProviderConfig.xccConfig.lineColor = clrLime; mProviderConfig.xccConfig.bearishColor = clrRed; mProviderConfig.xccConfig.bullishColor = clrLime; mProviderConfig.xccConfig.volumesColor = clrGreen; mProviderConfig.xccConfig.showCandles = true; // // XHK ... // HikenAshi Candle Representing ... mProviderConfig.xhkConfig.drawCandleLines = false; // // XTM ... // Trend Magic ... mProviderConfig.xtmConfig.length = 35; mProviderConfig.xtmConfig.shift = 0; mProviderConfig.xtmConfig.method = MODE_SMA; mProviderConfig.xtmConfig.appliedTo = PRICE_LOW; mProviderConfig.xtmConfig.showLine = false; // // XPV ... // Peaks And Vales ... mProviderConfig.xpvConfig.shortLength = 9; mProviderConfig.xpvConfig.mediumLength = 17; mProviderConfig.xpvConfig.longLength = 26; mProviderConfig.xpvConfig.hindLength = 35; mProviderConfig.xpvConfig.fiboLevel1 = 0.382; mProviderConfig.xpvConfig.fiboLevel2 = 0.5; mProviderConfig.xpvConfig.fiboLevel3 = 0.618; mProviderConfig.xpvConfig.hhMode = MODE_HIGH; mProviderConfig.xpvConfig.llMode = MODE_LOW; mProviderConfig.xpvConfig.showPeaksAndVales = false; mProviderConfig.xpvConfig.showLevels = false; mProviderConfig.xpvConfig.showFibo1Levels = false; mProviderConfig.xpvConfig.showFibo2Levels = false; mProviderConfig.xpvConfig.showFibo3Levels = false; // // XAMA ... // Adaptive Moving Average ... mProviderConfig.xamaConfig.length = 52; mProviderConfig.xamaConfig.fastEMA = 2; mProviderConfig.xamaConfig.slowEMA = 30; mProviderConfig.xamaConfig.maShift = 0; mProviderConfig.xamaConfig.appliedTo = PRICE_LOW; mProviderConfig.xamaConfig.showLine = false; // // XMRB ... // Moving Average Ribbon ... mProviderConfig.xmrbConfig.fast1Length = 3; mProviderConfig.xmrbConfig.slow1Length = 5; mProviderConfig.xmrbConfig.fast2Length = 8; mProviderConfig.xmrbConfig.slow2Length = 13; mProviderConfig.xmrbConfig.fast3Length = 21; mProviderConfig.xmrbConfig.slow3Length = 34; mProviderConfig.xmrbConfig.fast4Length = 55; mProviderConfig.xmrbConfig.slow4Length = 89; mProviderConfig.xmrbConfig.fast5Length = 144; mProviderConfig.xmrbConfig.slow5Length = 233; mProviderConfig.xmrbConfig.ribbonMode = MODE_EMA; mProviderConfig.xmrbConfig.ribbonAppliedTo = PRICE_CLOSE; mProviderConfig.xmrbConfig.showFastMa = false; mProviderConfig.xmrbConfig.showSlowMa = false; mProviderConfig.xmrbConfig.showRibbon = false; // // XCHE ... // Chandelier Exit Points ... mProviderConfig.xcheConfig.length = 35; mProviderConfig.xcheConfig.loopback = 26; mProviderConfig.xcheConfig.multiplier1 = 3; mProviderConfig.xcheConfig.multiplier2 = 3.5; mProviderConfig.xcheConfig.upAppliedTo = PRICE_HIGH; mProviderConfig.xcheConfig.downAppliedTo = PRICE_LOW; mProviderConfig.xcheConfig.showLongExit1Line = false; mProviderConfig.xcheConfig.showShortExit1Line = false; mProviderConfig.xcheConfig.showLongExit2Line = false; mProviderConfig.xcheConfig.showShortExit2Line = false; // // XICH ... // Ichimopku Kinko Hyo ... mProviderConfig.xichConfig.tenkanSenLength = 9; mProviderConfig.xichConfig.tenkanSenMode = X_XICH_HH_LL_MODE; mProviderConfig.xichConfig.kijunSenLength = 26; mProviderConfig.xichConfig.kijunSenMode = X_XICH_HH_LL_MODE; mProviderConfig.xichConfig.senkouSpanBLength = 52; mProviderConfig.xichConfig.senkouSpanBMode = X_XICH_HH_LL_MODE; mProviderConfig.xichConfig.chikuoSpanAppliedTo = PRICE_CLOSE; mProviderConfig.xichConfig.showTenkanSen = false; mProviderConfig.xichConfig.showKijunSen = false; mProviderConfig.xichConfig.showKijunSenPlus = false; mProviderConfig.xichConfig.showKijunSenNegative = false; mProviderConfig.xichConfig.showChikouSpan = false; mProviderConfig.xichConfig.showSenkouSpanA = false; mProviderConfig.xichConfig.showSenkouSpanB = false; mProviderConfig.xichConfig.showKumo = false; mProviderConfig.xichConfig.shiftKumo = true; // // XTRND ... // Trend Detector ... mProviderConfig.xtrndConfig.cycleLength = 2; mProviderConfig.xtrndConfig.numberOfVerifications = 2; mProviderConfig.xtrndConfig.hhMode = MODE_HIGH; mProviderConfig.xtrndConfig.llMode = MODE_LOW; mProviderConfig.xtrndConfig.l1Method = X_PERIOD_AUTO; mProviderConfig.xtrndConfig.l1Period = NULL; mProviderConfig.xtrndConfig.l2Method = X_PERIOD_AUTO; mProviderConfig.xtrndConfig.l2Period = NULL; mProviderConfig.xtrndConfig.l3Method = X_PERIOD_AUTO; mProviderConfig.xtrndConfig.l3Period = NULL; mProviderConfig.xtrndConfig.showConsolidations = false; mProviderConfig.xtrndConfig.showTrend = false; mProviderConfig.xtrndConfig.showL1Trend = false; mProviderConfig.xtrndConfig.showL2Trend = false; mProviderConfig.xtrndConfig.showL3Trend = false; // // XSSLC ... // SSL Channel ... mProviderConfig.xsslcConfig.length = 36; mProviderConfig.xsslcConfig.method = MODE_SMA; mProviderConfig.xsslcConfig.upAppliedTo = PRICE_HIGH; mProviderConfig.xsslcConfig.downAppliedTo = PRICE_LOW; mProviderConfig.xsslcConfig.showUp = false; mProviderConfig.xsslcConfig.showDown = false; // // XHULL ... // Hull Trend Detection Channel ... mProviderConfig.xhullConfig.length = 72; mProviderConfig.xhullConfig.divisor = 2; mProviderConfig.xhullConfig.upAppliedTo = PRICE_HIGH; mProviderConfig.xhullConfig.downAppliedTo = PRICE_LOW; mProviderConfig.xhullConfig.showUpZone = false; mProviderConfig.xhullConfig.showDownZone = false; // // Default Configs For Different States ... bool showPV = true; bool showHK = true; bool showCHE = true; bool showTRND = true; bool simpleIchi = true; // if (showHK) { // // Hiken Ashi ... mProviderConfig.xccConfig.showCandles = false; mProviderConfig.xhkConfig.drawCandles = true; } if (showPV) { // // Peaks and Vales ... mProviderConfig.xpvConfig.showFibo1Levels = true; mProviderConfig.xpvConfig.showFibo2Levels = true; mProviderConfig.xpvConfig.showFibo3Levels = true; mProviderConfig.xpvConfig.showPeaksAndVales = true; } if (simpleIchi) { // // Simple Ichimoku Kinko Hyo ... mProviderConfig.xichConfig.showKijunSen = true; mProviderConfig.xichConfig.showTenkanSen = true; mProviderConfig.xichConfig.showSenkouSpanA = true; mProviderConfig.xichConfig.showSenkouSpanB = true; } if (showCHE) { // // Chandelier Exit ... mProviderConfig.xcheConfig.showLongExit1Line = true; mProviderConfig.xcheConfig.showLongExit2Line = true; mProviderConfig.xcheConfig.showShortExit1Line = true; mProviderConfig.xcheConfig.showShortExit2Line = true; } if (showTRND) { // // Show Trend ... mProviderConfig.xtrndConfig.showL1Trend = true; mProviderConfig.xtrndConfig.showL2Trend = true; mProviderConfig.xtrndConfig.showL3Trend = true; } } // // Initialize X121Provider ... void InitProvider() { // PrepareProviderConfig(); // mProvider = new XSCX121Provider( mSymbol, mPeriod); // if (mOnSignalConditions != NULL) { // // Attach Event Handlers ... mProvider.AddOnSignalConditionEventHandler(mOnSignalConditions); } // // Initialize Provider ... mProvider.SetConfig(mProviderConfig); } }; // // START Usefull Functions ... // // // END Usefull Functions ... //