Помогите с NormalizeDouble(AccountFreeMargin()

 
double a, b;
bool first=true;
extern int Shift = 3;
extern int Limit = 18;




//----------------------------------------------------------------------------
int start()
{
  if (first)
   {
      a=Ask;
      b=Bid;
      first=false;
      return(0);
   }
 
  if (Ask-a>=Shift*Point)
    {
    OrderSend(Symbol(),OP_SELL,GetLots(),Bid,3,0,0,"",0,0,CLR_NONE);
    }
  if (b-Bid>=Shift*Point)
    {
    OrderSend(Symbol(),OP_BUY,GetLots(),Ask,3,0,0,"",0,0,CLR_NONE);
    }

  a=Ask;  
  b=Bid;
 
  CloseAll();
return(0);}
//-----------------------------------------------------------------------------
void CloseAll()
{
  for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)
  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if (OrderSymbol() == Symbol())
    {
      if ((OrderProfit()>0))
      {
        if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
        if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
      }
      else
      {
        if((OrderType()==OP_BUY)  && (((OrderOpenPrice()-Ask)/Point) > Limit))
          OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
        if((OrderType()==OP_SELL) && (((Bid-OrderOpenPrice())/Point) > Limit))
          OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
      }
    }
  }
}



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



double GetLots()
{

return (NormalizeDouble(AccountFreeMargin()/1,1));
 
}
//-------------------------------------------------------------------------



какое значение (NormalizeDouble(AccountFreeMargin()/1,1)); будет соответствовать минимальному значению от баланса? 1%
 

Вставляйте пожалуйста на форум код через SRC кнопку в сообщении.


 
Vladimir Zubov:

Вставляйте пожалуйста на форум код через SRC кнопку в сообщении.


//+------------------------------------------------------------------+
//|                                                                  |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

double a, b; 
bool first=true; 
extern int Shift = 3; 
extern int Limit = 18;




//---------------------------------------------------------------------------- 
int start()
{ 
  if (first) 
   {
      a=Ask; 
      b=Bid; 
      first=false; 
      return(0);
   } 
 
  if (Ask-a>=Shift*Point) 
    {
    OrderSend(Symbol(),OP_SELL,GetLots(),Bid,3,0,0,"",0,0,CLR_NONE);
    } 
  if (b-Bid>=Shift*Point) 
    {
    OrderSend(Symbol(),OP_BUY,GetLots(),Ask,3,0,0,"",0,0,CLR_NONE);
    } 

  a=Ask;  
  b=Bid; 
  
  CloseAll(); 
return(0);} 
//----------------------------------------------------------------------------- 
void CloseAll() 
{ 
  for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--) 
  { 
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); 
    if (OrderSymbol() == Symbol()) 
    { 
      if ((OrderProfit()>0)) 
      { 
        if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); 
        if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); 
      } 
      else 
      { 
        if((OrderType()==OP_BUY)  && (((OrderOpenPrice()-Ask)/Point) > Limit)) 
          OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); 
        if((OrderType()==OP_SELL) && (((Bid-OrderOpenPrice())/Point) > Limit)) 
          OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); 
      } 
    } 
  } 
} 



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



double GetLots() 
{ 

return (NormalizeDouble(AccountFreeMargin()/1,1)); 
  
} 
//------------------------------------------------------------------------- 
 
Anton Danilchenko:

Сколько будет если 200/1 и нормализовать полученное значение до одного знака после запятой?

 
Alexey Viktorov:

Сколько будет если 200/1 и нормализовать полученное значение до одного знака после запятой?


Нормализация будет корректная, но обратите внимание если вы будете выводить полученное значение через Print в журнал то там возможен так называемый цифровой шум. К примеру после нормализации будет 1.01 а в Print пойдет 1.0100001

Подробнее описано здесь:

https://www.mql5.com/ru/articles/1561

 

Цыфровой шум в восьмом знаке тянется с далекого 1994 года, в первых моделях Pentium

Он до сих пор не устранен, так как все гонятся за скоростью и такая погрешность считается допустимой.

Вы никогда не увидете этого в рендеренге в игрушке в 3D cцене, а 99% пользователей именно такие

Для более точных расчетов и вычислений, как корректно делать описано в статье выше

P.S. Ну или использовать профессиональные процы из линии Xeon

 
Vladimir Zubov:

Нормализация будет корректная, но обратите внимание если вы будете выводить полученное значение через Print в журнал то там возможен так называемый цифровой шум. К примеру после нормализации будет 1.01 а в Print пойдет 1.0100001

Подробнее описано здесь:

https://www.mql5.com/ru/articles/1561

Вообще-то вопрос был другой

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Помогите с NormalizeDouble(AccountFreeMargin()

Anton Danilchenko, 2018.01.15 09:02


какое значение (NormalizeDouble(AccountFreeMargin()/1,1)); будет соответствовать минимальному значению от баланса? 1%
И именно к этому вопросу был мой намёк.