Расчет лота по проценту от депо

 
Здравствуйте. Есть у кого-то рабочая функция по расчету лота исходя из риска в процентах от депо?
 

Я так считаю

input double risk=0.05; //0.0 - 1.0
input double Maxlots=10;
double lotmin=0,lotmax=0,lotstep=0,margin=0;

double lots()
{
  lotstep = MarketInfo(Symbol(),MODE_LOTSTEP),
  lotmax = MathMin(MarketInfo(Symbol(), MODE_MAXLOT),Maxlots),
  lotmin = MarketInfo(Symbol(), MODE_MINLOT),
  margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);

  lot = lotstep*MathRound((AccountFreeMargin()*risk/margin)/lotstep);

 
  if(lot < lotmin) lot = lotmin;
  if(lot > lotmax) lot = lotmax;

  return(lot);
}
 
А что у Вас за переменная "AllocatedMargin"?     
И еще пару вопросов:  Вы не учитываете размер плеча? А также Вы не учитываете размер стопа в пунктах? Я правильно понимаю?
evillive:

Я так считаю

 

 
Ermak1243:
А что у Вас за переменная "AllocatedMargin"?     
И еще пару вопросов:  Вы не учитываете размер плеча? А также Вы не учитываете размер стопа в пунктах? Я правильно понимаю?

AllocatedMargin - делитель, указывает какую часть от свободных средств можно использовать для расчета лота. Можно удалить, лот будет рассчитан только от заданного риска, если риск=1 - то на все средства.

Да, плечо и стоп не учитывается, только процент от средств и всё. А зачем учитывать плечо и стоп в лоте?

 
evillive:

AllocatedMargin - делитель, указывает какую часть от свободных средств можно использовать для расчета лота. Можно удалить, лот будет рассчитан только от заданного риска, если риск=1 - то на все средства.

Да, плечо и стоп не учитывается, только процент от средств и всё. А зачем учитывать плечо и стоп в лоте?

 

Ну, плечо еще, может, и не обязательно, а, вот стоп...Например, если я открою позицию на 1 лот со стопом в 50 пунктов, а другую тем же объемом но со стопом в 100 пунктов, то как-то теряется актуальность расчета процента риска в каждой сделке потому, что потерянный процент от средств напрямую зависит от размера стопа.
 
Ну делите тогда ещё на некий коэффициент, пропорциональный стопу в пунктах, я как-то в этом смысла не видел, у меня размер стопов постоянен. А плечо там учитыватеся, от плеча зависит margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
evillive:
Ну делите тогда ещё на некий коэффициент, пропорциональный стопу в пунктах, я как-то в этом смысла не видел, у меня размер стопов постоянен. А плечо там учитыватеся, от плеча зависит margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
При попытке установить риск 50%(double risk=0.5) на сделку функция расчитывает 5%, при риске в 100% расчитывает 8%-это раз. Во-вторых, появляются много ошибок о нехватке средств, чтобы открыть ордер. То есть, я так понимаю, функция не следит за максимально возможным лотом для открытия.  
  
 
evillive:
Ну делите тогда ещё на некий коэффициент, пропорциональный стопу в пунктах, я как-то в этом смысла не видел, у меня размер стопов постоянен. А плечо там учитыватеся, от плеча зависит margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 ///////Расчет лота//////////
 double LotSize( int type, double LotRisk, int SL  )
{   //    int znakov_lot=0;
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        double  lot             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*LotRisk/100.0;
        dollarsPerPip = lot/SL;
     //   if (lot_min<2) {znakov_lot=0;  if (lot_min<0.2) {znakov_lot=1;  if (lot_min<0.02) {znakov_lot=3;  if (lot_min<0.002) {znakov_lot=4; }}}}      
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
            if(UninitializeReason()!=3)
            {
             
                Alert ( "Невозможно открыть ордер лотом ", DoubleToStr( lot, 2 ), ". Недостаточно денег."+Symbol() );
                return(-1);
            }
        }

        return( lot );
}
В этой функции также есть проблемы с максимальным лотом. То есть, при попытке установить риск от 8% и выше, выходит ошибка о нехватке средств.  И в интернете ПОЛНОСТЬЮ рабочую функцию по расчету лота мне найти так и не удалось.
 
evillive:
Ну делите тогда ещё на некий коэффициент, пропорциональный стопу в пунктах, я как-то в этом смысла не видел, у меня размер стопов постоянен. А плечо там учитыватеся, от плеча зависит margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
Скажите, я правильно понимаю, что ошибку о нехватке средств нужно перехватывать перед открытием ордера?
 
Ermak1243:
Скажите, я правильно понимаю, что ошибку о нехватке средств нужно перехватывать перед открытием ордера?

Правильно. 

И депозит побольше, с 1000 долларов (или центов) и меньше смысла нет играться. И сделки 50% от средств - чисто казино. 1-5% надо на форекс.

 
evillive:

... И сделки 50% от средств - чисто казино. 1-5% надо на форекс.

Одно из вреднейших ошибочных утверждений, играющих на руку ДЦ.

Чем больше Вы совершаете сделок (с этой Вашей философией), тем меньше шанса у Вас на успех  

(если надо - могу потом аргументировать...)