FDI by footon
43939 downloads / 4675 views / Created: 24.05.2013 Average Rating: 0
//==============================================================
// Forex Strategy Builder
// Copyright (c) Miroslav Popov. All rights reserved.
//==============================================================
// THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
//==============================================================
using System;
using System.Drawing;
using ForexStrategyBuilder.Infrastructure.Entities;
using ForexStrategyBuilder.Infrastructure.Enums;
using ForexStrategyBuilder.Infrastructure.Interfaces;
namespace ForexStrategyBuilder.Indicators.Store
{
public class FDI : Indicator
{
public FDI()
{
IndicatorName = "FDI";
PossibleSlots = SlotTypes.OpenFilter | SlotTypes.CloseFilter;
SeparatedChart = true;
//SeparatedChartMinValue = 0;
//SeparatedChartMaxValue = 3;
IndicatorAuthor = "Footon";
IndicatorVersion = "2.0";
IndicatorDescription = "Footon's indi corner: custom indicators for FSB and FST.";
}
public override void Initialize(SlotTypes slotType)
{
SlotType = slotType;
// The ComboBox parameters
IndParam.ListParam[0].Caption = "Logic";
IndParam.ListParam[0].ItemList = new string[]
{
" rises",
" falls",
" is higher than the level line",
" is lower than the level line",
" crosses the level line upward",
" crosses the level line downward",
" changes its direction upward",
" changes its direction downward"
};
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 = "Logic of application of the indicator.";
IndParam.ListParam[2].Caption = "Base price";
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 = "The price ";
IndParam.ListParam[3].Caption = "Smoothing method";
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 = "method";
// The NumericUpDown parameters
IndParam.NumParam[0].Caption = "Smoothing period";
IndParam.NumParam[0].Value = 14;
IndParam.NumParam[0].Min = 1;
IndParam.NumParam[0].Max = 200;
IndParam.NumParam[0].Enabled = true;
IndParam.NumParam[0].ToolTip = "The period ";
IndParam.NumParam[1].Caption = "Level";
IndParam.NumParam[1].Value = 2;
IndParam.NumParam[1].Min = -2;
IndParam.NumParam[1].Max = 2;
IndParam.NumParam[1].Point = 1;
IndParam.NumParam[1].Enabled = true;
IndParam.NumParam[1].ToolTip = "A critical level (for the appropriate logic).";
// The CheckBox parameters
IndParam.CheckParam[0].Caption = "Use previous bar value";
IndParam.CheckParam[0].Enabled = true;
IndParam.CheckParam[0].ToolTip = "Use the indicator value from the previous bar.";
return;
}
public override void Calculate(IDataSet dataSet)
{
DataSet = dataSet;
// Reading the parameters
BasePrice basePrice = (BasePrice)IndParam.ListParam[2].Index;
int iPeriod = (int)IndParam.NumParam[0].Value;
double dLevel = IndParam.NumParam[1].Value;
MAMethod maMethod = (MAMethod )IndParam.ListParam[3].Index;
int iPrvs = IndParam.CheckParam[0].Checked ? 1 : 0;
int g_period_minus_1 = iPeriod -1;
double LOG_2 = Math.Log( 2.0 );
double e_random_line = dLevel;
// Calculation
double[] FDI = new double[Bars];
//double[] StdDev = new double[Bars];
double[] stdevi = new double[Bars];
int iFirstBar = iPeriod + 2;
double[] adBasePrice = Price(basePrice);
//double[] MA = MovingAverage(iPeriod, 0, maMethod, adBasePrice);
double[] ExtOutputBufferUp = new double[Bars];
double[] ExtOutputBufferDown = new double[Bars];
double[] UpBufferUp = new double[Bars];
double[] UpBufferDown = new double[Bars];
double[] DownBufferUp = new double[Bars];
double[] DownBufferDown = new double[Bars];
double diff = 0;
double priorDiff;// = 0; = 0;
double length;// = 0;
double delta = 0;
double mean = 0;
double sum;// = 0; = 0;
double fdi = 0;
double variance = 0;
double stddev = 0;
for (int iBar = iFirstBar; iBar < Bars; iBar++)
{
length = 0;
priorDiff = 0;
sum = 0;
double priceMax = double.MinValue;
double priceMin = double.MaxValue;
for (int i = 0; i < iPeriod; i++)
{
if (adBasePrice[iBar - i] > priceMax) priceMax = adBasePrice[iBar - i];
if (adBasePrice[iBar - i] < priceMin) priceMin = adBasePrice[iBar - i];
}
for( int iteration = 0; iteration <= g_period_minus_1; iteration++ )
{
if(( priceMax - priceMin)> 0.0 )
{
diff =(adBasePrice[iBar - iteration] - priceMin )/( priceMax - priceMin );
if(iteration > 0 )
{
length+=Math.Sqrt( Math.Pow( diff - priorDiff, 2.0)+(1.0/Math.Pow( iPeriod, 2.0)) );
}
priorDiff=diff;
}
}
if(length > 0.0 )
{
fdi=1.0 +(Math.Log( length)+ LOG_2 )/Math.Log( 2 * g_period_minus_1 );
FDI[iBar] = fdi;
mean=length/g_period_minus_1;
for( int iteration = 0; iteration <= g_period_minus_1; iteration++ )
{
if(( priceMax - priceMin)> 0.0 )
{
diff =(adBasePrice[iBar - iteration] - priceMin )/( priceMax - priceMin );
if(iteration > 0 )
{
delta=Math.Sqrt( Math.Pow( diff - priorDiff, 2.0)+(1.0/Math.Pow( iPeriod, 2.0)) );
sum+=Math.Pow(delta-(length/g_period_minus_1),2);
}
priorDiff=diff;
}
}
variance=sum/(Math.Pow(length,2)*Math.Pow(Math.Log(2*g_period_minus_1),2));
}
else
{
fdi=0.0;
variance=0.0;
}
stddev=Math.Sqrt(variance);
if(fdi > e_random_line )
{
ExtOutputBufferUp[iBar]=fdi;
//ExtOutputBufferUp[pos+1]=MathMin( ExtOutputBufferUp[pos+1], ExtOutputBufferDown[pos+1] );
//ExtOutputBufferDown[iBar]=EMPTY_VALUE;
//UpBuffer is clearly above e_random_line, we just have an 'if' case for DownBuffer
UpBufferUp[iBar] =fdi+stddev;
//UpBufferUp[pos+1]=ExtOutputBufferUp[pos+1]+stddev;
//UpBufferDown[iBar]=EMPTY_VALUE;
if (fdi-stddev > e_random_line )
{
DownBufferUp[iBar]=fdi-stddev;
//DownBufferUp[pos+1]=ExtOutputBufferUp[pos+1]-stddev;
//DownBufferDown[iBar]=EMPTY_VALUE;
}
else
{
DownBufferDown[iBar]=fdi-stddev;
//DownBufferDown[pos+1]=ExtOutputBufferUp[pos+1]-stddev;
//DownBufferUp[iBar]=EMPTY_VALUE;
}
}
else
{
ExtOutputBufferDown[iBar]=fdi;
//ExtOutputBufferDown[pos+1]=MathMin( ExtOutputBufferUp[pos+1], ExtOutputBufferDown[pos+1] );
//ExtOutputBufferUp[iBar]=EMPTY_VALUE;
//Symmetrically, DownBuffer is clearly below e_random_line, we just have an 'if' case for UpBuffer
if (fdi+stddev > e_random_line )
{
UpBufferUp[iBar] =fdi+stddev;
//UpBufferUp[pos+1]=ExtOutputBufferDown[pos+1]+stddev;
//UpBufferDown[iBar]=EMPTY_VALUE;
}
else
{
UpBufferDown[iBar] =fdi+stddev;
//UpBufferDown[pos+1]=ExtOutputBufferDown[pos+1]+stddev;
//UpBufferUp[iBar]=EMPTY_VALUE;
}
DownBufferDown[iBar]=fdi-stddev;
//DownBufferDown[pos+1]=ExtOutputBufferDown[pos+1]-stddev;
//DownBufferUp[iBar]=EMPTY_VALUE;
}
}
// Saving the components
Component = new IndicatorComp[9];
Component[0] = new IndicatorComp();
Component[0].CompName = "FDI";
Component[0].DataType = IndComponentType.IndicatorValue;
Component[0].ChartType = IndChartType.Line;
Component[0].ChartColor = Color.RoyalBlue;
Component[0].FirstBar = iFirstBar;
Component[0].Value = FDI;
Component[3] = new IndicatorComp();
Component[3].CompName = "ExtOutputBufferUp";
Component[3].DataType = IndComponentType.IndicatorValue;
Component[3].ChartType = IndChartType.Level;//Line;
Component[3].ChartColor = Color.RoyalBlue;
Component[3].FirstBar = iFirstBar;
Component[3].Value = ExtOutputBufferUp;
Component[4] = new IndicatorComp();
Component[4].CompName = "ExtOutputBufferDown";
Component[4].DataType = IndComponentType.IndicatorValue;
Component[4].ChartType = IndChartType.Level;//Line;
Component[4].ChartColor = Color.RoyalBlue;
Component[4].FirstBar = iFirstBar;
Component[4].Value = ExtOutputBufferDown;
Component[5] = new IndicatorComp();
Component[5].CompName = "UpBufferUp";
Component[5].DataType = IndComponentType.IndicatorValue;
Component[5].ChartType = IndChartType.Level;//Line;
Component[5].ChartColor = Color.RoyalBlue;
Component[5].FirstBar = iFirstBar;
Component[5].Value = UpBufferUp;
Component[6] = new IndicatorComp();
Component[6].CompName = "UpBufferDown";
Component[6].DataType = IndComponentType.IndicatorValue;
Component[6].ChartType = IndChartType.Level;//Line;
Component[6].ChartColor = Color.RoyalBlue;
Component[6].FirstBar = iFirstBar;
Component[6].Value = UpBufferDown;
Component[7] = new IndicatorComp();
Component[7].CompName = "DownBufferUp";
Component[7].DataType = IndComponentType.IndicatorValue;
Component[7].ChartType = IndChartType.Level;//Line;
Component[7].ChartColor = Color.RoyalBlue;
Component[7].FirstBar = iFirstBar;
Component[7].Value = DownBufferUp;
Component[8] = new IndicatorComp();
Component[8].CompName = "DownBufferDown";
Component[8].DataType = IndComponentType.IndicatorValue;
Component[8].ChartType = IndChartType.Level;//Line;
Component[8].ChartColor = Color.RoyalBlue;
Component[8].FirstBar = iFirstBar;
Component[8].Value = DownBufferDown;
Component[1] = new IndicatorComp();
Component[1].ChartType = IndChartType.NoChart;
Component[1].FirstBar = iFirstBar;
Component[1].Value = new double[Bars];
Component[2] = new IndicatorComp();
Component[2].ChartType = IndChartType.NoChart;
Component[2].FirstBar = iFirstBar;
Component[2].Value = new double[Bars];
// Sets the Component's type
if (SlotType == SlotTypes.OpenFilter)
{
Component[1].DataType = IndComponentType.AllowOpenLong;
Component[1].CompName = "Is long entry allowed";
Component[2].DataType = IndComponentType.AllowOpenShort;
Component[2].CompName = "Is short entry allowed";
}
else if (SlotType == SlotTypes.CloseFilter)
{
Component[1].DataType = IndComponentType.ForceCloseLong;
Component[1].CompName = "Close out long position";
Component[2].DataType = IndComponentType.ForceCloseShort;
Component[2].CompName = "Close out short position";
}
// Calculation of the logic
IndicatorLogic indLogic = IndicatorLogic.It_does_not_act_as_a_filter;
switch (IndParam.ListParam[0].Text)
{
case " rises":
indLogic = IndicatorLogic.The_indicator_rises;
break;
case " falls":
indLogic = IndicatorLogic.The_indicator_falls;
break;
case " is higher than the level line":
indLogic = IndicatorLogic.The_indicator_is_higher_than_the_level_line;
break;
case " is lower than the level line":
indLogic = IndicatorLogic.The_indicator_is_lower_than_the_level_line;
break;
case " crosses the level line upward":
indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_upward;
break;
case " crosses the level line downward":
indLogic = IndicatorLogic.The_indicator_crosses_the_level_line_downward;
break;
case " changes its direction upward":
indLogic = IndicatorLogic.The_indicator_changes_its_direction_upward;
break;
case " changes its direction downward":
indLogic = IndicatorLogic.The_indicator_changes_its_direction_downward;
break;
default:
break;
}
OscillatorLogic(iFirstBar, iPrvs, FDI, dLevel, dLevel, ref Component[1], ref Component[2], indLogic);
return;
}
///
/// Sets the indicator logic description
///
public override void SetDescription()
{
EntryFilterLongDescription = "the " + ToString() + " ";
EntryFilterShortDescription = "the " + ToString() + " ";
ExitFilterLongDescription = "the " + ToString() + " ";
ExitFilterShortDescription = "the " + ToString() + " ";
switch (IndParam.ListParam[0].Text)
{
case " rises":
EntryFilterLongDescription += "rises";
EntryFilterShortDescription += "falls";
ExitFilterLongDescription += "rises";
ExitFilterShortDescription += "falls";
break;
case " falls":
EntryFilterLongDescription += "falls";
EntryFilterShortDescription += "rises";
ExitFilterLongDescription += "falls";
ExitFilterShortDescription += "rises";
break;
case " is higher than the level line":
EntryFilterLongDescription += "is higher than the level line";
EntryFilterShortDescription += "is lower than the level line";
ExitFilterLongDescription += "is higher than the level line";
ExitFilterShortDescription += "is lower than the level line";
break;
case " is lower than the level line":
EntryFilterLongDescription += "is lower than the level line";
EntryFilterShortDescription += "is higher than the level line";
ExitFilterLongDescription += "is lower than the level line";
ExitFilterShortDescription += "is higher than the level line";
break;
case " crosses the level line upward":
EntryFilterLongDescription += "crosses the level line upward";
EntryFilterShortDescription += "crosses the level line downward";
ExitFilterLongDescription += "crosses the level line upward";
ExitFilterShortDescription += "crosses the level line downward";
break;
case " crosses the level line downward":
EntryFilterLongDescription += "crosses the level line downward";
EntryFilterShortDescription += "crosses the level line upward";
ExitFilterLongDescription += "crosses the level line downward";
ExitFilterShortDescription += "crosses the level line upward";
break;
case " changes its direction upward":
EntryFilterLongDescription += "changes its direction upward";
EntryFilterShortDescription += "changes its direction downward";
ExitFilterLongDescription += "changes its direction upward";
ExitFilterShortDescription += "changes its direction downward";
break;
case " changes its direction downward":
EntryFilterLongDescription += "changes its direction downward";
EntryFilterShortDescription += "changes its direction upward";
ExitFilterLongDescription += "changes its direction downward";
ExitFilterShortDescription += "changes its direction upward";
break;
default:
break;
}
return;
}
///
/// Indicator to string
///
public override string ToString()
{
string sString = IndicatorName +
(IndParam.CheckParam[0].Checked ? "* (" : " (") +
IndParam.ListParam[1].Text + ", " + // Price
IndParam.NumParam[0].ValueToString + ")"; // Period
return sString;
}
}
}
//+--------------------------------------------------------------------+ //| Copyright: (C) 2014, Miroslav Popov - All rights reserved! | //| Website: http://forexsb.com/ | //| Support: http://forexsb.com/forum/ | //| License: Proprietary under the following circumstances: | //| | //| This code is a part of Forex Strategy Builder. It is free for | //| use as an integral part of Forex Strategy Builder. | //| One can modify it in order to improve the code or to fit it for | //| personal use. This code or any part of it cannot be used in | //| another applications without a permission. Contact information | //| cannot be changed. | //| | //| NO LIABILITY FOR CONSEQUENTIAL DAMAGES | //| | //| In no event shall the author be liable for any damages whatsoever | //| (including, without limitation, incidental, direct, indirect and | //| consequential damages, damages for loss of business profits, | //| business interruption, loss of business information, or other | //| pecuniary loss) arising out of the use or inability to use this | //| product, even if advised of the possibility of such damages. | //+--------------------------------------------------------------------+ #property copyright "Copyright 2014, Miroslav Popov" #property link "http://forexsb.com" #property version "1.00" #property strict #include <Forexsb.com/Indicator.mqh> #include <Forexsb.com/Enumerations.mqh> //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class FDI : public Indicator { public: FDI(SlotTypes slotType) { SlotType=slotType; IndicatorName="FDI"; WarningMessage = ""; IsAllowLTF = true; ExecTime = ExecutionTime_DuringTheBar; IsSeparateChart = true; IsDiscreteValues = false; IsDeafultGroupAll = false; } virtual void Calculate(DataSet &dataSet); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void FDI::Calculate(DataSet &dataSet) { Data=GetPointer(dataSet); // Reading the parameters BasePrice basePrice=(BasePrice)ListParam[2].Index; int iPeriod = (int)NumParam[0].Value; double dLevel = NumParam[1].Value; int iPrvs = CheckParam[0].Checked ? 1 : 0; int gPeriodMinus1=iPeriod -1; double log2=MathLog(2.0); double eRandomLine=dLevel; // Calculation int iFirstBar=iPeriod+2; double adBasePrice[]; Price(basePrice,adBasePrice); double adFDI[]; ArrayResize(adFDI,Data.Bars); ArrayInitialize(adFDI, 0); double ExtOutputBufferUp[]; ArrayResize(ExtOutputBufferUp,Data.Bars); ArrayInitialize(ExtOutputBufferUp, 0); double ExtOutputBufferDown[]; ArrayResize(ExtOutputBufferDown,Data.Bars); ArrayInitialize(ExtOutputBufferDown, 0); double UpBufferUp[]; ArrayResize(UpBufferUp,Data.Bars); ArrayInitialize(UpBufferUp, 0); double UpBufferDown[]; ArrayResize(UpBufferDown,Data.Bars); ArrayInitialize(UpBufferDown, 0); double DownBufferUp[]; ArrayResize(DownBufferUp,Data.Bars); ArrayInitialize(DownBufferUp, 0); double DownBufferDown[]; ArrayResize(DownBufferDown,Data.Bars); ArrayInitialize(DownBufferDown, 0); double diff=0; double priorDiff;// = 0; = 0; double length;// = 0; double delta=0; double sum;// = 0; = 0; double fdi=0; double variance=0; double stddev=0; for(int iBar=iFirstBar; iBar<Data.Bars; iBar++) { length=0; priorDiff=0; sum=0; double priceMax = DBL_MIN; double priceMin = DBL_MAX; for(int i=0; i<iPeriod; i++) { if(adBasePrice[iBar - i] > priceMax) priceMax = adBasePrice[iBar - i]; if(adBasePrice[iBar - i] < priceMin) priceMin = adBasePrice[iBar - i]; } for(int iteration=0; iteration<=gPeriodMinus1; iteration++) { if(( priceMax-priceMin)>0.0) { diff=(adBasePrice[iBar-iteration]-priceMin)/(priceMax-priceMin); if(iteration>0) { length+=MathSqrt(MathPow(diff-priorDiff,2.0)+(1.0/MathPow(iPeriod,2.0))); } priorDiff=diff; } } if(length>0.0) { fdi=1.0+(MathLog(length)+log2)/MathLog(2*gPeriodMinus1); adFDI[iBar]=fdi; for(int iteration=0; iteration<=gPeriodMinus1; iteration++) { if(( priceMax-priceMin)>0.0) { diff=(adBasePrice[iBar-iteration]-priceMin)/(priceMax-priceMin); if(iteration>0) { delta=MathSqrt(MathPow(diff-priorDiff,2.0)+(1.0/MathPow(iPeriod,2.0))); sum+=MathPow(delta-(length/gPeriodMinus1),2); } priorDiff=diff; } } variance=sum/(MathPow(length,2)*MathPow(MathLog(2*gPeriodMinus1),2)); } else { fdi=0.0; variance=0.0; } stddev=MathSqrt(variance); if(fdi>eRandomLine) { ExtOutputBufferUp[iBar]=fdi; UpBufferUp[iBar]=fdi+stddev; if(fdi-stddev>eRandomLine) { DownBufferUp[iBar]=fdi-stddev; } else { DownBufferDown[iBar]=fdi-stddev; } } else { ExtOutputBufferDown[iBar]=fdi; if(fdi+stddev>eRandomLine) { UpBufferUp[iBar]=fdi+stddev; } else { UpBufferDown[iBar]=fdi+stddev; } DownBufferDown[iBar]=fdi-stddev; } } // Saving the components ArrayResize(Component[0].Value,Data.Bars); Component[0].CompName = "FDI"; Component[0].DataType = IndComponentType_IndicatorValue; Component[0].FirstBar = iFirstBar; ArrayCopy(Component[0].Value,adFDI); ArrayResize(Component[3].Value,Data.Bars); Component[3].CompName = "ExtOutputBufferUp"; Component[3].DataType = IndComponentType_IndicatorValue; Component[3].FirstBar = iFirstBar; ArrayCopy(Component[3].Value,ExtOutputBufferUp); ArrayResize(Component[4].Value,Data.Bars); Component[4].CompName = "ExtOutputBufferDown"; Component[4].DataType = IndComponentType_IndicatorValue; Component[4].FirstBar = iFirstBar; ArrayCopy(Component[4].Value,ExtOutputBufferDown); ArrayResize(Component[5].Value,Data.Bars); Component[5].CompName = "UpBufferUp"; Component[5].DataType = IndComponentType_IndicatorValue; Component[5].FirstBar = iFirstBar; ArrayCopy(Component[5].Value,UpBufferUp); ArrayResize(Component[6].Value,Data.Bars); Component[6].CompName = "UpBufferDown"; Component[6].DataType = IndComponentType_IndicatorValue; Component[6].FirstBar = iFirstBar; ArrayCopy(Component[6].Value,UpBufferDown); ArrayResize(Component[7].Value,Data.Bars); Component[7].CompName = "DownBufferUp"; Component[7].DataType = IndComponentType_IndicatorValue; Component[7].FirstBar = iFirstBar; ArrayCopy(Component[7].Value,DownBufferUp); ArrayResize(Component[8].Value,Data.Bars); Component[8].CompName = "DownBufferDown"; Component[8].DataType = IndComponentType_IndicatorValue; Component[8].FirstBar = iFirstBar; ArrayCopy(Component[8].Value,DownBufferDown); ArrayResize(Component[1].Value,Data.Bars); Component[1].FirstBar=iFirstBar; ArrayResize(Component[2].Value,Data.Bars); Component[2].FirstBar=iFirstBar; // Sets the Component's type if(SlotType==SlotTypes_OpenFilter) { Component[1].DataType = IndComponentType_AllowOpenLong; Component[1].CompName = "Is long entry allowed"; Component[2].DataType = IndComponentType_AllowOpenShort; Component[2].CompName = "Is short entry allowed"; } else if(SlotType==SlotTypes_CloseFilter) { Component[1].DataType = IndComponentType_ForceCloseLong; Component[1].CompName = "Close out long position"; Component[2].DataType = IndComponentType_ForceCloseShort; Component[2].CompName = "Close out short position"; } // Calculation of the logic IndicatorLogic indLogic=IndicatorLogic_It_does_not_act_as_a_filter; if(ListParam[0].Text==" rises") { indLogic=IndicatorLogic_The_indicator_rises; } else if(ListParam[0].Text==" falls") { indLogic=IndicatorLogic_The_indicator_falls; } else if(ListParam[0].Text==" is higher than the level line") { indLogic=IndicatorLogic_The_indicator_is_higher_than_the_level_line; } else if(ListParam[0].Text==" is lower than the level line") { indLogic=IndicatorLogic_The_indicator_is_lower_than_the_level_line; } else if(ListParam[0].Text==" crosses the level line upward") { indLogic=IndicatorLogic_The_indicator_crosses_the_level_line_upward; } else if(ListParam[0].Text==" crosses the level line downward") { indLogic=IndicatorLogic_The_indicator_crosses_the_level_line_downward; } else if(ListParam[0].Text==" changes its direction upward") { indLogic=IndicatorLogic_The_indicator_changes_its_direction_upward; } else if(ListParam[0].Text==" changes its direction downward") { indLogic=IndicatorLogic_The_indicator_changes_its_direction_downward; } OscillatorLogic(iFirstBar,iPrvs,adFDI,dLevel,dLevel,Component[1],Component[2],indLogic); } //+------------------------------------------------------------------+
Risk warning: Forex, spread bets and CFD are leveraged products. They may not be suitable for you as they carry a high degree of risk to your capital and you can lose more than your initial investment. You should ensure you understand all of the risks.
Copyright © 2006 - 2024, Forex Software Ltd.;
Copyright © 2006 - 2024, Forex Software Ltd.;