以下是TradingView中的Pine Script代码:
len = input(9, minval=1, title="Length")
high_ = highest(hl2, len)
low_ = lowest(hl2, len)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((hl2 - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1]))
fish1 = 0.0
fish1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(fish1[1])
fish2 = fish1[1]
以下是我尝试实现该指示器的方法:
public class FisherTransform : IndicatorBase
{
public int Length = 9;
public decimal[] Fish { get; set; }
public decimal[] Trigger { get; set; }
decimal _maxHigh;
decimal _minLow;
private decimal _value1;
private decimal _lastValue1;
public FisherTransform(IEnumerable<Candle> candles, int length)
: base(candles)
{
Length = length;
RequiredCount = Length;
_lastValue1 = 1;
}
protected override void Initialize()
{
Fish = new decimal[Series.Length];
Trigger = new decimal[Series.Length];
}
public override void Compute(int startIndex = 0, int? endIndex = null)
{
if (endIndex == null)
endIndex = Series.Length;
for (int index = 0; index < endIndex; index++)
{
if (index == 1)
{
Fish[index - 1] = 1;
}
_minLow = Series.Average.Lowest(Length, index);
_maxHigh = Series.Average.Highest(Length, index);
_value1 = Maths.Normalize(0.66m * ((Maths.Divide(Series.Average[index] - _minLow, Math.Max(_maxHigh - _minLow, 0.001m)) - 0.5m) + 0.67m * _lastValue1));
_lastValue1 = _value1;
Fish[index] = 0.5m * Maths.Log(Maths.Divide(1 + _value1, Math.Max(1 - _value1, .001m))) + 0.5m * Fish[index - 1];
Trigger[index] = Fish[index - 1];
}
}
}
问题
输出值似乎在预期范围内,但我的Fisher变换交叉点与TradingView版本的指标不匹配。
问题
如何在C#中正确实现Fisher Transform指标?我希望这能够与TradingView的Fisher Transform输出匹配。
我知道的
我已经检查了自己编写的其他指标以及TA-Lib的指标,并通过了单元测试。我还逐个蜡烛图检查了我的数据与TradingView数据是否匹配,并发现我的数据与预期相符。因此,我不认为我的数据有问题。
具体细节
下图显示了应用于TradingView图表的上述Fisher变换代码。我的目标是尽可能接近匹配此输出。
Fisher Cyan Trigger Magenta
预期输出:
于东部时间15:30完成交叉
大致 Fisher 值为2.86
大致 Trigger 值为1.79
于东部时间10:45完成交叉
大致 Fisher 值为-3.67
大致 Trigger 值为-3.10
实际输出:
于东部时间15:30完成交叉
我的 Fisher 值为1.64
我的 Trigger 值为1.99
于东部时间10:45完成交叉
我的 Fisher 值为-1.63
我的 Trigger 值为-2.00
Bounty
为了让您的生活更加轻松,我提供了一个小型控制台应用程序,其中包括通过和失败的单元测试。所有单元测试都针对相同的数据集进行。通过的单元测试来自经过测试的“简单移动平均”指标。失败的单元测试是针对所讨论的“Fisher变换”指标进行的。
项目文件 (更新于5/14)
帮助我通过FisherTransform测试,我会奖励赏金。
如果需要额外的资源或信息,请在评论中提出。
我会考虑的替代答案
提交您自己在C#中工作的FisherTransform
解释为什么我的FisherTransform实际上是按预期工作的