ERRO DE CÁLCULO DE GERENCIAMENTO DE DINHEIRO
13 respostas
loonet
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.
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.
JS17
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 🙂
loonet
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)
Marca Fric
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
loonet
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.
JS17
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
Marca Fric
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
JS17
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"?
tomas262
9 anos atrás #130205
O valor do campo Risk in % deve ser maior que zero, ou seja, 0,1, 1 etc.
NirvanaFx
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.
tturtle
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
tomas262
8 anos atrás #131257
Ok, você poderia anexar o arquivo SQW?
och
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
Marca Fric
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
Visualizando 13 respostas - 1 até 13 (de um total de 13)