如何将指标代码添加到 expertadvisor 代码中? - 页 4

 

如何写出只有一个方向的开仓?

因为我的EA同时开了两个方向的仓位,买入和卖出。

我只是编辑了代码并在上面添加了else;。

它是正确的吗?

这里是代码。

      if ((diClose0<diMA1))&&(ZigZagLow){
         OpenBuy();
         return(0);
      }
      else;

      if ((diClose2>diMA3))&&(ZigZagHigh){
         OpenSell();
         return(0);
      }
 
albert_lim83:

终于解决了变量问题。

现在只有

( - 函数定义出乎意料

)--不平衡的右括号......

它是我的代码上的左放(和)吗?

你有这个 . . .

double zag, zig; b=0; while(a<2) {

. . . 你的结束语} 在哪里? ?

 
if (!ExistPositions()){

      if ((diClose0<diMA1))&&(ZigZagLow){
         OpenBuy();
         return(0);
      }
      else;

      if ((diClose2>diMA3))&&(ZigZagHigh){
         OpenSell();
         return(0);
      }
   }
   
   return (0);
}

bool ExistPositions() {
for (int i=100; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
return(True);
}
} 
} 
return(false);
}
void OpenBuy() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   ldStop = GetStopLossBuy(); 
   ldTake = GetTakeProfitBuy(); 
   lsComm = GetCommentForOrder(); 
   OrderSend(Symbol
(),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,0,0,clOpenBuy); 
 
} 
void OpenSell() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   ldStop = GetStopLossSell(); 
   ldTake = GetTakeProfitSell(); 
   lsComm = GetCommentForOrder(); 
   OrderSend(Symbol
(),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,0,0,clOpenSell); 

} 
string GetCommentForOrder() { return(Name_Expert); } 

double GetSizeLot() { return(Lots); } 
double GetTakeProfitBuy() { return(Ask+lTakeProfit*Point); } 
double GetTakeProfitSell() { return(Bid-sTakeProfit*Point); }
double GetStopLossBuy() { return(Bid-lStopLoss*Point); }
double GetStopLossSell() { return(Ask+sStopLoss*Point); }

错误是

ExistPositions - 不允许在全局范围的表达式

和 } - 不平衡的括号。

 

只是不知道为什么错误总是变化?

在我修复了这个之后。

然后在那里出错。

在那里修复后。

这里出错。

 
albert_lim83:

错误是

ExistPositions - 不允许在全局范围的表达式

和 } - 不平衡的括号。

好的,你已经声明了 这个函数. .我调整了缩进方式,使我更容易阅读 . .

bool ExistPositions() 
   {
   for (int i=100; i<OrdersTotal(); i++) 
      {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         {
         if (OrderSymbol()==Symbol()) 
            {
            return(True);
            }
         } 
      } 
   return(false);
   }

这段代码 .......这个函数声明......必须 任何其他函数之外,所以它必须在start、init、deinit等之外。

 
albert_lim83:

只是不知道为什么错误总是变化?

在我修复了这个之后。

然后在那里出错。

在那里修复后。

这里出错。

因为一个错误掩盖了另一个错误 ......解决了一个错误,另一个错误就会被编译器发现 ......例如,你可能有正确的大括号数量,但可能在错误的地方 ......或者你可能漏掉了闭合大括号和开放大括号 ......所以数量相符,但却是错误的。......或者你可能漏掉了一个闭合大括号和一个开放大括号......所以数字相符但却是错误的。
 
RaptorUK:

好了,你已经声明了 这个函数 . . . 我已经调整了缩进,以使我更容易阅读 . .

这段代码 .......这个函数声明......必须 任何其他函数之外,所以它必须在start、init、deinit等的外面。

仍然是同样的错误...


ExistPositions - 不允许在全局范围内的表达式

和 } - 不平衡的括号。

我应该改哪里?

 
albert_lim83:


我应该在哪里改变?

我不知道......给你看完整的代码。
 
RaptorUK:
我不知道...给你看完整的代码。

同意!。没有完整的代码,我们也帮不上什么忙,所以不要期望更多。

用MetaEditor 5编译的。

   if(!ExistPositions())
     {

      if((diClose0<diMA1)) && (ZigZagLow)  // <<== ???
        {
         OpenBuy();
         return(0);
        }
      else;   // <<=== ???

      if((diClose2>diMA3)) && (ZigZagHigh) // <<=== ???
        {
         OpenSell();
         return(0);
        }
     }

   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ExistPositions() 
  {
   for(int i=100; i<OrdersTotal(); i++) // <<=== strange calculation 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            return(True);
           }
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenBuy() 
  {
   double ldLot,ldStop,ldTake;
   string lsComm;
   ldLot=GetSizeLot();
   ldStop = GetStopLossBuy();
   ldTake = GetTakeProfitBuy();
   lsComm = GetCommentForOrder();
   OrderSend(Symbol
             (),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,0,0,clOpenBuy);

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenSell() 
  {
   double ldLot,ldStop,ldTake;
   string lsComm;
   ldLot=GetSizeLot();
   ldStop = GetStopLossSell();
   ldTake = GetTakeProfitSell();
   lsComm = GetCommentForOrder();
   OrderSend(Symbol
             (),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,0,0,clOpenSell);

  }
string GetCommentForOrder() { return(Name_Expert); }

double GetSizeLot() { return(Lots); }
double GetTakeProfitBuy() { return(Ask+lTakeProfit*Point); }
double GetTakeProfitSell() { return(Bid-sTakeProfit*Point); }
double GetStopLossBuy() { return(Bid-lStopLoss*Point); }
double GetStopLossSell() { return(Ask+sStopLoss*Point); }
 

也许这应该这样写?

 if(!ExistPositions())
     {
      if(diClose0 < diMA1 && (ZigZagLow)) // <<== ???
        {
         OpenBuy();
         return(0);
        }
        else // <<=== ???
        {
        if(diClose2 > diMA3 && (ZigZagHigh)) // <<=== ???
          {
          OpenSell();
          return(0);
          }
        }
     }