183 lines
8.6 KiB
C#
183 lines
8.6 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using cAlgo.API;
|
|
using cAlgo.API.Indicators;
|
|
using cAlgo.API.Internals;
|
|
using cAlgo.Indicators;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace cAlgo
|
|
{
|
|
//[Cloud("Fast Smooth", "Slow Smooth", FirstColor = "Green", SecondColor = "Red", Opacity = 0.1)]
|
|
[Levels(0)]
|
|
[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
|
|
public class AngleOfMultiSymbol : Indicator
|
|
{
|
|
[Parameter("Symbol Selection Method", DefaultValue = SymbolSelectionMethodType.SymbolList, Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")]
|
|
public SymbolSelectionMethodType SymbolSelectionMethod { get; set; }
|
|
[Parameter("Symbol List", DefaultValue = "EURUSD GBPUSD AUDUSD USDCHF", Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")]
|
|
public string TradedSymbols { get; set; }
|
|
[Parameter("Watchlist Name", DefaultValue = "My Watchlist", Group = "Symbole Choice \n(Uncomment code for more than 6 Symbole)")]
|
|
public string WatchlistName { get; set; }
|
|
|
|
public enum SymbolSelectionMethodType
|
|
{
|
|
CurrentChart,
|
|
SymbolList,
|
|
WatchList
|
|
}
|
|
|
|
[Parameter("History Diff Angle", DefaultValue = 1, Group = "Base Setting")]
|
|
public int HistoryTextLookback { get; set; }
|
|
[Parameter("Tf", DefaultValue = "Hour1", Group = "Base Setting")]
|
|
public TimeFrame Tf { get; set; }
|
|
[Parameter("Price Smooth Period (255)", DefaultValue = 255, Group = "Angle Setting")]
|
|
public int SmoothPeriods { get; set; }
|
|
[Parameter("Price Smooth Type", DefaultValue = MovingAverageType.Weighted, Group = "Angle Setting")]
|
|
public MovingAverageType MaType { get; set; }
|
|
[Parameter("Loockback Periods Angle", DefaultValue = 1, Group = "Angle Setting")]
|
|
public int LookbackPeriodsAngle { get; set; }
|
|
[Parameter("Sensitivity (1.0)", DefaultValue = 1, Group = "Angle Setting")]
|
|
public double Sensitivity { get; set; }
|
|
|
|
[Output("Symb n° 1", LineColor = "White", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN1 { get; set; }
|
|
[Output("Symb n° 2", LineColor = "Lime", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN2 { get; set; }
|
|
[Output("Symb n° 3", LineColor = "Green", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN3 { get; set; }
|
|
[Output("Symb n° 4", LineColor = "DeepSkyBlue", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN4 { get; set; }
|
|
[Output("Symb n° 5", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN5 { get; set; }
|
|
[Output("Symb n° 6", LineColor = "Magenta", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN6 { get; set; }
|
|
|
|
/*Uncomment For more Symbole on the chart
|
|
[Output("Symb n° 7", LineColor = "Green", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN7 { get; set; }
|
|
[Output("Symb n° 8", LineColor = "DeepSkyBlue", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN8 { get; set; }
|
|
[Output("Symb n° 9", LineColor = "Red", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN9 { get; set; }
|
|
[Output("Symb n° 10", LineColor = "Magenta", PlotType = PlotType.Line, LineStyle = LineStyle.Solid, Thickness = 1)]
|
|
public IndicatorDataSeries SymbN10 { get; set; }
|
|
*/
|
|
|
|
private MovingAverage[] ma;
|
|
private AverageTrueRange[] atr;
|
|
|
|
private Symbol[] TradeList;
|
|
private Bars[] bars;
|
|
private IndicatorDataSeries[] Sources, ResSymbol;
|
|
private int[] indexBars;
|
|
|
|
protected override void Initialize()
|
|
{
|
|
if (SymbolSelectionMethod == SymbolSelectionMethodType.WatchList)
|
|
{
|
|
// Get the trade list from the watchlist provided by the user
|
|
foreach (Watchlist w in Watchlists)
|
|
{
|
|
if (w.Name == WatchlistName)
|
|
{
|
|
TradeList = Symbols.GetSymbols(w.SymbolNames.ToArray());
|
|
}
|
|
}
|
|
}
|
|
else if (SymbolSelectionMethod == SymbolSelectionMethodType.SymbolList)
|
|
{
|
|
// Get the trade list from the sysmbol list provided by the user
|
|
string[] SymbolList = TradedSymbols.ToUpper().Split(' ');
|
|
|
|
TradeList = Symbols.GetSymbols(SymbolList);
|
|
}
|
|
else
|
|
{
|
|
TradeList = new Symbol[1];
|
|
TradeList[0] = Symbol;
|
|
}
|
|
|
|
atr = new AverageTrueRange[TradeList.Length];
|
|
ma = new MovingAverage[TradeList.Length];
|
|
bars = new Bars[TradeList.Length];
|
|
indexBars = new int[TradeList.Length];
|
|
Sources = new IndicatorDataSeries[TradeList.Length];
|
|
ResSymbol = new IndicatorDataSeries[TradeList.Length];
|
|
|
|
Print("{0} traded symbols: ", TradeList.Length);
|
|
|
|
int i = 0;
|
|
foreach (var symbol in TradeList)
|
|
{
|
|
Print(symbol.Name);
|
|
|
|
bars[i] = MarketData.GetBars(Tf, symbol.Name);
|
|
if (bars[i].OpenTimes[0] > Bars.OpenTimes[0])
|
|
bars[i].LoadMoreHistory();
|
|
//Load indicators on start up EP5-ATR
|
|
Sources[i] = CreateDataSeries();
|
|
ResSymbol[i] = CreateDataSeries();
|
|
atr[i] = Indicators.AverageTrueRange(bars[i], 500, MovingAverageType.Simple);
|
|
|
|
ma[i] = Indicators.MovingAverage(Sources[i], SmoothPeriods, MaType);
|
|
i++;
|
|
}
|
|
}
|
|
|
|
public override void Calculate(int index)
|
|
{
|
|
if (index < SmoothPeriods)
|
|
return;
|
|
|
|
for (int i = 0; i < TradeList.Length; i++)
|
|
{
|
|
//indexBars[i] = GetIndexByDate(bars[i], Bars.OpenTimes[index]);
|
|
|
|
indexBars[i] = bars[i].OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);
|
|
Sources[i][index] = bars[i].ClosePrices[indexBars[i]];
|
|
ResSymbol[i][index] = GetCalculationSymbol(ma[i].Result[index], ma[i].Result[index - LookbackPeriodsAngle], atr[i].Result[indexBars[i]]);
|
|
}
|
|
|
|
SymbN1[index] = ResSymbol[0][index];
|
|
SymbN2[index] = ResSymbol[1][index];
|
|
SymbN3[index] = ResSymbol[2][index];
|
|
SymbN4[index] = ResSymbol[3][index];
|
|
SymbN5[index] = ResSymbol[4][index];
|
|
SymbN6[index] = ResSymbol[5][index];
|
|
|
|
/* Uncomment For More Symbols on chart
|
|
SymbN7[index] = ResSymbol[2][index];
|
|
SymbN8[index] = ResSymbol[3][index];
|
|
SymbN9[index] = ResSymbol[4][index];
|
|
SymbN10[index] = ResSymbol[5][index];
|
|
*/
|
|
|
|
IndicatorArea.RemoveAllObjects();
|
|
|
|
for (int i = 0; i < TradeList.Length; i++)
|
|
{
|
|
IndicatorArea.DrawText((TradeList[i]).ToString() + index, TradeList[i] + " : " + ResSymbol[i][index].ToString("F2"), index, ResSymbol[i][index], ResSymbol[i][index] > ResSymbol[i][index - HistoryTextLookback] ? Color.Lime : Color.Red);
|
|
}
|
|
|
|
}
|
|
public double GetCalculationSymbol(double priceSmooth, double priceSmoothLoockBack, double atr)
|
|
{
|
|
var _momentumpositive = priceSmooth - priceSmoothLoockBack;
|
|
var _momentumnegative = priceSmoothLoockBack - priceSmooth;
|
|
var _momentum = priceSmooth > priceSmoothLoockBack
|
|
? _momentumpositive / atr
|
|
: _momentumnegative / atr;
|
|
var _hypothenuse = Math.Sqrt((_momentum * _momentum) + (LookbackPeriodsAngle * LookbackPeriodsAngle));
|
|
var _cos = (LookbackPeriodsAngle / _hypothenuse);
|
|
var _angle = priceSmooth > priceSmoothLoockBack
|
|
? (0 + (Math.Acos(_cos) * 100)) * Sensitivity
|
|
: (0 - (Math.Acos(_cos) * 100)) * Sensitivity;
|
|
return _angle;
|
|
}
|
|
}
|
|
}
|