Topics
Replies
Vince
16 Sep 2019, 13:41
Were not there yet, but I managed to get Ctrader running.
First I installed Ctrader on a PC i have never installed Ctrader on before and it work perfectly. I could log in, all the chart templates were there. Then I revoked the active session for the desktop I am having problems with. My thinking was that this should prevent Ctrader from automatically logging in. And it did. I could get Ctrader running and it started with the log in screen. But when I then logged in, the software closed itself immediatly.
One step closer, but still not workable.
Vince
@Vince
Vince
25 Jul 2018, 12:07
Hi Panagiotis,
I understand what you are saying and that is what I am trying to do. The problem I encounter is that the Cbot somehow does not read some of the values of the indicator. Do you have any idea why this is?
For example, if I make a reference to the indicator and only put in the notification sending part, it will produce an error saying that a value does not exist in the current context, see '2)' of my previous reply.
I saw that hibba7rain has a similar question, so I will read your replies on his topic as well and will try implementing your suggestions there as well.
Kind regards,
Vince
@Vince
Vince
24 Jul 2018, 23:54
Hi Panagiotis,
I am trying to make the Indicator work as a Cbot. I have tried different things:
1) Only referencing to the Indicator in the Onstart() section. Including the Parameters. This resulted in an error, saying the Parameters do not exist in the current context.
Error CS0103: The name 'LongPeriod' does not exist in the current context
protected override void OnStart()
{
_supertrend = Indicators.GetIndicator<SupertrendCompletenoemail>(LongPeriod, LongMultiplier, ShortPeriod, ShortMultiplier);
}
So I figured the Cbot needs more info for referencing.
2) I replaced the default Parameter with all Parameters from the Indicator. This resulted in a 'Build succeeded'. I added the check in the OnTick() section that would trigger the Notification. Which resulted in an error, saying _upBufferlong does not exist. Error CS0103: The name '_upBufferlong' does not exist in the current context
protected override void OnTick()
{
var sendNotification = false;
// Make all your indicator checks here
// .
// .
// .
var value = MarketSeries.Close;
if (Functions.HasCrossedAbove(_upBufferlong, value, 1))
{
if (sendNotification && !_notificationSent)
{
Notifications.SendEmail("email", "email", "Subject", "Text");
_notificationSent = true;
}
}
}
At this point I decided that I would convert the Indicator to the Cbot 1 on 1, that is the whole Initialize() section to the OnStart(), the whole Calculate() section to the OnTick() section, etc. This was partly succesful except I got the error that 'index' does not exist. Because of the OnTick() method, I thought it maybe would not need an [index] reference since it would be calculated according the OnTick() method.
3) I tried to remove the [index] which resulted in an error saying Error CS0029: Cannot implicitly convert type 'double' to 'cAlgo.API.IndicatorDataSeries'.
At this point I would not know what else I could do to make it work and would appreciate some pointers ;) The only thing I could think of is to somehow declare each variable in an earlier stage?? Below you will find the code that I finished with before removing the [index] :
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.UTC, AccessRights = AccessRights.None)]
public class Supertrend : Robot
{
[Parameter(DefaultValue = 50)]
public int LongPeriod { get; set; }
[Parameter(DefaultValue = 10.0)]
public double LongMultiplier { get; set; }
[Parameter(DefaultValue = 20)]
public int ShortPeriod { get; set; }
[Parameter(DefaultValue = 5.0)]
public double ShortMultiplier { get; set; }
[Output("UpTrendLong", Color = Colors.Green, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries UpTrendLong { get; set; }
[Output("DownTrendLong", Color = Colors.Red, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries DownTrendLong { get; set; }
[Output("UpTrendShort", Color = Colors.Green, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries UpTrendShort { get; set; }
[Output("DownTrendShort", Color = Colors.Red, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries DownTrendShort { get; set; }
private IndicatorDataSeries _upBufferlong;
private IndicatorDataSeries _downBufferlong;
private IndicatorDataSeries _upBuffershort;
private IndicatorDataSeries _downBuffershort;
private AverageTrueRange _averageTrueRangelong;
private AverageTrueRange _averageTrueRangeshort;
private int[] _trendlong;
private int[] _trendshort;
private bool _changeofTrendlong;
private bool _changeofTrendshort;
private SupertrendCompletenoemail _supertrend;
private bool _notificationSent;
protected override void OnStart()
{
_supertrend = Indicators.GetIndicator<SupertrendCompletenoemail>(LongPeriod, LongMultiplier, ShortPeriod, ShortMultiplier);
_trendlong = new int[1];
_trendshort = new int[1];
_upBufferlong = CreateDataSeries();
_downBufferlong = CreateDataSeries();
_upBuffershort = CreateDataSeries();
_downBuffershort = CreateDataSeries();
_averageTrueRangelong = Indicators.AverageTrueRange(LongPeriod, MovingAverageType.WilderSmoothing);
_averageTrueRangeshort = Indicators.AverageTrueRange(ShortPeriod, MovingAverageType.WilderSmoothing);
}
protected override void OnTick()
{
var sendNotification = false;
// Make all your indicator checks here
// .
// .
// .
// Init
{
UpTrendLong[index] = double.NaN;
DownTrendLong[index] = double.NaN;
UpTrendShort[index] = double.NaN;
DownTrendShort[index] = double.NaN;
double median = (MarketSeries.High[index] + MarketSeries.Low[index]) / 2;
double atrlong = _averageTrueRangelong.Result[index];
double atrshort = _averageTrueRangeshort.Result[index];
_upBufferlong = median + LongMultiplier * atrlong;
_downBufferlong[index] = median - LongMultiplier * atrlong;
_upBuffershort[index] = median + ShortMultiplier * atrshort;
_downBuffershort[index] = median - ShortMultiplier * atrshort;
if (index < 1)
{
_trendlong[index] = 1;
return;
}
Array.Resize(ref _trendlong, _trendlong.Length + 1);
// Main Logic
if (MarketSeries.Close[index] > _upBufferlong[index - 1])
{
_trendlong[index] = 1;
if (_trendlong[index - 1] == -1)
_changeofTrendlong = true;
}
else if (MarketSeries.Close[index] < _downBufferlong[index - 1])
{
_trendlong[index] = -1;
if (_trendlong[index - 1] == -1)
_changeofTrendlong = true;
}
else if (_trendlong[index - 1] == 1)
{
_trendlong[index] = 1;
_changeofTrendlong = false;
}
else if (_trendlong[index - 1] == -1)
{
_trendlong[index] = -1;
_changeofTrendlong = false;
}
if (_trendlong[index] < 0 && _trendlong[index - 1] > 0)
_upBufferlong[index] = median + (LongMultiplier * atrlong);
else if (_trendlong[index] < 0 && _upBufferlong[index] > _upBufferlong[index - 1])
_upBufferlong[index] = _upBufferlong[index - 1];
if (_trendlong[index] > 0 && _trendlong[index - 1] < 0)
_downBufferlong[index] = median - (LongMultiplier * atrlong);
else if (_trendlong[index] > 0 && _downBufferlong[index] < _downBufferlong[index - 1])
_downBufferlong[index] = _downBufferlong[index - 1];
// Draw Indicator
if (_trendlong[index] == 1)
{
UpTrendLong[index] = _downBufferlong[index];
if (_changeofTrendlong)
{
UpTrendLong[index - 1] = DownTrendLong[index - 1];
_changeofTrendlong = false;
}
}
else if (_trendlong[index] == -1)
{
DownTrendLong[index] = _upBufferlong[index];
if (_changeofTrendlong)
{
DownTrendLong[index - 1] = UpTrendLong[index - 1];
_changeofTrendlong = false;
}
}
if (index < 1)
{
_trendshort[index] = 1;
return;
}
Array.Resize(ref _trendshort, _trendshort.Length + 1);
// Main Logic
if (MarketSeries.Close[index] > _upBuffershort[index - 1])
{
_trendshort[index] = 1;
if (_trendshort[index - 1] == -1)
_changeofTrendshort = true;
}
else if (MarketSeries.Close[index] < _downBuffershort[index - 1])
{
_trendshort[index] = -1;
if (_trendshort[index - 1] == -1)
_changeofTrendshort = true;
}
else if (_trendshort[index - 1] == 1)
{
_trendshort[index] = 1;
_changeofTrendshort = false;
}
else if (_trendshort[index - 1] == -1)
{
_trendshort[index] = -1;
_changeofTrendshort = false;
}
if (_trendshort[index] < 0 && _trendshort[index - 1] > 0)
_upBuffershort[index] = median + (ShortMultiplier * atrshort);
else if (_trendshort[index] < 0 && _upBuffershort[index] > _upBuffershort[index - 1])
_upBuffershort[index] = _upBuffershort[index - 1];
if (_trendshort[index] > 0 && _trendshort[index - 1] < 0)
_downBuffershort[index] = median - (ShortMultiplier * atrshort);
else if (_trendshort[index] > 0 && _downBuffershort[index] < _downBuffershort[index - 1])
_downBuffershort[index] = _downBuffershort[index - 1];
// Draw Indicator
if (_trendshort[index] == 1)
{
UpTrendShort[index] = _downBuffershort[index];
if (_changeofTrendshort)
{
UpTrendShort[index - 1] = DownTrendShort[index - 1];
_changeofTrendshort = false;
}
}
else if (_trendshort[index] == -1)
{
DownTrendShort[index] = _upBuffershort[index];
if (_changeofTrendshort)
{
DownTrendShort[index - 1] = UpTrendShort[index - 1];
_changeofTrendshort = false;
}
}
}
if (sendNotification && !_notificationSent)
{
Notifications.SendEmail("email", "email", "Subject", "Text");
_notificationSent = true;
}
}
protected override void OnBar()
{
_notificationSent = false;
}
protected override void OnStop()
{
// Put your deinitialization logic here
}
}
}
Kind regards,
Vince
@Vince
Vince
20 Jul 2018, 16:28
Hi Panagiotis,
Thank you for your swift reply. Below you will find the full code.
Basicly this is a modified version of the Supertrend indicator from spka111 to display the Supertrend, but with different settings. I added a DrawText option to display the High or Low of the closed candle that has crossed the Supertrend, which displays just fine.
I also tried to add a Sendemail option which would notify me of the above described event. This works, but instead of getting just 1 email, it will continue to send emails for every tick during the following period. That is the last problem I am trying to solve: to only send 1 email of the High or Low of the closed candle that has crossed the Supertrend.
Kind Regards,
Vince
using System;
using cAlgo.API;
using cAlgo.API.Indicators;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
public class SupertrendCompleteTestEmail : Indicator
{
[Parameter(DefaultValue = 50)]
public int LongPeriod { get; set; }
[Parameter(DefaultValue = 10.0)]
public double LongMultiplier { get; set; }
[Parameter(DefaultValue = 20)]
public int ShortPeriod { get; set; }
[Parameter(DefaultValue = 5.0)]
public double ShortMultiplier { get; set; }
[Output("UpTrendLong", Color = Colors.Green, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries UpTrendLong { get; set; }
[Output("DownTrendLong", Color = Colors.Red, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries DownTrendLong { get; set; }
[Output("UpTrendShort", Color = Colors.Green, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries UpTrendShort { get; set; }
[Output("DownTrendShort", Color = Colors.Red, PlotType = PlotType.Points, Thickness = 3)]
public IndicatorDataSeries DownTrendShort { get; set; }
private IndicatorDataSeries _upBufferlong;
private IndicatorDataSeries _downBufferlong;
private IndicatorDataSeries _upBuffershort;
private IndicatorDataSeries _downBuffershort;
private AverageTrueRange _averageTrueRangelong;
private AverageTrueRange _averageTrueRangeshort;
private int[] _trendlong;
private int[] _trendshort;
private bool _changeofTrendlong;
private bool _changeofTrendshort;
protected override void Initialize()
{
_trendlong = new int[1];
_trendshort = new int[1];
_upBufferlong = CreateDataSeries();
_downBufferlong = CreateDataSeries();
_upBuffershort = CreateDataSeries();
_downBuffershort = CreateDataSeries();
_averageTrueRangelong = Indicators.AverageTrueRange(LongPeriod, MovingAverageType.WilderSmoothing);
_averageTrueRangeshort = Indicators.AverageTrueRange(ShortPeriod, MovingAverageType.WilderSmoothing);
}
public override void Calculate(int index)
{
// Init
UpTrendLong[index] = double.NaN;
DownTrendLong[index] = double.NaN;
UpTrendShort[index] = double.NaN;
DownTrendShort[index] = double.NaN;
double median = (MarketSeries.High[index] + MarketSeries.Low[index]) / 2;
double atrlong = _averageTrueRangelong.Result[index];
double atrshort = _averageTrueRangeshort.Result[index];
_upBufferlong[index] = median + LongMultiplier * atrlong;
_downBufferlong[index] = median - LongMultiplier * atrlong;
_upBuffershort[index] = median + ShortMultiplier * atrshort;
_downBuffershort[index] = median - ShortMultiplier * atrshort;
if (index < 1)
{
_trendlong[index] = 1;
return;
}
Array.Resize(ref _trendlong, _trendlong.Length + 1);
// Main Logic
if (MarketSeries.Close[index] > _upBufferlong[index - 1])
{
_trendlong[index] = 1;
if (_trendlong[index - 1] == -1)
_changeofTrendlong = true;
}
else if (MarketSeries.Close[index] < _downBufferlong[index - 1])
{
_trendlong[index] = -1;
if (_trendlong[index - 1] == -1)
_changeofTrendlong = true;
}
else if (_trendlong[index - 1] == 1)
{
_trendlong[index] = 1;
_changeofTrendlong = false;
}
else if (_trendlong[index - 1] == -1)
{
_trendlong[index] = -1;
_changeofTrendlong = false;
}
if (_trendlong[index] < 0 && _trendlong[index - 1] > 0)
_upBufferlong[index] = median + (LongMultiplier * atrlong);
else if (_trendlong[index] < 0 && _upBufferlong[index] > _upBufferlong[index - 1])
_upBufferlong[index] = _upBufferlong[index - 1];
if (_trendlong[index] > 0 && _trendlong[index - 1] < 0)
_downBufferlong[index] = median - (LongMultiplier * atrlong);
else if (_trendlong[index] > 0 && _downBufferlong[index] < _downBufferlong[index - 1])
_downBufferlong[index] = _downBufferlong[index - 1];
// Draw Indicator
if (_trendlong[index] == 1)
{
UpTrendLong[index] = _downBufferlong[index];
if (_changeofTrendlong)
{
UpTrendLong[index - 1] = DownTrendLong[index - 1];
_changeofTrendlong = false;
}
}
else if (_trendlong[index] == -1)
{
DownTrendLong[index] = _upBufferlong[index];
if (_changeofTrendlong)
{
DownTrendLong[index - 1] = UpTrendLong[index - 1];
_changeofTrendlong = false;
}
}
if (index < 1)
{
_trendshort[index] = 1;
return;
}
Array.Resize(ref _trendshort, _trendshort.Length + 1);
// Main Logic
if (MarketSeries.Close[index] > _upBuffershort[index - 1])
{
_trendshort[index] = 1;
if (_trendshort[index - 1] == -1)
_changeofTrendshort = true;
}
else if (MarketSeries.Close[index] < _downBuffershort[index - 1])
{
_trendshort[index] = -1;
if (_trendshort[index - 1] == -1)
_changeofTrendshort = true;
}
else if (_trendshort[index - 1] == 1)
{
_trendshort[index] = 1;
_changeofTrendshort = false;
}
else if (_trendshort[index - 1] == -1)
{
_trendshort[index] = -1;
_changeofTrendshort = false;
}
if (_trendshort[index] < 0 && _trendshort[index - 1] > 0)
_upBuffershort[index] = median + (ShortMultiplier * atrshort);
else if (_trendshort[index] < 0 && _upBuffershort[index] > _upBuffershort[index - 1])
_upBuffershort[index] = _upBuffershort[index - 1];
if (_trendshort[index] > 0 && _trendshort[index - 1] < 0)
_downBuffershort[index] = median - (ShortMultiplier * atrshort);
else if (_trendshort[index] > 0 && _downBuffershort[index] < _downBuffershort[index - 1])
_downBuffershort[index] = _downBuffershort[index - 1];
// Draw Indicator
if (_trendshort[index] == 1)
{
UpTrendShort[index] = _downBuffershort[index];
if (_changeofTrendshort)
{
UpTrendShort[index - 1] = DownTrendShort[index - 1];
_changeofTrendshort = false;
}
}
else if (_trendshort[index] == -1)
{
DownTrendShort[index] = _upBuffershort[index];
if (_changeofTrendshort)
{
DownTrendShort[index - 1] = UpTrendShort[index - 1];
_changeofTrendshort = false;
}
}
// Test Notifications on chart
{
var value = MarketSeries.Close[index - 1];
if (Functions.HasCrossedAbove(_upBufferlong, value, 1))
{
var name = "BuyLong";
var high = MarketSeries.High[index - 1];
var text = high.ToString();
var xPos = index - 1;
var yPos = high;
var vAlign = VerticalAlignment.Top;
var hAlign = HorizontalAlignment.Center;
ChartObjects.DrawText(name, text, xPos, yPos, vAlign, hAlign, Colors.Lime);
{
var highemail = MarketSeries.High[index - 1];
var subject = highemail.ToString();
Notifications.SendEmail("email", "email", "Buy Long " + Symbol.Code + " " + subject, Symbol.Code + " " + subject);
}
}
}
{
var value = MarketSeries.Close[index - 1];
if (Functions.HasCrossedBelow(_downBufferlong, value, 1))
{
var name = "SellLong";
var low = MarketSeries.Low[index - 1];
var text = low.ToString();
var xPos = index - 1;
var yPos = low;
var vAlign = VerticalAlignment.Bottom;
var hAlign = HorizontalAlignment.Center;
ChartObjects.DrawText(name, text, xPos, yPos, vAlign, hAlign, Colors.PeachPuff);
{
var lowemail = MarketSeries.Low[index - 1];
var subject = lowemail.ToString();
Notifications.SendEmail("email", "email", "Buy Long " + Symbol.Code + " " + subject, Symbol.Code + " " + subject);
}
}
}
// Test Notifications on chart
{
var value = MarketSeries.Close[index - 1];
if (Functions.HasCrossedAbove(_upBuffershort, value, 1))
{
var name = "BuyShort";
var high = MarketSeries.High[index - 1];
var text = high.ToString();
var xPos = index - 1;
var yPos = high;
var vAlign = VerticalAlignment.Top;
var hAlign = HorizontalAlignment.Center;
ChartObjects.DrawText(name, text, xPos, yPos, vAlign, hAlign, Colors.Green);
{
var highemail = MarketSeries.High[index - 1];
var subject = highemail.ToString();
Notifications.SendEmail("email", "email", "Buy Long " + Symbol.Code + " " + subject, Symbol.Code + " " + subject);
}
}
}
{
var value = MarketSeries.Close[index - 1];
if (Functions.HasCrossedBelow(_downBuffershort, value, 1))
{
var name = "SellShort";
var low = MarketSeries.Low[index - 1];
var text = low.ToString();
var xPos = index - 1;
var yPos = low;
var vAlign = VerticalAlignment.Bottom;
var hAlign = HorizontalAlignment.Center;
ChartObjects.DrawText(name, text, xPos, yPos, vAlign, hAlign, Colors.Red);
{
var lowemail = MarketSeries.Low[index - 1];
var subject = lowemail.ToString();
Notifications.SendEmail("email", "email", "Buy Long " + Symbol.Code + " " + subject, Symbol.Code + " " + subject);
}
}
}
}
}
}
@Vince
Vince
05 Jun 2018, 16:20
With me it does apply the template over the current timeframe. I suggest you save the chart(s) as a workspace with template you made for a specific timeframe. You can then open the workspace with all charts, timeframes and templates being opened at the time you saved the workspace.
@Vince
Vince
16 Sep 2019, 15:40
Hi Panagiotis,
Thank you for the offer. I have just reset the OS and from what I can see, now everything runs smooth. So there is no need for further investigation.
Thank you for the help!
Best regards,
Vince
@Vince