Erros, bugs, perguntas - página 1153

 
joo:
O vídeo nos posts do fórum não é reproduzido. no lugar do espaço vazio do vídeo. experimentou muitos browsers. dispositivo - Lenovo K900.
Vídeo toca bem no site youtube. e em outros sites youtube vídeo toca....
Vamos verificar.
 
Renat:
Como se executa um programa instalado no Windows 8.1? Com /portável?
Não. Normalmente, faço-o sem /portável. Não só isso, mas para ter a certeza, instalei e desinstalei o MT5 duas vezes. Após a desinstalação, também apaguei manualmente as pastas em AppData.
 

Se trabalhar no Windows 8.1 como um utilizador normal, o terminal MT5 não se lembra dos números de conta introduzidos. O MetaEditor também não salva o estado de armazenamento da MQL5. Isto só pode ser corrigido se trabalhar como administrador ou se "Executar este programa como administrador" for seleccionado no metaeditor64.exe e no terminal64.exe propriedades do ficheiro.

Mas neste caso, ao correr sob uma conta de utilizador normal, tenho de introduzir a palavra-passe do administrador - será isto correcto, tendo em conta as questões de segurança?

P.S. O terminal é o mais recente - mas o problema não é novo.


 

Boa tarde.

Tenho um indicador bastante intensivo em recursos (que é calculado a partir de 7+ matrizes), carrega normalmente apenas "intermitentemente" no terminal, não sei por que razão. Não tem erros, é algo com o próprio terminal MT5.

Gostaria de o testar no testador, mas no testador continua a dar um erro: anexei uma imagem de ecrã.

Por favor, informe, existe alguma possibilidade de processar o erro antes do início do testador e recarregar à força o indicador no testador, se este aparecer?

 
M1k3:

Boa tarde.

Tenho um indicador bastante intensivo em recursos (que é calculado a partir de 7+ matrizes), carrega normalmente apenas "intermitentemente" no terminal, não sei por que razão. Não tem erros, é algo com o próprio terminal MT5.

Gostaria de o testar no testador, mas no testador continua a dar um erro: anexei uma imagem de ecrã.

Por favor, informe, existe alguma forma de lidar com o erro antes do início do testador e recarregar à força o indicador no testador, se ele aparecer?

.

O erro está no seu código, não no terminal. Há até uma dica onde procurar o erro: linha 302, posição 49. Este erro é uma matriz fora do seu alcance. Por exemplo, tem uma matriz com tamanho [4], mas está a tentar obter valor [5].
 
barabashkakvn:
O erro está no seu código, não no terminal. Há mesmo uma dica onde procurar o erro: linha 302, posição 49. Este erro é uma saída de matriz a partir do seu alcance. Por exemplo, tem uma matriz com tamanho [4], mas está a tentar obter valor [5].

Não consigo repará-lo, a matriz é preenchida com aspas (100%) ou valores indicadores. No terminal, num determinado momento, o valor das aspas ou dos indicadores X produz NULL, e num outro momento produz um valor normal (não na 0ª barra). Não sei porque é que isto acontece.

O valor NULL está sempre presente no provador. O erro ocorre quando tento multiplicar uma cotação ou um valor indicador, mas aí NULL.

 
M1k3:

Não consigo repará-lo, a matriz é preenchida com aspas (100%) ou valores indicadores. No terminal, num determinado momento, o valor das aspas X dá NULL, e noutro momento dá um valor normal (não na 0ª barra). Não sei porque é que isto acontece.

O valor NULL está sempre presente no provador. O erro ocorre quando tento multiplicar uma cotação ou um valor indicador, mas aí NULL.

Usar depuração de código ou inserir operadores Print() em secções de código duvidoso. Desta forma, compreenderá onde se encontra o erro.
 
barabashkakvn:

Este código é o código do indicador e a função OnInit(). Consequentemente, OnInit() é processado no momento do início do terminal - e este código exibe correctamente o preço do tick. É OnInit() e não init() - como o seu. Se o erro se repetir, por favor envie o código e a versão do terminal.

O erro é que está a tentar receber informações de mercado (MarketInfo...) no OnInit() a partir do indicador. O indicador não tem funções de negociação e, portanto, durante a inicialização, não está à espera de actualização da informação da conta e do mercado.

Para obter dados do mercado, utilizar OnInit() da EA, e não o indicador.

Se quiser utilizar a informação do mercado no indicador, deve introduzir uma bandeira (bool) e verificar a correcção da informação da conta (Account...) na função OnCalculate() no caso da primeira execução ou na função OnInit() se alterar as definições de tempo ou do indicador.

Não induzir as pessoas em erro. Independentemente do init() ou OnInit() do indicador ser utilizado, o terminal não garante que este manipulador será chamado quando o login já tiver sido efectuado e o valor do tick for conhecido. Por isso, é fácil obter zero também no OnInit. Também não há proibição sobre a utilização de informações de mercado em indicadores. Mas neste caso temos realmente de transferir a inicialização para a parte de cálculo do indicador e executá-la nas primeiras carraças.
 
marketeer:
Não induzir as pessoas em erro. Independentemente do init() ou OnInit() do indicador ser utilizado, o terminal não garante que este manipulador será chamado quando o login for feito e o valor do tick for conhecido. Por isso, é fácil obter zero também no OnInit. Também não há proibição sobre a utilização de informações de mercado em indicadores. Mas neste caso temos realmente de transferir a inicialização para a parte de cálculo do indicador e executá-la nas primeiras carraças.

Não existem funções comerciais no indicador. O Conselheiro Especialista tem funções comerciais. Portanto, quando a EA chama o ambiente de mercado e/ou informação de conta, tudo corre correctamente no OnInit().

Para provar as minhas palavras, aqui está uma simples EA em que OnInit() se refere ao ambiente de negociação e à informação da conta:

//+------------------------------------------------------------------+
//|                                                  test_expert.mq4 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  //--- выведем всю информацию, доступную из функции AccountInfoDouble()
      printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));
      printf("ACCOUNT_CREDIT =  %G",AccountInfoDouble(ACCOUNT_CREDIT));
      printf("ACCOUNT_PROFIT =  %G",AccountInfoDouble(ACCOUNT_PROFIT));
      printf("ACCOUNT_EQUITY =  %G",AccountInfoDouble(ACCOUNT_EQUITY));
      printf("ACCOUNT_MARGIN =  %G",AccountInfoDouble(ACCOUNT_MARGIN));
      printf("ACCOUNT_FREEMARGIN =  %G",AccountInfoDouble(ACCOUNT_FREEMARGIN));
      printf("ACCOUNT_MARGIN_LEVEL =  %G",AccountInfoDouble(ACCOUNT_MARGIN_LEVEL));
      printf("ACCOUNT_MARGIN_SO_CALL = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_CALL));
      printf("ACCOUNT_MARGIN_SO_SO = %G",AccountInfoDouble(ACCOUNT_MARGIN_SO_SO));
      //--- MarketInfo
      Print("Symbol=",Symbol());
      Print("Минимальная дневная цена=",MarketInfo(Symbol(),MODE_LOW));
      Print("Максимальная дневная цена=",MarketInfo(Symbol(),MODE_HIGH));
      Print("Время поступления последней котировки=",(MarketInfo(Symbol(),MODE_TIME)));
      Print("Последняя поступившая цена предложения=",MarketInfo(Symbol(),MODE_BID));
      Print("Последняя поступившая цена продажи=",MarketInfo(Symbol(),MODE_ASK));
      Print("Размер пункта в валюте котировки=",MarketInfo(Symbol(),MODE_POINT));
      Print("Количество цифр после запятой в цене инструмента=",MarketInfo(Symbol(),MODE_DIGITS));
      Print("Спрэд в пунктах=",MarketInfo(Symbol(),MODE_SPREAD));
      Print("Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах=",MarketInfo(Symbol(),MODE_STOPLEVEL));
      Print("Размер контракта в базовой валюте инструмента=",MarketInfo(Symbol(),MODE_LOTSIZE));
      Print("Размер минимального изменения цены инструмента в валюте депозита=",MarketInfo(Symbol(),MODE_TICKVALUE));
      Print("Минимальный шаг изменения цены инструмента в пунктах=",MarketInfo(Symbol(),MODE_TICKSIZE));
      Print("Размер свопа для ордеров на покупку=",MarketInfo(Symbol(),MODE_SWAPLONG));
      Print("Размер свопа для ордеров на продажу=",MarketInfo(Symbol(),MODE_SWAPSHORT));
      Print("Календарная дата начала торгов (фьючерсы)=",MarketInfo(Symbol(),MODE_STARTING));
      Print("Календарная дата окончания торгов (фьючерсы)=",MarketInfo(Symbol(),MODE_EXPIRATION));
      Print("Разрешение торгов по указанному инструменту=",MarketInfo(Symbol(),MODE_TRADEALLOWED));
      Print("Минимальный размер лота=",MarketInfo(Symbol(),MODE_MINLOT));
      Print("Шаг изменения размера лота=",MarketInfo(Symbol(),MODE_LOTSTEP));
      Print("Максимальный размер лота=",MarketInfo(Symbol(),MODE_MAXLOT));
      Print("Метод вычисления свопов=",MarketInfo(Symbol(),MODE_SWAPTYPE));
      Print("Способ расчета прибыли=",MarketInfo(Symbol(),MODE_PROFITCALCMODE));
      Print("Способ расчета залоговых средств=",MarketInfo(Symbol(),MODE_MARGINCALCMODE));
      Print("Начальные залоговые требования для 1 лота=",MarketInfo(Symbol(),MODE_MARGININIT));
      Print("Размер залоговых средств для поддержки открытых ордеров в расчете на 1 лот=",MarketInfo(Symbol(),MODE_MARGINMAINTENANCE));
      Print("Маржа, взимаемая с перекрытых ордеров в расчете на 1 лот=",MarketInfo(Symbol(),MODE_MARGINHEDGED));
      Print("Размер свободных средств, необходимых для открытия 1 лота на покупку=",MarketInfo(Symbol(),MODE_MARGINREQUIRED));
      Print("Уровень заморозки ордеров в пунктах=",MarketInfo(Symbol(),MODE_FREEZELEVEL)); 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
barabashkakvn:

Não existem funções comerciais no indicador. O Conselheiro Especialista tem funções comerciais. Portanto, quando a EA chama o ambiente de mercado e/ou informação de conta, tudo corre correctamente no OnInit().

Para provar as minhas palavras, aqui está um simples Expert Advisor que o OnInit() chama o ambiente do mercado e informação de contas:

Bem, a pergunta era originalmente sobre o indicador. E estava a responder sobre o OnInit do indicador. O Consultor Especialista é outro assunto, não há problema, mas o Consultor Especialista não pode substituir um indicador.