加入 |登录

策略交易高峰会论坛EasyLanguage/PowerLanguage 策略语言研究 › 查看主题

916

查看

6

回复
返回列表

Rank: 2Rank: 2

go

[程序代码分享] 高手们来鉴定一下我写的el程序,dll桥接到外部程序

楼主
发表于 2012-1-6 10:49 | 只看该作者 | 倒序看帖 | 打印


唠叨两句先。

我现在用的是达钱+mc,程序模拟测试,没有做过实盘期货,之前做了几年的外汇保证金交易,全自动交易,不做手工,小赚了一点。
用过的平台是mt4和瑞士的dokascopy,拿它们和mc比较一下。

一、平台
mc平台的结构和组件远比mt4和dokascopy复杂,后面两者就一个客户端,提供全部功能。
稳定性和速度,mc差很远,我的mc基本每天都会出问题,一般都是内存访问出错,然后异常退出,出问题比较多的是 tsserver 进程。
实盘交易,有些担心。
做软件开发的人都知道,内存错误,是非常致命的。

二、编程语言
mt4的语言类似于c,功能很强大,可以在api中指定交易品种,可控性很强,提供文件输入输出,支持dll。
dokascopy则更为强大,编程语言干脆就是java,理论上啥都能做。

mt4很稳定强大,目前我发现的唯一缺点就是不支持多品种同时交易的程序的复盘测试。不过可以用插件解决。
dokascopy更强大,目前没发现什么缺点。
mc了解不多,但按照目前的了解来看,交易时不能指定品种,一个程序中交易多个品种,看来不行,至于复盘则不用想了。

mc的语言是el,一种伪语言。伪语言的特点就是功能弱,难于扩展,稳定性,速度(有时候需要复杂的数学模型运算)慢,外部接口少。

el也有这些缺点,但是比较奇怪的是el在很努力的完善,尽量强大,算是伪语言里面比较认真的一个吧。

传言mc很好很强大,这个继续了解吧

三、头寸管理
头寸的管理,mt4/dokascopy/mc大不一样。
比如我下一手多,再下一手多。在mt4里面是有两个单子,而mc干脆就没有单子的概念,干脆就是持仓2手。
比如我下一手多,再下一手空。在mt4里面是有两个单子,而mc干脆就没有单子的概念,干脆就是不持仓。我日。
mt4开单就是开单,api出去后返回值就是成交结果。mt4也支持limit和stop等挂单。
mc干脆没有开单,本质上就是limit和stop,开单也是委托,实际就是limit单。然后mc也不能管理挂单。
这个很不习惯。

mt4可以锁单,锁单的目的,有时候可能只是为了吃尽波动,比如我每隔30个点开多开空各一手,止盈20点不止损,不停的做,达到一定盈利后全部平仓。

mt4中,多就是多,空就是空,空单也是单。。。
mc中,似乎没有空的概念,空不是空,空是减仓。

mt4,多是多,多可以平仓;空就是空,空单也可平仓;平仓就是平仓,不分多空。
mc里面,多是多,空不是空,空是减仓。多单平仓不叫平仓,叫卖出平仓;空单空仓不叫平仓,叫买入平仓,我日。

搞得有点神经衰弱。

四、交易思路
考虑到我的程序逻辑比较复杂,el很难学,没把握,我把程序主体用java来实现,程序附件用el实现,附件运行在mc中。
程序主体执行逻辑判断,它所需要的行情由附件提供,程序主体的下单和平仓由附件来完成。

关系如下:

程序主体  《--(期货行情)  程序附件el
程序主体  (下单平仓等交易指令)--》  程序附件el

el中输出行情可以用文件输出,el中要执行的交易指令居然不提供文件输入,可能是我没找到,但这个很坑爹。

只好做个dll给程序附件用了,dll的参数值是期货行情值,dll的返回值是交易指令,就这么搞了。

目前发现另外的一个坑爹函数是currentshares,这个函数似乎只能返回最近一次程序启动后的持仓。
考虑一下如下过程:
1、程序启动,开一手多
2、由于某种原因,比如tsserver崩溃,程序停了
3、程序重新启动,再开一手多,这个时候调用currentshares,居然得到的是一手。我日。。。难道是我搞错了

程序如下:

/*定义一个外部的dll调用McReport1,用于向外部程序主体汇报当前价格行情,并返回当前品种的持仓,本程序根据持仓状况自动增减仓。
参数一:外部主体的地址
参数二:端口
参数三:价格行情
返回值:ok+仓位。如ok+9表示当前持多头9手,ok-6表示当前持空头6手,ok+0表示当前不持仓
*/
DEFINEDLLFUNC: "X:\JTT\eclipse-workspace\c-future\mcdll3\mcdll3.dll", lpstr, "McReport1", lpstr, int, lpstr;

variables: host("127.0.0.1");
variables: port(8888);
variables: ret("");
variables: s1("");
variables: lots(0);

if getappinfo(airealtimecalc) = 1 and getappinfo(aistrategyauto) = 1 then begin
    if (bartype<>0 or barinterval<>1) then begin    //必须运行于tick图表
        messagelog(symbolname, ": ", "error bartype");
        //这里应该要return,可惜我不知道语句怎么写
    end;

    s1 = symbolname+","+NumToStr(currentdate,0)+","+NumToStr(currenttime_s,0)+","+NumToStr(dailyopen,2)+","+NumToStr(dailyclose,2)+","+NumToStr(InsideAsk,2)+","+NumToStr(InsideBid,2)+";;;";    // + ":" + tradedate + "-" + tradetime + ":" + Close;
    //messagelog(symbolname, ": ", s1);
    ret = McReport1(host, port, s1);
    if InStr(ret,"error:")>0 then messagelog(symbolname, ": ", ret);
   
    if InStr(ret, "ok:")>0 then begin //开始处理仓位        
        lots = StrToNum(MidStr(ret,4,StrLen(ret)-3));
        //messagelog(symbolname, ": lots=", lots);        
        //messagelog(symbolname, ": MarketPosotion=", MarketPosition(0));        
        if lots=0 and currentshares>0 then begin //需要全部平仓
            if MarketPosition(0)>0 then begin
                messagelog(symbolname, ": close buy");   
                sell 1 share total next bar at open; //卖出一手平多头。。。这里我不知道怎么写程序平掉全部多头
            end;
            if MarketPosition(0)<0 then begin
                messagelog(symbolname, ": close sell");   
                buytocover 1 share total next bar at open; //买入一手平空头。。。这里我不知道怎么写程序平掉全部多头
            end;
        end;
        if lots>0 and lots>currentshares then begin
            messagelog(symbolname, ": buy this bar at open");     //开一手多
            buy 1 share next bar at open;
        end;
        if lots>0 and lots<currentshares then begin
            messagelog(symbolname, ": close buy");   
            sell 1 share total next bar at open;  //平一手多
        end;
        if lots<0 and (-1)*lots>currentshares then begin
            messagelog(symbolname, ": sell this bar at open");    //开一手空
            sell short 1 share next bar at open;
        end;
        if lots<0 and (-1)*lots<currentshares then begin
            messagelog(symbolname, ": close sell");   
            buytocover 1 share total next bar at open;            //平一手空
        end;
    end;
end;

好文分享,是超英赶美的关键! QQ书签=>QQ书签 百度搜藏=>百度搜藏

Google书签=> Google书签 新浪Vivi=> 新浪ViVi

Rank: 2Rank: 2

沙发
发表于 2012-1-6 10:52 | 只看该作者
补充一下,mc里面的弯弯肠子真多,对交易的过程和细节控制太多,程序化的功能反而很弱,也就是说交易细节的把握被平台掌控了,程序自主的空间很小。而mt4中,交易细节都能控制。

Rank: 4Rank: 4Rank: 4Rank: 4

板凳
发表于 2012-1-6 14:18 | 只看该作者
回复 1# wp00000008 的帖子
   

一、平台
LZ: “
稳定性和速度,mc差很远,我的mc基本每天都会出问题,一般都是内存访问出错,然后异常退出,出问题比较多的是 tsserver 进程。
my point1:

MC对电脑内存要求比较高,2~4G为好。如果图表或指标过多的话,会内存不足——这时关掉MC,重新打开就OK啦;

或者如果MC短时间内反复开启关闭的话,TSserver还没完全关闭,则会导致异常——可以先在任务管理器的进程中,结束tsserver进程,过一会再开启。



二、编程语言
ZL:“mc了解不多,但按照目前的了解来看,交易时不能指定品种,一个程序中交易多个品种,看来不行,至于复盘则不用想了。
MY point2
http://www.multicharts.cn/product/index.php

1MC交易可以指定品种
只要画图画出指定合约,就可以交易指定品种;当然,指定合约,需要自己在QM中添加的。
                                                           


2)一个程序也可以交易多个品种

只要每个品种各开一张图,每张图上都插入同一个程序策略就可以了
                              

LZ:“传言mc很好很强大,这个继续了解吧”

My Point3: 回测功能目前还是比较强的,支持多品种多策略多周期的回测

三、头寸管理

MyPoint4:

MC本身设计的就是不支持锁仓的,如果想要锁仓可以在达钱中自己手动再下反向单。

因为不支持锁单,所以
1)有一手多单(buy1)后,sell1,就是平仓了,头寸当然是为0
2)有一手多单(buy1)后,sellshort1,就会先平掉之前的多单,再开一手空单,头寸由+1变为-1
或者(3)有一手空单(sellshort1)后,再buytocover1,也是平空单,头寸为0

4)有一手空单(sellshort1)后,再buy1,就会先平掉之前的空单,再开一手多单,头寸由-1变为+1

MyPoint4:

MCstop单是通过达钱来下到交易所的,在本地端挂单等待触价,一旦价格达到就会发送到交易所,

LZ:“mc里面,多是多,空不是空,空是减仓。多单平仓不叫平仓,叫卖出平仓;空单空仓不叫平仓,叫买入平仓,我日。”

MyPoint6

这是国内习惯和台湾习惯叫法不同,楼主既然可以这么明白的区分开来,何须这么挑剔呢?多一种学习,多一种看法而已,没有坏处的吧?

四、交易思路

LZ:“3、程序重新启动,再开一手多,这个时候调用currentshares,居然得到的是一手

MyPoint7:
重新开启自动交易时,需要告诉MC你目前的持仓才行——设置初始经纪商留仓部位;你不告诉它,它只会默认为0


LZ: //这里应该要return,可惜我不知道语句怎么写

Mypoint8:真的不知道你要return

LZ:
sell 1 share total next bar at open; //卖出一手平多头。。。这里我不知道怎么写程序平掉全部多头

Mypoint9sell nextbar at open;//不指定平仓手数,就是默认全部平仓

ZL: buytocover 1 share total next bar at open; //买入一手平空头。。。这里我不知道怎么写程序平掉全部多头
Mypoint10:
同上,buytocover next bar at open;//全平

Rank: 2Rank: 2

地板
发表于 2012-1-6 16:01 | 只看该作者
多谢楼上的,经纪商留仓这个东东,刚学习了。
再有一个问题:我想在一个程序里面连续下两个单,不同品种的。如果我放在两张图上面,则可能会不能确保下单的连续性,因为可能某个品种价格变动后下一单,另外一个品种价格可能尚未跳动,就下不了了。而等到第二个品种下单后,第一个品种的价格可能发生了比较大的变化。这种情况如何处理呢

Rank: 2Rank: 2

5#
发表于 2012-1-6 18:10 | 只看该作者
楼上是说,一个策略放在两个品种上,品种a下单后,希望品种b立刻下同方向的单子吗?
是想要组合价差下单吗?
MC一个策略下两个品种,只能分别开图;策略就根据商品不同而分别下单,不会相互影响

Rank: 2Rank: 2

6#
发表于 2012-1-11 10:26 | 只看该作者
设置初始经纪商留仓部位时,除了告之MC我持有的仓位外,能告之MC我持仓的成本吗?这样才可以继续使用STOPLOSS等指令。

Rank: 3Rank: 3Rank: 3

7#
发表于 2012-2-13 14:41 | 只看该作者
本帖最后由 bhwhui 于 2012-2-13 14:43 编辑

我倒是觉得楼主说日的地方很对。

主要区别Mc侧重图表交易,而MT侧重 程序 交易(不是程序化)。
如果想从细节全面把握,MC做不到。例如想知道每笔单子的来龙去脉。而不是一个整体来处理的这种情况,我还想删,改,怎么办的问题。
目前我是通过Excel记录这些信息,还行,就是不够稳定。

现在我最想的知道是我的 实际 持仓通过什么方法能让程序得到?
哪位赐教?谢谢


高级模式 | 发表帖子
B Color Image Link Quote Code Smilies
验证问答 换一个

策略交易高峰会 |联系我们

GMT+8, 2012-5-20 05:04, Processed in 0.025892 second(s), 11 queries.

Powered by Discuz! X1

© 2001-2010 Comsenz Inc.