龙听期货论坛's Archiver

龙听 发表于 2024-10-10 18:51

鼎元C++期货量化/程序化教程【交易与委托模块】

两种不同数据驱动模块下,不同的进出场语句1:开仓语句

一:tick数据驱动模块事件中:

(1)买入开仓语句:[code]OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句[/code]说明:

1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

(2)卖出开仓语句:[code]OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句[/code]说明:

1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

二:bar数据驱动模块事件中:

(1)买入开仓语句:[code]OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句[/code]说明:

1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

(2)卖出开仓语句:[code]OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句[/code]说明:

1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

龙听 发表于 2024-10-10 18:58

两种不同数据驱动模块下,不同的进出场语句2:平仓语句

一:tick数据驱动模块事件中:

(1)买入平仓语句:[code]OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句[/code]说明:

1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

(2)卖出平仓语句:[code]OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句[/code]说明:

1、t->AskPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

二:bar数据驱动模块事件中:

(1)买入平仓语句:[code]closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓[/code]说明:

1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

(2)买入平仓语句:[code]closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓[/code]说明:

1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

(3)卖出平仓语句:[code]closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓[/code]说明:

1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

(4)卖出平仓语句:[code]closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓[/code]说明:

1、mapMd[sInst].BidPrice1 ,最新tick的价格。
2、hd,滑点,交易参数设置中设定
3、mapInstrument[sInst].PriceTick,最小波动价位,即一跳代表的值。
4、sl,交易数量,委托手数。

龙听 发表于 2024-10-10 19:08

区别就是两种数据驱动模式下,数据模块结构是不同的。

1、在tick数据模式下,最新价使用[code]t->BidPrice1[/code]2、在bar数据模式下,最新价使用[code]mapMd[sInst].BidPrice1[/code]

龙听 发表于 2024-10-10 21:18

bar事件驱动模式下范例:[code]void test::OnBarOpen(TKVALUE t)
{
        if (state != "run")return;
        if (t.InstrumentID != sInst)return;
        mapK[sPeriod][sInst][t.sDate + t.sDayNight + t.sTime] = t;
        ma = avg(sPeriod, sInst, jxzq);
        string s2 = "    合约    " + sInst + "    均线  " + to_string(ma);
        InsertLog(s2);

        //(1)最新价小于均线价格,无持仓进行卖出开仓模块
        if (mapMd[sInst].LastPrice < ma && fx == 0)
        {
                fx = -1;
                ss = dbfx;
                map<string, double>::iterator it;
                for (it = mapSub.begin(); it != mapSub.end(); it++)
                {
                        int sl = (int)(ss * it->second);
                        OrderInsert(it->first, sInst, '1', '0', sl, mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");//卖出开仓语句
                        string s = it->first + "    突破入场价格空单达到入场条件卖出开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
                        maps[num] = s;
                        num++;

                }
                if (num != 0)shuchurizhi();
                tm = 0;
                xieruzhuangtai();
        }
        //(2)最新价大于均线价格,无持仓进行卖入开仓模块
        if (mapMd[sInst].LastPrice > ma && fx == 0)
        {
                fx = 1;
                ss = dbfx;
                map<string, double>::iterator it;
                for (it = mapSub.begin(); it != mapSub.end(); it++)
                {
                        int sl = (int)(ss * it->second); //获取根据单笔风险计算的交易数量并赋值给(sl)数量
                        OrderInsert(it->first, sInst, '0', '0', sl, mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
                        //输出至交易界面的log里面
                        string s = it->first + "    突破入场价格多单达到入场条件买入开仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
                        maps[num] = s;
                        num++;
                }
                if (num != 0)shuchurizhi();
                tm = 0;
                xieruzhuangtai();
        }

        //(3)最新价小于均线价格,持有多单进行平仓模块
        if (mapMd[sInst].LastPrice < ma && fx == 1)
        {
                fx = 0;
                map<string, double>::iterator it;
                for (it = mapSub.begin(); it != mapSub.end(); it++)
                {
                        int sl = (int)(ss * it->second);
                        if (yxpc == 0)
                        {
                                closesell1(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平昨仓
                        }
                        else if (yxpc == 1)
                        {
                                closesell2(it->first, sInst, sl, mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick);//卖出平仓,优先平今仓
                        }
                        string s = it->first + "    多单跌破均线达到出场条件卖出平仓    " + to_string(sl) + "    手,价格    " + to_string(mapMd[sInst].BidPrice1 - hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
                        maps[num] = s;
                        num++;
                }
                if (num != 0)shuchurizhi();
                tm = 0;
                xieruzhuangtai();
        }
        //(4)最新价大于均线价格,持有空单进行平仓模块
        if (mapMd[sInst].LastPrice > ma && fx == -1)
        {
                fx = 0;
                map<string, double>::iterator it;
                for (it = mapSub.begin(); it != mapSub.end(); it++)
                {
                        int sl = (int)(ss * it->second);
                        if (yxpc == 0)
                        {
                                closebuy1(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平昨仓
                        }
                        else if (yxpc == 1)
                        {
                                closebuy2(it->first, sInst, sl, mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick); //买入平仓,优先平今仓
                        }
                        string s = it->first + "    空单涨破均线达到出场条件买入平仓    " + to_string(ss) + "    手,价格    " + to_string(mapMd[sInst].AskPrice1 + hd * mapInstrument[sInst].PriceTick) + "  基础手数  " + to_string(ss) + "  均线 " + to_string(ma);
                        maps[num] = s;
                        num++;
                }
                if (num != 0)shuchurizhi();
                tm = 0;
                xieruzhuangtai();

        }
}[/code]

龙听 发表于 2024-10-10 21:19

tick数据驱动模式下范例:[code]void test::OnMarketData(CThostFtdcDepthMarketDataField* t)
{
        if (state != "run")return;
        if (t->InstrumentID != sInst)return;
        mapMd[t->InstrumentID] = *t;

        if (t->LastPrice > ma && fx == 0)
        {
                fx = 1;
                ss = dbfx;
                map<string, double>::iterator it;
                for (it = mapSub.begin(); it != mapSub.end(); it++)
                {
                        int sl = (int)(ss * it->second);
                        OrderInsert(it->first, sInst, '0', '0', sl, t->AskPrice1 + hd * mapInstrument[sInst].PriceTick, "", "");//买入开仓语句
                        //输出至交易界面的log里面
                        string s = it->first + " 突破入场价格多单达到入场条件买入开仓 " + to_string(sl) + " 手,价格 " + to_string(t->AskPrice1 + hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
                        maps[num] = s;
                        num++;
                }
                if (num != 0)shuchurizhi();
                tm = 0;
                xieruzhuangtai();
        }
        if (t->LastPrice < ma && fx == 0)
        {
                fx = -1;
                ss = dbfx;
                map<string, double>::iterator it;
                for (it = mapSub.begin(); it != mapSub.end(); it++)
                {
                        int sl = (int)(ss * it->second);
                        OrderInsert(it->first, sInst, '1', '0', sl, t->BidPrice1 - hd * mapInstrument[sInst].PriceTick, "", "");
                        string s = it->first + " 突破入场价格空单达到入场条件卖出开仓 " + to_string(sl) + " 手,价格 " + to_string(t->BidPrice1 - hd * mapInstrument[sInst].PriceTick) + " 基础手数 " + to_string(ss) + " 均线 " + to_string(ma);
                        maps[num] = s;
                        num++;

                }
                if (num != 0)shuchurizhi();
                tm = 0;
                xieruzhuangtai();
        }
}[/code]

页: [1]