Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1554

 
Zalevsky1234:

Hola.

Me pueden decir si es posible añadir una columna con comentarios o explicaciones en los parámetros del EA... ???

Gracias.

Sí, pero necesitas la fuente.
 
MakarFX:
Sí, pero necesitas la fuente.
No es un gran problema...

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

Gracias. No sabía que MQL tuviera una función para eso. Estaba a punto de crear el mío propio. Pero antes decidípreguntar en el foro.

Esto es consecuencia de un enfoque erróneo del aprendizaje de idiomas. Si hubieras trabajado con la documentación, y no con el g.code de......... leyendo la ayuda del recurso, habrías leído sobre ello. Y no tendrías que preguntar.
 
Zalevsky1234:

Hola.

Me podéis decir si es posible añadir una columna con comentarios o explicaciones en los parámetros del EA... ???

Gracias.

¿Cuándo aprenderás a leer la documentación?

//--- 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
 
Lo he hecho de manera que cuando estoy siguiendo un contrato, el Take Profites igual a 500 y el Stop Loss es igual a 150.
Se compran hasta cinco contratos adicionales.
¿Puedo prohibir la apertura de nuevas posiciones cuando ya hay dos abiertas? Limitar el volumen de posiciones abiertas.



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

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:
Esto es consecuencia de un enfoque erróneo del estudio de la lengua. Si trabajaras con documentación, en lugar de con codificación desde ......... leyendo la ayuda en los recursos, lo leerías. Y no tendrías que preguntar.

Sabía que mi respuesta iría seguida de un sermón... Ya sabes, como tú... Pensé que había dicho: "Gracias", pero no... Tienes que escribir algo... Si conoces la función por la documentación, ¡bien por ti! Pero si no se conoce bien el código, se puede estudiar la documentación de MQL a fondo, ¡pero servirá de muy poco en la práctica!

 

Accidentalmente me encontré con este error

Crear dos botones idénticos con coordenadas ligeramente diferentes

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

se ve así


Pero como resultado, sólo el primer botón reacciona a OnChartEvent, el segundo no.

 
Eugen8519:
Lo hice de manera que cuando se hace un seguimiento de un contrato, el Take Profites igual a 500 y el Stop Loss es igual a 150.
Se compran hasta cinco contratos adicionales.
¿Puedo prohibir la apertura de nuevas posiciones cuando ya hay dos abiertas? Limitar el volumen de posiciones abiertas.

No conozco MQL5, pero creo 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:

Accidentalmente me encontré con este error

Crear dos botones idénticos con coordenadas ligeramente diferentes

se ve así


pero como resultado, sólo el primer botón reacciona a OnChartEvent, el segundo no.

¿Puedes ver el código en el manejador?

¿Y por qué hay -73 en los parámetros, no está muy claro...?

 
Mihail Matkovskij:

¿Puedo ver el código en el manejador?

¿Y por qué hay -73 en los parámetros, no está muy claro...?

No da ningún error.

Con estas coordenadas el botón está al revés, porque la longitud del botón se calcula +/- desde el punto X

Razón de la queja: