龙听期货论坛's Archiver

龙听 发表于 2024-11-8 14:45

鼎元C++期货量化/程序化教程【如何设计与调用一个技术指标(以经典的均线指标为例)】

第一部分:在头文件中声明一个变量:(以均线为例,取名为:avg,为防止取名与C++系统计算基础函数冲突,建议不要用经典的数学计算英文命名;均线周期取名为:num。均线数值可能有小数所以类型我用double类型,均线周期都是整数,所以我就int(整数)类似,这是计算均线函数。我想在平时使用过程中给它取名ma,这样方便大家都知道它是哪个指标。)[code]
private:
    int num;
    double avg , ma;
[/code]为了其它人能方便的知道这些变量各中什么用处,我把名称分到各自的分类中:[code]private:
        //公式指标(function)变量设计(开始)******************************************
        double avg(string period, string inst, int num);
        double highest(string period, string inst, int num);
        double lowerest(string period, string inst, int num);
        double avg1(string period, string inst, int num, int ref);
        double highest1(string period, string inst, int num, int ref);
        double lowerest1(string period, string inst, int num, int ref);
        //公式指标(function)变量设计(结束)******************************************

private:
        //交易界面策略参数设置相关的变量设计(开始)*******************************
        int jxzq, jyfx, num, hd, yxpc, jg, fx, ss, tm, dbfx, cscc, tb;
        double jx, zg, zd, ma,ma1;
        string entrymodel;
        //交易界面策略参数设置相关的变量设计(结束)*******************************
};[/code]第二部分:均线计算思路:将从现在K线的收盘价往前加num个周期总和然后除以num就能得到平均值了。要用到for循环语句;[code]double test::avg(string period, string inst, int num)
{
    double d = 0;
    int n = 0;
    map<string, TKVALUE>::reverse_iterator it;
    for (it = mapK[period][inst].rbegin(); it != mapK[period][inst].rend(); ++it)
    {
        d += it->second.dClose;
        n++;
        if (n >= num)break;
    }
    return d / num;
}[/code]经过num轮的取值后就可以通过总和除以周期num 获得平均值了。下面我们将在策略里面引用它。

第三部分:如何在策略与调用这个均线函数;

要调用均线avg函数,在策略程式码中我们要先调用K线数据,然后将这些数据调入函数,然后计算出均线。

调用可以在:

初建化时【InitParm()】模块、点击“运行”时【OnRun() 】模块、tick数据传入时【OnMarketData】及新bar产生时【OnBarOpen】中。因为申请调用K线数据只需要申请一次就行了,后面一直可用,所以可以在程式码最靠前的地方申请,也就是初始化时。[code]
RsqBar(sPeriod, sInst); //申请调用bar数据
ma = avg(sPeriod, sInst, jxzq); //调用数据,jxzg就是可参考MC中的均线常用变量length。
[/code]这样就求得了特定周期,特定品种的bar线的length周期的均线值了。

页: [1]