Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1554

 
Zalevsky1234:

Olá.

Você pode me dizer se é possível adicionar uma coluna com comentários ou explicações nos parâmetros da EA... ???

Obrigado.

Sim, mas você precisa da fonte.
 
MakarFX:
Sim, mas você precisa da fonte.
Não é um grande problema...

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

Obrigado! Eu não sabia que a MQL tinha uma função para isso. Eu estava prestes a criar o meu próprio. Mas antes disso, decidiperguntar no fórum.

Isto é uma conseqüência da abordagem errada da aprendizagem de línguas. Se você tivesse trabalhado com a documentação, não com o código g.code de......... lendo a ajuda do recurso, você teria lido sobre isso. E você não teria que perguntar.
 
Zalevsky1234:

Olá.

Você pode me dizer se é possível adicionar uma coluna com comentários ou explicações nos parâmetros da EA... ???

Obrigado.

Quando você vai aprender a ler a documentação?

//--- 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
 
Fiz isso para que quando estou atrás de um contrato, o Take Profitseja igual a 500 e o Stop Loss seja igual a 150.
Até cinco contratos adicionais são comprados.
Posso proibir a abertura de novas posições quando duas já estão abertas? Limitar o volume de posições em aberto.



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

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:
Isto é uma conseqüência da abordagem errada do estudo da língua. Se você trabalhasse com documentação, e não com codificação do ......... lendo a ajuda sobre recursos, você leria sobre isso. E você não teria que perguntar.

Eu sabia que minha resposta seria seguida de uma palestra. Como você faz... Eu pensei ter dito: "Obrigado", mas não... Você tem que escrever algo... Se você conhece a função a partir da documentação, bom para você! Mas se você não conhece o código corretamente, você pode estudar a documentação MQL em toda parte, mas ela será de muito pouco uso na prática...!

 

Eu acidentalmente me deparei com este bug

Criar dois botões idênticos com coordenadas ligeiramente 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);

parece ser assim


Mas como resultado, apenas o primeiro botão reage ao OnChartEvent, o segundo não.

 
Eugen8519:
Eu fiz isso ao seguir um contrato, porque Take Profité igual a 500 e Stop Loss é igual a 150.
Até cinco contratos adicionais são comprados.
Posso proibir a abertura de novas posições quando duas já estão abertas? Limitar o volume de posições em aberto.

Eu não conheço a MQL5, mas eu acho

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:

Eu acidentalmente me deparei com este bug

Criar dois botões idênticos com coordenadas ligeiramente diferentes

parece ser assim


mas como resultado, apenas o primeiro botão reage ao OnChartEvent, o segundo não.

Você pode ver o código no manipulador?

E por que há -73 nos parâmetros, não está muito claro...?

 
Mihail Matkovskij:

Posso ver o código no manipulador?

E por que há -73 nos parâmetros, não muito claros...?

Não dá nenhum erro.

Com estas coordenadas o botão está de cabeça para baixo, porque o comprimento do botão é calculado +/- a partir do ponto X