função de cálculo automático de tamanho de lote? - página 5

 

Olá Phillip, aqui de novo Shawn. Fiz as pequenas mudanças que discutimos da última vez (contudo, ainda não implementei sua última versão) e os problemas com lotes de pares JPY ainda estão aparecendo. Deixei minha EA funcionar ontem à noite e gerou 3 negociações (meu saldo de conta era de US$2550, o risco é de 1%, então cerca de US$25 de risco por negociação):


(1) Vender NZDJPY, 0,89 lotes

(2) Vender AUDJPY, 0,23 lotes

(3) Vender CADJPY, 0,94 lotes


Os lotes para o comércio AUDJPY parecem estar bem, mas não os outros dois. Eu tinha algumas declarações impressas embutidas ao redor das chamadas para suas coisas. Primeiro, aqui está o código do meu EA para esta parte:


if(Bid > SellPrice && SellPrice != 0.00)
         {       
          CurrentOrderType=OP_SELL;
          CurrentStopLossPrice= FinalSellStopPrice;
          CurrentEquityAtRisk=(MaxPercentEquityAtRisk/100.0)*AccountBalance();
          CurrentLotSize=LotSize(CurrentEquityAtRisk,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "AccountBalance = ", DoubleToStr(AccountBalance(),2), " Max EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Max Lotsize = ",DoubleToStr(CurrentLotSize,4));
          CurrentLotSize=NormalizeLotSize(CurrentLotSize);
          Print("SELL - ", Symbol(), "Normalized LotSize is now = ", DoubleToStr(CurrentLotSize,4));
          if(CurrentLotSize<MarketInfo(Symbol(),MODE_MINLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MINLOT);
          if(CurrentLotSize>MarketInfo(Symbol(),MODE_MAXLOT)) CurrentLotSize=MarketInfo(Symbol(),MODE_MAXLOT);
          CurrentEquityAtRisk=EquityAtRisk(CurrentLotSize,CurrentStopLossPrice,CurrentOrderType,CurrentSymbolType,CurrentCounterPairForCross);
          Print("SELL - ", Symbol(), "Current EquityAtRisk = $",DoubleToStr(CurrentEquityAtRisk,2)," and Current Lotsize = ",DoubleToStr(CurrentLotSize,4));
          Print("SELL - ", Symbol(), " MarketInfo(MODE_STOPLEVEL) = ",DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),5));
          
          //Check free margin
          if (AccountFreeMargin() < (1000 * CurrentLotSize)) 
          {
             Print("We have no money. Free Margin = ", AccountFreeMargin());
             return(0);
          }
         
          Ticket=OrderSendReliable2Step(Symbol(),OP_SELLSTOP,CurrentLotSize,FinalSellPrice,Slippage,CurrentStopLossPrice,FinalSellProfTarg,Symbol()+DoubleToStr(MagicNumber,0),MagicNumber,0,Red);
          if(Ticket<=0) Print("Error = ",GetLastError());
          else 
          { 


E aqui está a saída dos extratos impressos tirados do registro, para cada uma das 3 negociações acima:


05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 e Max Lotsize = 0.8988
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYNormalized LotSize é agora = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPYCurrent EquityAtRisk = $25.26 e Current Lotsize = 0.8900
05:16:10 DelphiEA NZDJPY,H1: SELL - NZDJPY MarketInfo(MODE_STOPLEVEL) = 70.00000


05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 e Max Lotsize = 0.2376
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYNormalized LotSize é agora = 0.2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPYCurrent EquityAtRisk = $24,69 e Current Lotsize = 0,2300
05:16:56 DelphiEA AUDJPY,H1: SELL - AUDJPY MarketInfo(MODE_STOPLEVEL) = 50.00000


07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYAccountBalance = 2550.90 Max EquityAtRisk = $25.51 e Max Lotsize = 0.9408
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYNormalized LotSize é agora = 0.9400
07:13:53 DelphiEA CADJPY,H1: SELL - CADJPYCurrent EquityAtRisk = $25.49 e Current Lotsize = 0.9400

07:13:53 DelphiEA CADJPY,H1: SELL - CADJPY MarketInfo(MODE_STOPLEVEL) = 60.00000


Espero que isto ajude!!

Oh Phillip, uma outra coisa - acho que encontrei um pequeno bug na OrderSendReliable2Step. Você saberia a quem eu deveria relatar isso?


Obrigado!

Shawn

 
Ricotter:

Esse cara faz isso usando o histórico do arquivo.

https://www.mql5.com/en/articles/1493

Como você é novo aqui, vale a pena mencionar que esta limitação não existe no MT5 Tester. PARA SUA PRÓPRIA INFORMAÇÃO.

 
gordon:

Como você é novo aqui, vale a pena mencionar que esta limitação não existe no MT5 Tester. PARA SUA PRÓPRIA INFORMAÇÃO.

Obrigado pela dica. Há alguma razão para eu NÃO estar usando o MT5?

 
Ricotter:

Obrigado pela dica. Existe alguma razão para eu NÃO estar usando o MT5?

Se você quer negociar ao vivo imediatamente, então é melhor você se ater ao MT4, mas se você planeja aprender e fazer demonstrações por alguns meses antes de ir ao vivo, então você pode considerar isso. É uma nova plataforma com muitas melhorias em relação ao MT4, mas também é muito mais complicada e ainda não suportada por muitos corretores. Aqui estão algumas boas informações -> http://www.100forexbrokers.com/mt5-metatrader5. Além disso, você pode querer conferir a MQL5.com.
 
shawnh:

Olá Phillip, aqui de novo Shawn. Fiz as pequenas mudanças que discutimos da última vez (contudo, ainda não implementei sua última versão) e os problemas com lotes de pares JPY ainda estão aparecendo.

Tudo "parece" bem em seu código, ainda não tem idéia do porquê de estar acontecendo com você.

Eu recomendo mudar para o código mais recente. Neste ponto, você precisa mudar alguma coisa, já que o que você tem agora não está funcionando corretamente.

Não sei a quem você deve reportar os bugs em relação a problemas de ordem, desculpe.
 
1005phillip:

Passo 1: Coloque todos os anexos de arquivo deste post em seu caminho de inclusão (...especialistas/incluem*.mqh)

Passo 2: Adicione o seguinte ao topo de sua EA para que ela tenha acesso às funções de chamada contidas nos arquivos anexos

Etapa 3: Para calcular os lotes com base em uma quantia orçada de capital próprio para o risco, acrescente o seguinte

Assumindo que você tenha definido MaxPercentEquityAtRisk em algum lugar em sua EA como sendo o patrimônio líquido máximo permitido para colocar em risco de perda completa por operação caso as paradas sejam atingidas, esta porção de código determinará primeiro o tamanho máximo de lotes com base no preço aberto e no preço de stoploss (não pips mas o preço real de mercado, o mesmo que você envia em seu pedido ao corretor) e então determinará o tamanho máximo de posição que o corretor aceitará enquanto não exceder seu patrimônio líquido de risco orçado.

Passo 4: Se você gosta de ter os resultados dos cálculos impressos em seu registro ou adicionados ao negócio como um comentário de ordem, você também pode adicionar o seguinte

Etapa 5: Faça seu pedido (utilizando o método de encomenda confiável)

https://c.mql5.com/mql4/forum/2010/10/OrderReliable_2010.10.12.mqh


Oi 1005phillip,


Você tem uma versão dos 2 mqh (análise..., e tradepositionmanage...) que não tem nenhuma importação dos abaixo? Isto porque ambos têm essa importação, e portanto não é permitida pelo compilador.

//#incluir <stderror.mqh>
//#incluir <stdlib.mqh>


...para que eu não edite os arquivos e os mantenha em estado somente leitura. Ou posso editá-los e remover essas importações?

 
jcadong5:

...para que eu não edite os arquivos e os mantenha em estado somente leitura. Ou posso editá-los e remover essas importações?


Vá em frente e edite-os ao seu gosto. A duplicidade não impede a compilação para mim, o compilador registra uma nota sobre a duplicidade, mas é só isso que faz.
 
Obrigado.
 
1005phillip:
Tudo "parece" bem em seu código, ainda não tem idéia do porquê de estar acontecendo com você.

Eu recomendo mudar para o código mais recente. Neste ponto, você precisa mudar alguma coisa, já que o que você tem agora não está funcionando corretamente.

Não sei a quem você deve reportar os bugs em relação a problemas de ordem, desculpe.


Olá Phillip, aqui novamente Shawn. Depois de ter instalado sua última versão há algumas semanas, tenho o prazer de informar que tudo parece bem agora e os tamanhos de lote calculados parecem estar em alta. Acho que eu só precisava da versão mais recente!


Obrigado novamente por toda a sua ajuda, você é um bom homem!


Abraço

Shawn

 

O prazer é meu! E obrigado por me informar que está trabalhando para você, agradeço o feedback. Não tenho certeza do que correu mal com o código anterior. Pode muito bem ter sido um erro de algum tipo que eu corrigi sem querer entre as revisões.

Provavelmente terei uma versão atualizada dentro de uma semana ou duas que terá alguns recursos de retorno para uso com testes de retorno no MT4 empares de moedas cruzadas. Agora mesmo, se você tentar fazer um backtest em pares cruzados enquanto usa meu código de tamanho de lote, seu backtest vai bombardear porque o backtester não pode acessar os preços de mercado para os pares de contador e base necessários. (isto não é um problema em testes ao vivo ou em teste avançado, puramente uma limitação do MT4 para o backtester)

Eu afixarei o código quando eu cruzar aquela ponte por acaso você ou outros acharem útil.

Tenha um bom fim de semana,
- Phil

Razão: