MetaTrader 5 build 2121: Novo projeto do Testador de Estratégia - página 8

 
A100:

Os resultados da execução mostram que o compilador age de forma contrária à lógica:

  • Para uma cadeia constante, mais memória é alocada do que o necessário (em princípio, seu comprimento não pode ser aumentado)
  • Nenhuma memória adicional é alocada para um fio não-constante (se seu comprimento aumentar, será necessária uma nova alocação de memória)
  • Se o usuário inicializa uma string com StringInitInit, mais memória é alocada do que o necessário, porque o tamanho do buffer é explicitamente definido pelo usuário e na maioria dos casos não será aumentado (o usuário já pensou qual buffer final ele precisa e definiu seu tamanho explicitamente)

Para uma corda puramente constante, o tamanho do buffer por StringBufferlen=0, o que significa que a corda é constante:

        string s1 = "_";            // исходное "чистое" присвоение константной строки
        Print(StringBufferLen(s1)); // показывает 0 верно, не должно быть 260


Reatribuir uma string "supostamente" constante não é trabalhar com uma constante, mas sim criar exatamente uma variável dinâmica com uma pré-alocação de 260 caracteres:

        const string s2 = s1;       // динамическое создание переменной копированием данных из другой переменной (не константной строки)
        Print(StringBufferLen(s2)); // показывает 260 верно
 
Renat Fatkhullin:

Para uma corda puramente constante, o tamanho do buffer por StringBufferlen=0, o que significa que a corda é constante:


A realocação de uma string "supostamente" constante não está funcionando com uma constante, está criando uma variável dinâmica com uma pré-alocação de 260 caracteres:

é hora de introduzir alocadores ))))

 

Como um lembrete, há um bug com o buffer de cordas:

#import "Shlwapi.dll"
int PathFileExistsW(string &pszPath);
#import

class CTest
{
protected:
   string bufstr;

public:
   CTest()
   {
      StringInit(bufstr, 1000111);
   }
   string getString()
   {
      PathFileExistsW(bufstr);
      Print(StringBufferLen(bufstr), " ", StringLen(bufstr));   
      return bufstr;
   }
};

CTest dll;

int OnInit()
{
   dll.getString(); // 1000111 0 - OK
   dll.getString(); // 260 0 - ???
   dll.getString(); // 260 0 - ???
   return INIT_SUCCEEDED;
}
void OnTick()
  {
  }
//+------------------------------------------------------------------+
A função da DLL pode ser qualquer coisa.
 

Proponho acrescentar uma versão estendida da funçãoStringToTime à MQL na forma:

bool StringToTime(string timeString, datetime &time);

Porque na versão atual a função sempre retorna o tempo válido, mesmo que a corda contenha lixo, e a data atual é devolvida, o que é particularmente estranho:

StringToTime("aaabbbccc") retorna "2019.09.05 01:00:00" Isto é normal? Nesta implementação, a função é de todo perigosa para a saúde. Portanto, é necessária uma versão com verificações corretas.

Até agora, temos que analisar nossa própria função,mas o problema é que o tempo pode ser especificado em diferentes formatos.E não quero realmente codificar todos esses formatos reinventando a roda quando o tempo já tiver sido implementado na MQL.

Basicamente, isto também se aplica a outras funções de conversão de cordas: StringToInteger, StringToDouble. Não é fornecida nenhuma verificação de validade para eles também.

p.s. Hmm, acontece queGetLastError() gera erros nestes casos. Eu não sabia disso. A documentação para estas funções não diz nada disso. Então o problema é resolvido. Embora fosse mais fácil com um bool.
 
Alexey Navoykov:


Eu apoio a sugestão de Alexey, o manuseio seguro das cordas é a chave para evitar erros ocultos.

 
#property tester_no_cache true

erro "a propriedade já existe com valor diferente e será pulada".

Utilizou-o pela primeira vez. Nenhum outro arquivo o tem. Não depende do valor. Construir 2136.

 

Por favor, traga de volta o modelador de estilo antigo.

Agora eu não consigo descobrir o que deve funcionar aqui:

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else
         if(extrema[1]>0.0 && extrema[0]>0.0)
           {
            if(extrema[1]<extrema[0])
               if(prices[1]>prices[0])
                 {
                  int d=0;
                 }
           }
         else
           {
            return(true);
           }
     }
   else
     {
      int d=0;
     }

Esta peça costumava ser parecida com esta:

   int size=ArraySize(prices);
   if(size>1)
     {
      if(size>2)
         return(true);
      if(extrema[1]<0.0 && extrema[0]<0.0)
        {
         if(extrema[1]>extrema[0])
            if(prices[1]<prices[0])
              {
               int d=0;
              }
        }
      else if(extrema[1]>0.0 && extrema[0]>0.0)
        {
         if(extrema[1]<extrema[0])
            if(prices[1]>prices[0])
              {
               int d=0;
              }
        }
      else
        {
         return(true);
        }
     }
   else
     {
      int d=0;
     }
 
Edgar:
#property tester_no_cache true

erro "a propriedade já existe com valor diferente e será pulada".

Utilizou-o pela primeira vez. Nenhum outro arquivo o tem. Não depende do valor. Construir 2136.

Este erro ocorre durante o trabalho com projetos se o valor do bem especificado no código fonte estiver em conflito com o valor nas configurações do projeto.

Propriedades do projeto

As propriedades do programa no arquivo do projeto têm precedência sobre as propriedades especificadas no código fonte. Se você especificar propriedades tanto no projeto quanto no código fonte, as propriedades do projeto serão usadas.
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
Создание и работа с проектом - Проекты и MQL5 Storage - MetaTrader 5
  • www.metatrader5.com
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
 
Vladimir Karputov:

Por favor, traga de volta o modelador de estilo antigo.

Agora eu não consigo descobrir o que deve funcionar aqui:

Esta peça costumava ser parecida com esta:

Múltiplos ifs aninhados não podem ser salvos por qualquer alinhamento. Precisamos mudar o código para torná-lo legível.

bool Sample()
  {
//---
   double prices[], extrema[];
   int size=ArraySize(prices);
   if(size>2)
      return(true);

   if(size<=1)
     {
      int d=0;
      return(false);
     }

   if(extrema[1]<0.0 && extrema[0]<0.0)
     {
      if(extrema[1]>extrema[0])
         if(prices[1]<prices[0])
           {
            int d=0;
           }
      return(false);
     }

   if(extrema[1]>0.0 && extrema[0]>0.0)
     {
      if(extrema[1]<extrema[0])
         if(prices[1]>prices[0])
           {
            int d=0;
           }
      return(false);
     }
//---     
   return(true);
  }
 
Rashid Umarov:

Múltiplos ses aninhados não podem ser salvos por qualquer alinhamento. É preciso alterar o código para torná-lo legível.

Não há ninhos múltiplos - o nível superior é se, então, se outro nível.

Estou pedindo o estilo antigo de volta, quando se parecia mais com isto:

      else if

- Estava em uma única linha e não houve nenhuma compensação do texto subseqüente à direita.


Aqui está um exemplo da ajuda dadeclaração Condicional if-else (o velho estilista)

//--- Вложенные операторы
if(x=='a')
  {
   y=1;
  }
else if(x=='b')
  {
   y=2;
   z=3;
  }
else if(x=='c')
  {   
   y=4;
  }
else Print("ERROR");

e isto é o que o novo modelador faz:

//--- Вложенные операторы
   if(x=='a')
     {
      y=1;
     }
   else
      if(x=='b')
        {
         y=2;
         z=3;
        }
      else
         if(x=='c')
           {
            y=4;
           }
         else
            Print("ERROR");
Стилизатор - Разработка программ - MetaTrader 5
Стилизатор - Разработка программ - MetaTrader 5
  • www.metatrader5.com
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...