Any questions from newcomers on MQL4 and MQL5, help and discussion on algorithms and codes - page 1554

 
Zalevsky1234:

Hello.

Can you tell me if it's possible to add a column with comments or explanations in the EA parameters... ???

Thank you.

Yeah, but you need the source.
 
MakarFX:
Yes, but you need the source.
It's not a big deal...

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

Thank you! I didn't know MQL had a function for that. I was about to create my own. But before that I decided toask on the forum.

This is a consequence of the wrong approach to language learning. If you had worked with the documentation, not with the g.code from......... reading the resource help, you would have read about it. And you wouldn't have to ask.
 
Zalevsky1234:

Hello.

Can you tell me if it's possible to add a column with comments or explanations in the EA parameters... ???

Thank you.

When will you learn to read the 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
 
I have done this so that when I am trailing a contract, the Take Profitequals 500 and Stop Loss equals 150.
Up to five additional contracts are bought.
Can I prohibit the opening of new positions when two are already open? Limit the volume of open positions.



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

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:
This is a consequence of the wrong approach to the study of the language. If you worked with documentation, rather than with coding from ......... reading the help on resources, you would read about it. And you wouldn't have to ask.

I knew my answer would be followed by a lecture... You know, like you do... I thought I said: "Thank you," but no... You have to write something... If you know the function from the documentation, good for you! But if you don't know the code properly, you may study MQL documentation up and down, but it will be of very little use in practice...!

 

I accidentally came across this bug

Create two identical buttons with slightly different coordinates

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

it looks like this


But as a result, only the first button reacts to OnChartEvent, the second doesn't.

 
Eugen8519:
I did it so that when trailing a contract, the Take Profitequals 500 and Stop Loss equals 150.
Up to five additional contracts are bought.
Can I prohibit the opening of new positions when two are already open? Limit the volume of open positions.

I don't know MQL5, but I think

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:

I accidentally came across this bug

Create two identical buttons with slightly different coordinates

it looks like this


but as a result, only the first button reacts to OnChartEvent, the second doesn't.

Can you see the code in the handler?

And why is there -73 in the parameters, it's not very clear...?

 
Mihail Matkovskij:

Can I see the code in the handler?

And why is there -73 in the parameters, not very clear...?

It doesn't give out any errors.

With these coordinates the button is upside down, because the length of the button is calculated +/- from point X