Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1554

 
Zalevsky1234:

Bonjour.

Pouvez-vous me dire s'il est possible d'ajouter une colonne de commentaires ou d'explications dans les paramètres de l'EA... ? ??

Merci.

Oui, mais vous avez besoin de la source.
 
MakarFX:
Oui, mais vous avez besoin de la source.
Ce n'est pas un gros problème...

   input int i = 5;            
   input bool b = false;    
 
void OnTick()
  {
  if(i != 0) 
         {
            Comment("123");
         }
  }
 
Mihail Matkovskij:

Merci ! Je ne savais pas que MQL avait une fonction pour ça. J'étais sur le point de créer le mien. Mais avant cela, j'ai décidé deposer la question sur le forum.

C'est la conséquence d'une mauvaise approche de l'apprentissage des langues. Si vous aviez travaillé avec la documentation, et non avec le g.code de......... en lisant l'aide de la ressource, vous auriez lu à ce sujet. Et vous n'auriez pas à demander.
 
Zalevsky1234:

Bonjour.

Pouvez-vous me dire s'il est possible d'ajouter une colonne de commentaires ou d'explications dans les paramètres de l'EA... ? ??

Merci.

Quand apprendras-tu à lire la documentation?

//--- input parameters
input int            InpMAPeriod=13;         // Smoothing period
input int            InpMAShift=0;           // Line horizontal shift
input ENUM_MA_METHOD InpMAMethod=MODE_SMMA;  // Smoothing method


Input переменные - Переменные - Основы языка - Справочник MQL4
Input переменные - Переменные - Основы языка - Справочник MQL4
  • docs.mql4.com
Input переменные - Переменные - Основы языка - Справочник MQL4
 
J'ai fait en sorte que lorsque je suis le suivi d'un contrat, le Take Profitest égal à 500 et le Stop Loss est égal à 150.
Jusqu'à cinq contrats supplémentaires sont achetés.
Puis-je interdire l'ouverture de nouveaux postes lorsque deux sont déjà ouverts ? Limitez le volume des positions ouvertes.



//--------------------------------------------------------------------

void OPENORDER(string ord)

  {
  
  double priceL=m_symbol.Ask();
   if(ord=="Sell")      
        //--- check for free money
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
      if(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
         Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of Retcode: ",m_trade.ResultRetcodeDescription(),
               ", ticket of order: ",m_trade.ResultOrder());                     // Если sell, то не открываемся
     double priceS=m_symbol.Bid();
   if(ord=="Buy")
         //--- check for free money
            if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
               printf("We have no money. Free Margin = %f",m_account.FreeMargin());
            else
      if(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
 
         Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
               ", description of result: ",m_trade.ResultRetcodeDescription(),
               ", ticket of deal: ",m_trade.ResultDeal());
   return;
 }
  double iMAGet(const int handle,const int index)
  {
   double MA[];
   ArraySetAsSeries(MA,true);
//--- reset error code
   ResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index
   if(CopyBuffer(handle,0,0,index+1,MA)<0)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(0.0);
     }
   return(MA[index]);
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Get Time for specified bar index                                 |
//+------------------------------------------------------------------+
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[];
   datetime time=0;
   ArraySetAsSeries(Time,true);
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0)
      time=Time[0];
   return(time);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                  __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
 
 
}
void TrailingOrder()
  {

   if(InpTrailingOrderLimit==0)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                     
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Buy");
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Sell");
                   }
              }
           }
    }      
 void Trailing()
  {
   if(InpTStop==0)
      return;
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket(),
                              " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                              ", description of result: ",m_trade.ResultRetcodeDescription());
                   }
              }
         }
   }
 
Alexey Viktorov:
C'est une conséquence de la mauvaise approche de l'étude de la langue. Si vous travailliez avec la documentation, plutôt qu'avec le codage à partir de ......... en lisant l'aide sur les ressources, vous l'auriez lu. Et vous n'auriez pas à demander.

Je savais que ma réponse serait suivie d'une conférence... Vous savez, comme vous le faites... Je croyais avoir dit : "Merci", mais non... Tu dois écrire quelque chose... Si vous connaissez la fonction grâce à la documentation, tant mieux pour vous ! Mais si vous ne connaissez pas le code correctement, vous pouvez étudier la documentation MQL à fond, mais cela ne vous servira pas à grand-chose en pratique... !

 

Je suis accidentellement tombé sur ce bug

Créer deux boutons identiques avec des coordonnées légèrement différentes

   CreateButton(0,"lab_Button1",0,79,20,77,25,CORNER_RIGHT_UPPER," ","START","Arial Black",10,clrWhite,clrGreen,
   BORDER_SUNKEN,false,false,false,false,false,0);
   CreateButton(0,"lab_Button2",0,4,50,-73,25,CORNER_RIGHT_UPPER," ","START","Arial Black",10,clrWhite,clrGreen,
   BORDER_SUNKEN,false,false,false,false,false,0);

cela ressemble à ceci


Mais en conséquence, seul le premier bouton réagit à OnChartEvent, le second non.

 
Eugen8519:
Je l'ai fait ainsi lors du suivi d'un contrat, car le Take Profitest égal à 500 et le Stop Loss est égal à 150.
Jusqu'à cinq contrats supplémentaires sont achetés.
Puis-je interdire l'ouverture de nouveaux postes lorsque deux sont déjà ouverts ? Limitez le volume des positions ouvertes.

Je ne connais pas MQL5, mais je pense que

void TrailingOrder()
  {

   if(InpTrailingOrderLimit==0||PositionsTotal()>=2)
      return;
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                     
                        m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Buy");
                    }
              }
            else
              {
               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
                     (m_position.StopLoss()==0))
                    {
                     if(!m_trade.PositionModify(m_position.Ticket(),
                        m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
                        m_position.TakeProfit()))
                        Print("Modify ",m_position.Ticket());
                        OPENORDER("Sell");
                   }
              }
           }
    }      
 
MakarFX:

Je suis accidentellement tombé sur ce bug

Créer deux boutons identiques avec des coordonnées légèrement différentes

cela ressemble à ceci


mais en conséquence, seul le premier bouton réagit à OnChartEvent, le second non.

Pouvez-vous voir le code dans le gestionnaire ?

Et pourquoi il y a -73 dans les paramètres, pas très clair... ?

 
Mihail Matkovskij:

Je peux voir le code dans le gestionnaire ?

Et pourquoi il y a -73 dans les paramètres, pas très clair... ?

Il n'y a pas d'erreur.

Avec ces coordonnées, le bouton est à l'envers, parce que la longueur du bouton est calculée à +/- du point X