Code: Select all
using System;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Robots
{
[Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class SvrHeadlessScreener : Robot
{
[Parameter("ATR Period", DefaultValue = 14, MinValue = 1)]
public int AtrPeriod { get; set; }
[Parameter("Minimum SVR Threshold", DefaultValue = 15.0)]
public double SvrThreshold { get; set; }
private AverageTrueRange _atr;
protected override void OnStart()
{
// Initialize ATR on the M15 execution timeframe
_atr = Indicators.AverageTrueRange(MarketData.GetBars(TimeFrame.Minute15), AtrPeriod, MovingAverageType.Simple);
}
protected override void OnBar()
{
// Retrieve the last closed bar's ATR
double currentAtr = _atr.Result.Last(1);
// Normalize raw price values to standard pips
double spreadInPips = Symbol.Spread / Symbol.PipSize;
double atrInPips = currentAtr / Symbol.PipSize;
// Prevent division by zero during zero-spread ticks on raw pricing accounts
if (spreadInPips <= 0) return;
double svr = Math.Round(atrInPips / spreadInPips, 2);
if (svr >= SvrThreshold)
{
string alertMessage = $"[SVR ALIVE] {Symbol.Name} | SVR: {svr} | Spread: {spreadInPips:F1} pips | M15 ATR: {atrInPips:F1} pips";
// Push notification to the mobile app
Notifications.SendPushNotification(alertMessage);
Print(alertMessage);
}
}
}
}