Я пытаюсь перевести код pine-script в двухполюсный осциллятор торгового представления BigBeluga для использования на своих графиках cTrader. Код Trading View находится здесь:
https://www.tradingview.com/script/2Ssn ... BigBeluga/
Я создал следующий код в cTrader с помощью Visual Studio, но результаты на графиках, которые я сравнивал, не совпадают (представление торговли с индикатором и представление cTrader с моей переведенной версией индикатор), и я не могу понять, где/что я делаю не так с моим кодом C# для cTrader.
Например, на всех телевизионных графиках, которые я смотрел, кривые красивые и плавные; по сравнению с cTrader, линии осциллятора в половине случаев выглядят неровными и более заостренными, чем гладкая кривая.
Поэтому я надеюсь, что кто-нибудь сможет указать на какие-либо проблемы или что-то, что могло быть «потеряно при переводе» при моей попытке преобразовать сценарий pine в структуру индикаторов C# cTrader.
Я даю ему разрешения «полного доступа», чтобы я мог попробовать отладку в VS, чтобы увидеть, даст ли это мне что-нибудь подсказки о том, где могут быть проблемы.
Вот мой код C# cTrader:
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
namespace cAlgo.Indicators
{
[Indicator(IsOverlay = false, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
public class TwoPoleOscillator : Indicator
{
[Parameter("Filter Length", DefaultValue = 20, MinValue = 1)]
public int length { get; set; }
// === OUTPUTS ===
[Output("two_p", LineColor = "#55ffda", Thickness = 1)]
public IndicatorDataSeries two_p { get; set; }
[Output("two_pp")]
public IndicatorDataSeries two_pp { get; set; }
[Output("buy", PlotType = PlotType.Points, LineColor = "#55ffda", Thickness = 3)]
public IndicatorDataSeries buy_plot { get; set; }
[Output("sell", PlotType = PlotType.Points, LineColor = "#8c5bff", Thickness = 3)]
public IndicatorDataSeries sell_plot { get; set; }
// === SERIES ===
private IndicatorDataSeries sma_n1;
private IndicatorDataSeries sma_closeMinusSma1;
private IndicatorDataSeries smooth1;
private IndicatorDataSeries smooth2;
private SimpleMovingAverage sma1;
private SimpleMovingAverage sma_norm;
private StandardDeviation stdev_norm;
protected override void Initialize()
{
#if DEBUG
var result = System.Diagnostics.Debugger.Launch();
#endif
sma_n1 = CreateDataSeries();
sma_closeMinusSma1 = CreateDataSeries();
smooth1 = CreateDataSeries();
smooth2 = CreateDataSeries();
sma1 = Indicators.SimpleMovingAverage(Bars.ClosePrices, 25);
sma_norm = Indicators.SimpleMovingAverage(sma_closeMinusSma1, 25);
stdev_norm = Indicators.StandardDeviation(sma_closeMinusSma1, 25, MovingAverageType.Simple);
}
public override void Calculate(int index)
{
//if (index < 30)
// return;
// === CALCULATIONS ===
sma_closeMinusSma1[index] = (Bars.ClosePrices[index] - sma1.Result[index]);
sma_n1[index] = ((Bars.ClosePrices[index] - sma1.Result[index]) - (sma_norm.Result[index])) / stdev_norm.Result[index];
// === TWO-POLE FILTER ===
double alpha = 2.0 / (length + 1);
if (double.IsNaN(smooth1[index - 1]))
smooth1[index] = sma_n1[index];
else
smooth1[index] = (1 - alpha) * smooth1[index] + alpha * sma_n1[index];
if (double.IsNaN(smooth2[index - 1]))
smooth2[index] = sma_n1[index];
else
smooth2[index] = (1 - alpha) * smooth2[index] + alpha * smooth1[index];
two_p[index] = smooth2[index];
two_pp[index] = index >= 4 ? two_p[index - 4] : double.NaN;
// === SIGNALS ===
bool buy =
index > 4 &&
two_p[index - 1] < two_pp[index - 1] &&
two_p[index] > two_pp[index] &&
two_p[index] < 0;
bool sell =
index > 4 &&
two_p[index - 1] > two_pp[index - 1] &&
two_p[index] < two_pp[index] &&
two_p[index] > 0;
buy_plot[index] = buy ? two_p[index] : double.NaN;
sell_plot[index] = sell ? two_p[index] : double.NaN;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -my-charts