查看完整版本: 版主,帮我看下这个系统错在哪里了?

晨曦 2008-2-19 14:32

版主,帮我看下这个系统错在哪里了?

版主,以下是我套用的移动平均线的系统,自己少加改造,虽然编译成功了,可是在做历史测试的时候,什么也测不到,不知道问题出在了什么地方!!请帮我看看,是不是建仓的时候,一直没有达到建仓条件啊
备注:我的指标实际上也就是一条移动均线,只不过计算方式不一样



#define MAGICMA  20050610
// extern 的全局变量,编译后可以直接在MT 中修改

extern double Lots                = 1;

extern double MaximumRisk             = 0.02;

extern double DecreaseFactor         = 3;




//+------------------------------------------------------------------+

//|  入口函数,程序从这里开始运行                                                                 |

//+------------------------------------------------------------------+

void start()

  {
  
  

//----

   if(Bars<100 //如果历史数据不足100 根K 线

         || IsTradeAllowed()==false) //  或者系统目前不允许交易

      return;  //  退出

//----

   if(CalculateCurrentOrders(Symbol())==0)//  调用子函数CalculateCurrentOrders 检查现有仓位,是否需

//要建仓

      CheckForOpen();                      //  调用子函数CheckForOpen 开始建立仓位

   else

      CheckForClose();                    //  否则检查是否需要平仓

//----

}

//+------------------------------------------------------------------+

//|  检查现有仓位|

//+------------------------------------------------------------------+

int CalculateCurrentOrders(string symbol)

  {
  int buys=0,sells=0;

//----

   for(int i=0;i<OrdersTotal();i++) //  遍历所有仓位

    {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) //  如果获取Order 失败,则退出

         break;

      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) //  获取仓位成功

       {

         if(OrderType()==OP_BUY)  buys++;             //  如果是买单,买单计数器加一

         if(OrderType()==OP_SELL) sells++;          //  如果是卖单,卖单计数器加一

       }

     }

//---- return orders volume

   if(buys>0) return(buys);      //  有至少一张买单,返回买单数量

   else       return(-sells); //  否则,返回卖单数量的负值

  }

//+------------------------------------------------------------------+

//|  计算最优仓位

//+------------------------------------------------------------------+

double LotsOptimized()

  {

   double lot=Lots;

   int    orders=HistoryTotal();       // history orders total

   int    losses=0;                   // number of losses orders without a break

//---- select lot size

   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- calcuulate number of losses orders without a break

   if(DecreaseFactor>0)

    {

      for(int i=orders-1;i>=0;i--)

       {

         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }

         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;

        //----

         if(OrderProfit()>0) break;

         if(OrderProfit()<0) losses++;

       }

      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);

     }

//---- return lot size

   if(lot<0.1) lot=0.1;

   return(lot);

  }
//+------------------------------------------------------------------+

//|  检查是否建仓                                          |

//+------------------------------------------------------------------+

void CheckForOpen()

  {

   double ma;

   int    res;

//---- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//----  指标调用

   ma= iCustom(NULL,0,"晨曦外汇指标",0,0);

//---- sell conditions

   if(Open[1]>ma && Close[1]<ma)  //  检查开盘价格和均线直接的关系

     {

    //  建立仓位

      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);

      return;

     }

//---- buy conditions

   if(Open[1]<ma && Close[1]>ma)

     {

      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);

      return;

     }

//----

  }

//+------------------------------------------------------------------+

//|  检查是否平仓                                        |

//+------------------------------------------------------------------+

void CheckForClose()

  {

   double ma;

//---- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//---- get Moving Average

   ma= iCustom(NULL,0,"晨曦外汇指标",0,0);

//----

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)                       break;

      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

      //---- check order type
if(OrderType()==OP_BUY)

       {

         if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);

         break;

       }

      if(OrderType()==OP_SELL)

       {

         if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);

         break;

       }

    }

//----

  }

晨曦 2008-2-19 16:04

版主这个是双向操作吗??还是单项的

xfxyldj 2008-2-19 18:06

没有详细的程序说明,没时间详细读你的程序。
猜测是你的自定义指标调用出现问题了。
另外你在复盘测试的时候出现的错误提示是什么?

xfxyldj 2008-2-19 18:07

对于双向操作还是单向操作要问你自己啊。我怎么知道你要做怎样的控制。

晨曦 2008-2-20 04:04

我已经解决完了,呵呵,谢谢,系统都一切正常了,只是判断上还需要改进一下
页: [1]
查看完整版本: 版主,帮我看下这个系统错在哪里了?