No Data NaN for M1 when using GetSeries(TimeFrame.Daily)
No Data NaN for M1 when using GetSeries(TimeFrame.Daily)
11 Sep 2019, 22:50
Hi, I am using MarketData.GetSeries(TimeFrame.Daily) in my indicator to work on different time frame but also show levels from D1. It works on every time frame (D1,H1,m5, m2 etc ) but not on m1. What should I do to make it work (show/print daily levels) on 1 minute time frame?
PS How to get the Swap value of current position but in pips/points not currency? What method?
Replies
radoslawkupisek
12 Sep 2019, 10:20
There is PRC indicator which works fine, all I have changed is timeframe. I paste oryginal code below and I underline the part that has been changed by me. When I launch it on any time frame it works (shows correct D1 price levels) but not on m1.
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
public class PRCD1 : Indicator
{
[Parameter(DefaultValue = 2.0, MinValue = 1, MaxValue = 4)]
public int degree { get; set; }
[Parameter(DefaultValue = 120)]
public int period { get; set; }
[Parameter(DefaultValue = 1.62)]
public double strdDev { get; set; }
[Parameter(DefaultValue = 2)]
public double strdDev2 { get; set; }
[Output("PRC", Color = Colors.Gray)]
public IndicatorDataSeries prc { get; set; }
[Output("SQH", Color = Colors.Red)]
public IndicatorDataSeries sqh { get; set; }
[Output("SQL", Color = Colors.Blue)]
public IndicatorDataSeries sql { get; set; }
[Output("SQL2", Color = Colors.Blue)]
public IndicatorDataSeries sql2 { get; set; }
[Output("SQH2", Color = Colors.Red)]
public IndicatorDataSeries sqh2 { get; set; }
private double[,] ai = new double[10, 10];
private double[] b = new double[10];
private double[] x = new double[10];
private double[] sx = new double[10];
private double sum;
private int ip;
private int p;
private int n;
private int f;
private double qq;
private double mm;
private double tt;
private int ii;
private int jj;
private int kk;
private int ll;
private int nn;
private double sq;
private double sq2;
private int i0 = 0;
private int mi;
public MarketSeries TF;
public IndicatorDataSeries TFF;
protected override void Initialize()
{
TF = MarketData.GetSeries(TimeFrame.Daily);
}
public override void Calculate(int index)
{
var index24h = GetIndexByDate(TF, MarketSeries.OpenTime[index]);
if (index24h != -1)
{
ip = period;
p = ip;
sx[1] = p + 1;
nn = degree + 1;
//----------------------sx-------------------------------------------------------------------
//
for (mi = 1; mi <= nn * 2 - 2; mi++)
{
sum = 0;
for (n = i0; n <= i0 + p; n++)
{
sum += Math.Pow(n, mi);
}
sx[mi + 1] = sum;
}
//----------------------syx-----------
for (mi = 1; mi <= nn; mi++)
{
sum = 0.0;
for (n = i0; n <= i0 + p; n++)
{
if (mi == 1)
sum += TF.Close[index24h - n]; // before sum += MarketSeries.Close[index - n];
else
sum += TF.Close[index24h - n] * Math.Pow(n, mi - 1); // before sum += MarketSeries.Close[index - n] * Math.Pow(n, mi - 1);
}
b[mi] = sum;
}
//===============Matrix=======================================================================================================
for (jj = 1; jj <= nn; jj++)
{
for (ii = 1; ii <= nn; ii++)
{
kk = ii + jj - 1;
ai[ii, jj] = sx[kk];
}
}
//===============Gauss========================================================================================================
for (kk = 1; kk <= nn - 1; kk++)
{
ll = 0;
mm = 0;
for (ii = kk; ii <= nn; ii++)
{
if (Math.Abs(ai[ii, kk]) > mm)
{
mm = Math.Abs(ai[ii, kk]);
ll = ii;
}
}
if (ll == 0)
return;
if (ll != kk)
{
for (jj = 1; jj <= nn; jj++)
{
tt = ai[kk, jj];
ai[kk, jj] = ai[ll, jj];
ai[ll, jj] = tt;
}
tt = b[kk];
b[kk] = b[ll];
b[ll] = tt;
}
for (ii = kk + 1; ii <= nn; ii++)
{
qq = ai[ii, kk] / ai[kk, kk];
for (jj = 1; jj <= nn; jj++)
{
if (jj == kk)
ai[ii, jj] = 0;
else
ai[ii, jj] = ai[ii, jj] - qq * ai[kk, jj];
}
b[ii] = b[ii] - qq * b[kk];
}
}
x[nn] = b[nn] / ai[nn, nn];
for (ii = nn - 1; ii >= 1; ii--)
{
tt = 0;
for (jj = 1; jj <= nn - ii; jj++)
{
tt = tt + ai[ii, ii + jj] * x[ii + jj];
x[ii] = (1 / ai[ii, ii]) * (b[ii] - tt);
}
}
sq = 0.0;
sq2 = 0.0;
for (n = i0; n <= i0 + p; n++)
{
sum = 0;
for (kk = 1; kk <= degree; kk++)
{
sum += x[kk + 1] * Math.Pow(n, kk);
}
prc[index - n] = (x[1] + sum);
sq += Math.Pow(TF.Close[index24h - n] - prc[index - n], 2); //before sq += Math.Pow(MarketSeries.Close[index - n] - prc[index - n], 2);
sq2 += Math.Pow(TF.Close[index24h - n] - prc[index - n], 2); //before sq2 += Math.Pow(MarketSeries.Close[index - n] - prc[index - n], 2);
}
sq = Math.Sqrt(sq / (p + 1)) * strdDev;
sq2 = Math.Sqrt(sq2 / (p + 1)) * strdDev2;
for (n = i0; n <= i0 + p; n++)
{
sqh[index - n] = (prc[index - n] + sq);
sql[index - n] = (prc[index - n] - sq);
sqh2[index - n] = (prc[index - n] + sq2);
sql2[index - n] = (prc[index - n] - sq2);
}
}
}
//just to check the price point
double sqld1 = Convert.ToDouble(sql.LastValue);
double sql2d1 = Convert.ToDouble(sql2.LastValue);
double sqhd1 = Convert.ToDouble(sqh.LastValue);
double sqh2d1 = Convert.ToDouble(sqh2.LastValue);
double prclined1 = Convert.ToDouble(prc.LastValue);
Print("d1 sql ", sqld1);
Print("d1 sql2 ", sql2d1);
Print("d1 sqh ", sqhd1);
Print("d1 sqh2 ", sqh2d1);
private int GetIndexByDate(MarketSeries series, DateTime time)
{
for (int i = series.Close.Count - 1; i > 0; i--)
{
if (time == series.OpenTime[i])
return i;
}
return -1;
}
}
}
@radoslawkupisek
PanagiotisCharalampous
12 Sep 2019, 11:04
Hi radoslawkupisek,
Unfortunately the code you posted here does not build
Best Regards,
Panagiotis
@PanagiotisCharalampous
radoslawkupisek
12 Sep 2019, 18:48
cause of Print method. The right code below
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
public class PRCD1 : Indicator
{
[Parameter(DefaultValue = 2.0, MinValue = 1, MaxValue = 4)]
public int degree { get; set; }
[Parameter(DefaultValue = 120)]
public int period { get; set; }
[Parameter(DefaultValue = 1.62)]
public double strdDev { get; set; }
[Parameter(DefaultValue = 2)]
public double strdDev2 { get; set; }
[Output("PRC", Color = Colors.Gray)]
public IndicatorDataSeries prc { get; set; }
[Output("SQH", Color = Colors.Red)]
public IndicatorDataSeries sqh { get; set; }
[Output("SQL", Color = Colors.Blue)]
public IndicatorDataSeries sql { get; set; }
[Output("SQL2", Color = Colors.Blue)]
public IndicatorDataSeries sql2 { get; set; }
[Output("SQH2", Color = Colors.Red)]
public IndicatorDataSeries sqh2 { get; set; }
private double[,] ai = new double[10, 10];
private double[] b = new double[10];
private double[] x = new double[10];
private double[] sx = new double[10];
private double sum;
private int ip;
private int p;
private int n;
private int f;
private double qq;
private double mm;
private double tt;
private int ii;
private int jj;
private int kk;
private int ll;
private int nn;
private double sq;
private double sq2;
private int i0 = 0;
private int mi;
public MarketSeries TF;
public IndicatorDataSeries TFF;
protected override void Initialize()
{
TF = MarketData.GetSeries(TimeFrame.Daily);
}
public override void Calculate(int index)
{
var index24h = GetIndexByDate(TF, MarketSeries.OpenTime[index]);
if (index24h != -1)
{
ip = period;
p = ip;
sx[1] = p + 1;
nn = degree + 1;
//----------------------sx-------------------------------------------------------------------
//
for (mi = 1; mi <= nn * 2 - 2; mi++)
{
sum = 0;
for (n = i0; n <= i0 + p; n++)
{
sum += Math.Pow(n, mi);
}
sx[mi + 1] = sum;
}
//----------------------syx-----------
for (mi = 1; mi <= nn; mi++)
{
sum = 0.0;
for (n = i0; n <= i0 + p; n++)
{
if (mi == 1)
sum += TF.Close[index24h - n];
else
// before sum += MarketSeries.Close[index - n];
sum += TF.Close[index24h - n] * Math.Pow(n, mi - 1);
// before sum += MarketSeries.Close[index - n] * Math.Pow(n, mi - 1);
}
b[mi] = sum;
}
//===============Matrix=======================================================================================================
for (jj = 1; jj <= nn; jj++)
{
for (ii = 1; ii <= nn; ii++)
{
kk = ii + jj - 1;
ai[ii, jj] = sx[kk];
}
}
//===============Gauss========================================================================================================
for (kk = 1; kk <= nn - 1; kk++)
{
ll = 0;
mm = 0;
for (ii = kk; ii <= nn; ii++)
{
if (Math.Abs(ai[ii, kk]) > mm)
{
mm = Math.Abs(ai[ii, kk]);
ll = ii;
}
}
if (ll == 0)
return;
if (ll != kk)
{
for (jj = 1; jj <= nn; jj++)
{
tt = ai[kk, jj];
ai[kk, jj] = ai[ll, jj];
ai[ll, jj] = tt;
}
tt = b[kk];
b[kk] = b[ll];
b[ll] = tt;
}
for (ii = kk + 1; ii <= nn; ii++)
{
qq = ai[ii, kk] / ai[kk, kk];
for (jj = 1; jj <= nn; jj++)
{
if (jj == kk)
ai[ii, jj] = 0;
else
ai[ii, jj] = ai[ii, jj] - qq * ai[kk, jj];
}
b[ii] = b[ii] - qq * b[kk];
}
}
x[nn] = b[nn] / ai[nn, nn];
for (ii = nn - 1; ii >= 1; ii--)
{
tt = 0;
for (jj = 1; jj <= nn - ii; jj++)
{
tt = tt + ai[ii, ii + jj] * x[ii + jj];
x[ii] = (1 / ai[ii, ii]) * (b[ii] - tt);
}
}
sq = 0.0;
sq2 = 0.0;
for (n = i0; n <= i0 + p; n++)
{
sum = 0;
for (kk = 1; kk <= degree; kk++)
{
sum += x[kk + 1] * Math.Pow(n, kk);
}
prc[index - n] = (x[1] + sum);
sq += Math.Pow(TF.Close[index24h - n] - prc[index - n], 2);
//before sq += Math.Pow(MarketSeries.Close[index - n] - prc[index - n], 2);
sq2 += Math.Pow(TF.Close[index24h - n] - prc[index - n], 2);
//before sq2 += Math.Pow(MarketSeries.Close[index - n] - prc[index - n], 2);
}
sq = Math.Sqrt(sq / (p + 1)) * strdDev;
sq2 = Math.Sqrt(sq2 / (p + 1)) * strdDev2;
for (n = i0; n <= i0 + p; n++)
{
sqh[index - n] = (prc[index - n] + sq);
sql[index - n] = (prc[index - n] - sq);
sqh2[index - n] = (prc[index - n] + sq2);
sql2[index - n] = (prc[index - n] - sq2);
}
}
//just to check the price point
Print("d1 sql ", sql);
Print("d1 sql2 ", sql2);
Print("d1 sqh ", sqh);
Print("d1 sqh2 ", sqh2);
}
private int GetIndexByDate(MarketSeries series, DateTime time)
{
for (int i = series.Close.Count - 1; i > 0; i--)
{
if (time == series.OpenTime[i])
return i;
}
return -1;
}
}
}
@radoslawkupisek
PanagiotisCharalampous
13 Sep 2019, 09:01
Hi radoslawkupisek,
The problem is with your GetIndexByDate() method. To fix it just replace line 74 with the one below
var index24h = TF.OpenTime.GetIndexByTime(MarketSeries.OpenTime[index]);
Best regards,
Panagiotis
@PanagiotisCharalampous
PanagiotisCharalampous
12 Sep 2019, 08:54
Hi radoslawkupisek,
Thanks for posting in our forum. Please share the indicator code and exact steps to reproduce the problem. Regarding swaps, currently they are not available from the API.
Best Regards,
Panagiotis
@PanagiotisCharalampous