b站直播姬怎么设置:高手们来鉴定一下我写的el程序,dll桥接到外部程序

来源:百度文库 编辑:中财网 时间:2024/04/29 05:06:25

高手们来鉴定一下我写的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            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            messagelog(symbolname, ": close sell");   
            buytocover 1 share total next bar at open;            //平一手空
        end;
    end;
end;