wemersonrv

Calculo de Risco MQL4

Nov 4th, 2016
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.63 KB | None | 0 0
  1. /**
  2.  * Função: MMComputeRisk
  3.  * Autor: Wemerson C. Guimarães <[email protected]>
  4.  * Descrição: Calcula o lote baseado no risco desejado em linguagem MQL4
  5.  * Parâmetros:
  6.  *    RiskPercent    O Risco em Percentual
  7.  *    sl             O StopLoss já convertido para o numero de digitos da moeda ( ponto flutuante )
  8.  *    comm           Comissão cobrada geralmente por corretoras ECN
  9.  */
  10. double MMComputeRisk(double RiskPercent, double sl, double comm=0){
  11.  
  12.    double MMBalance, MMRiskMoney;
  13.    double MMMaxLot=MarketInfo( _Symbol, MODE_MAXLOT );
  14.    double MMMinLot=MarketInfo( _Symbol, MODE_MINLOT );
  15.    double MMLotStep= MarketInfo( _Symbol, MODE_LOTSTEP );
  16.    double MMTickValue = MarketInfo( _Symbol, MODE_TICKVALUE); // Geralmente 1.00 no EURUSD 5 digitos
  17.    double MMTickSize = MarketInfo( _Symbol, MODE_TICKSIZE);   // Geralmente 0.00001 no EURUSD 5 digitos
  18.    
  19.    // Verifica quantos dígitos são aceitos no lote( geralmente 2 )
  20.    int lotdigits=0;
  21.    do
  22.    {
  23.       lotdigits++;
  24.       MMLotStep*=10;
  25.    }while(MMLotStep<1);
  26.    
  27.    // Por questão de segurança, escolhe o menor valor...
  28.    // Entre o saldo brudo disponível da conta ( Balance ) e o Capital Líquido ( Equity )
  29.    MMBalance = MathMin(AccountBalance(), AccountEquity());
  30.    
  31.    // Com base no saldo utilizado(Balance ou Equity), encontra o risco
  32.    // O risco é quanto em % da conta está disposto a arriscar por trade
  33.    MMRiskMoney=MMBalance*RiskPercent/100; // Quanto está disposto a perder por trade
  34.    
  35.    // Calcula o lote, abatendo a comissão
  36.    double lot = MMRiskMoney / ( sl * ( MMTickValue / MMTickSize ) + comm );
  37.    
  38.    lot=NormalizeDouble( MathFloor(lot*MathPow(10,lotdigits))/MathPow(10,lotdigits), lotdigits );
  39.    if( lot > MMMaxLot ){ lot=MMMaxLot; }
  40.    if( lot < MMMinLot ){ lot=MMMinLot; }
  41.  
  42.    return NormalizeDouble( lot, lotdigits );
  43. }
  44.  
  45. // Fragmento de código que utilizo para chamar o cálculo
  46. extern double StopLoss = 10; // StopLoss em PIPs
  47. extern double ComissaoECN = 0; // Comissãoem $$. 0 para desativar
  48. extern double Risk = 2; // Risco em %
  49.  
  50. double p = _Point; // 0.00001 no EURUSD 5 digitos
  51.  
  52. // Multiplica o ponto flutuante por 10 em pares de 3 e 5 digitos
  53. if( _Digits==3 || _Digits==5)
  54.    p *= 10; // 0,00001 x 10 = 0,0001
  55.  
  56. // Converte os PIPs do StopLoss em valor já na escala da moeda, conforme seu ponto flutuante ( dígitos )
  57. double SL_Scale = StopLoss*p; // 10 x 0,0001 = 0,001
  58.  
  59. // Calcula o valor do lote para ser utilizado na ordem
  60. double MeuLote = MMComputeRisk(Risk, SL_Scale, ComissaoECN); // 2.00, 0.001, 7.00
  61.  
  62. /*
  63.    Exemplo 1:  SEM COMISSÃO
  64.    - Par: EURUSD
  65.    - Saldo(Balance): 1.000,00
  66.    - Saldo Pendente em ordens abertas: 0,00
  67.    - Capital Líquido: 1.000,00
  68.    - Risco: 2%
  69.    - StopLoss: 10 PIPs
  70.    - Comissão: 0
  71.    
  72.    ** Tanto faz porque Balance e Equity são iguais **
  73.    ** Se o Equity tivesse menor que o Balance, usaria o equity **
  74.    lot = MMRiskMoney / ( sl * ( MMTickValue / MMTickSize ) + comm );
  75.    lot = 20 / ( 0.001 * ( 1 / 0.00001 ) + 7 );
  76.    lot = 20 / ( 0.001 * ( 100000 ) + 0 );
  77.    lot = 20 / ( 100  + 0 );
  78.    lot = 20 / ( 100 );
  79.    lot = 20 / 100;
  80.    lot = 0,20
  81.    
  82.    ** Tirando a Prova
  83.    Lote: 0,20
  84.    Se Fechar no StopLoss, perderá 10 PIPs, então perderá um total de 10 PIPs x 0,20 lotes
  85.    
  86.    Lotes Perdidos: 10x0,2 = 2 lotes
  87.    
  88.    Se o EURUSD paga/cobra $ 10,00 USD por lote, então perdemos $ 20,00... BATEU!!!
  89.    
  90.    Exemplo 1:  COM COMISSÃO ECN
  91.    - Par: EURUSD
  92.    - Saldo(Balance): 1.000,00
  93.    - Saldo Pendente em ordens abertas: 0,00
  94.    - Capital Líquido: 1.000,00
  95.    - Risco: 2%
  96.    - StopLoss: 10 PIPs
  97.    - Comissão: $ 7,00 por lote operado
  98.    
  99.    ** Tanto faz porque Balance e Equity são iguais **
  100.    // MeuLote Será = 0.20
  101.  
  102.    lot = MMRiskMoney / ( sl * ( MMTickValue / MMTickSize ) + comm );
  103.    lot = 20 / ( 0.001 * ( 1 / 0.00001 ) + 7 );
  104.    lot = 20 / ( 0.001 * ( 100000 ) + 7 );
  105.    lot = 20 / ( 100  + 7 );
  106.    lot = 20 / ( 107 );
  107.    lot = 20 / 107;
  108.    lot = 0,18
  109.    
  110.    ** Tirando a Prova
  111.    Lote: 0,18
  112.    Se Fechar no StopLoss, perderá 10 PIPs, então perderá um total de 10 PIPs x 0,18 lotes
  113.    
  114.    Lotes Perdidos: 10x0,18 = 1.8 lotes
  115.    Comissão Cobrada: $ 7,00 x 0.18 = $ 1,26
  116.    
  117.    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á
  118.    abater um total de  $ 19,26 da conta...
  119.    
  120.    Se tivermos ai 0,19 de lote, o valor total perdido ultrapassaria o risco desejado de $ 20,00...
  121.    
  122.    veja só:
  123.    Perda no SL: 0,19 lote x 10 PIPs ( SL ) x $ 10,00 por lote = $ 19,00
  124.    Comissão: 0,19 lote x 7,00 por lote = 1,33
  125.    19 + 1,33 = 20,33 PASSOU DE $ 20,00
  126.  
  127. */
Advertisement
Add Comment
Please, Sign In to add comment