Chart.DrawTrendLine working initially then not after next bar forms
Chart.DrawTrendLine working initially then not after next bar forms
27 Aug 2020, 11:15
I have created a script which draws a trend line or line of best fit within a cbot. The cbot works fine initially drawing the first line, but as soon as a another bar opens to redraw a new line, the lines goes almost vertical and continues like this every new bar. I believe it has something to do with the way how I calculate it but I struggling to figure this one out.
Looking for some suggestions/support??
CBOT:
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.WAustraliaStandardTime, AccessRights = AccessRights.None)]
public class TestBot : Robot
{
[Parameter(DefaultValue = 8)]
public int Periods { get; set; }
public double sumx = 0, sumx2 = 0, sumy = 0, sumxy = 0;
public double m, b;
public ChartObject chart1;
protected override void OnStart()
{
// Put your initialization logic here
}
protected override void OnBar()
{
DateTime start = Server.Time.AddHours(-(Periods));
Print("start = ", start);
DateTime end = Server.Time.AddHours(-(1));
Print("end = ", end);
for (int i = 1; i <= Periods; i++)
{
sumx += 1.0 * i;
sumx2 += 1.0 * i * i;
sumy += Bars.ClosePrices.Last(i);
sumxy += Bars.ClosePrices.Last(i) * i;
}
m = (Periods * sumxy - sumx * sumy) / (Periods * sumx2 - sumx * sumx);
Print("m = ", m);
b = (sumy - m * sumx) / Periods;
Print("b = ", b);
double pr1 = m * (1) + b;
Print("pr1 = ", pr1);
double pr2 = m * (Periods) + b;
Print("pr2 = ", pr2);
chart1 = Chart.DrawTrendLine("Trend-Line", start, pr1, end, pr2, "Yellow");
}
}
}
INITIAL:
AS SOON AS A NEW BAR OPENS:
Replies
mlcilia
27 Aug 2020, 11:29
RE:
PanagiotisCharalampous said:
Hi mlcillia,
Why do you declare these variables as global?
public double sumx = 0, sumx2 = 0, sumy = 0, sumxy = 0; public double m, b;
Best Regards,
Panagiotis
I declared them there from another script I wrote. I didn't take notice of it when copy this part of my old script over haha. Thanks for your feedback.
Do you have any suggestions around this particular section below:
DateTime start = Server.Time.AddHours(-(Periods));
Print("start = ", start);
DateTime end = Server.Time.AddHours(-(1));
Print("end = ", end);
If you run the CBOT you will notice the line drawn resets as the market closes and reopens at the end of a week and at the start of the following week.
@mlcilia
mlcilia
27 Aug 2020, 12:16
RE: RE:
mlcilia said:
PanagiotisCharalampous said:
Hi mlcillia,
Why do you declare these variables as global?
public double sumx = 0, sumx2 = 0, sumy = 0, sumxy = 0; public double m, b;
Best Regards,
Panagiotis
I declared them there from another script I wrote. I didn't take notice of it when copy this part of my old script over haha. Thanks for your feedback.
Do you have any suggestions around this particular section below:
DateTime start = Server.Time.AddHours(-(Periods));
Print("start = ", start);DateTime end = Server.Time.AddHours(-(1));
Print("end = ", end);If you run the CBOT you will notice the line drawn resets as the market closes and reopens at the end of a week and at the start of the following week.
Figured this out too.
Did this:
DateTime start, end;
if (Server.Time.DayOfWeek == DayOfWeek.Monday)
{
start = Server.Time.AddHours(-(Periods)-48);
Print("start = ", start);
end = Server.Time.AddHours(-(1)-48);
Print("end = ", end);
}
else
{
start = Server.Time.AddHours(-(Periods));
Print("start = ", start);
end = Server.Time.AddHours(-(1));
Print("end = ", end);
}
@mlcilia
PanagiotisCharalampous
27 Aug 2020, 11:23
Hi mlcillia,
Why do you declare these variables as class variables and not declare them inside the method?
Best Regards,
Panagiotis
Join us on Telegram
@PanagiotisCharalampous