在分析中,中位数因其对异常值的特殊性而成为衡量统计样本中心趋势的重要指标。
在统计学里,有一个中位数的计算,首先将N个数排序,如果是N是偶数位取中间的两个数的均值,如果N是奇数位取中间的值。
Excel用median来表示,而这个在通达信中没有对应的公式,因此考虑用通达信dll插件实现。代码非常简单,直接C++搞个dll绑定通可
附图是C++编辑框代码,非常简单
Median中位数C++源代码:
// ChanLunTdx.cpp : 定义 DLL 应用程序的导出函数。//#include "stdafx.h"//ChanLunTdx.cpp:定义DLL应用程序的导出函数。//#include"stdafx.h"#include"ChanLunTdx.h"#include "..\..\TestPluginTCale\ChanLunTdx.h"//----------------------------------------------函数MEDIAN(X,N)-----------------------------------//别名:中位数//所属类别:引用函数参数数量:2//中位数。//用法:MEDIAN(X,N),求X的N日中位数。//算法:若为奇数,取中间数,否则取中间2个数的平均数//例如:MEDIAN(CLOSE,3)表示求第二日收盘价,MEDIAN(CLOSE,4)表示求中间2日收盘价的均价//通达中用的时候,第一个输入参数是收盘价,第2个输入参数是常量,第三个输入参数为空;//A:=TDXDLL2(3,C,5,0);//B:=TDXDLL2(3,C,10,0);//A,COLORWHITE;//B,COLORYELLOW;//void MEDIAN(int DataLen, float*pfOUT, float*pfINa, float*pfINb, float*pfINc){int N = int(*pfINb);float * buf = new float[N + 1];for (int i = N - 1; i<DataLen; i++){memcpy(buf, &pfINa[i - N + 1], sizeof(buf)*N);std::sort(&buf[0], &buf[N]);if (N % 2 == 0) // 偶数位,取中间的两个数的均值pfOUT[i] = (buf[N / 2] + buf[N / 2 - 1]) / 2;elsepfOUT[i] = buf[N / 2]; // 奇数位,最中间的一个数的值printf("%f\n", pfOUT[i]);}delete[]buf;}PluginTCalcFuncInfo g_CalcFuncSets[] ={{ 1,(pPluginFUNC)®ma },{ 2,(pPluginFUNC)&ahma },{ 3,(pPluginFUNC)&rma },{ 4,(pPluginFUNC)&vidya },{ 5,(pPluginFUNC)&evwma },{ 6,(pPluginFUNC)&wwma },{ 7,(pPluginFUNC)&Highpass },{ 8,(pPluginFUNC)&MEDIAN },{ 9,(pPluginFUNC)&sum },{ 0,NULL },};//导出给TCalc的注册函数//__cplusplusinline BOOL RegisterTdxFunc(PluginTCalcFuncInfo ** pFun){if (*pFun == NULL){(*pFun) = g_CalcFuncSets;return TRUE;}return FALSE;}
第一步,导入编辑好的dll函数

第二步绑定好后,选择TDXDLL1代表绑定的是第一个DLL

第三部在公式编辑器里输入TDXDLL1这个自定义函数

复制代码导入即可看出均线与中位数的区别
中位数:TDXDLL1(8,C,20,0),LINETHICK3;MA(C,20),POINTDOT,LINETHICK3;
最后,完成。

使用方法:可以很明显的看出,与移动平均线(MA)对比,中位数比平均线更能反映统计样本的准确性,就像大家的平均工资可能是1万,但是中位数却只有1000块,因此,中位数对极值的处理有非常独到之处,能够更好地反映样本间的数据关系。
夜雨聆风