<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Forex Software — Who can help refine or fix bugs in the code indicator]]></title>
		<link>https://forexsb.com/forum/topic/3873/who-can-help-refine-or-fix-bugs-in-the-code-indicator/</link>
		<atom:link href="https://forexsb.com/forum/feed/rss/topic/3873/" rel="self" type="application/rss+xml" />
		<description><![CDATA[The most recent posts in Who can help refine or fix bugs in the code indicator.]]></description>
		<lastBuildDate>Fri, 19 Apr 2013 07:46:27 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Who can help refine or fix bugs in the code indicator]]></title>
			<link>https://forexsb.com/forum/post/19296/#p19296</link>
			<description><![CDATA[<p>this is how the indicator looks - the code</p>]]></description>
			<author><![CDATA[null@example.com (sashagara)]]></author>
			<pubDate>Fri, 19 Apr 2013 07:46:27 +0000</pubDate>
			<guid>https://forexsb.com/forum/post/19296/#p19296</guid>
		</item>
		<item>
			<title><![CDATA[Re: Who can help refine or fix bugs in the code indicator]]></title>
			<link>https://forexsb.com/forum/post/18201/#p18201</link>
			<description><![CDATA[<p>I fixed some obvious issues and cleanup the code. It is running but calculations are not correct.</p><p>I don&#039;t know what formula you want to code.</p><p>Please check this line:</p><div class="codebox"><pre><code>  for (int bar = firstBar; bar &lt; Bars; bar++)
      adRange[bar] = ((constante*(rMAFast[bar] - rMASlow[bar])*(fastATR2[bar]) + constante2)/(rMASlow[bar])/slowATR2[bar]);</code></pre></div><p>Also why do you use this:</p><div class="codebox"><pre><code>            for (int iBar = nSlow + nSignal - 1; iBar &lt; Bars; iBar++)
                adHistogram[iBar] = adRange2[iBar];</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Popov)]]></author>
			<pubDate>Wed, 13 Feb 2013 20:32:00 +0000</pubDate>
			<guid>https://forexsb.com/forum/post/18201/#p18201</guid>
		</item>
		<item>
			<title><![CDATA[Who can help refine or fix bugs in the code indicator]]></title>
			<link>https://forexsb.com/forum/post/17689/#p17689</link>
			<description><![CDATA[<p>Please do help to refine the indicator, I have little experience with C #, it runs but does not do any calculations, where an error and can not understand.</p><br /><div class="codebox"><pre><code>using System;
using System.Drawing;

namespace Forex_Strategy_Builder
{
    /// &lt;summary&gt;
    /// MACD Histogram Indicator
    /// &lt;/summary&gt;
    public class MACD_Histogram : Indicator
    {
        /// &lt;summary&gt;
        /// &lt;summary&gt;
        /// Sets the default indicator parameters for the designated slot type
        /// &lt;/summary&gt;
        public MACD_Histogram(SlotTypes slotType)
        {
            // General properties
            IndicatorName = &quot;Synerge Range&quot;;
            PossibleSlots = SlotTypes.OpenFilter | SlotTypes.CloseFilter;
            SeparatedChart = true;
            CustomIndicator = true;    

            // Setting up the indicator parameters
            IndParam = new IndicatorParam();
            IndParam.IndicatorName = IndicatorName;
            IndParam.SlotType = slotType;

            // The ComboBox parameters
            IndParam.ListParam[0].Caption = &quot;Logic&quot;;
            IndParam.ListParam[0].ItemList = new string[]
            {
                &quot;The Range rises&quot;,
                &quot;The Range falls&quot;,
                &quot;The Range is higher than the Level line&quot;,
                &quot;The Range is lower than the Level line&quot;,
                &quot;The Range crosses the Level line upward&quot;,
                &quot;The Range crosses the Level line downward&quot;,
                &quot;The Range changes its direction upward&quot;,
                &quot;The Range changes its direction downward&quot;
            };
            IndParam.ListParam[0].Index = 0;
            IndParam.ListParam[0].Text = IndParam.ListParam[0].ItemList[IndParam.ListParam[0].Index];
            IndParam.ListParam[0].Enabled = true;
            IndParam.ListParam[0].ToolTip = &quot;Logic of application of the indicator.&quot;;

            IndParam.ListParam[1].Caption = &quot;Smoothing method&quot;;
            IndParam.ListParam[1].ItemList = Enum.GetNames(typeof(MAMethod));
            IndParam.ListParam[1].Index = (int)MAMethod.Exponential;
            IndParam.ListParam[1].Text = IndParam.ListParam[1].ItemList[IndParam.ListParam[1].Index];
            IndParam.ListParam[1].Enabled = true;
            IndParam.ListParam[1].ToolTip = &quot;The smoothing method of Moving Averages.&quot;;

            IndParam.ListParam[2].Caption = &quot;Base price&quot;;
            IndParam.ListParam[2].ItemList = Enum.GetNames(typeof(BasePrice));
            IndParam.ListParam[2].Index = (int)BasePrice.Close;
            IndParam.ListParam[2].Text = IndParam.ListParam[2].ItemList[IndParam.ListParam[2].Index];
            IndParam.ListParam[2].Enabled = true;
            IndParam.ListParam[2].ToolTip = &quot;The price the Moving Averages are based on.&quot;;

            IndParam.ListParam[3].Caption = &quot;Signal line method&quot;;
            IndParam.ListParam[3].ItemList = Enum.GetNames(typeof(MAMethod));
            IndParam.ListParam[3].Index = (int)MAMethod.Simple;
            IndParam.ListParam[3].Text = IndParam.ListParam[3].ItemList[IndParam.ListParam[3].Index];
            IndParam.ListParam[3].Enabled = true;
            IndParam.ListParam[3].ToolTip = &quot;The smoothing method of the signal line.&quot;;

            // The NumericUpDown parameters
            IndParam.NumParam[0].Caption = &quot;Slow MA period&quot;;
            IndParam.NumParam[0].Value = 34;
            IndParam.NumParam[0].Min = 1;
            IndParam.NumParam[0].Max = 200;
            IndParam.NumParam[0].Enabled = true;
            IndParam.NumParam[0].ToolTip = &quot;The period of Slow MA.&quot;;

            IndParam.NumParam[1].Caption = &quot;Fast MA period&quot;;
            IndParam.NumParam[1].Value = 3;
            IndParam.NumParam[1].Min = 1;
            IndParam.NumParam[1].Max = 200;
            IndParam.NumParam[1].Enabled = true;
            IndParam.NumParam[1].ToolTip = &quot;The period of Fast MA.&quot;;

            IndParam.NumParam[2].Caption = &quot;Signal line period&quot;;
            IndParam.NumParam[2].Value = 1;
            IndParam.NumParam[2].Min = 1;
            IndParam.NumParam[2].Max = 200;
            IndParam.NumParam[2].Enabled = true;
            IndParam.NumParam[2].ToolTip = &quot;The period of Signal line.&quot;;

            IndParam.NumParam[3].Caption = &quot;Level&quot;;
            IndParam.NumParam[3].Value = 0.0000;
            IndParam.NumParam[3].Min = -2;
            IndParam.NumParam[3].Max = 2;
            IndParam.NumParam[3].Point = 4;
            IndParam.NumParam[3].Enabled = true;
            IndParam.NumParam[3].ToolTip = &quot;A critical level (for the appropriate logic).&quot;;

            // The CheckBox parameters
            IndParam.CheckParam[0].Caption = &quot;Use previous bar value&quot;;
            IndParam.CheckParam[0].Checked = PrepareUsePrevBarValueCheckBox(slotType);
            IndParam.CheckParam[0].Enabled = true;
            IndParam.CheckParam[0].ToolTip = &quot;Use the indicator value from the previous bar.&quot;;

            return;
        }

        /// &lt;summary&gt;
        /// Calculates the indicator&#039;s components
        /// &lt;/summary&gt;
        public override void Calculate(SlotTypes slotType)
        {
            // Reading the parameters
            MAMethod maMethod = (MAMethod)IndParam.ListParam[1].Index;
            MAMethod slMethod = (MAMethod)IndParam.ListParam[3].Index;
            BasePrice basePrice = (BasePrice)IndParam.ListParam[2].Index;
            int nSlow = (int)IndParam.NumParam[0].Value;
            int nFast = (int)IndParam.NumParam[1].Value;
            int nSignal = (int)IndParam.NumParam[2].Value;
            double dLevel = IndParam.NumParam[3].Value;
            int iPrvs = IndParam.CheckParam[0].Checked ? 1 : 0;

            // Calculation
            int iFirstBar = nSlow + nFast + 2;

            double constante = 100.0;
            double constante2 = 0.00001;
            double[] adRange = new double[Bars];
            double[] adRange2 = new double[Bars];

            /*ld_8 = 100.0 * (iMA(NULL, 0, 3, 0, MODE_LWMA, PRICE_CLOSE, li_36) - iMA(NULL, 0, 34, 0, MODE_LWMA, PRICE_CLOSE, li_36)) * iATR(NULL, 0, 3, li_36) + 0.00001;
            ld_16 = ld_8 / iMA(NULL, 0, 34, 0, MODE_LWMA, PRICE_CLOSE, li_36) / iATR(NULL, 0, 34, li_36);
            ld_24 = (MathExp(2.0 * ld_16) - 1.0) / (MathExp(2.0 * ld_16) + 1.0);*/

            double[] fastATR = new double[Bars];
           for (int bar = 1; bar &lt; Bars; bar++)
             fastATR[bar] = (double)Math.Max(High[bar], Close[bar - 1]) - (double)Math.Min(Low[bar], Close[bar - 1]);
          
             double[] fastATR2 = MovingAverage(nFast, 0, slMethod, fastATR);
            
            double[] slowATR = new double[Bars];
            for (int bar = 1; bar &lt; Bars; bar++)
               slowATR[bar] = (double)Math.Max(High[bar], Close[bar - 1]) - (double)Math.Min(Low[bar], Close[bar - 1]);
                      
               double[] slowATR2 = MovingAverage(nSlow, 0, slMethod, slowATR);
               
               double [] rMASlow = MovingAverage(nSlow, 0, maMethod, Price(basePrice));
               double [] rMAFast = MovingAverage(nFast, 0, maMethod, Price(basePrice));

               for (int ibar = iFirstBar; ibar &lt; Bars; ibar++)
                   adRange[ibar] = ((constante * (rMAFast[ibar] - rMASlow[ibar]) * (fastATR2[ibar]) + constante2) / (rMASlow[ibar]) / slowATR2[ibar]);
              
               for (int ibar = iFirstBar; ibar &lt; Bars; ibar++)
                   adRange2[ibar] = (Math.Exp((2.0 * adRange[ibar]) - 1.0))/(Math.Exp((2.0 * adRange[ibar]) + 1.0));


         /*   double[] ATR = new double[Bars];
            double[] ATR2 = new double[Bars];
            double[] Range = new double[Bars];
            double[] Factor = new double[Bars];
            double[] rMASlow = new double[Bars];
            double[] rMAFast = new double[Bars];
            double[] Factor1 = new double[Bars];
            double[] Factor2 = new double[Bars];
            double[] adRange = new double[Bars];
            double[] adRange2 = new double[Bars];
            double constante = 100.0;
            double constante2 = 0.00001;


            for (int iBar = 1; iBar &lt; Bars; iBar++)
            {
                ATR[iBar] = ((double)Math.Max(High[iBar], Close[iBar - 1]) - (double)Math.Min(Low[iBar], Close[iBar - 1]));
                ATR = MovingAverage(nFast, 0, maMethod, ATR);
                for (int iBary = 1; iBary &lt; Bars; iBary++)
                {
                    ATR2[iBary] = ((double)Math.Max(High[iBary], Close[iBary - 1]) - (double)Math.Min(Low[iBary], Close[iBary - 1]));
                    ATR2 = MovingAverage(nSlow, 0, maMethod, ATR2);





                    rMASlow = MovingAverage(nSlow, 0, maMethod, Price(basePrice));
                    rMAFast = MovingAverage(nFast, 0, maMethod, Price(basePrice));

                    //  for (int iBar = 1; iBar &lt; Bars; iBar++)
                    //     Range[iBar] = (100.0 * (rMAFast[iBar] - rMASlow[iBar]) * (ATR[iBar]) + 0.00001);
                    // for (int iBar = 1; iBar &lt; Bars; iBar++)
                    //    Factor[iBar] = Range[iBar] / rMAFast[iBar] / ATR2[iBar];
                    for (int iBaru = iFirstBar; iBaru &lt; Bars; iBaru++)
                        Range[iBaru] = constante * (rMAFast[iBaru] - rMASlow[iBaru]) * ATR[iBaru] + constante2;
                    for (int iBari = iFirstBar; iBari &lt; Bars; iBari++)
                        Factor[iBari] = (Range[iBari] / rMAFast[iBari] / ATR2[iBari]);

                    for (int iBaro = iFirstBar; iBaro &lt; Bars; iBaro++)
                        Factor1[iBaro] = Math.Exp(((2.0) * Factor[iBaro]) - 1.0);
                    for (int iBarp = iFirstBar; iBarp &lt; Bars; iBarp++)
                        Factor2[iBarp] = Math.Exp(((2.0) * Factor[iBarp]) + 1.0);
                    for (int iBarq = iFirstBar; iBarq &lt; Bars; iBarq++)
                        adRange2[iBarq] = Factor1[iBarq] / Factor2[iBarq];

                    for (int iBarw = iFirstBar; iBarw &lt; Bars; iBarw++)
                        adRange[iBarw] = adRange2[iBarw];
                }
            }*/

               double[] maSignalLine = MovingAverage(nSignal, 0, slMethod, adRange2);

           
            double[] adHistogram = new double[Bars];
            for (int iBar = nSlow + nSignal - 1; iBar &lt; Bars; iBar++)
                adHistogram[iBar] = adRange2[iBar];

            // Saving the components
            Component = new IndicatorComp[5];

            Component[0] = new IndicatorComp();
            Component[0].CompName = &quot;Histogram&quot;;
            Component[0].DataType = IndComponentType.IndicatorValue;
            Component[0].ChartType = IndChartType.Histogram;
            Component[0].FirstBar = iFirstBar;
            Component[0].Value = adRange2;

            Component[1] = new IndicatorComp();
            Component[1].CompName = &quot;Signal line&quot;;
            Component[1].DataType = IndComponentType.IndicatorValue;
            Component[1].ChartType = IndChartType.Line;
            Component[1].ChartColor = Color.Gold;
            Component[1].FirstBar = iFirstBar;
            Component[1].Value = maSignalLine;

            Component[2] = new IndicatorComp();
            Component[2].CompName = &quot;Synergy Range line&quot;;
            Component[2].DataType = IndComponentType.IndicatorValue;
            Component[2].ChartType = IndChartType.Line;
            Component[2].ChartColor = Color.Blue;
            Component[2].FirstBar = iFirstBar;
            Component[2].Value = adRange2;

            Component[3] = new IndicatorComp();
            Component[3].ChartType = IndChartType.NoChart;
            Component[3].FirstBar = iFirstBar;
            Component[3].Value = new double[Bars];

            Component[4] = new IndicatorComp();
            Component[4].ChartType = IndChartType.NoChart;
            Component[4].FirstBar = iFirstBar;
            Component[4].Value = new double[Bars];

            // Sets the Component&#039;s type
            if (slotType == SlotTypes.OpenFilter)
            {
                Component[3].DataType = IndComponentType.AllowOpenLong;
                Component[3].CompName = &quot;Is long entry allowed&quot;;
                Component[4].DataType = IndComponentType.AllowOpenShort;
                Component[4].CompName = &quot;Is short entry allowed&quot;;
            }
            else if (slotType == SlotTypes.CloseFilter)
            {
                Component[3].DataType = IndComponentType.ForceCloseLong;
                Component[3].CompName = &quot;Close out long position&quot;;
                Component[4].DataType = IndComponentType.ForceCloseShort;
                Component[4].CompName = &quot;Close out short position&quot;;
            }

            // Calculation of the logic
            IndicatorLogic indLogic = IndicatorLogic.It_does_not_act_as_a_filter;

            switch (IndParam.ListParam[0].Text)
            {
                case &quot;The Range histogram rises&quot;:
                    indLogic = IndicatorLogic.The_indicator_rises;
                    break;

                case &quot;The Range histogram falls&quot;:
                    indLogic = IndicatorLogic.The_indicator_falls;
                    break;

                case &quot;The Range histogram is higher than the Level line&quot;:
                    indLogic = IndicatorLogic.The_indicator_is_higher_than_the_level_line;
                    SpecialValues = new double[2] { dLevel, -dLevel };
                    break;

                case &quot;The Range histogram is lower than the Level line&quot;:
                    indLogic = IndicatorLogic.The_indicator_is_lower_than_the_level_line;
                    SpecialValues = new double[2] { dLevel, -dLevel };
                    break;

                case &quot;The Range histogram crosses the Level line upward&quot;:
                    indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_upward;
                    SpecialValues = new double[2] { dLevel, -dLevel};
                    break;

                case &quot;The Range histogram crosses the Level line downward&quot;:
                    indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_downward;
                    SpecialValues = new double[2] { dLevel, -dLevel };
                    break;

                case &quot;The Range histogram changes its direction upward&quot;:
                    indLogic = IndicatorLogic.The_indicator_changes_its_direction_upward;
                    break;

                case &quot;The Range histogram changes its direction downward&quot;:
                    indLogic = IndicatorLogic.The_indicator_changes_its_direction_downward;
                    break;

                default:
                    break;
            }

            OscillatorLogic(iFirstBar, iPrvs, adRange2, dLevel, -dLevel, ref Component[3], ref Component[4], indLogic);

            return;
        }

        /// &lt;summary&gt;
        /// Sets the indicator logic description
        /// &lt;/summary&gt;
        public override void SetDescription(SlotTypes slotType)
        {
            string sLevelLong = (IndParam.NumParam[3].Value == 0 ? &quot;0&quot; : IndParam.NumParam[3].ValueToString);
            string sLevelShort = (IndParam.NumParam[3].Value == 0 ? &quot;0&quot; : &quot;-&quot; + IndParam.NumParam[3].ValueToString);

            EntryFilterLongDescription = &quot;the &quot; + ToString() + &quot; &quot;;
            EntryFilterShortDescription = &quot;the &quot; + ToString() + &quot; &quot;;
            ExitFilterLongDescription = &quot;the &quot; + ToString() + &quot; &quot;;
            ExitFilterShortDescription = &quot;the &quot; + ToString() + &quot; &quot;;

            switch (IndParam.ListParam[0].Text)
            {
                case &quot;The Range histogram rises&quot;:
                    EntryFilterLongDescription += &quot;rises&quot;;
                    EntryFilterShortDescription += &quot;falls&quot;;
                    ExitFilterLongDescription += &quot;rises&quot;;
                    ExitFilterShortDescription += &quot;falls&quot;;
                    break;

                case &quot;The Range histogram falls&quot;:
                    EntryFilterLongDescription += &quot;falls&quot;;
                    EntryFilterShortDescription += &quot;rises&quot;;
                    ExitFilterLongDescription += &quot;falls&quot;;
                    ExitFilterShortDescription += &quot;rises&quot;;
                    break;

                case &quot;The Range histogram is higher than the Level line&quot;:
                    EntryFilterLongDescription += &quot;is higher than the Level &quot; + sLevelLong;
                    EntryFilterShortDescription += &quot;is lower than the Level &quot; + sLevelShort;
                    ExitFilterLongDescription += &quot;is higher than the Level &quot; + sLevelLong;
                    ExitFilterShortDescription += &quot;is lower than the Level &quot; + sLevelShort;
                    break;

                case &quot;The Range histogram is lower than the Level line&quot;:
                    EntryFilterLongDescription += &quot;is lower than the Level &quot; + sLevelLong;
                    EntryFilterShortDescription += &quot;is higher than the Level &quot; + sLevelShort;
                    ExitFilterLongDescription += &quot;is lower than the Level &quot; + sLevelLong;
                    ExitFilterShortDescription += &quot;is higher than the Level &quot; + sLevelShort;
                    break;

                case &quot;The Range histogram crosses the Level line upward&quot;:
                    EntryFilterLongDescription += &quot;crosses the Level &quot; + sLevelLong + &quot; upward&quot;;
                    EntryFilterShortDescription += &quot;crosses the Level &quot; + sLevelShort + &quot; downward&quot;;
                    ExitFilterLongDescription += &quot;crosses the Level &quot; + sLevelLong + &quot; upward&quot;;
                    ExitFilterShortDescription += &quot;crosses the Level &quot; + sLevelShort + &quot; downward&quot;;
                    break;

                case &quot;The Range histogram crosses the Level line downward&quot;:
                    EntryFilterLongDescription += &quot;crosses the Level &quot; + sLevelLong + &quot; downward&quot;;
                    EntryFilterShortDescription += &quot;crosses the Level &quot; + sLevelShort + &quot; upward&quot;;
                    ExitFilterLongDescription += &quot;crosses the Level &quot; + sLevelLong + &quot; downward&quot;;
                    ExitFilterShortDescription += &quot;crosses the Level &quot; + sLevelShort + &quot; upward&quot;;
                    break;

                case &quot;The Range histogram changes its direction upward&quot;:
                    EntryFilterLongDescription += &quot;changes its direction upward&quot;;
                    EntryFilterShortDescription += &quot;changes its direction downward&quot;;
                    ExitFilterLongDescription += &quot;changes its direction upward&quot;;
                    ExitFilterShortDescription += &quot;changes its direction downward&quot;;
                    break;

                case &quot;The Range histogram changes its direction downward&quot;:
                    EntryFilterLongDescription += &quot;changes its direction downward&quot;;
                    EntryFilterShortDescription += &quot;changes its direction upward&quot;;
                    ExitFilterLongDescription += &quot;changes its direction downward&quot;;
                    ExitFilterShortDescription += &quot;changes its direction upward&quot;;
                    break;

                default:
                    break;
            }

            return;
        }

        /// &lt;summary&gt;
        /// Indicator to string
        /// &lt;/summary&gt;
        public override string ToString()
        {
            string sString = IndicatorName +
                (IndParam.CheckParam[0].Checked ? &quot;* (&quot; : &quot; (&quot;) +
                IndParam.ListParam[1].Text + &quot;, &quot; + // Method
                IndParam.ListParam[2].Text + &quot;, &quot; + // Price
                IndParam.ListParam[3].Text + &quot;, &quot; + // Signal MA Method
                IndParam.NumParam[0].ValueToString + &quot;, &quot; + // Slow MA period
                IndParam.NumParam[1].ValueToString + &quot;, &quot; + // Fast MA period
                IndParam.NumParam[2].ValueToString + &quot;)&quot;;   // Signal MA period

            return sString;
        }
    }
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (sashagara)]]></author>
			<pubDate>Sun, 06 Jan 2013 15:03:46 +0000</pubDate>
			<guid>https://forexsb.com/forum/post/17689/#p17689</guid>
		</item>
	</channel>
</rss>
