Resposta

ERRO DE CÁLCULO DE GERENCIAMENTO DE DINHEIRO

13 respostas

loonet

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

Perfil da visita

9 anos atrás #113539

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.

 

Como sou programador de MQL, tentei corrigir a função EAW sqMMFixedRisk, substituindo-a por uma função própria que relato aqui abaixo para ajudá-lo a resolver o bug:

    //------ 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 do corretor
    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);
     
    }
    //--------------------------------------------------------------------

Usando essa função, também é possível evitar a configuração do   Lotes Decimais  e o   Taxa de câmbio da moeda base  Parâmetros MM que se tornarão ininfluentes.

 

0

JS17

Cliente, bbp_participante, comunidade, 73 respostas.

Perfil da visita

9 anos atrás #129896

Riccardo

 

Obrigado por isso, mas tenho uma série de perguntas

 

1. Qual parte do código EAW precisa ser excluída?

2. É necessário declarar alguma variável nova para que seu código funcione?

 

Obrigado 🙂

0

loonet

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

Perfil da visita

9 anos atrás #130005

1. Você só precisa substituir a função sqMMFixedRisk pelo código que publiquei.

2. Você não precisa declarar nenhuma variável adicional (leve em consideração que, com a minha função, a variável Lotes Decimais  e o  Taxa de câmbio da moeda base  Os parâmetros do Ea Wizard Money Management tornam-se ininfluentes)

0

Marca Fric

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

9 anos atrás #130015

Olá, Riccardo,

 

Desculpe-me por demorar tanto para responder. Já dei uma olhada na sua função e a testei, mas ela é bem diferente da nossa própria função e não tive tempo de testá-la completamente em todos os ambientes, incluindo a negociação de CFDs etc., que é diferente do forex.

 

Gostaria de fazer isso qualquer dia, mas estou muito ocupado com coisas inesperadas o tempo todo.

Marcar
EstratégiaQuant arquiteto

0

loonet

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

Perfil da visita

9 anos atrás #130020

Obrigado, Marc,

Eu o utilizo basicamente em negociações de Forex.

Comparei o cálculo entre a função original e a modificada.

A função original me dá um comportamento estranho no cálculo do lote: em alguns casos, parece não levar em conta a porcentagem de risco que fixei.

Se quiser, posso lhe enviar um exemplo dos resultados de backtest obtidos usando as duas funções.

0

JS17

Cliente, bbp_participante, comunidade, 73 respostas.

Perfil da visita

9 anos atrás #130049

Riccardo,

 

Obrigado por sua resposta e explicação - como Mark já respondeu, vou esperar que ele termine seus testes - obrigado novamente

0

Marca Fric

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

9 anos atrás #130154

Testei-o e tudo parece estar funcionando corretamente, por isso acabei de lançar uma atualização automática do EA Wizard que contém a correção do Money Management feita pelo Riccardo.

Marcar
EstratégiaQuant arquiteto

0

JS17

Cliente, bbp_participante, comunidade, 73 respostas.

Perfil da visita

9 anos atrás #130163

Posso perguntar se, ao usar esse recurso, eu inserir 0 no risco %, a função usará o valor inserido em "lotes se não houver MM"?

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

9 anos atrás #130205

O valor do campo Risk in % deve ser maior que zero, ou seja, 0,1, 1 etc.

0

NirvanaFx

Cliente, bbp_participante, comunidade, 5 respostas.

Perfil da visita

8 anos atrás #130401

Tentei usar o Risk no % e, não importa o que eu tente, qualquer que seja a porcentagem que eu coloque no campo (ou seja, 1,20, 0,06. 0,3 etc.), essa é a exata fixo tamanho do lote que é negociado. Não está variando o tamanho do lote de forma alguma. Ele não está padronizando para Lotes se não houver MM ou algo do gênero e eu tiver o stoploss para que o risco seja calculado. Isso é um bug que alguém mais tem experimentado ultimamente? Também tenho a atualização mais recente.

0

tturtle

Assinante, bbp_participante, comunidade, 6 respostas.

Perfil da visita

8 anos atrás #131241

Oi Marc e Tomas,

 

Este parece ser o tópico mais próximo do que estou vivenciando.

 

MM para % fixo do patrimônio líquido é definido, assim como o Stop Loss global. Todas as negociações são definidas para usar essas configurações.

 

No TEster do MT4, todos os tamanhos de lote estão sendo padronizados para 0,01 lote no EURUSD.

 

Em anexo está o código que estou usando. Por favor, me informe se você consegue ver alguma coisa.

 

Estou usando o MT4 Build 840

 

Obrigado e cumprimentos

Tim

 

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

8 anos atrás #131257

Ok, você poderia anexar o arquivo SQW?

0

och

Assinante, bbp_participante, comunidade, 2 respostas.

Perfil da visita

8 anos atrás #133734

Olá, 
Não tenho certeza se este é o lugar certo para publicar este comentário, mas acho que também há um erro no cálculo do lote StrategyQuant (v3.8.1):

 

Linha 14: if(MathMod(lotMM*100, lotStep*100) > 0) {

 

deve ser

 

               se(MathMod(lotMM1*100, lotStep*100) > 0) {

double computeMMFromRiskPerTrade(double riskPerTrade, double slSize) {
   se(slSize 0) {
      lotMM = lotMM1 - MathMod(lotMM1, lotStep);
   } else {
      lotMM = lotMM1;
   }

   lotMM = NormalizeDouble( lotMM, LotsDecimals);

   if(MarketInfo(Symbol(), MODE_LOTSIZE)==10000.0) lotMM=lotMM*10.0 ;
   lotMM=NormalizeDouble(lotMM,LotsDecimals);

   //Log("Computing lots, risk: ", riskPerTrade, ", lotMM1: ", lotMM1, ", lotStep: ", lotStep, ", lots: ", lotMM);
   double Smallest_Lot = MarketInfo(Symbol(), MODE_MINLOT);
   double Largest_Lot = MarketInfo(Symbol(), MODE_MAXLOT);

   se (lotMM Largest_Lot) lotMM = Largest_Lot;

   se(lotMM > MaximumLots) {
      lotMM = MaximumLots;
   }

   //Log("SL size: ", slSize, ", LotMM: ", lotMM);

   return (lotMM);
}

Cumprimentos,

och

0

Marca Fric

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

8 anos atrás #133753

Olá, Olivier,

 

você está certo, existe esse erro. Lançarei uma atualização amanhã com uma correção.

Marcar
EstratégiaQuant arquiteto

0

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