麻烦高手帮我看一下错在哪里,做了个EA不会平仓!

 

开单正常,就是条件达到以后不会平仓。麻烦高手给指导一下吧,谢谢拉!

int start()
  {
   double usprice=MarketInfo(美国原油名称,MODE_BID);
   double ukprice=MarketInfo(北海原油名称,MODE_ASK);
   double usprice_B=MarketInfo(美国原油名称,MODE_ASK);
   double ukprice_B=MarketInfo(北海原油名称,MODE_BID);
   double dangqianjiacha=ukprice-usprice;
   double DQJC=NormalizeDouble(dangqianjiacha,3);
   double dangqianjiacha_B=ukprice_B-usprice_B;
   double DQJC_B=NormalizeDouble(dangqianjiacha_B,3);
   double shangdanjiacha=buylastprice()-selllastprice();
   double SDJC=NormalizeDouble(shangdanjiacha,3);
   double shangdanjiacha_B=selllastprice_B()-buylastprice_B();
   double SDJC_B=NormalizeDouble(shangdanjiacha_B,3);
   if(/*DayOfWeek()!=5&&*/Hour() >=开始运行时间 && Hour() < 结束运行时间&&时间管理==true)
     {
      if(DQJC<=最高差值_A&&DQJC>=最低差值_A)
        {
         if(danshusell()==0&&danshubuy()==0)
           {
            buy(Lots,0,0,zhushiB+buylastticket(),bigmagic);
            sell(Lots,0,0,zhushiA+selllastticket(),smallmagic);
           }
         if(danshusell()>0&&danshubuy()>0)
           {
            if(DQJC==SDJC-差价缩小)
              {
               buy(getbuylastLots()*加仓倍数,0,0,zhushiB+buylastticket(),bigmagic);
               sell(getselllastLots()*加仓倍数,0,0,zhushiA+selllastticket(),smallmagic);
              }
           }
        }
      if(DQJC_B<=最高差值_B&&DQJC_B>=最低差值_B)
        {
         if(danshusell_B()==0&&danshubuy_B()==0)
           {
            buy_B(Lots,0,0,zhushibuy_B+buylastticket_B(),buymagic_B);
            sell_B(Lots,0,0,zhushisell_B+selllastticket_B(),sellmagic_B);
           }
         if(danshusell_B()>0&&danshubuy_B()>0)
           {
            if(DQJC_B==SDJC_B+差价缩小)
              {
               buy_B(getbuylastLots_B()*加仓倍数,0,0,zhushibuy_B+buylastticket_B(),buymagic_B);
               sell_B(getselllastLots_B()*加仓倍数,0,0,zhushisell_B+selllastticket_B(),sellmagic_B);
              }
           }
        }
     return(0);
     }
   if(时间管理==false)
     {
      if(DQJC<=最高差值_A&&DQJC>=最低差值_A)
        {
         if(danshusell()==0&&danshubuy()==0)
           {
            buy(Lots,0,0,zhushiB+buylastticket(),bigmagic);
            sell(Lots,0,0,zhushiA+selllastticket(),smallmagic);
           }
         if(danshusell()>0&&danshubuy()>0)
           {
            if(DQJC==SDJC-差价缩小)
              {
               buy(getbuylastLots()*加仓倍数,0,0,zhushiB+buylastticket(),bigmagic);
               sell(getselllastLots()*加仓倍数,0,0,zhushiA+selllastticket(),smallmagic);
              }
           }
        }
      if(DQJC_B<=最高差值_B&&DQJC_B>=最低差值_B)
        {
         if(danshusell_B()==0&&danshubuy_B()==0)
           {
            buy_B(Lots,0,0,zhushibuy_B+buylastticket_B(),buymagic_B);
            sell_B(Lots,0,0,zhushisell_B+selllastticket_B(),sellmagic_B);
           }
         if(danshusell_B()>0&&danshubuy_B()>0)
           {
            if(DQJC_B==SDJC_B+差价缩小)
              {
               buy_B(getbuylastLots_B()*加仓倍数,0,0,zhushibuy_B+buylastticket_B(),buymagic_B);
               sell_B(getselllastLots_B()*加仓倍数,0,0,zhushisell_B+selllastticket_B(),sellmagic_B);
              }
           }
        }
      return(0);
     }

    if(OrdersTotal()>0)
      {
       for(i=0; i<=OrdersTotal(); i++)
         {
          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            {
             if(OrderType()==OP_SELL&&OrderMagicNumber()== smallmagic)
               {

                smallsellorderprofit=OrderProfit()+ OrderCommission() + OrderSwap();
               }
             if(OrderType()==OP_BUY&& OrderMagicNumber()== bigmagic)
               {

                bigbuyorderprofit=OrderProfit()+ OrderCommission() + OrderSwap();
               }
            }
         }
      }
    if(OrdersTotal()>0)
      {
       for(i=0; i<=OrdersTotal(); i++)
         {
          OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            {
             if(OrderType()==OP_SELL&&OrderMagicNumber()== sellmagic_B)
               {

                bigsellorderprofit=OrderProfit()+ OrderCommission() + OrderSwap();
               }
             if(OrderType()==OP_BUY&& OrderMagicNumber()== buymagic_B)
               {

                smallbuyorderprofit=OrderProfit()+ OrderCommission() + OrderSwap();
               }
            }
         }
      }
   if(danshusell()>0&&danshubuy()>0 && Hour() >=开始运行时间 && Hour() < 结束运行时间)
     {
      Print("当前价差"+DQJC);
      Print("上单价差"+SDJC);
      if(DQJC>= SDJC+止盈价差)
        {
         closeallA();
         Print("TP");
        }

      if(DQJC<=止损差值_A)
        {

         closeallA();
         Print("SL");

        }
      if(smallsellorderprofit+bigbuyorderprofit>=0)
        {
         if(DayOfWeek()==5&&Hour() >=开始运行时间 && Hour() < 结束运行时间&&时间管理==true)
           {
            closeallA();
            Print("PB");
           }
        }
      return(0);
     }

   if(danshusell_B()>0&&danshubuy_B()>0&&Hour() >=开始运行时间 && Hour() < 结束运行时间)
     {
      Print("当前价差B"+DQJC_B);
      Print("上单价差B"+SDJC_B);
      if(DQJC_B<=SDJC_B-止盈价差)
        {
         closeallB();
         Print("B_tp");
        }
      if(DQJC_B>=止损差值_B)
        {
         closeallB();
         Print("B_SL");
        }
      if(bigsellorderprofit+smallbuyorderprofit>=0)
        {
         if(DayOfWeek()==5&&Hour() >=开始运行时间 && Hour() < 结束运行时间&&时间管理==true)
           {
            closeallB();
            Print("PB_B");
           }
        }
      return(0);
     }
   return(0);
  }
 
高手也解决不了。 你发的代码都不全
 

"条件达到后不平仓"  ---

那一定是条件没有达到,你应该表述下你的平仓条件,不然无法判断你代码逻辑是否正确。

for(i=0; i<=OrdersTotal(); i++)
应该写成
for(i=0; i<OrdersTotal(); i++)
 
Ziheng Zhuang:

"条件达到后不平仓"  ---

那一定是条件没有达到,你应该表述下你的平仓条件,不然无法判断你代码逻辑是否正确。

Ziheng Zhuang:

"条件达到后不平仓"  ---

那一定是条件没有达到,你应该表述下你的平仓条件,不然无法判断你代码逻辑是否正确。

非常感谢,不过我修改了一下,去掉等号。貌似还是不行。


说一下这个EA的思路:

这个EA是原油套利型的,

A策略是多布油,空美油,

B策略反过来空布油,多美油,

两套策略各自执行:

 1、两油价差在各自的范围内执行A/B策略开单,(如:两油价差最低4.0最高9.0的范围内执行A策略——多布油,空美油)

 2、如果A策略开仓以后,价差缩小一个“价差缩小”参数,加仓一次;B策略则是价差扩大加仓;

 3、平仓条件是,AB策略各自的最后一对开仓盈利一个“止盈价差”,则各自平仓,

 4、另外,周五如果不亏损则平保不再开仓。


策略其实比较简单,发布出来的是运行逻辑。

至于运行逻辑以外的功能函数都是也都是比较简单的函数,这些功能函数都是我在别的EA里面运行没有问题的,考虑到都贴出来篇幅扩大,看着杂乱,所以就没有贴出来。


问题出在运行逻辑上,我对代码是业余水平,里面估计会有一些语法错误,

本来这个EA运行起来的问题是开仓后立马就平仓,秒开秒平的,这个问题也是困扰了我一个月。有一天突然想到会不会是返回值的问题,于是在开仓逻辑和平仓逻辑的结尾各自加了一个return(0)——代码中除了最后一个return(0)之外的另4个return(0);

然后开仓就不会秒平了,但是变成了现在这样,不会平仓了。

 

3、平仓条件是,AB策略各自的最后一对开仓盈利一个“止盈价差”,则各自平仓,

--

你这个表示也不是很清晰,各自最后一对貌似还有看品种,然后还要看单子类型

看你代码中找各自最后一对单子和盈利是不对的,应该按照开仓时间找到最后的单子,另外你遍历单子时没有确认OrderSymbol(),

问题比较多,不是几句话就帮你解决。

//依据开仓时间最后,找到该单子,输入参数品种,单子类型,magic
int GetLastOrderTicket(string sym,int orderType,int magic)
{
   datetime ot = 0;
   int ticket = -1;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
         if(OrderSelect(i,SELECT_BY_POS))
           {
               if(OrderSymbol()==sym && OrderType()==orderType && OrderMagicNumber()==magic)
               {
                  if(OrderOpenTime()>ot){ot=OrderOpenTime();ticket=OrderTicket();}
               }
           }
     }
     return(ticket);
}

//根据单号,获得该单子的总盈利
double GetLastOrderProfit(int ticket)
{
   double pft = 0;
   if(OrderSelect(ticket,SELECT_BY_TICKET))
   {
      pft = OrderProfit()+OrderCommission()+OrderSwap();
   }
   return(pft);
}