Cálculo de Lote

 

Olá pessoal,

Sou iniciante em MQL5, estou ainda na "fase de testes", fiz algo bem simples para começar a praticar, estou com o seguinte problema, fiz um cálculo para o lote que será aplicado em cada trade, estou no momento testando com EUR/USD, em uma conta demo de 5.000, risco de 1%, ou seja cada trade existe o risco de perda de 50 dólares, entretando quando eu faço o teste e o preço bate no stopLoss, minha perda é de 200 dólares.


//+------------------------------------------------------------------+
//|                                           EMA_RSI_Stochastic.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
CTrade trade;



// Inputs
input int         percentageAccountRiskLimitPerTrade = 1;     // Account Risk Limit Per Trade
input int         pipRiskOnATrade                    = 200;   // Pip Risk on a Trade
input double      lot                                = 0.01;  // Lot Size                                    


// Variables
double            stopLoss;
double            takeProfit;
double            exponentialMovingAverageArray5[];
double            exponentialMovingAverageArray10[];
double            accountRiskMoney;
double            lotSize;

int               exponentialMovingAverage5;
int               exponentialMovingAverage10;


// Strutures
MqlTick           ticks;



int OnInit()
  {
   
   exponentialMovingAverage5 = iMA(_Symbol, _Period, 5, 0, MODE_EMA, PRICE_CLOSE);    
   exponentialMovingAverage10 = iMA(_Symbol, _Period, 10, 0, MODE_EMA, PRICE_CLOSE);
        
   ArraySetAsSeries(exponentialMovingAverageArray5, true);
   ArraySetAsSeries(exponentialMovingAverageArray10, true);
       
   return(INIT_SUCCEEDED);
   
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---,
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {            
          
    CopyBuffer(exponentialMovingAverage5, 0, 0, 3, exponentialMovingAverageArray5);
    CopyBuffer(exponentialMovingAverage10, 0, 0, 3, exponentialMovingAverageArray10);
  
  
    SymbolInfoTick(_Symbol, ticks);
           

        
    if(exponentialMovingAverageArray5[0] > exponentialMovingAverageArray10[0] && PositionsTotal() == 0) {
    
       CalculateAccountRiskLimitPerTrade();       
       lotSize        = CalculateLotSizeForATrade();
                 
       stopLoss = NormalizeDouble(ticks.ask - (pipRiskOnATrade * _Point), _Digits);
       takeProfit = NormalizeDouble(ticks.ask + (pipRiskOnATrade * _Point), _Digits);
       
       lotSize = NormalizeDouble(lotSize, 2);
                   
       trade.Buy(lotSize, _Symbol, ticks.ask, stopLoss, takeProfit, NULL); 
     }                      
  }
  
  
void CalculateAccountRiskLimitPerTrade() {

    accountRiskMoney           = ( AccountInfoDouble(ACCOUNT_BALANCE) / 100) * percentageAccountRiskLimitPerTrade;
}  


double CalculateLotSizeForATrade() {

    double positionSize        = accountRiskMoney / (pipRiskOnATrade * 0.10);
    
    return lot * positionSize;
}
//+------------------------------------------------------------------+


Poderiam me dar um força para encontrar o problema e dicas de como melhor a lógica do código abaixo.

Forte abraço.

 
crls1235:

Olá pessoal,

Sou iniciante em MQL5, estou ainda na "fase de testes", fiz algo bem simples para começar a praticar, estou com o seguinte problema, fiz um cálculo para o lote que será aplicado em cada trade, estou no momento testando com EUR/USD, em uma conta demo de 5.000, risco de 1%, ou seja cada trade existe o risco de perda de 50 dólares, entretando quando eu faço o teste e o preço bate no stopLoss, minha perda é de 200 dólares.



Poderiam me dar um força para encontrar o problema e dicas de como melhor a lógica do código abaixo.

Forte abraço.

Tente este código:

   double tickSize      = SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE);
   double tickValue     = SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE);
   double valueToRisk   = risk / 100 * capital;
   double tickCount     = sldistance / tickSize;
   double lots          = valueToRisk / (tickCount * tickValue);
Razão: