mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 81

 
아마 이렇게 하는 사람은 많지 않을 것 같으니 여기서
 // Заполнение массива строками из файла - классика
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);
}
나는 무언가를 구문 분석해야 할 때 두 번째 옵션을 사용합니다. 아마도 더 빨리 작동하고 확인하지 않았을 것입니다.
 
// "Сортировка" символов Обзора рынка

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

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

"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 :
아마도 많은 사람들이 이것을하지 않을 것이므로 여기에서 나는 무언가를 구문 분석해야 할 때 두 번째 옵션을 사용합니다. 아마도 더 빨리 작동하고 확인하지 않았을 것입니다.

두 번째 옵션은 더 좋을 뿐만 아니라 더 정확합니다. 첫 번째 옵션은 신뢰할 수 없습니다. 그 안에서 치명적인 오류는 치명적인 오류 위에 앉아 그것을 구동합니다.

 
이호르 헤라스코 :

두 번째 옵션은 더 좋을 뿐만 아니라 더 정확합니다. 첫 번째 옵션은 신뢰할 수 없습니다. 그 안에서 치명적인 오류는 치명적인 오류 위에 앉아 그것을 구동합니다.

나는 첫 번째 버전에서 특별한 문제를 보지 못했습니다. 두 번째는 한두 명이 사용하는 것 같습니다.

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

나는 첫 번째 버전에서 특별한 문제를 보지 못했습니다. 두 번째 것은 한두 명이 사용하는 것 같습니다.

글쎄, 어떻게? 그리고 이것은 무엇입니까:

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

치명적인 오류가 아니라면?

 
이호르 헤라스코 :

글쎄, 어떻게? 그리고 이것은 무엇입니까:

치명적인 오류가 아니라면?

가속을 위해 Reserve를 사용할 수 있습니다. 사실, Reserve의 의미는 이 경우에 의심스럽습니다. 왜냐하면 복잡한 객체의 배열 - 문자열.

치명적인 오류의 경우 음수 ArrayResize 값을 처리하는 것은 선택 사항입니다.

 
fxsaber :

가속을 위해 Reserve를 사용할 수 있습니다. 치명적인 오류의 경우 음수 ArrayResize 값을 처리하는 것은 선택 사항입니다.

아니요, 가속에 관한 것이 아닙니다. 가장 먼저 생각해야 할 것은 신뢰성입니다. 따라서 ArrayResize 의 값을 반환 하는 처리는 "의지대로"라고 할 수 없습니다. 그래도 여기 초보자를 위한 것이 아니라 기본 사항을 설명하고 간단한 예제를 제공하는 지점이 있습니다.

PS 그건 그렇고, ArrayResize도 양수 값을 반환할 수 있지만 여전히 배열 범위를 벗어난 오류가 발생합니다.
 
이호르 헤라스코 :

ArrayResize의 반환 값을 처리하는 것은 결코 "선택 사항"이 아닙니다. 그래도 여기 초보자를 위한 것이 아니라 기본 사항을 설명하고 간단한 예제를 제공하는 지점이 있습니다.

이 경우 신뢰성을 위해 가시성을 죽이는 것은 적절하지 않다고 봅니다. 과제는 두 번째 방법을 보여주는 것이 었습니다. 여기에서 시연된 것은 보편적인 기성 솔루션이 아닌 기술이었습니다.

내 코드를 복사하여 붙여넣을 수 없습니다. 항상 교육 목적으로만 사용됩니다. 저것들. 사람이 코드를 이해하고 주요 아이디어를 이해하고 이를 기반으로 자신의 버전을 작성할 것이라고 가정합니다.

PS 그건 그렇고, ArrayResize도 양수 값을 반환할 수 있지만 여전히 배열 범위를 벗어난 오류가 발생합니다.
이 상황에서는 범위를 벗어난 배열이 없습니다.
 
fxsaber :

이 상황에서는 범위를 벗어난 배열이 없습니다.

물론이죠:

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

arrnArray를 확장할 수 없는 경우 ArrayResize는 배열의 현재 크기(최소 0)를 반환합니다. 따라서 루프 본문을 실행하면 배열이 범위를 벗어 납니다.