Erros, bugs, perguntas - página 9

 
DC2008:

Não é correcto usar a condição == para variáveis de tipo duplo. Recomenda-se a comparação desta forma:


Posso acrescentar a isso, que embora com algum atraso, ainda escrevemos um artigo sobre este tópico - Características de trabalhar com números do tipo duplo em MQL4. Tudo o que aí for mencionado continuará a ser relevante para qualquer linguagem de programação quando se tratar de operações com números reais (duplo e flutuante em MQL5).
Особенности работы с числами типа double в MQL4 - Статьи по MQL4
  • www.mql5.com
Особенности работы с числами типа double в MQL4 - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
DC2008:

Não é correcto usar a condição == para variáveis de tipo duplo. Recomenda-se a comparação desta forma:


Bastante razoável, e o mais importante, uma abordagem sensata. Mas parece-me que pelo menos a primeira linha deveria ter ficado assim:

if (MathAbs(LotStep-0.01)<0.01)return(NormalizeDouble(Lot,2));
 

De vez em quando recebo estas mensagens no diário de bordo

2010.06.15 14:48:09 MemoryException 4915200 bytes não disponíveis

Não sei o que fazer ?

 
Prival:

As seguintes mensagens aparecerão periodicamente no diário de bordo

2010.06.15 14:48:09 MemoryException 4915200 bytes não disponíveis

Não sei o que fazer ?

Não há RAM suficiente. Verificar o tamanho das matrizes dinâmicas, muito provavelmente uma tentativa de atribuir mais memória do que a disponível.
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
DC2008:

Não é correcto usar a condição == para variáveis de tipo duplo. Recomenda-se a comparação desta forma:


Não é esse o objectivo da pergunta, se bem entendi, deve sempre colocar o operador de retorno no final de uma função do utilizador
 
joo:
Memória op. insuficiente. Verificar o tamanho das matrizes dinâmicas, muito provavelmente uma tentativa de atribuir mais memória do que a disponível.
Não, não é isso. provavelmente é algo com os servidores. provavelmente há algum trabalho em curso. apareceu um buraco nos dados. a ligação ao servidor é muitas vezes perdida. o histórico não está a ser descarregado. isto provavelmente causou o erro.
 
sergey1294:
Se bem entendi, o operador deve ser sempre colocado no final da função de utilizador.

Penso que a resposta sobre == foi essencialmente. Deveria realmente haver um retorno(...) algures numa função de tipo duplo. Não necessariamente no final. Usando == operador em if() return(); pode causar saída falsa se tiver o tipo LotStep 0.1000000000000000001. Neste caso, nenhum dos retornos funcionará e a função não devolve nada. Embora no seu caso o regresso provavelmente não goste de NormalizeDouble no seu interior. Na sua versão que funciona, fixe o fim para regressar(NormilizeDouble(lote,2)) e veja se funciona. Eu próprio estou curioso sobre isso.

 
gpwr:

Penso que a resposta sobre == foi essencialmente. Deveria realmente haver um retorno(...) algures numa função de tipo duplo. Não necessariamente no final. Usando == operador em if() return(); pode causar saída falsa se tiver o tipo LotStep 0.1000000000000000001. Neste caso, nenhum dos retornos funcionará e a função não devolve nada. Embora no seu caso a devolução provavelmente não goste de NormalizeDouble dentro dela. Na sua versão que funciona, fixe o fim para regressar(NormilizeDouble(lote,2)) e veja se funciona. Eu próprio estou curioso sobre isso.

Deve haver retorno(...) no final, mas pode nunca chegar lá (se uma das condições do Se funcionar)...
 
Interesting:
Deve haver retorno(...) no final, mas pode não chegar a ele (se uma das condições do Se funcionar)...
Era nisso que eu estava interessado, em 4 não era necessário colocá-lo no final.
 

double volMin     =SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
double LotSize    =SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
long   Leverage   =AccountInfoInteger(ACCOUNT_LEVERAGE);
double FreeMargin =AccountInfoDouble(ACCOUNT_FREEMARGIN);  
double LotRqdMgn  =LotSize/Leverage;
double vol=NormalizeDouble(MathFloor(FreeMargin*MaxRisk/LotRqdMgn/Step)*Step,2);
if(vol<volMin) vol=volMin;
if(vol*LotRqdMgn>FreeMargin) vol=0.0;
Print(LotRqdMgn," ",FreeMargin);
return(vol);
Renat
:

O erro é que se esqueceu da moeda da margem nos seus cálculos. Saldo = 100 USD e exigência de margem = 100 EUR (119 USD).

É por isso que a operação não pode ser executada - tudo está correcto.

Quero voltar à minha pergunta sobre o cálculo correcto da margem. Como Renat notou nos meus cálculos, o LotRqdMgn (margem necessária para comprar 1 lote) não tem em conta o preço da moeda. Lembro-me de ter visto esta tabela

Identificador

Descrição

Fórmula

SÍMBOLO_CALC_MODE_FOREX

Modo Forex - cálculo de lucro e margem para Forex

Margem: Lotes*Tamanho_de_contrato/Alavancagem

Lucro: (fechar_preço_aberto_preço)*Tamanho_de_contrato*Lotes

SYMBOL_CALC_MODE_FUTURES

ModoFuturos- cálculo da margem e lucro para futuros

Margem: Lotes *Margem Inicial*Percentagem/100

Lucro: (fechar_preço_aberto_preço)*TickPrice/TickSize*Lots

SÍMBOLO_CALC_MODE_CFD

Modo CFD - cálculo da margem e lucro para CFD

Margem: Lotes *Tamanho do contrato*Preço de mercado*Percentagem/100

Lucro: (fechar_preço_aberto_preço)*Tamanho_de_contrato*Lotes

SÍMBOLO_CALC_MODE_CFDINDEX

Modo índice CFD - cálculo da margem e lucro para CFD por índices

Margem: (Lotes*TamanhoContrato*Preço de Mercado)*TickPrice/TickSize

Lucro: (fechar_preço_aberto_preço)*Tamanho_de_contrato*Lotes

SYMBOL_CALC_MODE_CFDLEVERAGE

Modo de alavancagem de CFD - cálculo de margem e lucro para CFD na negociação de alavancagem

Margem: (Lotes*Tamanho do contrato*Preço de mercado*Percentagem)/Alavancagem

Lucro: (fechar_preço_aberto_preço)*Tamanho_de_contrato*Lotes

Verifica-se então que existe um erro na tabela: em vez de Lots*Contract_Size/Leverage, deve ser Price*Lots*Contract_Size/Leverage.