Características del lenguaje mql5, sutilezas y técnicas - página 81

 
Probablemente no hay mucha gente que haga esto, así que aquí
// Заполнение массива строками из файла - классика
int FileToStrings( const string FileName, string &Str[] )
{
  ArrayResize(Str, 0);

  const int handle = FileOpen(FileName, FILE_READ | FILE_ANSI );
  
  if (handle != INVALID_HANDLE)
  {
    while (!FileIsEnding(handle))
      Str[ArrayResize(Str, ArraySize(Str) + 1) - 1] = FileReadString(handle);
    
    FileClose(handle);
  }
  
  return(ArraySize(Str));
}

// Заполнение массива строками из файла - альтернатива
int FileToStrings2( const string FileName, string &Str[] )
{
  uchar Bytes[];
  
  return(FileLoad(FileName, Bytes) ? StringSplit(CharArrayToString(Bytes), '\n', Str) : 0);
}

void OnStart()
{
  const string FileName = "Test.txt";
  
  string Str[];  
  FileToStrings(FileName, Str);

  string Str2[];  
  FileToStrings2(FileName, Str2);
  
  ArrayPrint(Str);
  ArrayPrint(Str2);
}
Yo mismo utilizo la segunda opción cuando necesito raspar algo. Probablemente también funcione más rápido, no lo he probado.
 
// "Сортировка" символов Обзора рынка

// Обмен значений
template <typename T>
void Swap( T &Value1, T &Value2 )
{
  const T Tmp = Value1;
  
  Value1 = Value2;
  Value2 = Tmp;  
}

// Сортировка строк
bool ArraySort( string &Str[], const bool Increase = true )
{
  const int Compare = Increase ? 1 : -1;
  const int Size = ArraySize(Str);
  
  for (int i = 0; i < Size - 1; i++)
    for (int j = i + 1; j < Size; j++)
      if (StringCompare(Str[i], Str[j]) == Compare)
        Swap(Str[i], Str[j]);
  
  return(true);
}

// Выключение (что возможно) символов в Обзоре рынка
void MarketWatchOff()
{
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
    SymbolSelect(SymbolName(i, true), false);
}

// Получение символов из Обзора рынка
int GetMarketWatch( string &Str[] )
{
  const int Size = ArrayResize(Str, SymbolsTotal(true));
  
  for (int i = 0; i < Size; i++)
    Str[i] = SymbolName(i, true);
    
  return(Size);
}

// Задание символов Обзора рынка
void SetMarketWatch( const string &Str[] )
{
  MarketWatchOff();
  
  const int Size = ArraySize(Str);
  
  for (int i = 0; i < Size; i++)
    SymbolSelect(Str[i], true);        
}

// "Сортировка" символов Обзора рынка
void SortMarketWatch()
{
  string Str[];
  
  GetMarketWatch(Str);
  ArraySort(Str);
  
  SetMarketWatch(Str);
}

void OnStart()
{
  SortMarketWatch();
}
 

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

Discusión del artículo "Crear y probar símbolos personalizados en MetaTrader 5"

fxsaber, 2018.04.12 07:59

#property script_show_inputs

#include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/ru/code/20225

// Generate M1-history from ticks
void OnStart()
{  
  MqlTick Ticks[];
  CUSTOMSYMBOL Symb;

  if (Symb.IsCustom() && (CopyTicksRange(Symb.Name, Ticks, COPY_TICKS_ALL, 0, LONG_MAX) > 0))
  {
    Symb.AddTicks(Ticks);
  
    Symb.CreateHistoryRates();
    
    ChartOpen(Symb.Name, PERIOD_CURRENT);
  }
}
 
fxsaber:
Probablemente, no hay mucha gente que lo haga, así que yo uso la segunda variante cuando necesito paralelizar algo. Probablemente también funcione más rápido, no lo he comprobado.

La segunda opción no sólo es mejor, sino también más correcta. La primera variante es poco fiable. Hay un error fatal en su interior.

 
Ihor Herasko:

La segunda opción no sólo es mejor, sino también más correcta. La primera variante es poco fiable. Hay un error fatal en él y conduce el error fatal.

No he visto ningún problema especial en la primera variante. En cuanto a la segunda, parece que la utilizan una o dos personas.

Поиск - MQL5.community
Поиск - MQL5.community
  • www.mql5.com
Поиск выполняется с учетом морфологии и без учета регистра. Все буквы, независимо от того, как они введены, будут рассматриваться как строчные. По умолчанию наш поиск показывает страницы...
 
fxsaber:

No vi ningún problema en particular con la primera opción. En cuanto a la segunda, parece que la utilizan una o dos personas.

¿Qué te parece? ¿Qué tal este?

Str[ArrayResize(Str, ArraySize(Str) + 1) - 1]

¿si no es un error fatal?

 
Ihor Herasko:

¿Cómo es eso? ¿Qué te parece esto?

¿si no es un error fatal?

Puedes usar la Reserva para acelerar las cosas. Pero el punto de Reserva es cuestionable en este caso, porque la matriz de objetos complejos es una cadena.

En cuanto a los errores fatales, el manejo de un valor negativo de ArrayResize es a tu gusto.

 
fxsaber:

Puedes usar la Reserva para acelerar las cosas. En cuanto al error fatal, el manejo de un valor negativo de ArrayResize es opcional.

No, no se trata de la aceleración. Deberíamos pensar primero en la fiabilidad. Y es por eso que el procesamiento del valor de retorno de ArrayResize no puede ser llamado "a voluntad". De todos modos, este hilo no es para principiantes donde se explican los fundamentos y se dan ejemplos simplificados.

P. S. Por cierto, puedes devolver ArrayResize con un valor positivo, pero seguirás obteniendo el error de desbordamiento del array.
 
Ihor Herasko:

El procesamiento de la devolución del valor de ArrayResize no puede ser llamado "a voluntad". Al fin y al cabo, este hilo no es para principiantes, donde se explican los fundamentos y se dan ejemplos simplificados.

En este caso, no veo ninguna razón para acabar con la claridad en aras de la fiabilidad. La tarea consistía en mostrar el segundo método. La técnica fue demostrada aquí, no es una solución universal ya hecha.

No debes copiar y pegar mis códigos. Siempre son de carácter formativo. Es decir, se espera que una persona mire el código y entienda la idea principal y escriba su propia variante basada en ella.

P. S. Por cierto, puedes devolver ArrayResize con un valor positivo y aún así obtener un error de desbordamiento de array.
En esta situación no habrá fuera de la red.
 
fxsaber:

En esta situación no habrá fuera de la red.

Por favor:

void AddElements(int &arrnArray[], int nCount)
{
   int nTotal = ArraySize(arrnArray);
   if (ArrayResize(arrnArray, nTotal + nCount) < 0)
      return;

   for (int i = nTotal + nCount - 1; i >= nTotal; --i)
      arrnArray[i] = i;
}

En los casos en los que el array arrnArray no pueda expandirse, ArrayResize devolverá el tamaño actual del array (al menos 0). Por lo tanto, la ejecución del cuerpo del bucle hará que el array se expanda fuera del mismo.