Cálculo correto do lote a partir da % do depósito

 

Olá a todos,

Roger, um dos programadores, recentemente abriu meus olhos para o fato de eu ter escrito minha função de calcular lotes por %.


minha função é a seguinte:


double GetSizeLot() //Функция возвращает значение лотов,
{ //если включен ММ то значение лотов,
double lots,MD,RM,MinLots,LotSize; int lotsdigit; //вычисляется путем:Свободные средства*Risk
LotSize = MarketInfo(Symbol(), MODE_LOTSIZE); //поделить на стоимость одного лота
MD = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); //А также вычисляет колличество знаков
if(MD==0.01) lotsdigit=2; //присваивает значения максимума лотов
if(MD==0.1) lotsdigit=1;
if(MM>1) {lots=NormalizeDouble((AccountFreeMargin()*MM/LotSize),lotsdigit);Lot=lots;}
else lots=Lot;
MinLots=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
if(lots < MinLots) lots = MinLots;
if(lots > MaxLot) lots = MaxLot;
return(NormalizeDouble(lots,2));
}



Eu deveria usar a alavancagem e o preço atual,


Tentei verificar com os consultores especializados, mas todos eles tinham a mesma função,


onde está a verdade?


Gostaria de lhe pedir a função correta para calcular o lote em %!

 
Normalmente o problema é que há confusão entre a carga do depósito e a quantidade de risco por posição. É aconselhável verificar ambos. O que conta no código acima é a carga, ou melhor, o tamanho do lote com base na carga.
 
Este é muito melhor, não há cálculo de ombros, é uma maneira diferente de fazer isso. Eu gosto muito.

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 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }

        return( lot );
}
O cálculo do lote na % do depósito para uma determinada distância de pips. ou seja, "para drenar 20% do depósito em 10 pips = você precisa de ?lote" é a função desta pergunta e conta
 
wenay:
Este é muito melhor, aqui não há cálculo de alavancagem. Eu gosto muito do cálculo do lote para a % do depósito para uma determinada distância de pips. ou seja, "para drenar 20% do depósito em 10 pips = você precisa de ?lote" esta função pede e calcula

Na minha opinião, a alavancagem deveria estar presente nos cálculos de lote.

1) Se a alavancagem não for levada em conta, significa que o TS não é capaz de gerar grandes lucros.

2) Se o depósito já for suficientemente grande, a alavancagem é reduzida (na minha corretora automaticamente), então o erro "Volume errado" aparece.

É uma vantagem, não é uma vantagem de borracha.

P.S. esta é minha IMHO

 
rensbit:

> Nenhum cálculo de alavancagem

Na minha opinião, a alavancagem deve ser incluída no cálculo do lote.

1) Se não houver alavancagem, isso significa que o TS não é capaz de dar um grande lucro.

2) Se o depósito já for suficientemente grande, a DT diminui a alavancagem (na minha corretora automaticamente), então há um erro "Volume errado".


P.S. é o meu IMHO


Em vez de alavancar, olhe o custo de um tique. Se você tem 1k1 de alavancagem - um tique não é caro (digamos que há 1 centavo), se 1k 500 - caro (5 libras). Isto é, o sistema funciona bem com qualquer alavanca, aqui está outra forma de cálculo, me parece mais otimizada e correta.

sua empresa de corretagem mudará automaticamente para uma alavancagem diferente para você.

 
Vladon:
... você ainda tem que usar o ombro ...
Se o risco for definido como uma porcentagem, então:
lot = AccountEquity()*0.01*Risk / MarketInfo(Symbol(), MODE_MARGINREQUIRED);
 

Roger foi muito útil neste assunto, pelo qual merece um agradecimento especial a!!!!


Eu o redesenhei ligeiramente, para que a moeda da conta possa ser determinada por mim


int Percent=10;
string Valdepo=AccountCurrency();

int start()
{
double Lot,MinLots,MaxLots;
int lotdig;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)lotdig=2; else lotdig=1;
if(Valdepo=="USD")
   {
   if(StringSubstr(Symbol(),0,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else if(StringSubstr(Symbol(),3,3)=="USD")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/Ask/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else 
      {
      double pr=MarketInfo(StringSubstr(Symbol(),0,3)+"USD",MODE_ASK);
      if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      }
   }
if(Valdepo=="EUR")
   {
   if(StringSubstr(Symbol(),0,3)=="EUR")Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
   else
      {
      pr=MarketInfo("EUR"+StringSubstr(Symbol(),0,3),MODE_BID);
      if(pr!=0)Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()*pr/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      else Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);
      }
   }
MinLots=MarketInfo(Symbol(),MODE_MINLOT);
MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
if(Lot < MinLots) Lot = MinLots;
if(Lot > MaxLots) Lot = MaxLots;
return(0);
}
 

Não há outras moedas de conta? ;-)

E os riscos não são levados em conta? Esta opção também conta apenas com a carga do depósito, e quais serão os riscos (em % do depósito) no saque - é ignorada. Como se quando você abre, você sempre adivinhasse a direção desde o primeiro momento e até o último.

 

função inútil, com erros além de...

if(Lot < MinLots) Lot = MinLots;

o que é isto? não há dinheiro suficiente ainda em aberto?

se tivermos 100 libras, 100 de alavancagem e 100% de risco, ou seja, abrimos bem, o que recebemos?

if(StringSubstr(Symbol(),0,3)=="USD")
Lot=NormalizeDouble(AccountFreeMargin()*Percent*AccountLeverage()/100/MarketInfo(Symbol(),MODE_LOTSIZE),lotdig);

lote = 100 * 100 * 100 * 100 / 100 / 100 = 100

Eu não misturei nada ? por 100 libras é improvável que um lote de 100 possa abrir em um par ...

 
keekkenen:

Se tivermos 100 libras, 100 de alavancagem e 100% de risco, ou seja, abrimos totalmente, o que conseguimos?

lote = 100 * 100 * 100 * 100 / 100 / 100 = 100

eu não confundi nada ? por 100 libras é improvável que muitas 100 possam abrir em um par ...



É claro, misturado, o real é 100*100*100/100/100000=0,1
 
ah desculpe, isso era eu olhando para o ouro... então nada de comércio de ouro usando sua fórmula agora ?