Erros, bugs, perguntas - página 1871

 
Slava:
E não deve ser possível


1) Quando está prevista a introdução da união?

2. serão também digitados recibos datilografados?

3. Estão previstas indicações sobre os tipos fundamentais a introduzir?
 
Konstantin:


1. quando está prevista a introdução da união?

2. Será que oedef também será introduzido com sindicato?

3. está planeada a introdução de indicadores de tipos fundamentais?

1. Em breve. Tudo está pronto no compilador, estamos agora a testá-lo. Libertá-la-emos após os testes.

2. Ainda não se sabe quando

3. não, não planeado.

 

Por alguma razão,CopyTime (ou qualquer outro semelhante)redimensiona a matriz de recepção, mesmoque otamanho da matriz de recepção seja maior do que o tamanho a ser copiado.

Cavalheiros, é normal? Tem sido sempre assim? Ou um insecto?

Por exemplo:

static datetime TimeBuf[]; 

if (ArraySize(TimeBuf) == 0) ArrayResize(TimeBuf, 10);

CopyTime(_Symbol, _Period, 0, 1, TimeBuf);

A função CopyTime redimensiona a matriz TimeBuf para 1.

Isto está errado em princípio.

Não seria um problema, mas por uma nuance importante: os dados são copiados até ao início da matriz e, consequentemente, todo o ponto de optimização é perdido na raiz.

 
Marat Sultanov:

Por alguma razão,CopyTime (ou qualquer outro semelhante)redimensiona a matriz de recepção, mesmoque otamanho da matriz de recepção seja maior do que o tamanho a ser copiado.

Cavalheiros, é normal? Tem sido sempre assim? Ou um insecto?

Por exemplo:

A função CopyTime redimensiona a matriz TimeBuf para 1.

Isto está errado em princípio.

Não seria tão mau, se não fosse por uma nuance importante: os dados são copiados no início da matriz, e consequentemente, todo o ponto de optimização é perdido na raiz.

A sua matriz é dinâmica! Ou seja, com um tamanho variável. Como não especificou a sua dimensão entre parênteses rectos.

A palavra estática significa que o objecto deste conjunto é construído quando o Expert Advisor é carregado, e é destruído quando é descarregado.

 
Slava:

A sua matriz é dinâmica! Ou seja, com um tamanho variável. Como não especificou a sua dimensão entre parênteses rectos.

A palavra estática significa que o objecto desta matriz é construído no carregamento da EA e destruído no descarregamento

Desculpe, mas falhou o objectivo.

Que a matriz seja declarada no âmbito global

datetime _TimeBuf[]; 

void OnTick()
{}

Então:

1) A primeira vez que copiamos (CopyTime) para a matriz quantas barras existem.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      if (_BarsCountReserveSize <= BarsCount) _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
}

2) De acordo com o desenho ideal, quando uma nova barra aparece, não queremos copiar todas as barras, certo? Por conseguinte, decidimos copiar apenas as 2 últimas barras modificadas.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
   else
   {
      int RequiredCount = BarsCount - ArraySize(_TimeBuf) + 1;
      
      ArrayResize(_TimeBuf, RequiredCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, RequiredCount, _TimeBuf);
   }
}

3) No final a nossa optimização não funciona, porqueCopyTime redimensiona a matriz e coloca o tamanho =RequiredCount, mais perdemos o tamanho da reserva(CopyTime não está ciente disso).

 

Esta situação não ocorreria se o CopyTime fosse copiado directamente do fim da matriz até ao ponto de partida:

no local:

_TimeBuf[0] = D'2017.01.01';
_TimeBuf[1] = D'2017.01.02';
_TimeBuf[2] = D'2017.01.03';

ele:

const int ArrSize = ArraySize(_TimeBuf);

_TimeBuf[ArrSize-3] = D'2017.01.01';
_TimeBuf[ArrSize-2] = D'2017.01.02';
_TimeBuf[ArrSize-1] = D'2017.01.03';
 

As funções de cópia sempre mudaram o tamanho de uma matriz dinâmica. Para um tamanho maior ou menor. Mas houve sempre uma correspondência clara com o número de registos dado como resultado da consulta.

No seu caso, a consulta original a uma matriz com redimensionamento dinâmico. Todos os outros pedidos que solicitam um elemento de cada vez, fazem-no numa matriz com um tamanho pré-definido (datatime _TimeBuf1[1]), pelo que não há redistribuição. Auto-atribuir o elemento recebido a uma grande matriz dinâmica

 

Por isso, sempre foi assim e é normal. Estou a ver. Obrigado pela sua resposta!

Estava ciente do alargamento, mas não do encolhimento para o tamanho dos dados solicitados. Agora vou saber, obrigado!

 

MT4 construir 1065

Teste sobre USDJPY TF M15

a partir do registo de resultados:

406 2014.11.28 20:30 venda 18 5.50 118.641 0.000 117.015 0.00
521 2014.12.09 17:15 t/p 18 5.50 118.386 0.000 118.386-148.95

Como é que a perda se dá?
 
-Aleks-:

Como é que a perda se dá?

Troca.
Razão: