龙听期货论坛's Archiver

C
+
+


 微信: QQ:

龙听 发表于 2024-9-27 15:28

鼎元C++期货量化/程序化教程【简单移动平均线(Simple Moving Average,sma/average)的计算方法及调用方法】

第一步:在test.h中定义这个均线名称,主要有两个名字,一个是计算用的建议用avg(类似MC中的function),另一个是调用的,可以设置为:ma;(类似mc中的var声明变量),在调用中周期的引用,命名 length;

即:[code]
private:
double avg, ma;
int length;
[/code]因为ma计时可能会有小数类的,所以用double类型数值

第二步:在test.cpp设计如何计算均线:(类似mc中的function 中的计算)[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 / n;
}
[/code]说明:

1、period:在交易软件界面设置的交易周期,并不是均线的周期,比方说60MIN ,即小时线。
2、 inst:具体的合约名称,也就是调用的品种的名称,比方说:rb2501 ,。
3、num:这才是真正的均线周期,类似mc中的avglength类的input参数。

4、计算原理:

(1)先声明两个变量,d 和 n 只在这里面有效与使用。
(2)map的使用,不明白的可以学这个去。
(3)一个for循环,不明白的可以到C++语法里面学习。
(4)it->second.dClose:意为dclose的数值或value。
(5) for会一直的循环,转一轮n会增加一个1,每转一轮d 会自动加一个K线的收盘价,相当于d做了收盘价的加总。直到 n>num,也就是我们设置的均线的周期就停止。
(6)停止后d 就是num周期中均线收盘价的加总,除以num周期就算当根的均线价格了。每走完一根k线,计算一次,得到最新的均线值。

第三步:逻辑运行方式,在test.cpp主程序中[code]//点击运行按钮动作
void test::OnRun()

在此中处理下方的调用程式码
}[/code]要调用上面的公式。[code]
RsqBar(sPeriod, sInst);
ma = avg(sPeriod, sInst, jxzq);
[/code]第一行是请求K线数据,(sPeriod, sInst) 周期与品种。第二步就是计算变量ma的均线值,avg是计算均线的function,(sPeriod是在交易界面设置的K线运行周期, sInst是要使用的具体的期货合约,length就是上面说到的num的具体周期,这个值是在交易界面参数设置里面设置的。

策略参数方面具体参考:[url=http://www.qhlt.cn/thread-158952-1-1.html]http://www.qhlt.cn/thread-158952-1-1.html[/url];)
交易界面设置参考:
[img]http://p.algo2.net/2024/0922/5d5d3a9b8d3fa.png[/img]

龙听 发表于 2024-11-2 14:53

第四步,还可以在BAR数据中调用即:[code]void test::OnBarOpen(TKVALUE t)
{
        mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
        
       ma = avg(sPeriod, sInst, length); //调用ma均线
        
      string s2 = "    合约    " + sInst + "    均线  " + to_string(ma); //定义字符串
      
       InsertLog(s2);//每个有新的bar产生,就会在log中输出

[/code]

龙听 发表于 2024-11-2 14:54

通过上面的两种方式都可以得到均线的数值,然后在tick或bar数据中使用就可以了。

页: [1]