Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 81

 
Muhtemelen pek çok insan bunu yapmaz, bu yüzden burada
 // Заполнение массива строками из файла - классика
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);
}
Bir şeyi ayrıştırmam gerektiğinde kendim ikinci seçeneği kullanıyorum. Muhtemelen ve daha hızlı çalışıyor, kontrol etmedi.
 
// "Сортировка" символов Обзора рынка

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

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

"MetaTrader 5'te özel semboller oluşturma ve test etme" makalesinin tartışılması

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 :
Muhtemelen, pek çok insan bunu yapmaz, bu yüzden burada bir şeyi ayrıştırmam gerektiğinde ikinci seçeneği kullanıyorum. Muhtemelen ve daha hızlı çalışıyor, kontrol etmedi.

İkinci seçenek sadece daha iyi değil, aynı zamanda daha doğru. İlk seçenek güvenilmez. İçinde, ölümcül hata, ölümcül hatanın üzerine oturur ve onu yönlendirir.

 
Ihor Herasko :

İkinci seçenek sadece daha iyi değil, aynı zamanda daha doğru. İlk seçenek güvenilmez. İçinde, ölümcül hata, ölümcül hatanın üzerine oturur ve onu yönlendirir.

İlk sürümde belirli bir sorun görmedim. İkincisine gelince, bir veya iki kişi tarafından kullanılıyor gibi görünüyor.

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

İlk sürümde belirli bir sorun görmedim. İkincisine gelince, bir veya iki kişi tarafından kullanılıyor gibi görünüyor.

Peki, nasıl? Ve bu nedir:

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

ölümcül bir hata değilse?

 
Ihor Herasko :

Peki, nasıl? Ve bu nedir:

ölümcül bir hata değilse?

Hızlanma için Rezerv kullanmak mümkündür. Doğru, bu durumda Rezervin anlamı şüphelidir, çünkü karmaşık nesneler dizisi - dize.

Önemli hataya gelince, negatif bir ArrayResize değerinin işlenmesi isteğe bağlıdır.

 
fxsaber :

Hızlanma için Rezerv kullanmak mümkündür. Önemli hataya gelince, negatif bir ArrayResize değerinin işlenmesi isteğe bağlıdır.

Hayır, hızlanma ile ilgili değil. Düşünülmesi gereken ilk şey güvenilirliktir. Ve bu nedenle, ArrayResize değerini döndürme işlemi hiçbir şekilde "isteğe bağlı" olarak adlandırılamaz. Yine de, burada yeni başlayanlar için olmayan, temel bilgilerin anlatıldığı ve basitleştirilmiş örneklerin verildiği bir dal var.

PS Bu arada, ArrayResize ayrıca pozitif bir değer döndürebilir, ancak yine de bir dizi sınır dışı hatası alıyoruz.
 
Ihor Herasko :

ArrayResize dönüş değerinin işlenmesi hiçbir şekilde "isteğe bağlı" değildir. Yine de, burada yeni başlayanlar için olmayan, temel bilgilerin anlatıldığı ve basitleştirilmiş örneklerin verildiği bir dal var.

Bu durumda güvenilirlik adına görünürlüğü öldürmeyi uygun görmüyorum. Görev ikinci yöntemi göstermekti. Burada gösterilen, evrensel bir hazır çözüm değil, teknikti.

Kodlarımı kopyala-yapıştır yapamazsınız. Her zaman sadece eğitim amaçlıdırlar. Onlar. Bir kişinin kodu anlayacağı ve ana fikri anladıktan sonra buna dayanarak kendi versiyonunu yazacağı varsayılmaktadır.

PS Bu arada, ArrayResize ayrıca pozitif bir değer döndürebilir, ancak yine de bir dizi sınır dışı hatası alıyoruz.
Bu durumda sınır dışı dizi olmayacak.
 
fxsaber :

Bu durumda sınır dışı dizi olmayacak.

Rica ederim:

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

arnArray'in genişletilemediği durumlarda, ArrayResize dizinin geçerli boyutunu (en az 0) döndürür. Bu nedenle, döngünün gövdesini yürütmek, sınırların dışında bir diziyle sonuçlanacaktır.