Erros, bugs, perguntas - página 100

 
Urain:

Existe uma cessação forçada da função OnTester()

ou porque é que o histórico das transacções antes da função personalizada existe e devolve zero depois:

double OnTester()
  {
   int HTD=-1;
   Custom_func();
   if(HistorySelect(0,TimeCurrent()))HTD=HistoryDealsTotal();   
   return(HTD);
  }

quais as funções que não estão a funcionar no testador ?

como pode o testador (durante a optimização) sinalizar para o exterior que algo está errado (alertas de impressão, nada funciona) ?

Aparentemente, todos estão a dormir hoje à noite.
[Excluído]  
Urain:
Aparentemente, todos estão hoje a dormir.

Já olhou para os registos dos agentes, talvez tudo esteja lá?

Tanto quanto sei, as impressoras não são exibidas no registo principal de testes apenas durante a optimização (no modo normal, tudo está OK).

OnTester() como eu entendo, não é possível sair à força. E para quê? Calcula simplesmente um determinado resultado de teste (além disso, é essencialmente utilizado apenas para optimização)?

OnTester:
A função OnTester() é um manipulador de eventos do Testador que é gerado automaticamente no final dos testes históricos do Expert Advisor num dado intervalo de datas. A função deve ser definida com tipo duplo, não tem parâmetros:

duploOnTester();

A função é chamada imediatamente antes de OnDeinit() e tem o tipo de retorno duplo. A função OnTester() só pode ser usada em peritos durante os testes. O seu principal objectivo é calcular algum valor a ser usado como o critério Custom max na optimização genética dos parâmetros de entrada.


PS

> porque é que o histórico das transacções antes de uma função personalizada, mas depois mostra zero...

Talvez esta seja uma questão para os criadores.

Tanto quanto sei, OnTester deve devolver o número de transacções (se houver), enquanto que Custom_func() é entendido como uma função personalizada?

 
Urain:

Dedicado aos criadores ...

Vocês pelo menos teriam avisado se tivessem dado uma oportunidade que antes em princípio não era possível.

Perdi vinte e quatro horas a tentar apanhar este insecto.

Não me diga que está tudo bem. Claro que sei disso, mas já perdi 24 horas só porque estou habituado ao facto de que com isto

Estou habituado a que o compilador me dê um erro.

Qual é a forma correcta de o fazer? É "==" ou é "="?
 
Urain:

Existe uma cessação forçada da função OnTester()

ou porque é que o histórico das transacções antes da função personalizada existe e devolve zero depois:

quais as funções que não estão a funcionar no testador ?

como sinalizar do testador (durante a optimização) para o exterior que algo está errado (as impressões alertam que nada funciona) ?

Obrigado pela sua mensagem. A sua candidatura foi recebida - estamos a tratar do assunto.

 

Como posso calcular o lote máximo permitido por margem para abrir uma nova posição? Na MQL4 foi feito da seguinte forma:

MaxLot=AccountFreeMargin()/MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 
EvgeTrofi:

Como posso calcular o lote máximo permitido por margem para abrir uma nova posição? Na MQL4 foi feito desta forma:

Aproximadamente assim:

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
Este código não só calcula o volume máximo, como também o ajusta exactamente dentro dos limites das definições do símbolo.
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
Renat:

É algo parecido com isto:

Este código não só calcula o volume máximo, mas também o enquadra exactamente dentro dos limites da definição dos caracteres.
Obrigado! Eu não tenho OrderCalcMargin() na minha ajuda :)
 
EvgeTrofi:
Obrigado! Eu não tenho OrderCalcMargin() na minha ajuda :)
Esta função foi acrescentada há muito tempo - consulte a documentação, por favor.
 
EvgeTrofi:
Então, qual é o caminho certo no final? É "==" ou é "="?

Seja como for.

if(a==0){expressão} significa que se a é 0 então é verdade, por isso executamos {expressão}.

if(a=0){expressão} é igual a if(a){a=0;expressão} , se a for verdade, então {a atribuir 0, expressão}.

 
Interesting:

Já olhou para os registos dos agentes, talvez tudo esteja lá?

Tanto quanto sei, as impressoras não são exibidas no registo principal de testes apenas durante a optimização (no modo normal, tudo está OK).

OnTester() como eu entendo, não é possível sair à força. E para quê, apenas calcula um determinado resultado de teste (além disso, é essencialmente utilizado apenas para optimização)?

PS

> Porque é que o historial das transacções antes de existir uma função personalizada e dar zero depois...

Talvez este seja um problema para os criadores.

Tanto quanto sei, o OnTester deve devolver o número de negócios (se houver), enquanto a função personalizada é Custom_func()?

O problema é que na optimização em si o programa não funciona como em outras situações (é por isso que preciso de enviar uma mensagem de sob OnTester).

Para este fim, inventei a impressão analógica (função que cria um ficheiro para imprimir uma cadeia passada para a função como parâmetro).

int prints=0;// счётчик вызовов, должен быть обьявлен глобально
//+------------------------------------------------------------------+
//| вывод информации из под тестера                                  |
//+------------------------------------------------------------------+
void WriteFilePrint(string text,string folder="Print")
  {
   string subfolder="Print";
   int han=FileOpen(subfolder+"\\"+folder+(string)prints+".csv",FILE_WRITE|FILE_CSV,";");
   if(han!=INVALID_HANDLE)
     {
      FileWrite(han,text);
      FileClose(han);
     }
   else Print("File open failed"+subfolder+"\\"+folder+".txt, error",GetLastError());
   prints++;
  }

Assim, consegui apanhar a execução incorrecta de algumas funções no OnTester.