基于MT4平台通过CTP操作期货(一) -- 行情

通过MT4平台来由ctp接口操作期货,首先需要处理好商品和行情

1.期货商品品种

由于期货商品代号会随着时间变化,且商品品种较多,手动维护商品的话太繁琐。比较简单的处理方式
是做一个服务端的插件,在插件的启动事件

int APIENTRY MtSrvStartup(CServerInterface *server)

去检查并新增商品代号
这里主要用到了MT4接口的这两个个方法,取商品信息和新增商品

int         __stdcall SymbolsGet(LPCSTR symbol,ConSymbol *security);
int         __stdcall SymbolsAdd(ConSymbol *sec);

期货的品种种类是相对固定的,变化的只是月份,所以可以考虑常量定义相关种类,也可以考虑直接从四大期货的网站去爬。
我是直接用常量定义种类,然后根据当前月份计算目前的期货品种。

SymbolDefine Defines[SYMBOL_DEF_COUNT] = {
    //中国金融期货交易所 CFFEX
    { "沪深300", "IF", 1, 1, {0}, 0},//当月、下月及随后两个季月(如当前为3月,则为4","5","6","9}},
    { "上证50", "IH", 1, 1, {0}, 0},//当月、下月及随后两个季月
    { "中证500", "IC", 1, 1, {0}, 0},//当月、下月及随后两个季月
    { "5年期国债", "TF", 3, 2, {0}, 0},//最近的三个季月(3月、6月、9月、12月中的最近三个月循环)(当前为3月 则为6","9","12}},
    { "10年期国债", "T", 3, 2, {0}, 0},//最近的三个季月(3月、6月、9月、12月中的最近三个月循环)
    //上海期货交易所  SHFE
    { "铜", "cu", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "铝", "al", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "锌", "zn", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "铅", "pb", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "镍", "ni", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "锡", "sn", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "黄金", "au", 2, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "白银", "ag", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "螺纹钢", "rb", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "线材", "wr", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "热轧卷板", "hc", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "燃料油", "fu", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "沥青", "bu", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    { "天然橡胶", "ru", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 1},
    //大连商品交易所  DCE
    { "玉米", "c", 0, 0, { 1, 3, 5, 7, 9, 11 }, 2},
    { "玉米淀粉", "cs", 0, 0, { 1, 3, 5, 7, 9, 11 }, 2},
    { "黄大豆1号", "a", 0, 0, { 1, 3, 5, 7, 9, 11 }, 2},
    { "黄大豆2号", "b", 0, 0, { 1, 3, 5, 7, 9, 11 }, 2},
    { "豆粕", "m", 0, 0, { 1, 3, 5, 7, 8, 9, 11, 12 }, 2},
    { "豆油", "y", 0, 0, { 1, 3, 5, 7, 8, 9, 11, 12 }, 2},
    { "棕榈油", "p", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "纤维板", "fb", 2, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "胶合板", "bb", 2, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "鸡蛋", "jd", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "聚乙烯(塑料}},", "l", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "聚氯乙烯(PVC}},", "v", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "聚丙烯", "pp", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "焦炭", "j", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "焦煤", "jm", 1, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    { "铁矿石", "i", 1, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 2},
    //郑州商品交易所 CZCE
    { "强麦", "WH", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "普麦", "PM", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "棉花", "CF", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "白糖", "SR", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "PTA", "TA", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 3},
    { "菜籽油", "OI", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "早籼稻", "RI", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "甲醇", "MA", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 3},
    { "玻璃", "FG", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 3},
    { "菜籽", "RS", 0, 0, { 7, 8, 9, 11 }, 3},
    { "菜粕", "RM", 0, 0, { 1, 3, 5, 7, 8, 9, 11 }, 3},
    { "动力煤", "ZC", 1, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 3},
    { "粳稻", "JR", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "晚籼稻", "LR", 0, 0, { 1, 3, 5, 7, 9, 11 }, 3},
    { "硅铁", "SF", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 3},
    { "锰硅", "SM", 0, 0, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12 }, 3}
};

然后通过插件方便的新增所有的期货品种到MT4中
这里写图片描述

这里写图片描述

2.行情数据

处理好品种问题,接下来就是行情数据。
行情数据主要是两个事情,一个是用CTP接口取到数据,另一个是把数据写入MT4

1)取CTP的行情数据

只需要用到CTP的行情接口CThostFtdcMdApi

    // 初始化UserApi
    pUserApi = CThostFtdcMdApi::CreateFtdcMdApi();          // 创建UserApi
    CThostFtdcMdSpi* pUserSpi = new CMdSpi();
    pUserApi->RegisterSpi(pUserSpi);                        // 注册事件类
    pUserApi->RegisterFront(FRONT_ADDR);                    // connect
    pUserApi->Init();

    pUserApi->Join();
//  pUserApi->Release();

在连接成功后,调用登录并订阅行情即可。

pUserApi->ReqUserLogin(&req, ++iRequestID);
SubscribeMarketData();
SubscribeForQuoteRsp();

CTP都有比较详细的接口说明,相关文档都很健全,这里就不多说了。

2)数据写入MT4
数据写入MT4有两个方式 都可以做到。
一个方式是使用DataFeed接口,做一个行情插件,关于行情插件有在此文(http://blog.csdn.net/mt4develop/article/details/51251465)简单介绍,这里的话,就是在行情插件中去调用CTP接口取报价数据即可。
另一个方式是使用普通插件接口,用接口的扩展事件

int   APIENTRY       MtSrvTelnet(char *buf, const int maxlen)

此接口可用于 向MT4发送任意自定义的数据,插件在此事件中处理即可。
那么此处可以做一个外部程序调用CTP接口取得数据,然后把数据发给MT4的扩展接口,然后在此事件中调用MT4新增报价的方法即可。

void        __stdcall HistoryAddTick(FeedData *tick);
### 回答1: MT4-DKX多空分水线是一款专为MetaTrader 4平台设计的技术指标扩展文件(.ex4)。该指标的主要作用是帮助交易者判断市场的多空力量变化和趋势反转的时机。 该指标的计算基于市场价格和成交量的综合分析。它通过分析市场的多空力量平衡来判断市场趋势的转折点。在图表上,MT4-DKX多空分水线以分水线的形式呈现,当多头力量高于空头力量时,分水线上升,表示多头趋势;当空头力量高于多头力量时,分水线下降,表示空头趋势。交叉分水线的位置则表示市场趋势发生了反转的可能,提示交易者注意趋势变化。 该指标的应用可以帮助交易者更好地理解市场趋势,并作出相应的交易决策。当分水线上升或下降时,交易者可以借此确认市场的多空力量强弱,并考虑进一步的买入或卖出机会。当分水线交叉时,交易者可以借此判断趋势反转的可能性,以避免错过逆势交易机会。 总结而言,MT4-DKX多空分水线是一款可在MetaTrader 4平台上使用的技术指标,通过对市场多空力量的综合分析来判断市场趋势的转折点。它的应用能够帮助交易者更好地把握市场行情,作出更明智的交易决策。 ### 回答2: MT4-DKX多空分水线是一种基于MetaTrader 4(MT4平台的技术指标,它的全称是MT4-DKX Bull Bear Separation Line。这个指标旨在帮助交易者观察市场趋势的转变。它通过计算一段时间内的股价波动平均值,并将其以曲线图的形式呈现,以便交易者更加直观地观察市场的多空力量。 在MT4-DKX多空分水线指标中,分水线的主要含义是表示市场空多力量的分割线。当股价在分水线上方运动时,意味着市场处于多头(上涨)状态;而当股价低于分水线时,意味着市场处于空头(下跌)状态。交易者可以根据这个指标的图表变动来判断市场当前的多空态势,从而制定相应的交易策略。 此外,MT4-DKX多空分水线指标还可以配合其他技术指标一起使用,以增强分析和决策的准确性。比如,交易者可以将其与其他趋势指标如移动平均线等进行比较,来进一步确认市场的多空趋势,并推测未来价格的走势。 总之,MT4-DKX多空分水线是一种用于辅助交易决策的技术指标,通过分析股价的均值波动情况,帮助交易者判断市场的多空力量和趋势变化。使用此指标可以更好地把握市场的行情,从而更加科学和有依据地进行交易操作
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值