/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Candle Styles // --------------------------------------------------- // Name: XCC // Description: Candle Styles ... // // // 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 XCC Indicator" #property strict // // START Constants ... // // // Indicator Short Name ... #define ShortName "XCC" // // Holds an SnapShot of Charts Configuration ... struct XChartStyle { // // chart's ID ... long chartId; // // chart's mode ... ENUM_CHART_MODE mode; // // show bid line ... bool showBidLine; // // show ask line ... bool showAskLine; // // show grids on chart ... bool showGrid; // // show volumes ... bool showVolumes; // // Displaying trade levels in the chart (levels of open positions, Stop Loss, Take Profit and pending orders) ... bool showTradeLevels; // // chart autoscroll ... bool autoScroll; // // chart quick navigation state ... bool quickNavigation; // // chart's foreground color ... color foreGroundColor; // // chart's background color ... color backGroundColor; // // Up Color ... color upColor; // // Down Color ... color downColor; // // Bullish color ... color bullishColor; // // Bearish color ... color bearishColor; // // grid color ... color gridColor; // // bid line color ... color bidLineColor; // // ask line color ... color askLineColor; // // line mode and doji candlestick color ... color lineColor; // // Color of stop order levels (Stop Loss and Take Profit) ... color stopColor; // // volumes color ... color volumesColor; }; // // END Constants ... // // // START Inputs ... // // input group "Chart Style"; input ENUM_CHART_MODE mode = CHART_CANDLES; // Mode input color upColor = clrLime; // Up Color input color downColor = clrRed; // Down Color input color lineColor = clrLime; // Line mode and Doji candlestick Color input color bearishColor = clrRed; // Bullish Color input color bullishColor = clrLime; // Bearish Color input color volumesColor = clrGreen; // Volumes Color // input group "Presentation"; input bool showCandles = true; // Show Candles // // END Inputs ... // // // START Includes and Imports ... // // // Includes Draw Library ... #include "../Libraries/x-saherelm.draw.lib.mq5" // // Includes Common Library ... #include "../Libraries/x-saherelm.common.lib.mq5" // // END Includes and Imports ... // // // START Buffers ... // // #property indicator_chart_window // #property indicator_buffers 0 #property indicator_plots 0 // // END Buffers ... // // // START Global Definitions: Variables, Properties and etc ... // // int maxLength; // XChartStyle chartStyle; XChartStyle clearStyle; // // END Global Definitions: Variables, Properties and etc ... // // // START Event Handlers ... // // // Initialization ... int OnInit() { // // Validate Inputs ... if (!ValidateInputs()) { return INIT_PARAMETERS_INCORRECT; } // drawPrefix = ShortName; // // because in some cases we may have more than one input for // calculation and we must prevent any calculation // untill we pass the biggest input length, here we get max Input length // and then wait until pass it ... maxLength = ExtractMaxLengthOfInputs(); // // Define Index Buffers ... DefineBuffers(); // // Set Indicator ShortName ... SetIndicatorName(); // // Apply Chart Style ... ApplyCustomChartStyle(); // // Init Succeed ... return INIT_SUCCEEDED; } // // DeInitialization ... void OnDeinit(const int reason) { // // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function // REASON_REMOVE 1 Program removed from a chart // REASON_RECOMPILE 2 Program recompiled // REASON_CHARTCHANGE 3 A symbol or a chart period is changed // REASON_CHARTCLOSE 4 Chart closed // REASON_PARAMETERS 5 Inputs changed by a user // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings // REASON_TEMPLATE 7 Another chart template applied // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value // REASON_CLOSE 9 Terminal closed } // // Calculating what we want ... int OnCalculate( // // total Candles on chart ... const int rates_total, // // total calculated Candles on charts ... const int prev_calculated, // // history of Candles Open Time ... const datetime &time[], // // history of Candles Open Price ... const double &open[], // // history of Candles High Price ... const double &high[], // // history of Candles Low Price ... const double &low[], // // history of Candles Close Price ... const double &close[], // // history of Tick Volumes on Candle ... const long &tick_volume[], // // history of Trade Volumes ... const long &volume[], // // history of Candles Spread Price ... const int &spread[] // ) { // // Prepare Buffers ... ArraySetAsSeries(time, true); ArraySetAsSeries(open, true); ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(close, true); ArraySetAsSeries(tick_volume, true); ArraySetAsSeries(volume, true); ArraySetAsSeries(spread, true); // // this counts Available Bars ... int limit; // limit = (prev_calculated > rates_total || prev_calculated <= 0) ? rates_total : (rates_total - prev_calculated) + 1; // // Main Loop ... for (int i = limit - 1; i >= 0 && !IsStopped(); i--) { CalculateBuffers(i); } // return rates_total; } // // END Event Handlers ... // // // START Functions ... // // // Validate Input Args for Initialization ... bool ValidateInputs() { // bool result = true; // return result; } // // Retrieve all Exists Input Max Length ... // use for Start Of Drawing ... int ExtractMaxLengthOfInputs() { // int result = 0; // return result; } // // Define Indexes and Styles ... void DefineBuffers() { } // // Set Indicator Short Name and also we can define Buffers Labels ... void SetIndicatorName() { IndicatorSetString(INDICATOR_SHORTNAME, ShortName); } // // Calculate Buffers ... void CalculateBuffers( int bar_index // Selected Bar Index ) { } // // Apply Custom Chart Style ... void ApplyCustomChartStyle() { // // Read Current Chart Config and Store it ... ReadChartStyle(); // // After Reading Current Chart Style ... // we have to Save Configs and Change Styles ... clearStyle = chartStyle; // clearStyle.upColor = CLR_NONE; clearStyle.downColor = CLR_NONE; clearStyle.lineColor = CLR_NONE; clearStyle.bullishColor = CLR_NONE; clearStyle.bearishColor = CLR_NONE; // // Decide to Show or not Candles based on User Input ... if (showCandles) { SetChartStyle(chartStyle); } else { SetChartStyle(clearStyle); } } // // Read Previous Chart Style ... void ReadChartStyle() { // // Retrieve Current Chart ID ... long chartId = ChartID(); chartStyle.chartId = chartId; // // Retrieve Chart Mode ... chartStyle.mode = (ENUM_CHART_MODE)ChartGetInteger(chartId, CHART_MODE); // chartStyle.showBidLine = (bool)ChartGetInteger(chartId, CHART_SHOW_BID_LINE); chartStyle.showAskLine = (bool)ChartGetInteger(chartId, CHART_SHOW_ASK_LINE); chartStyle.showGrid = (bool)ChartGetInteger(chartId, CHART_SHOW_GRID); chartStyle.showVolumes = (bool)ChartGetInteger(chartId, CHART_SHOW_VOLUMES); chartStyle.showTradeLevels = (bool)ChartGetInteger(chartId, CHART_SHOW_TRADE_LEVELS); chartStyle.autoScroll = (bool)ChartGetInteger(chartId, CHART_AUTOSCROLL); chartStyle.quickNavigation = (bool)ChartGetInteger(chartId, CHART_QUICK_NAVIGATION); // chartStyle.foreGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_FOREGROUND); chartStyle.backGroundColor = (color)ChartGetInteger(chartId, CHART_COLOR_BACKGROUND); chartStyle.upColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_UP); chartStyle.downColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_DOWN); chartStyle.bullishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BULL); chartStyle.bearishColor = (color)ChartGetInteger(chartId, CHART_COLOR_CANDLE_BEAR); chartStyle.gridColor = (color)ChartGetInteger(chartId, CHART_COLOR_GRID); chartStyle.bidLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_BID); chartStyle.askLineColor = (color)ChartGetInteger(chartId, CHART_COLOR_ASK); chartStyle.stopColor = (color)ChartGetInteger(chartId, CHART_COLOR_STOP_LEVEL); chartStyle.lineColor = (color)ChartGetInteger(chartId, CHART_COLOR_CHART_LINE); chartStyle.volumesColor = (color)ChartGetInteger(chartId, CHART_COLOR_VOLUME); // chartStyle.mode = mode; chartStyle.upColor = upColor; chartStyle.downColor = downColor; chartStyle.lineColor = lineColor; chartStyle.bearishColor = bearishColor; chartStyle.bullishColor = bullishColor; chartStyle.volumesColor = volumesColor; } // // Set Chart Style ... void SetChartStyle( XChartStyle &mChartStyle // Chart Style to Apply ) { // ApplyChartStyle( mChartStyle.chartId, mChartStyle.mode, mChartStyle.showBidLine, mChartStyle.showAskLine, mChartStyle.showGrid, mChartStyle.showVolumes, mChartStyle.showTradeLevels, mChartStyle.autoScroll, mChartStyle.quickNavigation, mChartStyle.foreGroundColor, mChartStyle.backGroundColor, mChartStyle.upColor, mChartStyle.downColor, mChartStyle.bullishColor, mChartStyle.bearishColor, mChartStyle.gridColor, mChartStyle.bidLineColor, mChartStyle.askLineColor, mChartStyle.lineColor, mChartStyle.stopColor, mChartStyle.volumesColor); } // // END Functions ... //