Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 81

 
Wahrscheinlich machen das nicht viele Leute, deshalb hier
// Заполнение массива строками из файла - классика
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);
}
Ich selbst verwende die zweite Möglichkeit, wenn ich etwas raspeln muss. Wahrscheinlich geht es auch schneller, ich habe es nicht getestet.
 
// "Сортировка" символов Обзора рынка

// Обмен значений
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();
}
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion des Artikels "Erstellen und Testen von benutzerdefinierten Symbolen in 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:
Wahrscheinlich machen das nicht viele Leute, deshalb verwende ich die zweite Variante, wenn ich etwas parallelisieren muss. Wahrscheinlich geht es auch schneller, ich habe es nicht überprüft.

Die zweite Option ist nicht nur besser, sondern auch richtiger. Die erste Variante ist unzuverlässig. Ein fataler Fehler ist ein fataler Fehler darin.

 
Ihor Herasko:

Die zweite Option ist nicht nur besser, sondern auch richtiger. Die erste Variante ist unzuverlässig. Er enthält einen schwerwiegenden Fehler und führt zu einem schwerwiegenden Fehler.

Bei der ersten Variante habe ich keine besonderen Probleme festgestellt. Was die zweite anbelangt, so scheint es, dass ein oder zwei Personen sie benutzen.

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

Ich habe kein besonderes Problem mit der ersten Option gesehen. Was die zweite betrifft, so scheinen ein oder zwei Personen sie zu benutzen.

Wie wäre das? Wie wäre es mit diesem hier:

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

wenn nicht ein schwerwiegender Fehler?

 
Ihor Herasko:

Wie war das? Wie wäre es damit:

wenn nicht ein schwerwiegender Fehler?

Sie können Reserve verwenden, um die Dinge zu beschleunigen. Aber der Sinn von Reserve ist in diesem Fall fraglich, weil die Reihe komplexer Objekte eine Zeichenkette ist.

Was fatale Fehler angeht, so ist die Behandlung eines negativen ArrayResize-Wertes eine Frage des Geschmacks.

 
fxsaber:

Sie können Reserve verwenden, um die Dinge zu beschleunigen. Was den fatalen Fehler betrifft, so ist die Behandlung eines negativen ArrayResize-Wertes optional.

Nein, es geht nicht um Beschleunigung. Wir sollten zuerst an die Zuverlässigkeit denken. Und deshalb kann die Verarbeitung des Rückgabewertes von ArrayResize nicht "nach Belieben" aufgerufen werden. Wie auch immer, dieser Thread ist nicht für Anfänger gedacht, wo die Grundlagen erklärt und vereinfachte Beispiele gegeben werden.

P. S. Übrigens, Sie können ArrayResize mit einem positiven Wert zurückgeben, aber Sie werden immer noch den Array-Überlauf-Fehler erhalten.
 
Ihor Herasko:

Die Verarbeitung der ArrayResize Wertrückgabe kann nicht "nach Belieben" aufgerufen werden. Schließlich ist dieser Thread nicht für Anfänger gedacht, wo die Grundlagen erklärt und vereinfachte Beispiele gegeben werden.

In diesem Fall sehe ich keinen Grund, die Klarheit um der Zuverlässigkeit willen zu beseitigen. Die Aufgabe bestand darin, die zweite Methode zu zeigen. Die Technik wurde hier demonstriert, es handelt sich nicht um eine universelle Lösung von der Stange.

Sie dürfen meine Codes nicht kopieren und einfügen. Sie sind immer nur für Schulungszwecke gedacht. D.h. es wird von einer Person erwartet, dass sie sich den Code ansieht, die Grundidee versteht und darauf aufbauend eine eigene Variante schreibt.

P. S. Übrigens können Sie ArrayResize mit einem positiven Wert zurückgeben und trotzdem einen Fehler wegen Arrayüberlaufs erhalten.
In dieser Situation gibt es kein "Out-of-Array".
 
fxsaber:

In dieser Situation gibt es kein "Out-of-Array".

Ich bitte Sie:

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;
}

In Fällen, in denen arrnArray nicht erweitert werden kann, gibt ArrayResize die aktuelle Array-Größe zurück (mindestens 0). Daher führt die Ausführung des Schleifenkörpers dazu, dass das Array außerhalb des Arrays erweitert wird.

Grund der Beschwerde: