Erros, bugs, perguntas - página 7

 
FEDOR_MQL:

E nesta fase de desenvolvimento: parâmetros, chamada de função e a própria função devem ou não mostrar erros de tempo de compilação. Em caso afirmativo, porquê? Tenho erros.

Sim, mostra de facto erros por alguma razão, ainda que não deva haver nenhum. Peço aos programadores que prestem atenção a isto. Mudei-o desta forma, não há erros, mas quando uso o interruptor ainda mostra erro.

 //+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters

input double   Lots=0.1;
input bool     MM = true;
input double   Risk = 10.0;

double lots;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(MM) lots = LotSon();      //вызов функции LotSon 
   else lots = Lots;
  }
//+------------------------------------------------------------------+
double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;
  // Вариант первый
  /*
  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }
  */
  // Вариант второй
  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
  // Вариант третий
  // if (LotStep == 0.01)     Lot=NormalizeDouble(Lot,2);
  // else if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  // else if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
 return(Lot); 
}
 
sergey1294:

Sim, de facto, por alguma razão erros, embora não deva haver nenhum. Peço aos programadores que prestem atenção a isto, voltei a fazê-lo assim, sem erros, mas ao usar o interruptor ainda dá erro.

  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }

Tem de enviar lotes como int, ou seja, 0,01 = 1000 e 0,10 = 10000...

 
Interesting:

Os lotes devem ser enviados aqui como int, ou seja, 0,01 = 1000 e 0,10 = 10000...

Segundo a sua opinião, a função
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
devolve 1000 em vez de 0,01
 
sergey1294:
Então está a dizer que a função
devolve um valor de 1.000 em vez de 0,01.

Não, eu quis dizer que o erro desaparecerá se o código tiver este aspecto:

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
Acabei de notar que em
switch
não pode utilizar números de dupla precisão, então esta opção não pode ser utilizada neste caso.
 
sergey1294:
Acabei de notar que em
não pode usar números de precisão dupla, então esta opção não pode ser usada neste caso.
Pode se converter lotes em int de antemão. Como disse acima...
 
permanece a questão de saber por que razão um tal desenho não pode ser utilizado
  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
 
Interesting:
Pode fazê-lo se converter lotes em int. O que eu disse acima...

Posso ver o código, se não se importa? Já tentei de todas as maneiras, mas não funciona.

Não sei se é mais fácil adicionar o risco em percentagens de títulos. Obrigado!

 
FEDOR_MQL:

Posso ver o código, se não se importa? Já tentei de todas as maneiras, mas não funciona.

Não sei se existe qualquer outra variante simples, basta adicionar o risco em percentagem do depósito à EA. Obrigado!

Aqui, por exemplo, dei uma série de funções interessantes sobre o cálculo dos riscos


E para que este código funcione, basta multiplicar o lote por 100000 e alimentá-lo para mudar (StepSize) como um parâmetro (variável do tipo int).


PS

E em geral, para ser honesto, não compreendo bem o propósito de todas estas variantes? Quer dizer, no contexto desta função, uma das últimas.... é suficiente.

 
Interesting:

Depende do que se quer obter no resultado final, aqui, por exemplo, eu dei algumas funções interessantes sobre o risco


E para que este código funcione, basta multiplicar o lote por 100000 e passá-lo para mudar (StepSize) como parâmetro (variável do tipo int).

O vosso artigo é o que eu penso que preciso. Obrigado