Erros, bugs, perguntas - página 8

 
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 é mais fácil adicionar o risco em percentagens de títulos. Gostaria de usar o código como exemplo e mostrar a rentabilidade do meu robô comercial.

Dei-lhe o código que funciona sem erros
 
sergey1294:

Cada variante de caso pode ser marcada com uma constante inteira, uma constante de carácter ou uma expressão constante. Uma expressão constante pode não incluir variáveis ou chamadas de funções . Uma declaração de interruptor deve ser do tipo inteiro.
 
Valmars:
Cada variante de caso pode ser marcada com uma constante inteira, uma constante de carácter ou uma expressão constante. Uma expressão constante pode não incluir variáveis ou chamadas de funções. Uma declaração deinterruptor deve ser do tipo inteiro.
Isto já foi tratado.
 
sergey1294:
Dei-lhe um código que funciona sem erros
Tem razão, o resto do código devia ter sido deitado fora em vez de ter sido salvo.
 

Pergunto-me porque é que uma construção como esta não funciona, dá um erro - '}'. - nem todos os caminhos de controlo devolvem um valor

 //+------------------------------------------------------------------+
#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;

  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
}
 
sergey1294:
Dei-vos o código que funciona sem erros.
Desculpa Sergei, de alguma forma perdi-o. Encontrei-o agora. Muito obrigado a todos, não pensei que demorasse tanto tempo.
 
sergey1294:

Pergunto-me porque é que uma construção como esta não funciona, dá um erro - '}'. - nem todos os caminhos de controlo devolvem um valor


O que acha que esta função deve retornar? A maneira como eu vejo as coisas
return(Lot);
 
Interesting:
O que acha que esta função deve retornar? A meu ver -

Não funciona desta forma.


  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));

É assim que funciona.

  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);

  return(Lot); 

	          
 
sergey1294:

Não funciona desta forma

Certo e não funciona. Depende de todos, mas eu pessoalmente sempre acreditei que o retorno( ) deveria ser declarado no final de qualquer função, e o compilador apoia-me nisto.


PS

Pessoalmente, de volta à MQL4 comecei a usar a variável Resultado para calcular o valor de retorno. Devo notar que chamar retorno( ) no fim do código da função é obrigatório e a sua presença no início/médio do código será por vezes percebida como algum análogo de quebra (a única diferença é que a quebra em si não é percebida pelo compilador como um comando para retornar o valor do resultado da função).

 

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

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;

  if (MathAbs(LotStep-0.01)<0.001)return(NormalizeDouble(Lot,2));
  if (MathAbs(LotStep-0.1)<0.001) return(NormalizeDouble(Lot,1));
  if (MathAbs(LotStep-1.0)<0.001) return(NormalizeDouble(Lot,0));
  return(-1);
}
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5