Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Função: MMComputeRisk
- * Autor: Wemerson C. Guimarães <[email protected]>
- * Descrição: Calcula o lote baseado no risco desejado em linguagem MQL4
- * Parâmetros:
- * RiskPercent O Risco em Percentual
- * sl O StopLoss já convertido para o numero de digitos da moeda ( ponto flutuante )
- * comm Comissão cobrada geralmente por corretoras ECN
- */
- double MMComputeRisk(double RiskPercent, double sl, double comm=0){
- double MMBalance, MMRiskMoney;
- double MMMaxLot=MarketInfo( _Symbol, MODE_MAXLOT );
- double MMMinLot=MarketInfo( _Symbol, MODE_MINLOT );
- double MMLotStep= MarketInfo( _Symbol, MODE_LOTSTEP );
- double MMTickValue = MarketInfo( _Symbol, MODE_TICKVALUE); // Geralmente 1.00 no EURUSD 5 digitos
- double MMTickSize = MarketInfo( _Symbol, MODE_TICKSIZE); // Geralmente 0.00001 no EURUSD 5 digitos
- // Verifica quantos dígitos são aceitos no lote( geralmente 2 )
- int lotdigits=0;
- do
- {
- lotdigits++;
- MMLotStep*=10;
- }while(MMLotStep<1);
- // Por questão de segurança, escolhe o menor valor...
- // Entre o saldo brudo disponível da conta ( Balance ) e o Capital Líquido ( Equity )
- MMBalance = MathMin(AccountBalance(), AccountEquity());
- // Com base no saldo utilizado(Balance ou Equity), encontra o risco
- // O risco é quanto em % da conta está disposto a arriscar por trade
- MMRiskMoney=MMBalance*RiskPercent/100; // Quanto está disposto a perder por trade
- // Calcula o lote, abatendo a comissão
- double lot = MMRiskMoney / ( sl * ( MMTickValue / MMTickSize ) + comm );
- lot=NormalizeDouble( MathFloor(lot*MathPow(10,lotdigits))/MathPow(10,lotdigits), lotdigits );
- if( lot > MMMaxLot ){ lot=MMMaxLot; }
- if( lot < MMMinLot ){ lot=MMMinLot; }
- return NormalizeDouble( lot, lotdigits );
- }
- // Fragmento de código que utilizo para chamar o cálculo
- extern double StopLoss = 10; // StopLoss em PIPs
- extern double ComissaoECN = 0; // Comissãoem $$. 0 para desativar
- extern double Risk = 2; // Risco em %
- double p = _Point; // 0.00001 no EURUSD 5 digitos
- // Multiplica o ponto flutuante por 10 em pares de 3 e 5 digitos
- if( _Digits==3 || _Digits==5)
- p *= 10; // 0,00001 x 10 = 0,0001
- // Converte os PIPs do StopLoss em valor já na escala da moeda, conforme seu ponto flutuante ( dígitos )
- double SL_Scale = StopLoss*p; // 10 x 0,0001 = 0,001
- // Calcula o valor do lote para ser utilizado na ordem
- double MeuLote = MMComputeRisk(Risk, SL_Scale, ComissaoECN); // 2.00, 0.001, 7.00
- /*
- Exemplo 1: SEM COMISSÃO
- - Par: EURUSD
- - Saldo(Balance): 1.000,00
- - Saldo Pendente em ordens abertas: 0,00
- - Capital Líquido: 1.000,00
- - Risco: 2%
- - StopLoss: 10 PIPs
- - Comissão: 0
- ** Tanto faz porque Balance e Equity são iguais **
- ** Se o Equity tivesse menor que o Balance, usaria o equity **
- lot = MMRiskMoney / ( sl * ( MMTickValue / MMTickSize ) + comm );
- lot = 20 / ( 0.001 * ( 1 / 0.00001 ) + 7 );
- lot = 20 / ( 0.001 * ( 100000 ) + 0 );
- lot = 20 / ( 100 + 0 );
- lot = 20 / ( 100 );
- lot = 20 / 100;
- lot = 0,20
- ** Tirando a Prova
- Lote: 0,20
- Se Fechar no StopLoss, perderá 10 PIPs, então perderá um total de 10 PIPs x 0,20 lotes
- Lotes Perdidos: 10x0,2 = 2 lotes
- Se o EURUSD paga/cobra $ 10,00 USD por lote, então perdemos $ 20,00... BATEU!!!
- Exemplo 1: COM COMISSÃO ECN
- - Par: EURUSD
- - Saldo(Balance): 1.000,00
- - Saldo Pendente em ordens abertas: 0,00
- - Capital Líquido: 1.000,00
- - Risco: 2%
- - StopLoss: 10 PIPs
- - Comissão: $ 7,00 por lote operado
- ** Tanto faz porque Balance e Equity são iguais **
- // MeuLote Será = 0.20
- lot = MMRiskMoney / ( sl * ( MMTickValue / MMTickSize ) + comm );
- lot = 20 / ( 0.001 * ( 1 / 0.00001 ) + 7 );
- lot = 20 / ( 0.001 * ( 100000 ) + 7 );
- lot = 20 / ( 100 + 7 );
- lot = 20 / ( 107 );
- lot = 20 / 107;
- lot = 0,18
- ** Tirando a Prova
- Lote: 0,18
- Se Fechar no StopLoss, perderá 10 PIPs, então perderá um total de 10 PIPs x 0,18 lotes
- Lotes Perdidos: 10x0,18 = 1.8 lotes
- Comissão Cobrada: $ 7,00 x 0.18 = $ 1,26
- Se o EURUSD paga/cobra $ 10,00 USD por lote, então perdemos $ 18,00 e abatendo também a comissão do saldo, irá
- abater um total de $ 19,26 da conta...
- Se tivermos ai 0,19 de lote, o valor total perdido ultrapassaria o risco desejado de $ 20,00...
- veja só:
- Perda no SL: 0,19 lote x 10 PIPs ( SL ) x $ 10,00 por lote = $ 19,00
- Comissão: 0,19 lote x 7,00 por lote = 1,33
- 19 + 1,33 = 20,33 PASSOU DE $ 20,00
- */
Advertisement
Add Comment
Please, Sign In to add comment