Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 561

 
Ihor Herasko:

Simples:

dá um erro

 
Aleksandr Lishchenko:

mensagem de erro

Onde está o erro? Que tipo de erro?

 

Olá. Tenho uma tarefa para verificar o parâmetro de volume de entrada de negociação especificado pelo usuário para a exatidão, ou seja, o lote especificado deve ser um múltiplo da etapa de troca de lote. Para isso, obtenho o restante real da divisão e comparo com um zero ou um valor muito próximo de zero (por exemplo, 0,000000001)

void OnStart()
{
   double volume = 0.03;
   Alert("Результат деления ", volume/MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Шаг изменения лота ", MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Вешественный остаток ", fmod(volume, MarketInfo(Symbol(), MODE_LOTSTEP)));
}

Resultado:

/*
   Вещественный остаток 0,009999999999999998
   Шаг изменения лота 0,01
   Результат деления 3,0
*/

Também anexou uma captura de tela.

Eu acho que o restante deve ser zero ou um número muito pequeno, mas o resultado é quase 0,01 por alguma razão? Então, como posso verificar o parâmetro de entrada se, por exemplo, o usuário define 0,001 por engano?

Arquivos anexados:
4npm6qh.png  8 kb
 
Aleksandr Teleguz:

Olá. Tenho uma tarefa para verificar o parâmetro de volume de entrada de negociação especificado pelo usuário para a exatidão, ou seja, o lote especificado deve ser um múltiplo da etapa de troca de lote. Para fazer isso, encontre uma divisão real e compare-a com um zero ou um valor muito próximo de zero (por exemplo, 0,000000001)

Resultado:

Também anexou uma captura de tela.

Eu acho que o restante deve ser zero ou um número muito pequeno, mas o resultado é quase 0,01 por alguma razão? Então, como posso verificar o parâmetro de entrada se, por exemplo, o usuário define 0,001 por engano?

É um pouco errado. A primeira coisa a fazer é calcular o valor correto mais próximo (com base no valor definido), e depois verificar a diferença entre os valores obtidos. Se for igual a zero (ou não mais do que DBL_EPSILON), então tudo está bem:

void OnStart()
{
   double volume = 0.03;

   double fVolumeMin = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);   
   double fVolumeMax = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);   
   double fVolumeStep = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); 

   double fNearestCorrectVolume = VolumeCast(volume, fVolumeMin, fVolumeMax, fVolumeStep);
   if (fabs(fNearestCorrectVolume - volume) > DBL_EPSILON)
      Alert("Ошибка");
   else
      Alert("Все ОК");
}

A função VolumeCast pode ser tomada a partir daqui.

 
Ihor Herasko:

Onde isso vai dar errado? Que tipo de erro ele dá?

1 erro(s), 0 advertência(ões) 2 1
"se" - não são permitidas expressões em um

 

Boa tarde!!!

Pessoal, podem me dizer o código sobre como vincular uma EA a uma conta (para a última atualização do MT4).

Muito obrigado.

 
Aleksandr Lishchenko:

Boa tarde!

Pessoal, podem me dizer o código sobre como vincular uma EA a uma conta (para a última atualização do MT4).

Muito obrigado.

Você já recebeu o código.

Você mesmo cometeu o erro - está escrito na descrição do erro que você digitou o código na área das variáveis globais e não dentro do OnTick() ou OnInit():

'if' - expressions are not allowed on a global scope

E com tal conhecimento você ainda está tentando proteger seu código de outra pessoa?
 
Artyom Trishkin:

O código já lhe foi dito.

Você mesmo cometeu o erro - está escrito na descrição do erro que você digitou o código na área de variáveis globais, não dentro de OnTick() ou OnInit():

'if' - expressions are not allowed on a global scope

E com esse conhecimento, você ainda está tentando proteger seu código de outra pessoa?

Estou apenas aprendendo!

Não julgue! ;)

 
Aleksandr Lishchenko:

1 erro(s), 0 advertência(ões) 2 1
"se" - não são permitidas expressões em um

Mostre-me como você aplicou o código. Você acabou de copiar o que eu escrevi?

 
Ihor Herasko:

Mostre-me como você aplicou o código. Você acabou de copiar o que eu escrevi?

Eu fiz :))))