Topics
Forum Topics not found
Replies
amusleh
23 May 2022, 08:57
( Updated at: 23 May 2022, 08:58 )
RE: Display Date Pro issue
notoriousocean said:
Hey there!
I bought your display date pro, and installed it. It only displays the date and time but not the vertical lines as shown in the video. how can i get it to show the lines?
Hi,
Not sure what you are talking about, please contact the company you bought the product from.
And don't post on threads that aren't related to your issue.
@amusleh
amusleh
23 May 2022, 08:56
Hi,
There is no GetIndexByTime method for Ticks series, because several ticks can occur per second and it's hard to match them against a fixed time, but if you want to you can create your own as an extension method to Ticks:
using System;
using cAlgo.API;
namespace cAlgo
{
[Indicator(AccessRights = AccessRights.None)]
public class NewIndicator2 : Indicator
{
protected override void Initialize()
{
var ticks = MarketData.GetTicks();
var index = ticks.GetIndexByTime(Bars.OpenTimes.LastValue);
Print(index);
}
public override void Calculate(int index)
{
}
}
public static class TickGetIndexByTimeExtension
{
public static int GetIndexByTime(this Ticks ticks, DateTime time)
{
for (var i = 0; i < ticks.Count; i++)
{
if (ticks[i].Time == time)
{
return i;
}
}
return -1;
}
}
}
@amusleh
amusleh
23 May 2022, 08:49
RE:
swapd0 said:
After reading this post I've changed my multi-register routine to send several subscribe messages, each one for each symbol but I only get quotes from the first one.
By the way, I'm using different values for MDReqID on each request (reqId1, reqId5, reqId7...), not sure if this is right.
What I'm doing wrong?
Edited: Using the same value for MDReqID I get quotes from two symbols, although I've subscribed for 24...
Here are my request messages
OUT: 8=FIX.4.4|9=144|35=V|34=5|49=live.icmarkets.****|50=******|52=20220520-19:21:27.018|57=QUOTE|56=cServer|262=reqId1|263=1|264=1|267=2|269=0|269=1|146=1|55=1|10=149|
OUT: 8=FIX.4.4|9=410|35=V|34=7|49=live.icmarkets.*****50=******|52=20220520-19:21:53.622|57=QUOTE|56=cServer|262=reqId5|263=1|264=1|267=2|269=0|269=1|146=1|55=14|10=203|
OUT: 8=FIX.4.4|9=152|35=V|34=9|49=live.icmarkets.*****50=******|52=20220520-19:21:53.788|57=QUOTE|56=cServer|262=reqId7|263=1|264=1|267=2|269=0|269=1|146=1|55=17|10=226|
And here are the quotes, I only got from EURUSD(1)
IN:8=FIX.4.4|9=141|35=W|34=301|49=cServer|50=QUOTE|52=20220520-17:24:51.269|56=live.icmarkets.****|57=****|55=1|268=2|269=0|270=1.05502|269=1|270=1.05502|10=064|
IN:8=FIX.4.4|9=141|35=W|34=302|49=cServer|50=QUOTE|52=20220520-17:24:51.804|56=live.icmarkets.****|57=****|55=1|268=2|269=0|270=1.05503|269=1|270=1.05503|10=062|
IN:8=FIX.4.4|9=141|35=W|34=303|49=cServer|50=QUOTE|52=20220520-17:24:52.774|56=live.icmarkets.****|57=****|55=1|268=2|269=0|270=1.05502|269=1|270=1.05502|10=068|
IN:8=FIX.4.4|9=137|35=W|34=304|49=cServer|50=QUOTE|52=20220520-17:24:52.974|56=live.icmarkets.****|57=****|55=1|268=2|269=0|270=1.055|269=1|270=1.055|10=136|
IN:8=FIX.4.4|9=141|35=W|34=305|49=cServer|50=QUOTE|52=20220520-17:24:53.182|56=live.icmarkets.****|57=****|55=1|268=2|269=0|270=1.05499|269=1|270=1.05499|10=094|
IN:8=FIX.4.4|9=141|35=W|34=306|49=cServer|50=QUOTE|52=20220520-17:24:53.410|56=live.icmarkets.****|57=****|55=1|268=2|269=0|270=1.05498|269=1|270=1.05498|10=087|
IN:8=FIX.4.4|9=141|35=W|34=307|49=cServer|50=QUOTE|52=20220520-17:24:54.457|56=live.icmarkets.****|57=*****|55=1|268=2|269=0|270=1.05497|269=1|270=1.05497|10=098|
Hi,
I just tested by subscribing to multiple symbols and I received quotes from all of them.
I used our QuickFIX console sample: spotware/quickfixnsamples.net: .NET Samples for QuickFIXn library and Spotware FIX API (github.com)
Change the SendMarketDataRequest method on console sample program.cs to:
private static void SendMarketDataRequest(string[] fields, bool subscribe)
{
foreach (var symbolId in Enumerable.Range(0, 10))
{
MDReqID mdReqID = new("MARKETDATAID");
SubscriptionRequestType subType = new(subscribe ? '1' : '2');
MarketDepth marketDepth = new(fields[1].ToLowerInvariant().Equals("y", StringComparison.OrdinalIgnoreCase) ? 0 : 1);
QuickFix.FIX44.MarketDataRequest.NoMDEntryTypesGroup bidMarketDataEntryGroup = new() { MDEntryType = new MDEntryType('0') };
QuickFix.FIX44.MarketDataRequest.NoMDEntryTypesGroup offerMarketDataEntryGroup = new() { MDEntryType = new MDEntryType('1') };
//QuickFix.FIX44.MarketDataRequest.NoRelatedSymGroup symbolGroup = new() { Symbol = new Symbol(fields[0]), };
QuickFix.FIX44.MarketDataRequest.NoRelatedSymGroup symbolGroup = new() { Symbol = new Symbol(symbolId.ToString()), };
QuickFix.FIX44.MarketDataRequest message = new(mdReqID, subType, marketDepth);
message.AddGroup(bidMarketDataEntryGroup);
message.AddGroup(offerMarketDataEntryGroup);
message.AddGroup(symbolGroup);
_application.SendMessage(message);
}
}
Now instead of sending a single request it sends 10 request for 10 symbols.
@amusleh
amusleh
23 May 2022, 08:38
RE:
toddslagowski06 said:
Well, that's a piece of bad news for me. Actually, I don't understand why the developers just don't create such a feature.
Hi,
It's a third party data, if you want to use their data on your cBots/Indicators then you can contact them and ask them to give you access to their API.
@amusleh
amusleh
20 May 2022, 08:02
Hi,
By commenting I mean remove that line of code by making it a comment, ex:
using System;
using System.Collections.Generic;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
namespace cAlgo
{
[Indicator("Support and Resistance At Price", IsOverlay = true, AccessRights = AccessRights.None)]
public class SRAtPrice : Indicator
{
private double extremeHigh = 0;
private double extremeLow = 0;
private double dayHi = 0;
private double dayLo = 0;
private SortedList<double, int> prices = new SortedList<double, int>();
private IList<Zone> zones = new List<Zone>();
private const string ExtremeHighName = "ExtremeHigh";
private const string ExtremeLowName = "ExtremeLow";
private const string DayHighName = "DayHigh";
private const string DayLowName = "DayLow";
[Parameter("Periods", DefaultValue = 100)]
public int Periods { get; set; }
[Parameter("Show Extreme H/L", DefaultValue = true)]
public bool ShowExtremeHL { get; set; }
[Parameter("Show Day H/L", DefaultValue = true)]
public bool ShowDayHL { get; set; }
[Parameter("Required Hits", DefaultValue = 0)]
public int RequiredHits { get; set; }
[Parameter("Zone Size", DefaultValue = 2)]
public int ZoneSize { get; set; }
[Parameter("Max Lines In Zone", DefaultValue = 1)]
public int MaxLinesInZone { get; set; }
[Output("Extreme H/L Style", Color = Colors.Red, LineStyle = LineStyle.DotsVeryRare)]
public IndicatorDataSeries ExtremeHLStyle { get; set; }
[Output("Day H/L Style", Color = Colors.Blue, LineStyle = LineStyle.DotsVeryRare)]
public IndicatorDataSeries DayHLStyle { get; set; }
[Output("S/R Style", Color = Colors.Orange, LineStyle = LineStyle.DotsVeryRare)]
public IndicatorDataSeries SRStyle { get; set; }
public override void Calculate(int index)
{
if (this.IsLastBar)
{
var currentOpenDate = this.MarketSeries.OpenTime[index].Date;
var earliest = index - this.Periods;
for (var i = index; i >= earliest; i--)
{
if (i >= 0)
{
var high = this.MarketSeries.High[i];
var nextHigh = this.MarketSeries.High[i + 1];
var low = this.MarketSeries.Low[i];
var nextLow = this.MarketSeries.Low[i + 1];
this.extremeHigh = Math.Max(high, this.extremeHigh);
this.extremeLow = this.extremeLow == 0 ? low : Math.Min(low, this.extremeLow);
if (this.TimeFrame < TimeFrame.Minute)
{
if (this.MarketSeries.OpenTime[i].Date == currentOpenDate)
{
this.dayHi = Math.Max(high, this.dayHi);
this.dayLo = this.dayLo == 0 ? low : Math.Min(low, this.dayLo);
}
}
if (nextHigh <= high)
{
this.AddOrUpdatePrice(high);
}
if (nextLow >= low)
{
this.AddOrUpdatePrice(low);
}
}
else
{
break;
}
}
this.zones.Clear();
var rangePipSize = (this.Symbol.PipSize * (double)this.ZoneSize);
for (var i = this.extremeLow + rangePipSize; i < this.extremeHigh - rangePipSize; i += rangePipSize + this.Symbol.PipSize)
{
this.zones.Add(new Zone
{
Start = i,
End = i + rangePipSize,
LinesRendered = 0
});
}
//this.ChartObjects.RemoveAllObjects();
foreach (var price in this.prices.Keys)
{
this.RenderSRIfRequred(price, this.prices[price]);
}
if (this.ShowExtremeHL)
{
this.DrawExtremeHigh();
this.DrawExtremeLow();
}
if (this.TimeFrame < TimeFrame.Minute && this.ShowDayHL)
{
this.DrawDayHigh();
this.DrawDayLow();
}
}
}
private void RenderSRIfRequred(double price, int count)
{
if (count < this.RequiredHits)
{
return;
}
foreach (var range in this.zones)
{
if (price >= range.Start && price <= range.End)
{
if (range.LinesRendered != this.MaxLinesInZone)
{
range.LinesRendered++;
this.DrawSR(price);
}
return;
}
}
}
private void AddOrUpdatePrice(double priceValue)
{
if (this.prices.ContainsKey(priceValue))
{
this.prices[priceValue]++;
}
else
{
this.prices.Add(priceValue, 1);
}
}
private void DrawExtremeHigh()
{
this.DrawExtreme(ExtremeHighName, this.extremeHigh);
}
private void DrawExtremeLow()
{
this.DrawExtreme(ExtremeLowName, this.extremeLow);
}
private void DrawDayHigh()
{
this.DrawDay(DayHighName, this.dayHi);
}
private void DrawDayLow()
{
this.DrawDay(DayLowName, this.dayLo);
}
private void DrawExtreme(string name, double level)
{
var attribute = this.GetAttributeFrom<OutputAttribute>("ExtremeHLStyle");
this.ChartObjects.DrawHorizontalLine(name, level, attribute.Color, attribute.Thickness, attribute.LineStyle);
}
private void DrawDay(string name, double level)
{
var attribute = this.GetAttributeFrom<OutputAttribute>("DayHLStyle");
this.ChartObjects.DrawHorizontalLine(name, level, attribute.Color, attribute.Thickness, attribute.LineStyle);
}
private void DrawSR(double level)
{
var attribute = this.GetAttributeFrom<OutputAttribute>("SRStyle");
this.ChartObjects.DrawHorizontalLine(string.Format("SR {0}", level), level, attribute.Color, attribute.Thickness, attribute.LineStyle);
}
private T GetAttributeFrom<T>(string propertyName)
{
var attrType = typeof(T);
var property = this.GetType().GetProperty(propertyName);
return (T)property.GetCustomAttributes(attrType, false).GetValue(0);
}
private class Price
{
internal double Value { get; set; }
internal int Count { get; set; }
}
private class Zone
{
internal double Start { get; set; }
internal double End { get; set; }
internal int LinesRendered { get; set; }
}
}
}
@amusleh
amusleh
19 May 2022, 14:45
RE: RE: downgrade
dokinya said:
amusleh said:
Hi,
We were able to reproduce the issue with your indicator, we are investigating now what's causing it, please be patient and wait for our reply.
is there anyway i can downgrade the platform?
Hi,
There is no way to downgrade, for this particular indicator you can comment the "this.ChartObjects.RemoveAllObjects();" line and it will work on version 4.2.
@amusleh
amusleh
19 May 2022, 09:34
Hi,
It depends on your email server that how many emails it allows you to send on a unit of time (seconds/milliseconds).
To avoid this issue you can place a delay after sending the first email, use Thread.Sleep, example:
try
{
Notifications.SendEmail(EmailAddress1, EmailAddress1, "cTrader 5 Wick Alert", emailmsg);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Invalid email address", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (EmailAddress2 != "")
{
// 2 seconds delay
Thread.Sleep(2000);
// Call refresh data is required after suspending the main thread
RefreshData();
try
{
Notifications.SendEmail(EmailAddress1, EmailAddress2, "cTrader 5 Wick Alert", emailmsg);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Invalid email address", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
@amusleh
amusleh
19 May 2022, 09:29
Hi,
To use an indicator on a different time frame you have to first pass that time frame bars series as source to indicator and then use that time frame index values to access the indicator output values, here is an example for MACD:
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo
{
[Indicator(AccessRights = AccessRights.None)]
public class MACDMTF : Indicator
{
private MacdCrossOver _macd;
private Bars _bars;
[Parameter("Selected Time Frame")]
public TimeFrame SelectedTimeFrame { get; set; }
[Parameter("Long Cycle", DefaultValue = 26)]
public int LongCycle { get; set; }
[Parameter("Short Cycle", DefaultValue = 12)]
public int ShortCycle { get; set; }
[Parameter("Signal Periods", DefaultValue = 9)]
public int SignalPeriods { get; set; }
[Output("Histogram", LineColor = "Yellow", IsHistogram = true, PlotType = PlotType.Histogram, Thickness = 2)]
public IndicatorDataSeries Histogram { get; set; }
[Output("MACD", LineColor = "Blue", PlotType = PlotType.Line, Thickness = 1)]
public IndicatorDataSeries MACD { get; set; }
[Output("Signal", LineColor = "Red", PlotType = PlotType.Line, Thickness = 1)]
public IndicatorDataSeries Signal { get; set; }
protected override void Initialize()
{
_bars = MarketData.GetBars(SelectedTimeFrame);
_macd = Indicators.MacdCrossOver(_bars.ClosePrices, LongCycle, ShortCycle, SignalPeriods);
}
public override void Calculate(int index)
{
var timeFrameIndex = _bars.OpenTimes.GetIndexByTime(Bars.OpenTimes[index]);
Histogram[index] = _macd.Histogram[timeFrameIndex];
MACD[index] = _macd.MACD[timeFrameIndex];
Signal[index] = _macd.Signal[timeFrameIndex];
}
}
}
@amusleh
amusleh
18 May 2022, 11:19
Hi,
Does it happen constantly? or only sometimes?
We tried to reproduce this but we were not able to, please provide below data so we will be able to reproduce this issue:
- cBot code
- cTrader Version
- Back test period (start/end time), time frame, data source type
- Broker name
@amusleh
amusleh
23 May 2022, 08:59
Hi,
Please use suggestions section, create a thread there for your suggestion.
@amusleh