Run an indicator for multi symbols and get text outputs
Run an indicator for multi symbols and get text outputs
24 Mar 2021, 02:46
Hi
I have made an indicator with 1200 lines of code that returns a text. to simplify the situation. I have made a sample indicator that returns index and SymbolName.
Now I need to run this indicator on multi symbols and analysis those outputs.
for example
Symbol[] MySymbols = Symbols.GetSymbols("EURUSD", "GBPUSD", "USDJPY", "USDCHF", "AUDCAD", "AUDCHF", "AUDJPY", "AUDNZD", "AUDUSD", "CADCHF",
"CADJPY");
foreach (var symbol in MySymbols)
{
// run or call indicator for each symbol
}
I wonder how I can run or call an indicator for a list of currencies or symbols?
------------------------------------------------------------------------------------
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System.Collections.Generic;
namespace cAlgo
{
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class Callindicator : Indicator
{
[Parameter("Bigger Timeframe", DefaultValue = "Daily")]
public TimeFrame TimeframeBigger { get; set; }
public int IndexMinDaily = 0;
public int MinIndexB = 0;
public double MinLineB = 0;
public int IndexMaxDaily = 0;
public int MaxIndexB = 0;
public double MaxLineB = 0;
public bool is_minB = false;
public bool is_maxB = false;
public List<Extremum> extremums = new List<Extremum>();
public int lastHighindexB;
public int LastLowindexB;
public bool isBuy_allowedB = true;
public bool isSell_allowedB = true;
public bool signal_BuyB = false;
public bool signal_SellB = false;
public double high_insideB;
public double low_insideB;
public int lastbuy_exIndexB;
public int lastsell_exIndexB;
private MarketSeries Biggermarketseries;
private int lastIndex = 0;
protected override void Initialize()
{
// Initialize and create nested indicators
while (Bars.Count < 1000)
{
var loadedCount = Bars.LoadMoreHistory();
Print("Loaded {0} bars", loadedCount);
if (loadedCount == 0)
break;
}
Biggermarketseries = MarketData.GetSeries(TimeframeBigger);
int index = Bars.Count - 2;
int idx1 = Biggermarketseries.OpenTime.GetIndexByTime(MarketSeries.OpenTime[index]);
int indaxstart = idx1 - 10;
MinIndexB = indaxstart;
MinLineB = double.MaxValue;
MaxIndexB = indaxstart;
MaxLineB = double.MinValue;
}
public override void Calculate(int index)
{
Symbol[] MySymbols = Symbols.GetSymbols("EURUSD", "GBPUSD", "USDJPY", "USDCHF", "AUDCAD", "AUDCHF", "AUDJPY", "AUDNZD", "AUDUSD", "CADCHF",
"CADJPY");
foreach (var symbol in MySymbols)
{
// run indicator for each symbol
}
int idx1 = Biggermarketseries.OpenTime.GetIndexByTime(MarketSeries.OpenTime[index]);
// index daily
int idx2 = MarketSeries.OpenTime.GetIndexByTime(Biggermarketseries.OpenTime[idx1]);
Bars barsD1 = MarketData.GetBars(TimeFrame.Daily);
Bars barsH1 = MarketData.GetBars(TimeFrame.Hour);
if (is_maxB && Biggermarketseries.High[idx1 - 1] > MaxLineB)
{
MaxLineB = Biggermarketseries.High[idx1 - 1];
MaxIndexB = findindexmax(idx2, MaxLineB);
}
Chart.DrawStaticText("text", index + SymbolName, VerticalAlignment.Bottom, HorizontalAlignment.Left, Color.Red);
returnfun(MaxIndexB);
}
public string returnfun(int index)
{
return index + SymbolName;
}
public int findindexmax(int index, double high)
{
for (int i = index - 24; i <= index + 24; i++)
{
if (high == Bars.HighPrices[i])
return i;
}
return index;
}
}
}
Replies
itmfar
25 Mar 2021, 19:10
RE:
Wow, interesting, you made my day.
amusleh said:
Try this:
using cAlgo.API; using cAlgo.API.Internals; using System.Collections.Generic; using System.Linq; namespace cAlgo { [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class Callindicator : Indicator { private Symbol[] _symbols; private Bars[] _bars; [Parameter("Symbols", DefaultValue = "EURUSD,GBPUSD,USDJPY,USDCHF,AUDCAD,AUDCHF,AUDJPY,AUDNZD,AUDUSD,CADCHF,CADJPY")] public string SymbolNames { get; set; } [Parameter("Bigger Timeframe", DefaultValue = "Daily")] public TimeFrame TimeframeBigger { get; set; } public int IndexMinDaily = 0; public int MinIndexB = 0; public double MinLineB = 0; public int IndexMaxDaily = 0; public int MaxIndexB = 0; public double MaxLineB = 0; public bool is_minB = false; public bool is_maxB = false; public List<Extremum> extremums = new List<Extremum>(); public int lastHighindexB; public int LastLowindexB; public bool isBuy_allowedB = true; public bool isSell_allowedB = true; public bool signal_BuyB = false; public bool signal_SellB = false; public double high_insideB; public double low_insideB; public int lastbuy_exIndexB; public int lastsell_exIndexB; private MarketSeries Biggermarketseries; private int lastIndex = 0; protected override void Initialize() { _symbols = Symbols.GetSymbols(SymbolNames.Replace(" ", string.Empty).Split(',').ToArray()); _bars = _symbols.Select(iSymbol => MarketData.GetBars(TimeframeBigger, iSymbol.Name)).ToArray(); foreach (var bars in _bars) { while (bars.Count < 1000) { var loadedCount = bars.LoadMoreHistory(); Print("Loaded {0} bars of {1}", loadedCount, bars.SymbolName); if (loadedCount == 0) break; } bars.Tick += Bars_Tick; bars.BarOpened += Bars_BarOpened; } Biggermarketseries = MarketData.GetSeries(TimeframeBigger); int index = Bars.Count - 2; int idx1 = Biggermarketseries.OpenTime.GetIndexByTime(MarketSeries.OpenTime[index]); int indaxstart = idx1 - 10; MinIndexB = indaxstart; MinLineB = double.MaxValue; MaxIndexB = indaxstart; MaxLineB = double.MinValue; } private void Bars_BarOpened(BarOpenedEventArgs obj) { // each symbol will call this method on new bar open } private void Bars_Tick(BarsTickEventArgs obj) { // each symbol will call this method on tick change } public override void Calculate(int index) { foreach (var symbol in _symbols) { // run indicator for each symbol } int idx1 = Biggermarketseries.OpenTime.GetIndexByTime(MarketSeries.OpenTime[index]); // index daily int idx2 = MarketSeries.OpenTime.GetIndexByTime(Biggermarketseries.OpenTime[idx1]); Bars barsD1 = MarketData.GetBars(TimeFrame.Daily); Bars barsH1 = MarketData.GetBars(TimeFrame.Hour); if (is_maxB && Biggermarketseries.High[idx1 - 1] > MaxLineB) { MaxLineB = Biggermarketseries.High[idx1 - 1]; MaxIndexB = findindexmax(idx2, MaxLineB); } Chart.DrawStaticText("text", index + SymbolName, VerticalAlignment.Bottom, HorizontalAlignment.Left, Color.Red); returnfun(MaxIndexB); } public string returnfun(int index) { return index + SymbolName; } public int findindexmax(int index, double high) { for (int i = index - 24; i <= index + 24; i++) { if (high == Bars.HighPrices[i]) return i; } return index; } } }
You can put any code you want to inside "Bars_BarOpened" and "Bars_Tick" methods, you can use the Calculate method to calculate the indicator for historical data, its called only for current chart symbol ticks not your other symbols, so instead use "Bars_Tick" method.
Now you have all you need, the symbols and their bars, and you can pass the symbols via a parameter instead of hard coding the symbol names inside your indicator.
@itmfar
amusleh
24 Mar 2021, 09:17
Try this:
You can put any code you want to inside "Bars_BarOpened" and "Bars_Tick" methods, you can use the Calculate method to calculate the indicator for historical data, its called only for current chart symbol ticks not your other symbols, so instead use "Bars_Tick" method.
Now you have all you need, the symbols and their bars, and you can pass the symbols via a parameter instead of hard coding the symbol names inside your indicator.
@amusleh