将反向移动平均公式转换为C#
我一直绞尽脑汁想把这个公式转换成C,但没有成功 。将反向移动平均公式转换为C#,c#,moving-average,trading,algorithmic-trading,quantitative-finance,C#,Moving Average,Trading,Algorithmic Trading,Quantitative Finance,我一直绞尽脑汁想把这个公式转换成C,但没有成功 。 我擅长编程,但不擅长数学 其中0
我擅长编程,但不擅长数学 其中0<λ≤ 1是衰减因子。
当λ<1时,指数加权移动平均值为价格分配更大的权重 与常规的指数移动平均线相反,指数移动平均线 加权到最近的价格,逆指数移动 average为最早的价格和价格分配更大的权重 降低最近价格的重要性
在我看来,这是一个和除以另一个。以下是我试图给出的直截了当的答案。我的结果绝对是平均值,更倾向于列表中较早的条目,但我不知道它们是否正确
double[] m_prices;
public double Rema(int k, double lambda)
{
// Simple parameter validation
if(lambda == 0.0 || k == 0)
return 0.0;
// Ensure the iteration will not be larger than the number of entries
int t = m_prices.Length - 1;
k = Math.Min(t, k);
double numerator = 0;
double denominator = 0;
for (int j = 0; j <= k; j++)
{
// Preform the 2 sigma operations from the formula
numerator += Math.Pow(lambda, k-j) * m_prices[t - j];
denominator += Math.Pow(lambda, k-j);
}
// Simple error check
if (denominator == 0.0)
return 0.0;
return numerator / denominator;
}
double[]m_价格;
公共双Rema(整数k,双λ)
{
//简单参数验证
如果(λ=0.0 | | k==0)
返回0.0;
//确保迭代次数不会大于条目数
int t=m_.Length-1;
k=数学最小值(t,k);
双分子=0;
双分母=0;
对于(int j=0;j高效REMA()
,带有错误检查和特定于上下文的返回值
高效?是的,避免重复昂贵的操作(或依赖编译器优化技巧)
带有错误检查功能?是的,几乎是Q/a程序的必备功能
特定于上下文?是,返回{-1.|REMA(k,lambda)}
,允许调用方处理输入错误的情况
double[]fTimeSeriesPRICE;//一个正向步进存储器(与MT4反向步进模型相比)
公共双REMA(整数k,双λ)
{
如果(λ1.0/)不应超过1.0
||感谢您提出有关堆栈溢出的问题!为了让我们帮助您,您必须发布一些您尝试过的代码,并更具体地说明您遇到的一些问题。如果int k<0(由于指针代数)和lambda<0,建议的方案将失败(由于下溢,定义范围给出的上限)和int j永远不会低于0(由于大k-s的反向访问m_价格[]的指针下溢限制),定义失败。如果k感谢您的用户。基本上我想将其转换为忍者脚本(忍者交易平台)这与MT4在引用图表上的条形图(当前条形图为[0])时类似。如何使用反向步进编码。StackOverflow鼓励用户将问题集中在单个原始主题上。请毫不犹豫地[Accept]这是第一个原始问题的答案,并打开下一个新问题,如您所示。
double[] fTimeSeriesPRICE; // a forward-stepping storage ( vs. a MT4 reversed-stepping model )
public double REMA( int k, double lambda )
{
if ( lambda <= 0.0 // lambda shall not fall on/under 0.0
|| lambda > 1.0 // shall not grow beyond 1.0
|| k <= 0 // depth shall not be negative or 0
)
return -1.0; // context-protecting RET value
int aCurrentPricePTR = fTimeSeriesPRICE.Length - 1;
int aMaxIterableDEPTH = Math.Min( aCurrentPricePTR, k );
double numerator = 0.0;
double denominator = 0.0; // REMA formula-expansion contains +1 at the end, never less, never negative
double lambdator = 1.0; // lambda ^ ( ( k - j ) == 0 ) == 1.0
for ( int aReverseSteppingPTR = 0;
aReverseSteppingPTR <= aMaxIterableDEPTH;
aReverseSteppingPTR++
)
{ numerator += lambdator * fTimeSeriesPRICE[aCurrentPricePTR - aReverseSteppingPTR];
denominator += lambdator;
lambdator *= lambda;
}
return numerator / denominator; // numerically fair, denominator never < +1.0
}