/////////////////////////////////////////////////////// // // SaherElm IT Center XST_OSC Strategy Expert Advisor // --------------------------------------------- // saherelm implementation of strategy expert advisor ... // // ShortName: XST_OSC // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://saherelm.ir" #property version "1.00" #property description "SaherElm XST_OSC Strategy Expert Advisor" #property strict // // START Inputs ... // // // Signal Prefixe ... input string signalPrefix = "XST_OSC"; // Signal Prefix // // Signal Draw Specifications ... input string bullishSignalLabel = "X_BUY"; // Bullish Signal Label input color bullishSignalColor = clrAqua; // Bullish Signal Color // input string bearishSignalLabel = "X_SELL"; // Bearish Signal Label input color bearishSignalColor = clrFuchsia; // Bearish Signal Color // input color signalEntryColor = clrAquamarine; // Signal Entry Ptice Color input color signalSLColor = clrRed; // Signal SL Color input color signalTPColor = clrGreen; // Signal TP Color // // Trade ... input bool allowTrade = true; // Allow Trade Based on given Signals input bool allowLongTrades = true; // Allow Long Trades input bool allowShortTrades = false; // Allow Short Trades // // Market Specification Inpouts ... input int marketLength = 7; // Market Length input double riskToRewardRatio = 1.5; // Risk to Reward Ratio // // Alerts ... input bool alertEvents = true; // Alert Events input bool alertPositions = true; // Alert Positions input bool longPositionAlerts = true; // Alert Long Positions input bool shortPositionAlerts = true; // Alert Short Positions // // Alert Types ... input bool terminalAlert = false; // Terminal Alert input bool pushAlert = false; // Push Notification Alerts // // Balance and Finanical Specifications ... input double lotsPerTradePercent = 0.0001; // Lots Per Trade Percent input int maxOpenTrades = 4; // Maximum Open Trade input double maxDrawdownPercentPerPTrade = 0; // Maximum DrawDown Per Trade input double minBalancePercent = 0.5; // Minimum Balance for Trading input double maxEquityPercent = 0.2; // Maximum Trade Equity // // OSC Inputs ... // // FastOSC ... // Short Cycle (Fast OSC) ... input int fastOSCLength = 10; // FastOSC Length input double fastOSCMultiplier = 1.0; // FastOSC Multiplier // // SlowOSC ... // Medium Cycle (Slow OSC) ... input int slowOSCLength = 30; // SlowOSC Length input double slowOSCMultiplier = 3.0; // SlowOSC Multiplier // // Power OSC ... input double minPowerOSC = 0; // Minimum Signal Power // // Variance OSC ... input double minVarianceOSC = 0; // Minimum Var Power // // ZIGZAG Inputs ... input int zDeviation = 5; // ZigZag Deviation input int zBackStep = 3; // ZigZag Back Step // // XMA Inputs ... // input int shortCycleFastMultiplier = 1; // Short Cycle Fast Multiplier input int shortCycleSlowMultiplier = 4; // Short Cycle Slow Multiplier input int mediumCycleFastMultiplier = 7; // Medium Cycle Fast Multiplier input int mediumCycleSlowMultiplier = 14; // Medium Cycle Slow Multiplier input int longCycleFastMultiplier = 70; // Long Cycle Fast Multiplier input int longCycleSlowMultiplier = 140; // Long Cycle Slow Multiplier // // Show/Hide Inputs ... input bool showShortCycle = false; // Show Short Cycle input bool showShortCycleCrossLines = false; // Show Short Cycle Vertical Lines input bool showMediumCycle = false; // Show Medium Cycle input bool showMediumCycleCrossLines = false; // Show Medium Cycle Vertical Lines input bool showLongCycle = false; // Show Long Cycle input bool showLongCycleCrossLines = false; // Show Long Cycle Vertical Lines // // Color Inputs ... input color shortCycleFastColor = clrGreen; // Short Cycle Fast Color ... input color shortCycleSlowColor = clrRed; // Short Cycle Slow Color ... input color mediumCycleFastColor = clrAqua; // Medium Cycle Fast Color ... input color mediumCycleSlowColor = clrFuchsia; // Medium Cycle Slow Color ... input color longCycleFastColor = clrGoldenrod; // Medium Cycle Fast Color ... input color longCycleSlowColor = clrBrown; // Medium Cycle Slow Color ... // // END Inputs ... // // // START Global Definitions: Variables, Properties and etc ... // int totalBars; int countedBars = 0; int lastSignalledBar = 0; // int signalTradeRetry = 0; // bool waitForLongSignals = true; bool closeLongTrades = false; // bool waitForShortSignals = true; bool closeShortTrades = false; // // Includes our shared library ... #include "../Libraries/x-saherelm.lib.mq4" // // Includes our shared library ... #include "../Libraries/x-saherelm.osc.signal.lib.mq4" // // END Global Definitions: Variables, Properties and etc ... // // // Start Event Handlers ... // // // Initialization ... int OnInit() { // // Validate Inputs ... bool inputsNotValiid = // // MARKET ... marketLength < 0 || riskToRewardRatio < 0 // // EA ... || lotsPerTradePercent < 0 || maxOpenTrades <= 0 || maxDrawdownPercentPerPTrade < 0 || minBalancePercent < 0 || maxEquityPercent < 0 || marketLength < 0 // // OSC ... || fastOSCLength < 0 || fastOSCMultiplier < 0 || slowOSCLength < 0 || slowOSCMultiplier < 0 || minPowerOSC < 0 || minVarianceOSC < 0 || slowOSCLength <= fastOSCLength // // ZIGZAG ... || zDeviation < 0 || zBackStep < 0 || zBackStep >= marketLength // // XMA ... // // Validate Short Cycle ... || shortCycleFastMultiplier <= 0 || shortCycleSlowMultiplier <= 0 || shortCycleFastMultiplier >= shortCycleSlowMultiplier // // Validate Medium Cycle ... || mediumCycleFastMultiplier <= 0 || mediumCycleSlowMultiplier <= 0 || mediumCycleFastMultiplier >= mediumCycleSlowMultiplier // // Validate Long Cycle ... || longCycleFastMultiplier <= 0 || longCycleSlowMultiplier <= 0 || longCycleFastMultiplier >= longCycleSlowMultiplier // // Validate Series of Multipliers ... || shortCycleFastMultiplier >= mediumCycleFastMultiplier || mediumCycleFastMultiplier >= longCycleFastMultiplier ; if (inputsNotValiid) { return INIT_PARAMETERS_INCORRECT; } // totalSignals = 0; totalLongSignals = 0; totalShortSignals = 0; // initialBalance = 0; // ArraySetAsSeries( scTrendPower, true ); // ArraySetAsSeries( shortMarketCrossPointsTime, true ); // ArraySetAsSeries( mcTrendPower, true ); // ArraySetAsSeries( mediumMarketCrossPointsTime, true ); // ArraySetAsSeries( lcTrendPower, true ); // ArraySetAsSeries( longMarketCrossPointsTime, true ); // // here we specify logging enabled or not ... enableLogging = false; // // this is a Tag which attached to our Logger ... logTag = "XST_OSC"; // // // // Set Event Timer on One Seccond ... // bool isEventSet = EventSetTimer(1); // if (!isEventSet) { // LogMessage("Error: " + GetLastError()); // return INIT_FAILED; // } // return INIT_SUCCEEDED; } // // DeInitialization ... void OnDeinit(const int reason) { // // Killing Event Timer ... EventKillTimer(); } // // Ticker Event Handler ... void OnTick() { // // Checking State for Signal Handling ... CheckState(); // // Process Signals to Open Positions ... ProcessSignals(); // // Process Open Positions for Trailing Stop Loss or Close ... ProcessOpenPositions(); } // // Timer Event Handler ... void OnTimer() { // CheckState(); ProcessOpenPositions(); } // // END Event Handlers ... // // // START Functions ... // // // Check State for Signal Handling ... void CheckState() { // // Here we Must to Check Market State in Big Picture ... // // Retrieve XMA State ... // XMAState xmaState = GetXMAState( // // // // Bar Index ... // 0, // // // // Market Specification Inpouts ... // marketLength, // Market Length ... // // // // XMA Inputs ... // shortCycleFastMultiplier, // Short Cycle Fast Multiplier ... // shortCycleSlowMultiplier, // Short Cycle Slow Multiplier ... // mediumCycleFastMultiplier, // Medium Cycle Fast Multiplier ... // mediumCycleSlowMultiplier, // Medium Cycle Slow Multiplier ... // longCycleFastMultiplier, // Long Cycle Fast Multiplier ... // longCycleSlowMultiplier, // Long Cycle Slow Multiplier ... // // // // Show/Hide Inputs ... // showShortCycle, // showShortCycleCrossLines, // showMediumCycle, // showMediumCycleCrossLines, // showLongCycle, // showLongCycleCrossLines, // // // // Color Inputs ... // shortCycleFastColor, // shortCycleSlowColor, // mediumCycleFastColor, // mediumCycleSlowColor, // longCycleFastColor, // longCycleSlowColor // ); // // // bool isMCFastCrossUnderSCSlow = // xmaState.mcFast < xmaState.scSlow // && !(xmaState.mcFastPrev < xmaState.scSlowPrev); // // // if ( // waitForLongSignals // && xmaState.isSCTrendDown // && isMCFastCrossUnderSCSlow // ) { // // // closeLongTrades = true; // waitForLongSignals = false; // // // // // string message = "Pause Long Trades ..."; // // // // // LogMessage(message); // // // return; // } // // // if ( // !waitForLongSignals // && xmaState.isSCFastCrossOverSlow // ) { // // // waitForLongSignals = true; // // // // // string message = "Play Long Trades ..."; // // // // // LogMessage(message); // // // return; // } } // // Calculate Signals and Process Based on Exists Signals ... void ProcessSignals() { // // Prevent Multiple Calculating on Same Bars ... if (IsNewBar()) { // // // LogMessage( // StringConcatenate( // "Current Time: ", // TimeCurrent() // ) // ); // countedBars++; } // // Retrieve Signal Exists ... XSignalRequest request = CalculateSignal( // // Bar Index ... 0, // // Market Specification Inpouts ... marketLength, // Market Length ... // // Risk To Reward Ratio ... riskToRewardRatio, // // XMA Inputs ... shortCycleFastMultiplier, // Short Cycle Fast Multiplier ... shortCycleSlowMultiplier, // Short Cycle Slow Multiplier ... mediumCycleFastMultiplier, // Medium Cycle Fast Multiplier ... mediumCycleSlowMultiplier, // Medium Cycle Slow Multiplier ... longCycleFastMultiplier, // Long Cycle Fast Multiplier ... longCycleSlowMultiplier, // Long Cycle Slow Multiplier ... // // Show/Hide Inputs ... // // OSC ... fastOSCLength, // FastOSC Length ... fastOSCMultiplier, // FastOSC Multiplier ... slowOSCLength, // SlowOSC Length ... slowOSCMultiplier, // SlowOSC Multiplier ... minPowerOSC, // Minimum Signal Power ... minVarianceOSC, // Minimum Var Power ... // // ZIGZAG Inputs ... zDeviation, // ZigZag Deviation ... zBackStep // ZigZag Back Step ... ); // // Prevent doing anything else, if there is no signals ... if ( !request.hasSignal || request.type == X_NONE ) { return; } // bool hasLongSignal = request.type == X_LONG; // // Check For Bot State ... if ( (hasLongSignal && !waitForLongSignals) || (!hasLongSignal && !waitForShortSignals) ) { return; } // // Check last Signalled Bar with Counted Bars ... // Prevent Multiple Signalling on Same Bar ... if (lastSignalledBar == countedBars) { // totalSignals--; if (hasLongSignal) { totalLongSignals--; } else { totalShortSignals--; } return; } // // increase last signalled bar ... lastSignalledBar = countedBars; // // Calculate Can Trade or not ... bool allowDoTrade = allowTrade && ( hasLongSignal ? allowLongTrades : allowShortTrades ); // // Check Balance ... if (initialBalance > 0) { // // Retrieve Account Balance ... double balance = AccountInfoDouble(ACCOUNT_BALANCE); double minimumBalanceForTrade = minBalancePercent * initialBalance; // // Retrieve Account Equity ... double equity = AccountInfoDouble(ACCOUNT_EQUITY); double maxAllowedEquity = balance - (balance * maxEquityPercent); // // Retrieve Free Marigin ... double freeMargin = AccountFreeMargin(); double maximumMariginRisk = balance - (balance * maxEquityPercent); // if ( // // Do not Open Positions if equity not passed ... equity < maxAllowedEquity || // // Do not Open Positions if free margin not passed ... freeMargin <= maximumMariginRisk || // // Do not open positions if balance less than minimum ... balance <= minimumBalanceForTrade ) { // allowDoTrade = false; // // // string message = StringConcatenate( // "Trading Pause => ", // "Balance: ", balance, // ", Equity: ", equity, // ", FreeMargin: ", freeMargin // ); // // // LogMessage(message); // SendAlert(message); } // if ( !allowDoTrade && signalTradeRetry < 2 ) { // signalTradeRetry++; CloseAllInProfitTrades(); ProcessSignals(); } else { signalTradeRetry = 0; } } // // Chack Maximum Open Positions ... int openTrades = CountOpenTrades(); if (maxOpenTrades > 0) { // if (openTrades >= maxOpenTrades) { // allowDoTrade = false; // // // string message = StringConcatenate( // "Trading Pause => ", // "Max Open Trades (", // maxOpenTrades, // ") reached ..." // ); // // // LogMessage(message); // SendAlert(message); } } // // Retrieve Signal Verification ... bool isVerified = true; if (!isVerified) { // allowDoTrade = false; // // // string message = StringConcatenate( // "Trading Pause => ", // "Signal Verification failed ..." // ); // // // LogMessage(message); // SendAlert(message); } // // Check Trading is Enable or not ... // nothing to do if trading is disabled ... if (!allowDoTrade) { // // // string message = StringConcatenate( // "Trading Not Allowed ..." // ); // // // LogMessage(message); // SendAlert(message); return; } // bool isPositionOpened = TradeSignal( request.signal, signalPrefix, lotsPerTradePercent, bullishSignalLabel, bullishSignalColor, bearishSignalLabel, bearishSignalColor ); // if (isPositionOpened) { // bool canAlert = alertPositions && ( hasLongSignal ? longPositionAlerts : shortPositionAlerts ); // if (canAlert) { // // Alert Message ... string message = StringConcatenate( "Trade on Signal ID: ", request.signal.id, ", Entry: ", request.signal.entryPrice, ", TP: ", request.signal.tp ); // // Terminal Alert ... if (terminalAlert) { Alert(message); } // // Push Alert ... if (pushAlert) { SendNotification(message); } } } } // // Process All Open Positions ... void ProcessOpenPositions() { // // Retrieve Account Balance ... double balance = AccountInfoDouble(ACCOUNT_BALANCE); double minimumBalanceForTrade = minBalancePercent * initialBalance; // // Retrieve Account Equity ... double equity = AccountInfoDouble(ACCOUNT_EQUITY); double maxAllowedEquity = balance - (balance * maxEquityPercent); // // Retrieve Free Marigin ... double freeMargin = AccountFreeMargin(); double maximumMariginRisk = balance - (balance * maxEquityPercent); // if (closeLongTrades) { // closeLongTrades = false; // // // CloseAllLongTrades(); // LogMessage("Close All Long Trades ..."); } // if (closeShortTrades) { // closeShortTrades = false; // CloseAllShortTrades(); // LogMessage("Close All Short Trades ..."); } } // // Send Special Type of Alerts ... void SendAlert(string message) { // if (!alertEvents) { return; } // // Terminal Alert ... if (terminalAlert) { Alert(message); } // // Push Alert ... if (pushAlert) { SendNotification(message); } } // // END Functions ... //