Crashed in Calculate with SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
Crashed in Calculate with SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
27 Mar 2019, 10:48
Hi everyone:
I am receiving the error message:
"Crashed in Calculate with SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."
on this bot when I backtest against EURUSD on H1 timeframe from Jan 24th - March 23 as shown below. It appears to happen when I call the "IsRising()" or "IsFalling()" functions, but I don't know why?
Since we can't easily debug Indicators, is anyone able to help/suggest what's causing the issue and how to resolve it?
Code and screen capture below:
Bot code:
using System; using System.Collections; 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 MySuperProfitcBot : Robot { //Specific to this robot [Parameter("Position Label", DefaultValue = "My Label")] public string MyLabel { get; set; } [Parameter("Stop Loss (Pips)", DefaultValue = 20.0)] public double StopLossInPips { get; set; } //For the SuperProfit Indicator [Parameter("Super Profit DllPeriod", DefaultValue = 35)] public int SuperProfitDllPeriod { get; set; } [Parameter("Super Profit Period", DefaultValue = 1.7)] public double SuperProfitPeriod { get; set; } [Parameter("Super Profit Moving Average Type", DefaultValue = MovingAverageType.Weighted)] public MovingAverageType SuperProfitMaType { get; set; } private SuperProfit _superProfit = new SuperProfit(); protected override void OnStart() { // Put your initialization logic here MarketSeries data = MarketData.GetSeries(TimeFrame.Hour); DataSeries series = data.Close; //indicators _superProfit = Indicators.GetIndicator<SuperProfit>(SuperProfitDllPeriod, SuperProfitPeriod, SuperProfitMaType, series, (int)StopLossInPips, 20); Print("Starting SuperProfit Bot"); } protected override void OnTick() { Print((_superProfit.UpSeries.IsFalling()).GetType()); //if (_superProfit.UpSeries.IsRising()) // Print("hello"); //if (_superProfit.UpSeries.IsFalling()) // Print("hello2"); //if (_superProfit.DownSeries.IsRising()) // Print("hello3"); //if (_superProfit.DownSeries.IsFalling()) // Print("hello4"); if (SumOfShortEntryConditions() >= 5) { Print("Short Didn't crash!"); } else { Print("Short Still hasn't crashed!"); } if (SumOfLongEntryConditions() >= 5) { Print("Long Didn't crash!"); } else { Print("Long Still hasn't crashed!"); } } private int SumOfLongEntryConditions() { int _sumOfLongEntryConditions = 0; if (_superProfit.UpSeries.IsRising()) { _sumOfLongEntryConditions += 1; } return _sumOfLongEntryConditions; } private int SumOfShortEntryConditions() { int _sumOfShortEntryConditions = 0; if (_superProfit.DownSeries.IsFalling()) { _sumOfShortEntryConditions += 1; } return _sumOfShortEntryConditions; } } }
Indicator code:
using System; using cAlgo.API; using System.Runtime.InteropServices; using cAlgo.API.Indicators; namespace cAlgo.Indicators { [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class SuperProfit : Indicator { // Alert [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type); [Parameter(DefaultValue = 35)] public int DllPeriod { get; set; } [Parameter(DefaultValue = 1.7)] public double Period { get; set; } [Parameter(DefaultValue = MovingAverageType.Weighted)] public MovingAverageType MaType { get; set; } [Parameter()] public DataSeries Price { get; set; } [Parameter(DefaultValue = 5)] public int StopLoss { get; set; } [Parameter(DefaultValue = 20)] public int TakeProfit { get; set; } [Output("Up", PlotType = PlotType.DiscontinuousLine, Color = Colors.Green, Thickness = 5)] public IndicatorDataSeries UpSeries { get; set; } [Output("Down", PlotType = PlotType.DiscontinuousLine, Color = Colors.Red, Thickness = 5)] public IndicatorDataSeries DownSeries { get; set; } private DateTime _openTime; private MovingAverage _movingAverage1; private MovingAverage _movingAverage2; private MovingAverage _movingAverage3; private IndicatorDataSeries _dataSeries; private IndicatorDataSeries _trend; protected override void Initialize() { _dataSeries = CreateDataSeries(); _trend = CreateDataSeries(); var period1 = (int)Math.Floor(DllPeriod / Period); var period2 = (int)Math.Floor(Math.Sqrt(DllPeriod)); _movingAverage1 = Indicators.MovingAverage(Price, period1, MaType); _movingAverage2 = Indicators.MovingAverage(Price, DllPeriod, MaType); _movingAverage3 = Indicators.MovingAverage(_dataSeries, period2, MaType); } public override void Calculate(int index) { if (index < 1) return; _dataSeries[index] = 2.0 * _movingAverage1.Result[index] - _movingAverage2.Result[index]; _trend[index] = _trend[index - 1]; if (_movingAverage3.Result[index] > _movingAverage3.Result[index - 1]) _trend[index] = 1; else if (_movingAverage3.Result[index] < _movingAverage3.Result[index - 1]) _trend[index] = -1; if (_trend[index] > 0) { UpSeries[index] = _movingAverage3.Result[index]; if (_trend[index - 1] < 0.0) { UpSeries[index - 1] = _movingAverage3.Result[index - 1]; if (IsLastBar) { var stopLoss = MarketSeries.Low[index - 1] - StopLoss * Symbol.PipSize; var takeProfit = MarketSeries.Close[index] + TakeProfit * Symbol.PipSize; var entryPrice = MarketSeries.Close[index - 1]; if (MarketSeries.OpenTime[index] != _openTime) { _openTime = MarketSeries.OpenTime[index]; DisplayAlert("Buy signal", takeProfit, stopLoss, entryPrice); } } } DownSeries[index] = double.NaN; } else if (_trend[index] < 0) { DownSeries[index] = _movingAverage3.Result[index]; if (_trend[index - 1] > 0.0) { DownSeries[index - 1] = _movingAverage3.Result[index - 1]; if (IsLastBar) { var stopLoss = MarketSeries.High[index - 1] + StopLoss * Symbol.PipSize; var takeProfit = MarketSeries.Close[index] - TakeProfit * Symbol.PipSize; var entryPrice = MarketSeries.Close[index - 1]; if (MarketSeries.OpenTime[index] != _openTime) { _openTime = MarketSeries.OpenTime[index]; DisplayAlert("Sell signal", takeProfit, stopLoss, entryPrice); } } } UpSeries[index] = double.NaN; } } protected void DisplayAlert(string tradyTypeSignal, double takeProfit, double stopLoss, double entryPrice) { string entryPricetext = entryPrice != 0.0 ? string.Format(" at price {0}", Math.Round(entryPrice, 4)) : ""; string takeProfitText = takeProfit != 0.0 ? string.Format(", TP on {0}", Math.Round(takeProfit, 4)) : ""; string stopLossText = stopLoss != 0.0 ? string.Format(", SL on {0}", Math.Round(stopLoss, 4)) : ""; var alertMessage = string.Format("{0} {1} {2} {3} {4}", tradyTypeSignal, entryPricetext, takeProfitText, stopLossText, Symbol.Code); MessageBox(new IntPtr(0), alertMessage, "Trade Signal", 0); } } }
Thank you :-)
Replies
firemyst
28 Mar 2019, 01:39
RE:
Panagiotis Charalampous said:
Hi FireMyst,
Try changing your cBot and indicator access rights e.g. try AccessRights = AccessRights.FullAccess.
Best Regards,
Panagiotis
Thank you! That was the issue exactly. Except, in this case, I only had to change the access rights on the bot, and not the indicator.
Funnily enough, after your response, I found the reference and guide online for access rights. Here it currently is for everyone else's reference:
https://ctrader.com/api/guides/access_rights
@firemyst
PanagiotisCharalampous
27 Mar 2019, 11:24
Hi FireMyst,
Try changing your cBot and indicator access rights e.g. try AccessRights = AccessRights.FullAccess.
Best Regards,
Panagiotis
@PanagiotisCharalampous