/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // ---------------------------------------------- // Name: XSCBaseEA // Description: provides all Base EA requirements ... // // // 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 "../Libraries/x-saherelm.alert.lib.mq5" #include "../Libraries/x-saherelm.common.lib.mq5" #include "../Classes/x-saherelm.xtrade.class.mq5" #include "../Classes/x-saherelm.xaccount.class.mq5" #include "../Classes/x-saherelm.xprovider.class.mq5" #include "../Libraries/x-saherelm.seriallizer.lib.mq5" // // END Import and Inclused requirements ... // // // START Overrides ... // // // END Overrides ... // // // a Class for Handle base requirements ... // for indicators ... class XSCBaseEA { // // Public ... public: // // Props ... XSCTrade *mTrader; XSCAccount *mAccount; // bool isNewHour; bool isNewDay; bool isNewWeek; bool isNewMonth; bool isNewCandle; // bool isInTestMode; // bool mWaitsUntilNewCandle; // // Constructor ... void XSCBaseEA( 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 ) { // mSymbol = symbol; mPeriod = period; // mMagic = magic; mSlippage = slippage; // mOnStopLossTriggered = onStopLossTriggered; mOnTakeProfitTriggered = onTakeProfitTriggered; mOnDealsChangedHandler = onDealsChangedHandler; mOnOrdersChangedHandler = onOrdersChangedHandler; mOnPositionsChangedHandler = onPositionsChangedHandler; mOnTradeStateChangedHandler = onTradeStateChangedHandler; // // Reset Timings ... ResetTiming(); // InitRequirements(); } // // Deconstructor ... void ~XSCBaseEA() { // delete mTrader; delete mAccount; } // // START Properties ... // // // Symbol ... string GetSymbol() { return mSymbol; } // // Period ... ENUM_TIMEFRAMES GetPeriod() { return mPeriod; } // // Tag ... string GetTag() { return mTag; } // ulong GetMagic() { return mMagic; } // int GetSlippage() { return mSlippage; } // // END Properties ... // // // START Provided Functions ... // // // Prepare Tag ... virtual void PrepareTag() { mTag = "XEA" + mSymbol + "," + ToString(mPeriod) + (string)mMagic; } // // Handle Chart Events ... virtual void OnChartEvent( const int id, // event ID const long &lparam, // long type event parameter const double &dparam, // double type event parameter const string &sparam // string type event parameter ) { } // // Check any Registered Providers Signalling ... virtual bool SignalCheck(XSignal &signals[]) { return false; } // // Check for any Custom Guard Actions Guard Actions ... virtual bool CheckGuard(XGuard &guards[]) { return false; } // // NOTE: you have to call these Functions on Static Classes to Handle Works ... // // Handle StopLoss Event ... virtual void OnStopLossTriggered(const XDeal &deal) {} // // Handle TakeProfit Event ... virtual void OnTakeProfitTriggered(const XDeal &deal) {} // // Handle Deals Changed Event ... virtual void OnDealsChangedHandler(int count) {} // // Handle Order Changed Event ... virtual void OnOrdersChangedHandler(int count) {} // // Handle Position Changed Event ... virtual void OnPositionsChangedHandler(int count) {} // // Handle Trade State Changed ... virtual void OnTradeStateChangedHandler(const XOnTradeHandlerState &state) {} // // Implemented Actions ... // // OnTick Handler ... void OnTick() { // // First Check Guards .... XGuard guards[]; bool hasGuard = CheckGuard(guards); if (hasGuard) { DoGuards(guards); } // XSignal signals[]; bool hasSignal = SignalCheck(signals); if (hasSignal) { mTrader.ExecuteSignals(signals); } } // // Handle On Trade ... void OnTrade() { // XOnTradeHandlerState state = mTrader.HandleOnTrade(); // if ( !state.hasNewDeal && !state.hasNewOrder && !state.hasNewPosition && !state.hasNewHistoryOrder) { return; } // // STATE ... // // Notfy Trade State Changed Event ... OnTradeStateChangedHandler(state); // // DEALS ... if (state.hasNewDeal) { // // Notfy Deals Changed Event ... OnDealsChangedHandler(state.newDeals); // // Retrieve Last Deal ... XDeal deals[]; mTrader.GetDeals(deals); int dealsCount = ArraySize(deals); if (dealsCount > 0) { // XDeal lastDeal = deals[0]; // if (lastDeal.reason == DEAL_REASON_TP) { OnTakeProfitTriggered(lastDeal); } else if (lastDeal.reason == DEAL_REASON_SL) { OnStopLossTriggered(lastDeal); } } } // // ORDERS ... if (state.hasNewOrder || state.hasNewHistoryOrder) { // // Notfy Orders Changed Event ... OnOrdersChangedHandler(state.newOrders + state.newHistoryOrders); } // // POSITIONS ... if (state.hasNewPosition) { // // Notfy Positions Changed Event ... OnPositionsChangedHandler(state.newPositions); } } // // Retrieve Dept Of Market ... void OnBookEvent(const string &symbol) { // // TODO: Implement this ... } // // TOOLS ... // void GetPositions( XPosition &result[], // Hold Result ... string symbol = NULL, // Trading Symbol ... ENUM_POSITION_TYPE type = NULL, // Trading Type ... ENUM_TIMEFRAMES period = NULL // Trading Period ... ) { // Clean(result); // int positionsCount = mTrader.PositionsCount(); if (positionsCount <= 0) { return; } // XPosition positions[]; mTrader.GetPositions( positions, symbol, period); positionsCount = ArraySize(positions); if (positionsCount <= 0) { return; } // if (type == NULL) { // ArrayResize( result, ArraySize(positions)); // for (int i = 0; i < positionsCount; i++) { // Add( positions[i], result); } // return; } // for (int i = 0; i < positionsCount; i++) { // XPosition iPosition = positions[i]; // if (type == NULL || iPosition.type == type) { // Add( iPosition, result); } } } void GetPositions( XPosition &result[], // Hold Result ... string symbol = NULL, // Trading Symbol ... ENUM_POSITION_TYPE type = NULL, // Trading Type ... ENUM_TIMEFRAMES period = NULL, // Trading Period ... string provider = NULL // Signal Provider ... ) { // Clean(result); // bool hasSymbol = !(symbol == NULL || StringLen(symbol) == 0); bool hasProvider = !(provider == NULL || StringLen(provider) == 0); // int positionsCount = mTrader.PositionsCount(); if (positionsCount <= 0) { return; } // XPosition positions[]; mTrader.GetPositions( positions, symbol, period); positionsCount = ArraySize(positions); if (positionsCount <= 0) { return; } // if (!hasProvider && type == NULL) { // ArrayResize( result, ArraySize(positions)); // for (int i = 0; i < positionsCount; i++) { // Add( positions[i], result); } // return; } // if (type == NULL) { // ArrayResize( result, ArraySize(positions)); // for (int i = 0; i < positionsCount; i++) { // Add( positions[i], result); } // return; } // for (int i = 0; i < positionsCount; i++) { // XPosition iPosition = positions[i]; // string iProvider = ExtractProvider(iPosition.comment); if (hasProvider && iProvider != provider) { continue; } // if (type == NULL || iPosition.type == type) { // Add( iPosition, result); } } } // // GUARD Handlers ... // // Parse Recievd Guards and Do them ... void DoGuards(XGuard &guards[]) { int guardsCount = ArraySize(guards); if (guardsCount <= 0) { return; } // for (int i = 0; i < guardsCount; i++) { // XGuard iGuard = guards[i]; // switch (iGuard.action) { // // Hedge In Profit Specified Positions ... case X_GUARD_ACTION_HEDGE: HandleGuardHedgeAction( iGuard.provider, iGuard.symbol, iGuard.type, iGuard.period); break; // // Trail Stop Loss in Specified Positions ... case X_GUARD_ACTION_TRAIL_STOP: HandleGuardTrailingStopAction( iGuard.provider, iGuard.symbol, iGuard.type, iGuard.period, iGuard.dblPayLoad); break; // // Force Close Specified Positions ... case X_GUARD_ACTION_FORCE_CLOSE: HandleGuardForceCloseAction( iGuard.provider, iGuard.symbol, iGuard.type, iGuard.period); break; // // Generate and Place Support Signals ... case X_GUARD_ACTION_ADD_SUPPORT_SIGNAL: HandleGuardAddSupportPositionAction( iGuard.provider, iGuard.symbol, iGuard.type, iGuard.period); break; // // Delete All Placed Pending Orders ... case X_GUARD_ACTION_CANCEL_PENDING_ORDERS: HandleGuardCancelPendingOrdersAction( iGuard.provider, iGuard.symbol, iGuard.type, iGuard.period); break; } } } // // Close All Specified Provider's Positions in Profit Summary ... void HandleGuardHedgeAction( string provider, // Positions Provided by Specific Provider string symbol, // Trading Symbol ENUM_POSITION_TYPE type, // Trading Type ENUM_TIMEFRAMES period, // Specified Time Frame double minProfitForHedging = 1 // Specified Profit for Hedge ... ) { // } // // Force Close Specified Set Of Position ... void HandleGuardForceCloseAction( string provider, // Positions Provided by Specific Provider string symbol, // Trading Symbol ENUM_POSITION_TYPE type, // Trading Type ENUM_TIMEFRAMES period, // Specified Time Frame ulong ticket = 0 // Specific Ticket ) { // string comment = ""; // // Close All Positions ... if (ticket == 0) { // XPosition positions[]; GetPositions( positions, symbol, type, period, provider); if (ArraySize(positions) <= 0) { return; } // comment = provider + " Force Close Guard ..."; // mTrader.ClosePositions( positions, comment); } // // Close Specific Position ... else { // XPosition position; bool hasPosition = mTrader.GetPosition( position, ticket); // if (hasPosition) { // comment = provider + "(" + ToString(ticket) + ")" + " Force Close Guard ..."; // mTrader.Close( ticket, comment); } } // if (StringLen(comment) > 0) { LogMessage(comment); } } // // Trailing Specified Set Of Positions Stop Losses ... void HandleGuardTrailingStopAction( string provider, // Positions Provided by Specific Provider string symbol, // Trading Symbol ENUM_POSITION_TYPE type, // Trading Type ENUM_TIMEFRAMES period, // Specified Time Frame double sl // Desired SL Value ... ) { // // TODO: Implement this ... } // // Add Support Signal for Specified Positions ... void HandleGuardAddSupportPositionAction( string provider, // Positions Provided by Specific Provider string symbol, // Trading Symbol ENUM_POSITION_TYPE type, // Trading Type ENUM_TIMEFRAMES period // Specified Time Frame ) { // // TODO: Implement this ... } // // Cancel all Placed Orders ... void HandleGuardCancelPendingOrdersAction( string provider, // Positions Provided by Specific Provider string symbol, // Trading Symbol ENUM_POSITION_TYPE type, // Trading Type ENUM_TIMEFRAMES period // Specified Time Frame ) { // // TODO: Implement this ... } // // END Provided Functions ... // // // Protected ... protected: // string GetTagPrefix() { // string result = "(" + mSymbol + ")(" + ToString(mPeriod) + ")"; // return result; } // // Symbol ... string mSymbol; // // Period ... ENUM_TIMEFRAMES mPeriod; // // ExpertAdviser MAgic Number ... ulong mMagic; // // Slipppage ... int mSlippage; // // Tag Identifier ... string mTag; // // Private ... private: // // Define Requirements ... // // XSCTrade Event Handlers ... OnStopLoss mOnStopLossTriggered; OnTakeProfit mOnTakeProfitTriggered; OnDealsChanged mOnDealsChangedHandler; OnOrdersChanged mOnOrdersChangedHandler; OnPositionsChanged mOnPositionsChangedHandler; OnTradeStateChanged mOnTradeStateChangedHandler; // // Initi Requirements ... void InitRequirements() { // // Account Manager ... mAccount = new XSCAccount(); // // Trader ... mTrader = new XSCTrade( mSlippage, mMagic); // // Attach Event Handlers ... // if (mOnStopLossTriggered != NULL) { mTrader.AddOnStopLossEventHandler(mOnStopLossTriggered); } // if (mOnTakeProfitTriggered != NULL) { mTrader.AddOnTakeProfitEventHandler(mOnTakeProfitTriggered); } // if (mOnDealsChangedHandler != NULL) { mTrader.AddOnDealsChangedEventHandler(mOnDealsChangedHandler); } // if (mOnOrdersChangedHandler != NULL) { mTrader.AddOnOrdersChangedEventHandler(mOnOrdersChangedHandler); } // if (mOnPositionsChangedHandler != NULL) { mTrader.AddOnPositionsChangedEventHandler(mOnPositionsChangedHandler); } // if (mOnTradeStateChangedHandler != NULL) { mTrader.AddOnTradeStateChangedEventHandler(mOnTradeStateChangedHandler); } } }; // // START Usefull Functions ... // // // END Usefull Functions ... //