Hello,
Here is a chart which have 2 data, for example 5 min and 1 hour.
I want to create a simple ADX indicator based on second data_stream, and want to apply this indicator to my signal.
But, this indicator only show a value based on data 1.
What is wrong or lack with this code ?
Of course, I know "Indicator properties --> Base study on --> select data stream " to show the indicator based on another data stream.
Best regards,
using System;
using System.Drawing;
namespace PowerLanguage.Indicator
{
public class ADX_data_num : IndicatorObject
{
private Function.ADX m_adx1;
private VariableSeries<Double> m_adxvalue;
private IPlotObject Plot1;
public ADX_data_num(object ctx) :
base(ctx){
length = 14;
data_num = 2;
}
[Input]
public int length { get; set; }
[Input]
public int data_num { get; set; }
protected override void Create(){
m_adx1 = new Function.ADX(this, data_num);
m_adxvalue = new VariableSeries<Double>(this);
Plot1 =
AddPlot(new PlotAttributes("ADX", 0, Color.Cyan,
Color.Empty, 0, 0, true));
}
protected override void StartCalc(){
m_adx1.Length = length;
m_adxvalue.DefaultValue = 0;
}
protected override void CalcBar(){
m_adxvalue.Value = m_adx1[0];
Plot1.Set(0, m_adxvalue.Value);
if (PublicFunctions.DoubleGreater(m_adxvalue.Value, m_adxvalue[1])
&&PublicFunctions.DoubleLessEquals(m_adxvalue[1], m_adxvalue[2])){
Alerts.Alert("Indicator turning up");
}
else{
if (PublicFunctions.DoubleLess(m_adxvalue.Value, m_adxvalue[1])
&&PublicFunctions.DoubleGreaterEquals(m_adxvalue[1], m_adxvalue[2])){
Alerts.Alert("Indicator turning down");
}
}
}
}
}
ADX based on data X within code.
- Henry MultiСharts
- Posts: 9165
- Joined: 25 Aug 2011
- Has thanked: 1264 times
- Been thanked: 2958 times
Re: ADX based on data X within code.
Yes, I made this indicator following your FAQ.
Added only a few lines to buit-in ADX indicator.
But nothing have changed whatever value set to data_num.
Added only a few lines to buit-in ADX indicator.
But nothing have changed whatever value set to data_num.
To make the function calculated on data2. Example for ADX and ATR functions:
CODE: SELECT ALL
ADX _a = new ADX(this,2);
//
double _aa = PublicFunctions.TrueRange(this, 10, 2);
- Attachments
-
- 20180918USDJPY_ADX2.jpg
- (258.97 KiB) Downloaded 762 times
Re: ADX based on data X within code.
I made another indicator "DMI_Data2".
This works almost good for my needs.
But it looks like calculated by calcbar() every data1 1 hour bar, and this make jagged shape curve.
Is this a defined behavior ?
Is there a easy way to calculate every data2 bar ?
And "m_adx1 = new Function.ADX(this, data_num);" doesn't work. I can't tell why....
This works almost good for my needs.
But it looks like calculated by calcbar() every data1 1 hour bar, and this make jagged shape curve.
Is this a defined behavior ?
Is there a easy way to calculate every data2 bar ?
And "m_adx1 = new Function.ADX(this, data_num);" doesn't work. I can't tell why....
Code: Select all
using System.Drawing;
using PowerLanguage.Function;
namespace PowerLanguage.Indicator
{
public class DMI_Data2 : IndicatorObject
{
//2018.9.19
private DirMovement m_dirmovement1;
private IPlotObject Plot1;
private IPlotObject Plot2;
private IPlotObject Plot3;
public DMI_Data2(object ctx) :
base(ctx)
{
adxtrend = 25;
length = 14;
Datastream_DMI = 2;
}
[Input]
public int length { get; set; }
[Input]
public double adxtrend { get; set; }
[Input]
public int Datastream_DMI { get; set; }
protected override void Create()
{
m_dirmovement1 = new DirMovement(this, Datastream_DMI);
Plot1 =
AddPlot(new PlotAttributes("DMI+", 0, Color.Yellow,
Color.Empty, 0, 0, true));
Plot2 =
AddPlot(new PlotAttributes("DMI-", 0, Color.Blue,
Color.Empty,
0, 0, true));
Plot3 =
AddPlot(new PlotAttributes("ADX", 0, Color.Cyan,
Color.Empty, 0, 0, true));
}
protected override void StartCalc()
{
m_dirmovement1.PriceH = BarsOfData(Datastream_DMI).High;
m_dirmovement1.PriceL = BarsOfData(Datastream_DMI).Low;
m_dirmovement1.PriceC = BarsOfData(Datastream_DMI).Close;
m_dirmovement1.Length = length;
}
protected override void CalcBar()
{
m_dirmovement1.Call();
Plot1.Set(0, m_dirmovement1.DMIPlus.Value);
Plot2.Set(0, m_dirmovement1.DMIMinus.Value);
Plot3.Set(0, m_dirmovement1.ADX.Value);
if (PublicFunctions.DoubleGreater(m_dirmovement1.ADX.Value, adxtrend))
{
if (this.CrossesOver(m_dirmovement1.DMIPlus, m_dirmovement1.DMIMinus))
{
Alerts.Alert("Bullish alert");
}
else
{
if (this.CrossesUnder(m_dirmovement1.DMIPlus, m_dirmovement1.DMIMinus))
{
Alerts.Alert("Bearish alert");
}
}
}
}
}
}
- Attachments
-
- 20180919USDJPY_DMI.JPG
- (142.1 KiB) Downloaded 753 times
- Henry MultiСharts
- Posts: 9165
- Joined: 25 Aug 2011
- Has thanked: 1264 times
- Been thanked: 2958 times
Re: ADX based on data X within code.
eunos64,
A study applied to the base series is always calculated based on the bars of this series. If in the script there are functions that are calculated in the context of the other series - they are called upon each calculation of the script, but their values are fixated on the other specified series bar close. You can limit these calculations by adding BarsOfData(2).Status check to your code, but that will not affect the indicator plot you have.
A study applied to the base series is always calculated based on the bars of this series. If in the script there are functions that are calculated in the context of the other series - they are called upon each calculation of the script, but their values are fixated on the other specified series bar close. You can limit these calculations by adding BarsOfData(2).Status check to your code, but that will not affect the indicator plot you have.
Re: ADX based on data X within code.
Thank you Henry !
if (BarsOfData(Datastream_DMI).Status == EBarState.Close)
{
my command
}
This works well.
It's getting better !!
if (BarsOfData(Datastream_DMI).Status == EBarState.Close)
{
my command
}
This works well.
It's getting better !!
- Attachments
-
- DMI_data2 on Data2.JPG
- (65.16 KiB) Downloaded 736 times
Re: ADX based on data X within code.
But I noticed another problem.
When I set [input]Datastream_DMI=1, this indicator shows totally different value from DMI indicator base study on data1.
I expect same result each indicator, because BarsOfData(1).Close means Bars.Close.
When I set [input]Datastream_DMI=1, this indicator shows totally different value from DMI indicator base study on data1.
I expect same result each indicator, because BarsOfData(1).Close means Bars.Close.
- Attachments
-
- DMI_data2 on Data1.png
- (369.37 KiB) Downloaded 736 times
Re: ADX based on data X within code.
Here is a file.
- Attachments
-
- DMI_Data2.pln
- (1.45 KiB) Downloaded 410 times
- Henry MultiСharts
- Posts: 9165
- Joined: 25 Aug 2011
- Has thanked: 1264 times
- Been thanked: 2958 times
Re: ADX based on data X within code.
eunos64,
Changing the base series number via the study Inputs is not supported. After changing the input the study is not recreated, i.e. the Create() method is not called and the functions are not applied to the new context. The study should be programmed to work with the required data series from the beginning.
Changing the base series number via the study Inputs is not supported. After changing the input the study is not recreated, i.e. the Create() method is not called and the functions are not applied to the new context. The study should be programmed to work with the required data series from the beginning.