Resposta

Gerenciamento de dinheiro Problem - % fixo e tamanho do lote

5 respostas

Julianrob

Cliente, bbp_participante, comunidade, 54 respostas.

Perfil da visita

9 anos atrás #113227

Olá Mark,

 

Primeiramente, muito obrigado pelo suporte útil até o momento. Parece que estou tendo dificuldades com meu gerenciamento de dinheiro com esse EA - estou usando MM predefinido em minhas regras de estratégia.

 

Na seção de estratégia, tenho variáveis para o tamanho do lote e a porcentagem fixa definida como valor duplo, mas quando executo esse EA no AUDUSD ou EURUSD com tamanho de lote de 0,10, ele sempre abre negociações com tamanho de lote de 0,01.

 

Quando defino AccountRiskPerTrade como 5, ele abre tamanhos de negociação de 5 lotes para cada negociação, mas não compõe os ganhos. Veja as fotos em anexo.

 

Para stop loss e take profit, estou usando valores fixos que são definidos como variáveis, definidos como um único dígito e o tipo é int (inteiro)

 

Qualquer ajuda seria ótima, obrigado.

Arquivo: TradeMM.jpgTradeMM.jpg

0

Marca Fric

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

9 anos atrás #128549

Olá,

 

Em sua escolha de MM, os lotes são computados dinamicamente, dependendo do SL e do patrimônio líquido da conta corrente. O LotSize é usado somente se a MM não puder ser calculada, geralmente quando você não tem SL definido para a ordem.

Mas como você tem o risco por negociação definido como 0, isso não faz sentido.

 

Se quiser usar o tamanho de lote fixo, use "No money management"; caso contrário, defina quanto % da conta você deseja arriscar em cada negociação.

 

 

O problema com o tamanho calculado é que você tem a variável LotsDecimals definida como 2, o que significa que ela arredondará os lotes para 2 números decimais.

 

Ele não compõe os ganhos - ele funcionará quando você definir o risco por negociação como um valor diferente de zero.

Marcar
EstratégiaQuant arquiteto

0

Julianrob

Cliente, bbp_participante, comunidade, 54 respostas.

Perfil da visita

9 anos atrás #128585

Obrigado, Mark, entendi.

0

loonet

Assinante, bbp_participante, comunidade, cliente, sq-ultimate, 15 respostas.

Perfil da visita

9 anos atrás #129589

Olá, Mark, sou Riccardo, da Sapienza Finanziaria

Gostaria de observar que, em minha opinião, a EAW tem um erro no cálculo do risco de gerenciamento de dinheiro com Fixed% do patrimônio líquido da conta.

No sistema de negociação que estou planejando, fixei um risco por negociação de 1%

Tente ver, por exemplo, o que acontece na negociação # 79, que eu destaco na imagem anexa.

traderesult.jpg

 

Antes da negociação #79, tenho um saldo de US$ 21680 em minha conta e defini um risco por negociação de 1%.

Isso significa que eu poderia perder cerca de US$ 217,00 se eu adquirir o SL.

A negociação # 79 é uma operação de COMPRA com preço de entrada em 1,3703 e SL em 1,3640.

A operação vai a mercado com lotes de 3:40, portanto cada pip é de 34 USD.

A transação fecha com uma perda de 1241 pips (= 63 x 34).

Na verdade, para respeitar um risco por negociação de 1%, o sistema de negociação deveria ter aberto essa negociação com 0,34 lote e não com 3,40 lotes.

 

 

Por isso, tentei corrigir a função EAW sqMMFixedRisk, substituindo-a por uma função própria que relato aqui abaixo:

//------ sqMMFixedRisk corrigido por Riccardo

double sqMMFixedRisk (int orderMagicNumber, int orderType)
  {
   
   double LotSize=0;
  
   double _riskInPercent = RiskPercent;
   double _maximumLots = 5.0;
   
   double slSize = sqMMGetOrderStopLossDistance(orderMagicNumber, orderType) * gPointPow;


   double riskPerTrade=AccountBalance() *(_riskInPercent/100);
   
  
   se(slSize 0 && TickValue>0)
     {
      
      LotSize = MarketInfo(Symbol(),MODE_TICKSIZE) * riskPerTrade / (slSize * TickValue * MarketInfo(Symbol(),MODE_POINT) );

      int err=GetLastError();
      if(err==4013)
        { //ERR_ZERO_DIVIDE
         Verbose("Err: divisão por zero: StopLoss:",slSize," TickValue:",TickValue," LotSize:",LotSize);
         return(-1);
        }
     }

//--- Gerenciamento de MAXLOT e MINLOT
   double Smallest_Lot = MarketInfo(Symbol(), MODE_MINLOT);
   double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT);

   se (LotSize Largest_Lot) LotSize = Largest_Lot;

   se (LotSize > _maximumLots) {
      LotSize = _maximumLots;
   }
//--------------------------------------------



//--- LotSize arredondado com relação ao LOTSTEP da corretora
   if(MarketInfo(Symbol(),MODE_LOTSTEP)==1)
     {
      LotSize=NormalizeDouble(LotSize,0);
     }
   if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1)
     {
      LotSize=NormalizeDouble(LotSize,1);
     }
   if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)
     {
      LotSize=NormalizeDouble(LotSize,2);
     }
   if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.001)
     {
      LotSize=NormalizeDouble(LotSize,3);
     }
//--------------------------------------------

   return (LotSize);

  }
//--------------------------------------------------------------------

Com ele, você também pode evitar definir o   Lotes Decimais  e o   Taxa de câmbio da moeda base  Parâmetros MM que se tornam ininfluentes.

0

geektrader

Customer, bbp_participant, community, 522 replies.

Perfil da visita

9 anos atrás #129667

O SQ parece ter alguns problemas com o dimensionamento correto da posição em relação ao StopLoss / Moeda base da conta e ao par negociado, pois todos esses fatores devem ser levados em conta para calcular corretamente o tamanho do lote resultante da negociação. Para ajudar, aqui está meu código que aperfeiçoei e uso há 5 anos no MT4. Ele leva em conta o SL, a moeda em que o par é indicado e a moeda em que a conta negociada é indicada, de modo que sempre o % correto seja perdido se um SL for atingido. Além disso, ele verifica o tamanho mínimo e máximo permitido do lote, o tamanho da etapa do lote e a margem necessária e garante que a margem seja usada somente até 73% quando um SL completo for atingido, para que você não seja impedido de operar por causa de uma margem muito baixa (o que, de qualquer forma, seria um overtrading absurdo). Talvez Mark possa adaptá-lo para a SQ.

 

Basta passar a ele o SL e a quantidade máxima de negociações que você abre posteriormente (eu uso isso para calcular a média e quando ainda quero perder apenas uma quantia específica em todas essas negociações - para negociações diretas, basta passar "1" para ele):

double GetLotSize(double TotalRiskPercentageAllTrades, double Stop_Loss, int MaximumTrades)
{
    int DigitsMulti = 1;

    se (Digits == 5 || Digits == 3)
        DigitsMulti = 10;

    Stop_Loss = Stop_Loss * DigitsMulti;
    double divided_by = 0;
    double Lots = 0;

    se (TotalRiskPercentageAllTrades != 0)
    {
        double RiskBalance = AccountBalance() * (TotalRiskPercentageAllTrades / 100,0);
        if (MarketInfo(Symbol(), MODE_TICKSIZE) != 0 && Stop_Loss != 0)
            divided_by = MarketInfo(Symbol(), MODE_TICKVALUE) * (MarketInfo(Symbol(), MODE_POINT) / MarketInfo(Symbol(), MODE_TICKSIZE));
        se (divided_by == 0)
            Print("Money Management Temporarily Disabled Due To Division By: ", divided_by);
        senão
            Lotes = RiskBalance / divided_by / Stop_Loss;
    }

    Lotes = Lotes / MaximumTrades;
    Lotes = MathMax(Lotes, MarketInfo(Symbol(), MODE_MINLOT));
    Lotes = MathMin(Lotes, MarketInfo(Symbol(), MODE_MAXLOT));
    if (MarketInfo(Symbol(), MODE_MARGINREQUIRED) != 0)
        Lotes = MathMin(Lotes, AccountEquity() / MarketInfo(Symbol(), MODE_MARGINREQUIRED) * 0.73);
    Lotes = MathCeil(Lotes / MarketInfo(Symbol(), MODE_LOTSTEP)) * MarketInfo(Symbol(), MODE_LOTSTEP);
    Lotes = MathMax(Lotes, MarketInfo(Symbol(), MODE_MINLOT));

    return(Lots);
}


🚀 Unlock Your Edge in Automated Forex Strategy Development 🚀

Historical Forex Data Starting From 1987, 28 Pairs, M1, 99% Error-Free, Lifetime Free Updates

0

Julianrob

Cliente, bbp_participante, comunidade, 54 respostas.

Perfil da visita

9 anos atrás #129673

Obrigado pelas informações.

 

Descobri como ativar a opção de risco de gerenciamento de dinheiro % ou de tamanho de lote fixo nas variáveis ao codificar o EA. A solução simples que usei foi criar uma variável com valor booleano true/false e chamá-la de "UseRiskPercent"

 

Depois, tenho uma regra que abre a negociação usando o risco de gerenciamento de dinheiro% somente se a variável UseRiskPercent estiver definida como TRUE. Uma segunda regra que é um clone da primeira e diz que, se UseRiskPercent estiver definida como falsa, use um tamanho de lote fixo para a negociação.

 

Juliano

0

Visualizando 5 respostas - 1 até 5 (de um total de 5)