Erros, bugs, perguntas - página 3155

 
murziks #:


Pode dizer-me que mais pode o Metatrader ler em vez do csv?

Os ficheiros binários podem ler e escrever. Variáveis, estruturas, matrizes. Tudo isto é escrito em ficheiros e lido de volta.

 

Caros programadores de terminais móveis, por favor corrijam já o tratamento de e-mails no separador "Mail".

Antes da última construção do terminal móvel (Android), quando se liga a uma conta, o separador "Mail" está cheio de e-mails que já foram apagados muitas vezes antes.

Assim que volto a ligar-me à conta, vejo uma confusão de e-mails previamente apagados e não apagados no separador Correio. O que tenho de fazer para me ver livre dele?

 

Explique por favor que mudanças no terminal do PC "Ferramentas > Definições > Mostrar Histórico de Negociações", se em qualquer valor da caixa de verificação puder activar/desactivar a exibição do histórico de negociação através de "PCM > Histórico de Negociações" e "F8 > Mostrar Histórico de Negociações"?

Ou seja, posso desactivar a exibição do histórico de negociação nas configurações gerais do terminal, para que não interfira com ele, enquanto será mostrado em qualquer gráfico se estiver activado nas configurações do gráfico ou usando o PCM. Não compreendo a lógica.

 

Caros programadores do terminal do PC. Há muito tempo, quando se trabalha com perfis gráficos (não modelos, mas apenas perfis) existe uma estranha lógica de que qualquer alteração num perfil faz com que este seja automaticamente guardado sem indicação manual do mesmo.

Erros na configuração do perfil pelo utilizador ou falha do terminal transformam um espaço de trabalho difícil de configurar numa abóbora.

Porque não podemos fazer com que até que o utilizador salve manualmente o perfil, as alterações feitas ao perfil não sejam salvas (deixá-las ser salvas num ficheiro de perfil temporário e não no último perfil de trabalho) ?

Há muitos anos que esperamos por mudanças na interface incorporada a la TradingView, provavelmente não é difícil para si, e é muito conveniente para os utilizadores.

 

Porque é que existe uma tal diferença, por exemplo, um teste com a caixa de verificação "lucro em pips para acelerar os cálculos" um drawdown de 15%, e sem esta caixa de verificação um drawdown de 93%?

Que resultado é mais correcto?

O número de negócios é o mesmo

Neste caso, um lucro de 2 libras no primeiro caso e 20 libras no segundo caso com o mesmo lote.

Tal como é visível, se mudar o lote é também uma diferença de 10 dólares.

 
Obrigado. Não gostaria de txt
 
As moedas criptográficas desapareceram dos servidores da MQ. Degradação, tristeza e frustração.
 

Erros em genérico/fila de espera.

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

[ERRO POSSÍVEL] Classe do recipiente CQueue

Loris De Marchi, 2022.02.14 13:00

Olá a todos!!!

Suspeito que pelo menos em CQueue::Contém(T item) e CQueue::Remove(T item) métodos há um erro.

A fila é gerida utilizando o clássico sistema circular cabeça-cauda, pelo que este código deve estar errado:

 //+------------------------------------------------------------------+
//| Removes all values from the CQueue<T>.                           |
//+------------------------------------------------------------------+
template < typename T>
bool CQueue::Contains(T item)
  {
   int count=m_size;
//--- try to find item in array
   while (count--> 0 )
     {
       //--- use default equality function
       if (::Equals(m_array[count],item))
         return ( true );
     }
   return ( false );
  }

Também a descrição incorrecta do método acima descrito faz-me pensar que alguns erros podem ter sido cometidos ao escrever esta classe.


O método Remover falha claramente quando se executa este código simples, por exemplo:

   CQueue< ulong > foo;
   foo.Enqueue( 1 );
   foo.Remove( 1 );
   foo.Enqueue( 2 );
   printf (foo.Contains( 2 ));

Imprime "falso" quando o item está claramente na fila.


Avisem-me se esta classe é fixa ou se devo usar uma das minhas.

Obrigado!


 

Olá. Sabemos que as matrizes em MQL podem ser indexadas tanto para a frente como para trás (série). É por isso que tenho uma pergunta, qual é a melhor maneira de trabalhar com arrays em MQL, se uma série ou indexação inversa é necessária? A primeira variante de obter o valor por índice para a série pode parecer como se segue.

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

A segunda forma é utilizar oArraySetAsSeries.

double arrayValue(double &array[], conct int shift) {
  int len = (int)array.Size();
  double ret;
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  if (!ArraySetAsSeries(array, true))
    return WRONG_VALUE;
  ret = array[shift];
  ArraySetAsSeries(array, false);
  return ret;
}

Claro que não estou a afirmar nada, mas penso que porque o ArraySetAsSeries simplesmente liga a série de bandeiras de matriz e quando se acede a um valor por índice ocorre como no primeiro exemplo.

double arrayValue(const double array[], conct int shift) {
  int len = (int)array.Size();
  if (shift < 0 || shift >= len)
    return WRONG_VALUE;
  return array[len - shift - 1];
}

E é mais ou menos assim que se lida com o tratamento do valor pelo índice.

Faz sentido incluir as séries de matrizes no manipulador de indicadores OnCalculate de cada vez, ou seria melhor abordar a barra baixa usando o comprimento das taxas das matrizes_total?

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]) 
{
  Print(price[rates_total-1]); // получение цены на младшем баре без использования серии
  return(rates_total);
}

Estes dois métodos são iguais em velocidade ou estou enganado no meu raciocínio?

 

O terminal não devolve o lucro acumulado das posições fechadas. Pode dizer-me onde poderá estar o problema?

double GetClosedPositionsInstrumentProfit(string symbol, datetime from) 
{
   HistorySelect(from, TimeCurrent());

   double profitSum = 0;

      for (int i = HistoryDealsTotal()-1; i >= 0; i--) 
    {   
      ulong ticket = HistoryDealGetTicket(i);
      if (ticket < 0) continue; 
      long magic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
      if (magic != EXPERT_MAGIC) continue; 
      string positionSymbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
      if (symbol != positionSymbol) continue; 
      
      double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT) + HistoryDealGetDouble(ticket, DEAL_SWAP)+ HistoryDealGetDouble(ticket, DEAL_COMMISSION);
      profitSum += profit; 
         
      Print ("Profit " + DoubleToString(profitSum,2));              
    }         
   return profitSum;
}
Razão: