[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 202

 
Vinin:

Ou peut-être simplement faire une liste des instruments actifs avec l'aide d'un EA. L'approche est un peu compliquée. Le problème pourrait être résolu de manière plus simple.
Nous pourrions simplement spécifier un nombre dans les paramètres d'entrée, mais le fait est que pendant le trading, des situations peuvent se produire, lorsque le trading est suspendu sur certaines devises. Ensuite, les EAs sur d'autres devises devraient recalculer leurs paramètres.
 
forexnew:
Vous pourriez simplement spécifier un nombre dans les paramètres d'entrée, mais le fait est que dans le processus de négociation, il peut y avoir des situations où la négociation est suspendue sur certaines devises. Les EA sur les autres devises doivent alors recalculer leurs paramètres.

Pourquoi préciser. Le conseiller expert peut l'obtenir par lui-même. Et en même temps, il peut gérer d'autres Expert Advisors. Tout dépend de la tâche
 

Figar0:

В самой функции ошибок нет, наверно ошибки возникают при попытке ее использовать, но это вы нам не показываете. Выкладывайте то что не компилится прямо файлом и гадать будет не надо.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
double Lots()      // Расчет используемого лота
  {
   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
     return(Lots);
  }
//+------------------------------------------------------------------+  

// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
 
Vinin:

Pourquoi le préciser ? Le conseiller expert peut l'obtenir par lui-même. Et en même temps, il peut gérer d'autres Expert Advisors. Tout dépend de la tâche à accomplir.

Je ne sais pas ce qu'il en est de la gestion des autres EA. L'EA est le même sur toutes les paires de devises, et le modèle est le suivant :

si 2 paires de devises : sur la première, il affiche 2, sur la seconde, il affiche 1

Si 3 paires de devises : la première affiche 3, la seconde 2, la troisième 1

s'il s'agit de 4 paires de devises : la première affiche 4, la deuxième affiche 3, la troisième affiche 2, la quatrième affiche 1.

J'ai l'impression que ce qui est calculé sur la première devise n'est pas pris en compte par le conseiller expert sur l'autre paire de devises, ou que cela dépend en quelque sorte du nombre de fenêtres ouvertes (paires de devises) !

 
Vinin:

Pourquoi préciser. Le conseiller peut l'obtenir lui-même. Et en même temps, il peut gérer d'autres conseillers. Tout dépend de la tâche à accomplir.
Merci. Je l'ai déjà compris moi-même. J'ai juste besoin d'enlever la ligne et de compter les kp à partir de 1.
if(OrderSymbol()==Symbol())   break;
 
skyjet:

Pour commencer, votre fonction de calcul du lot est déclarée à l'intérieur de la fonction start. Sortez-le. Ensuite, il y aura quelques erreurs avec des variables non déclarées, mais je pense que vous pouvez les gérer par vous-même.
 
skyjet:
Pourquoi ai-je besoin de NormalizeDlouble() dans le calcul des lots ?

Pour qu'il y ait deux chiffres après la virgule. Sinon, une position avec 0,009 lot ne sera pas ouverte, car elle ne sera pas un multiple du pas de lot minimum.

   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     else       Lots=NormalizeDouble(Lots,0);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     } 

 

Les gars !

comment faire pour que chaque 40ème commande soit un plus grand lot ? : : marché et en attente

Que pensez-vous de ça ?

int Nom = OrderTicket();                        // Номер ордера

a= Nom%40;                                      // к-во делить на 40 без остатка
if a = 0
lot = 2;  

 
 
Figar0:

Pour commencer, votre fonction de calcul du lot est déclarée à l'intérieur de la fonction start. Sortez-le. Ensuite, il y aura quelques erreurs avec des variables non déclarées, mais je pense que vous pouvez les gérer par vous-même.
Merci pour votre aide.
 
DDFedor:
skyjet:
à quoi sert NormalizeDlouble() dans le calcul du lot ?

Pour qu'il y ait deux chiffres après la virgule. Sinon, une position avec un lot de 0,009 ne sera pas ouverte, car elle ne sera pas un multiple du pas de lot minimum.

Merci pour cette précision.
Raison: