此算法在WP7 个人炒股软件 GilStock 中用到
同花顺算法描述:
LC := REF(CLOSE,
1);
RSI$ 1:SMA(MAX(CLOSE-LC, 0),N1, 1)/SMA(ABS(CLOSE-LC),N1, 1)* 100;
RSI$ 2:SMA(MAX(CLOSE-LC, 0),N2, 1)/SMA(ABS(CLOSE-LC),N2, 1)* 100;
RSI$ 3:SMA(MAX(CLOSE-LC, 0),N3, 1)/SMA(ABS(CLOSE-LC),N3, 1)* 100;
a: 20;
d: 80;
RSI$ 1:SMA(MAX(CLOSE-LC, 0),N1, 1)/SMA(ABS(CLOSE-LC),N1, 1)* 100;
RSI$ 2:SMA(MAX(CLOSE-LC, 0),N2, 1)/SMA(ABS(CLOSE-LC),N2, 1)* 100;
RSI$ 3:SMA(MAX(CLOSE-LC, 0),N3, 1)/SMA(ABS(CLOSE-LC),N3, 1)* 100;
a: 20;
d: 80;
c#实现,理论区间内和新股上市的R1,R2,R3分别在N1,N2,N3天后的数据才是正常的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
///
<summary>
/// RSI算法 --跟同花顺一致
/// </summary>
/// <param name="N"> 6 </param>
/// <param name="M1"> 12 </param>
/// <param name="M2"> 24 </param>
/// <param name="KLStocklist"> K线数据 </param>
/// <returns></returns>
public static List<KLinfo> ComputationRSI( int N1, int N2, int N3, List<KLinfo> KLStocklist)
{
for ( int i = 0; i < KLStocklist.Count; i++)
{
double RSI1 = 0;
double RSI2 = 0;
double RSI3 = 0;
if (KLStocklist[i].KID == 1)
{
KLStocklist[i].RSI1 = 0;
KLStocklist[i].RSI2 = 0;
KLStocklist[i].RSI3 = 0;
KLStocklist[i].RSI1ABSEma = 0;
KLStocklist[i].RSI1ABSEma = 0;
KLStocklist[i].RSI2ABSEma = 0;
KLStocklist[i].RSI2ABSEma = 0;
KLStocklist[i].RSI3ABSEma = 0;
KLStocklist[i].RSI3ABSEma = 0;
}
else
{
double Rmax = Math.Max( 0, KLStocklist[i].ClosePrice - KLStocklist[i - 1].ClosePrice);
double RAbs = Math.Abs(KLStocklist[i].ClosePrice - KLStocklist[i - 1].ClosePrice);
KLStocklist[i].RSI1MaxEma = (Rmax + (N1 - 1) * KLStocklist[i - 1].RSI1MaxEma) / N1;
KLStocklist[i].RSI1ABSEma = (RAbs + (N1 - 1) * KLStocklist[i - 1].RSI1ABSEma) / N1;
KLStocklist[i].RSI2MaxEma = (Rmax + (N2 - 1) * KLStocklist[i - 1].RSI2MaxEma) / N2;
KLStocklist[i].RSI2ABSEma = (RAbs + (N2 - 1) * KLStocklist[i - 1].RSI2ABSEma) / N2;
KLStocklist[i].RSI3MaxEma = (Rmax + (N3 - 1) * KLStocklist[i - 1].RSI3MaxEma) / N3;
KLStocklist[i].RSI3ABSEma = (RAbs + (N3 - 1) * KLStocklist[i - 1].RSI3ABSEma) / N3;
if (KLStocklist[i].RSI1ABSEma != 0) RSI1 = (KLStocklist[i].RSI1MaxEma / KLStocklist[i].RSI1ABSEma) * 100;
KLStocklist[i].RSI1 = RSI1;
if (KLStocklist[i].RSI2ABSEma != 0) RSI2 = (KLStocklist[i].RSI2MaxEma / KLStocklist[i].RSI2ABSEma) * 100;
KLStocklist[i].RSI2 = RSI2;
if (KLStocklist[i].RSI3ABSEma != 0) RSI3 = (KLStocklist[i].RSI3MaxEma / KLStocklist[i].RSI3ABSEma) * 100;
KLStocklist[i].RSI3 = RSI3;
}
}
return KLStocklist;
}
/// RSI算法 --跟同花顺一致
/// </summary>
/// <param name="N"> 6 </param>
/// <param name="M1"> 12 </param>
/// <param name="M2"> 24 </param>
/// <param name="KLStocklist"> K线数据 </param>
/// <returns></returns>
public static List<KLinfo> ComputationRSI( int N1, int N2, int N3, List<KLinfo> KLStocklist)
{
for ( int i = 0; i < KLStocklist.Count; i++)
{
double RSI1 = 0;
double RSI2 = 0;
double RSI3 = 0;
if (KLStocklist[i].KID == 1)
{
KLStocklist[i].RSI1 = 0;
KLStocklist[i].RSI2 = 0;
KLStocklist[i].RSI3 = 0;
KLStocklist[i].RSI1ABSEma = 0;
KLStocklist[i].RSI1ABSEma = 0;
KLStocklist[i].RSI2ABSEma = 0;
KLStocklist[i].RSI2ABSEma = 0;
KLStocklist[i].RSI3ABSEma = 0;
KLStocklist[i].RSI3ABSEma = 0;
}
else
{
double Rmax = Math.Max( 0, KLStocklist[i].ClosePrice - KLStocklist[i - 1].ClosePrice);
double RAbs = Math.Abs(KLStocklist[i].ClosePrice - KLStocklist[i - 1].ClosePrice);
KLStocklist[i].RSI1MaxEma = (Rmax + (N1 - 1) * KLStocklist[i - 1].RSI1MaxEma) / N1;
KLStocklist[i].RSI1ABSEma = (RAbs + (N1 - 1) * KLStocklist[i - 1].RSI1ABSEma) / N1;
KLStocklist[i].RSI2MaxEma = (Rmax + (N2 - 1) * KLStocklist[i - 1].RSI2MaxEma) / N2;
KLStocklist[i].RSI2ABSEma = (RAbs + (N2 - 1) * KLStocklist[i - 1].RSI2ABSEma) / N2;
KLStocklist[i].RSI3MaxEma = (Rmax + (N3 - 1) * KLStocklist[i - 1].RSI3MaxEma) / N3;
KLStocklist[i].RSI3ABSEma = (RAbs + (N3 - 1) * KLStocklist[i - 1].RSI3ABSEma) / N3;
if (KLStocklist[i].RSI1ABSEma != 0) RSI1 = (KLStocklist[i].RSI1MaxEma / KLStocklist[i].RSI1ABSEma) * 100;
KLStocklist[i].RSI1 = RSI1;
if (KLStocklist[i].RSI2ABSEma != 0) RSI2 = (KLStocklist[i].RSI2MaxEma / KLStocklist[i].RSI2ABSEma) * 100;
KLStocklist[i].RSI2 = RSI2;
if (KLStocklist[i].RSI3ABSEma != 0) RSI3 = (KLStocklist[i].RSI3MaxEma / KLStocklist[i].RSI3ABSEma) * 100;
KLStocklist[i].RSI3 = RSI3;
}
}
return KLStocklist;
}
WP7 效果:
同花顺效果:
最后一个数据对不上因为在交易时间,截图时候有时间差