comment ajouter le code de l'indicateur dans le code du conseiller-expert ? - page 4

 

Comment écrire une position ouverte dans une seule direction ?

parce que mon ea ouvre des positions dans les deux sens, achat et vente.

Je viens d'éditer le code et d'y ajouter le else ;,

Est-ce que c'est correct ?

Voici le code.

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

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

j'ai finalement résolu le problème de la variable,

maintenant c'est seulement

( - définition de fonction inattendue

) - parenthèse droite déséquilibrée...

est-ce que je dois mettre ( et ) dans mon code ??

Vous avez ceci...

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

. . . où est votre fermeture } ?

 
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); }

l'erreur est

ExistPositions - expression sur la portée globale non autorisée

et } - parenthèses non équilibrées.

 

Je me demande juste pourquoi l'erreur change toujours ?

Après avoir réparé ceci,

puis l'erreur là.

après avoir corrigé là,

erreur ici.

 
albert_lim83:

L'erreur est la suivante

ExistPositions - expression sur la portée globale non autorisée

et } - parenthèses non équilibrées.

OK, vous avez déclaré cette fonction.... J'ai ajusté l'indentation pour faciliter la lecture...

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

ce code . . cette déclaration de fonction . . . doit se trouver à l'extérieur de toute autre fonction, donc à l'extérieur de start, init, deinit, etc.

 
albert_lim83:

Je me demande juste pourquoi l'erreur change toujours ?

Après avoir réparé ceci,

puis l'erreur là.

après avoir corrigé là,

erreur ici.

Parce qu'une erreur en masque une autre... réparez-en une et une autre devient visible pour le compilateur... par exemple, vous avez peut-être le nombre correct d'accolades mais elles ne sont pas au bon endroit... ou vous avez peut-être oublié l'accolade fermante et l'accolade ouverte... de sorte que les chiffres correspondent mais sont faux. ... ou vous avez peut-être oublié une accolade fermante et une accolade ouverte... donc les chiffres correspondent mais sont faux.
 
RaptorUK:

OK, vous avez déclaré cette fonction... J'ai ajusté l'indentation pour faciliter la lecture de...

ce code . . . cette déclaration de fonction . . . doit être en dehors de toute autre fonction, donc en dehors de start, init, deinit, etc.

toujours la même erreur...


ExistPositions - expression sur la portée globale non autorisée

et } - parenthèses non équilibrées.

Où dois-je changer ?

 
albert_lim83:


Où dois-je changer ?

Je ne sais pas... je vous montre le code complet.
 
RaptorUK:
Je ne sais pas... je vous montre le code complet.

D'accord ! Sans le code complet, nous ne pouvons pas aider beaucoup, donc n'attendez pas plus.

Combiné avec 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); }
 

Peut-être que cela devrait être écrit comme ça ? ??

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