초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 245

 
forexman77 :

스크립트에서 다음과 같이 했습니다.

시간=0

SymbolInfoTick은 월요일에 확인합니다.

다음 코드로 확인할 수 있습니다.

 void OnStart ()
{
   double ask;
   uint start= GetTickCount ();
   for ( int i= 0 ;i< 1000000 ;i++)
  {
    ask= SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
  }
   uint time= GetTickCount ()-start;
   Print ( "SymbolInfoDouble = " ,time, " ms" );
  
   MqlTick tick;
  start= GetTickCount ();
   for ( int i= 0 ;i< 1000000 ;i++)
  {
     SymbolInfoTick ( Symbol (),tick);
  }
  time= GetTickCount ()-start;
   Print ( "SymbolInfoTick = " ,time, " ms" );
}

그러나 기호로 진드기가 필요합니다.

 
Fleder :

다음 코드로 확인할 수 있습니다.

그러나 기호로 진드기가 필요합니다.

예, " SymbolInfoTick ", 오늘 테스트되지 않았습니다.

틱이 갈 때까지 시도했지만 아무 것도 작동하지 않습니다.

 void OnStart ()
  {
uint start= GetTickCount ();
double iask= 0 ;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if (! SymbolInfoTick ( _Symbol ,latest_price)){iask=latest_price.ask;}
Alert ( "iask=" ,iask);
uint time= GetTickCount ()-start;
Alert ( "time=" ,time);  
  }
iask=0
 
forexman77 :

예, "SymbolInfoTick", 오늘 테스트되지 않았습니다.

틱이 갈 때까지 시도했지만 아무 것도 작동하지 않습니다.

iask=0

이 기능은 너무 빠릅니다.

성능을 측정하려면 반복 횟수가 많은 루프에서 여러 호출을 적용하고 총 실행 시간을 측정해야 합니다.

 
barabashkakvn :
더 흥미로운 것은 코드 예제가 있다는 것입니다. 결과를 기다리고 있습니다.
 
forexman77 :
고맙습니다. 편리하게 이용하세요.
 

EA에서 새 막대를 확인하기 위해 포럼에서 찾은 "CopyTime", "CopyRates"를 기반으로 하는 기능을 사용했습니다. 나는 그들의 계산에 많은 시간이 걸린다는 결론에 이르렀다.

다음은 확인 데이터입니다( 표시기 호출 에 171ms가 소요됨).

 datetime New_Time[]; //буффер для проверки нового бара
void OnStart ()
  {
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
static datetime t; //записываем старое время  
ArraySetAsSeries (New_Time, true ); //направление индексации
CopyTime ( _Symbol , _Period , 0 , 1 ,New_Time); //копируем время нового бара
t=New_Time[ 0 ];   
}
uint time= GetTickCount ()-start;
Print ( "New_Time = " ,time, " ms" );
  }

 MqlRates rates[]; 
void OnStart ()
  {
datetime t;  
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{
ArraySetAsSeries (rates, true );
int copied= CopyRates ( Symbol (), Period (), 0 , 1 ,rates);  
t=rates[ 0 ].time; 
}
uint time= GetTickCount ()-start;
Print ( "t = " ,time, " ms" );
  }

그리고 나는 시도하면 다른 것을 생각했습니다. 예를 들어 "TimeCurrent"

최적화를 위해 다음 코드를 만들었습니다.

 void OnStart ()
  {
int t;
int s;  
uint start= GetTickCount ();
for ( int i= 0 ;i< 1000000 ;i++)
{

MqlDateTime m;
TimeCurrent (m);
t=m.min;
s=m.sec;
}
uint time= GetTickCount ()-start;
Print ( "time = " ,time, " ms" );    
  }

Expert Advisor에서 최적화를 위해 다음 코드를 만들었습니다.

 static double ind1; //записываю значения
static double ind2; // значения
static double indsmall; //индикаторов
MqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
if (MIN== 0 && SEC== 0 )//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

각 틱에서 표시기 값을 얻을 때 새 막대를 확인하지 않고 단일 실행 결과: 817,196ms

새로운 바 체크 포함: 735,904ms

차이점은 특별히 인상적이지 않고 개선 사항이 있지만 이것으로 충분하지 않습니다.

다음과 같은 표시기를 얻습니다.

 int TSIHandle;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit ()
  {
TSIHandle= iCustom ( NULL , 0 , "Blau_TSI" ,q,r,s,u, PRICE_CLOSE );
if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}
ArraySetAsSeries (TSI, true );
   return ( 0 );
  }

void OnDeinit ( const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease (TSIHandle);
   ArrayFree (TSI);
  }

void OnTick ()
  {
MqlDateTime m;
TimeCurrent (m);
int MIN=m.min;
int SEC=m.sec;
static double tsismall;

if (MIN== 0 && SEC== 0 )
{
//--- копируем значения индикаторов из индикаторных буферов
   if ( CopyBuffer (TSIHandle, 0 , 0 , 3 ,TSI)< 0 )
     {
       Alert ( "Ошибка копирования буферов индикатора Moving Average - номер ошибки:" , GetLastError (), "!!" );
       return ;
     }
tsismall=TSI[ 1 ];
}
}

새 막대가 확인되는 블록에 핸들 호출이 있는 코드를 배치하려고 했습니다. 이 행이 있으면 오류가 발생합니다.

 if (TSIHandle< 0 ){ Alert ( "Ошибка при создании индикаторов - номер ошибки: " , GetLastError (), "!!" ); return (- 1 );}

나는 그 반환 을 넣어 아무 것도 반환하지 않고 오류도 없지만 어드바이저는 작동하지 않습니다.

가능한 경우 핸들의 호출, 그리고 일반적으로 정적 변수를 제외한 모든 주요 코드는 새 막대를 확인하기 위해 조건부 연산자 내부에 배치되어야 한다고 가정합니다.

내가 틀리지 않았다면 어딘가에서 핸들을 호출해도 버퍼에 표시기를 요청하지 않아도 여전히 계산된다는 것을 읽었습니다.

 
하나의 공식 버퍼[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)의 결과 출력을 기반으로 지표를 만드는 방법을 알려줄 수 있는 사람 ))*10000;
 
rus-lot :
하나의 공식 버퍼[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)의 결과 출력을 기반으로 지표를 만드는 방법을 알려줄 수 있는 사람 ))*10000;

사용자 지정 지표를 작성해야 합니다. 프로세스를 더 쉽게 만들려면 가장 간단한 표시기 중 하나인 iMa 를 사용하여 약간 다시 작성하십시오. 다음은 MarketInfo에 대해 이야기하는 또 다른 스레드 입니다. 코드를 작성하고 문제가 해결되지 않으면 물어보십시오.

 
정적 변수 는 어떻게 되었습니까? 오늘 나는 터미널의 이전 빌드를 업데이트했고 이제 오류를 컴파일할 때:

unresolved static variable
 
sgreen :
정적 변수 는 어떻게 되었습니까? 오늘 나는 터미널의 이전 빌드를 업데이트했고 이제 오류를 컴파일할 때:

unresolved static variable

이제 클래스의 정적 데이터 멤버를 배치해야 합니다 .

 //+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public :
   static int         s_words;
   static int         s_symbols;
   //--- конструктор и деструктор
                     Parser( void );
                    ~Parser( void ){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words= 0 ;
int CParser::s_symbols= 0 ;
사유: