最近写的EA碰到的问题,总是解决不了,求助呀~~~大家帮忙哦

Discussion in 'MetaTrader' started by netdevil, May 17, 2010.

  1. 我的思路很简单,就是判断30日MA的方向,用的是30日MA(今日与昨日的比值)-1,大于0就做多,小于0就做空。
    思路很简单,我一直用这个指标同时交易很多个货币对来对冲风险,之前一直是手工交易,最近想再增加货币对来减小系统性风险,所以尝试自己写EA,可是最近一直碰到好多问题,希望大家帮我解决。

    首先我写了四个函数,分别是做多,做空,平多仓,和平空仓。
    void buy_func()
    {
    OrderSend(Symbol(),OP_BUY,Lots,Ask,300,0,0,"QSX",MAGICMA,0,Green);
    if(OrderSelect(SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
    else Print("Error opening BUY order : ",GetLastError());
    }
    这个是做多的,做空的和这个一样,只是方向相反

    void lclose_func()
    {
    OrderClose(OrderTicket(),OrderLots(),Bid,300,White);
    if(OrderSelect(SELECT_BY_TICKET,MODE_TRADES)) Print("orderclosed : ",OrderClosePrice());
    else Print("Error close order : ",GetLastError());
    }
    这个是平多的,平空的也只是方向相反

    接下来是EA的主体部分

    //Check for buy condition
    if(ft1>0)
    {
    //Check for Orders holding
    if(total==0) buy_func();//No Orders holding
    if(total>0)//订单数>0
    {
    for(i=0,bod=0;i<OrdersTotal();i++)//循环遍历订单
    {
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGICMA) continue;//非本EA所开订单,继续
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)//本EA所开订单存在
    {
    bod++;//查询本EA所开订单
    OrderSelect(SELECT_BY_TICKET,MODE_TRADES);
    if(OrderType()==OP_BUY) break;//订单方向正确,中止
    if(OrderType()==OP_SELL) //订单方向不正确
    {
    sclose_func();//平仓
    buy_func();//开仓
    }
    }
    }
    if(bod==0) buy_func();//无本EA所开订单,下单
    }
    }
    这是主体,判断sell condition也是几本一样,就是方向相反
     
  2. 下面说说我碰到的问题,首先是EA测试的时候,总是出来这些东西:
    TestGenerator: unmatched data error (low value 1.3225 at 2010.04.30 00:00 is not reached from the least timeframe, low price 1.3225 mismatches)
    TestGenerator: unmatched data error (volume limit 45123 at 2010.04.23 00:00 exceeded)
    貌似是历史数据的问题,可是我下了好几遍历史数据,而且用MT4自带的EA检测的时候没有问题


    第二个,我用模拟账户挂的时候,我现在最多只挂过四个货币对,可是一般只有开一个单子,只有一次开了两个单子,而不是理想中的四个货币对四个单子(我的策略里应该始终是多头与空头转换,是没有空仓的时候的)

    第三个,很诡异的是我每次挂USDCHF的时候,会一直开单,瞬间就可以开N个单~不知道为什么。。。

    希望大家帮帮忙呀,一直看自己的代码,总觉得是没什么问题的。。。希望大家帮帮忙哦
     
  3. nix

    nix

    第一,你的broker数据和history data 冲突,可以解决,一般忽略它


    第三,你的代码有问题

    查询订单统计部分有错
     
  4. nix

    nix

    OrderSelect(SELECT_BY_TICKET,MODE_TRADES);

    第一个参数应该用POS方式
     
  5. 哦,那第二个还是用MODE_TRADES吧?
    还有下单平仓那两个函数没问题吧?
     
  6. 额,大家帮我看看呀
     
  7. 你要设个 BUYS=0, 和 SELLS=0, 这类的变量,当 BUYS=0, 和 SELLS=0 时才开单
     
  8. 当开一单时,用 BUYS++, 和 SELLS++, 但当关单时,用SELL-- 和 BUYS--,就不会一秒开多单了
     
  9. 你这个EA用在Living account 中,会碰到很多不幸的问题的,不是策略的问题,是EA本身的问题
     
  10. 额,谢谢啦,还要再研究呀~
     
  11. MT4中,EA是每个Tick运行一次主函数。但本周期满足开仓条件时,在这根K线中,ordersend函数会一直送单子进场。所以要增加一个仓位控制的条件。例如在想开多单时,判断一下是否已有仓位。如果你的策略中允许加仓,则要在开始增加一个开单时间的变量,本根K线已开过仓的,即使接下来的一个Tick满足开仓条件,在这根K线的时间内也不会再开仓。如果策略不允许加仓,那就是只允许持有一个该方向的仓位,那判断起来就更方便了,只要判断一下本EA开过的仓位中,是不是有同向的仓位就可以了,如果有,那么就不开新仓。这样就避免了一下开很多单的问题了。