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

 

MT4, 커뮤니티를 도와주세요.
1. M1 차트에서 (틱 또는 0.5초 타이머로) 작업하는 Expert Advisor에서 H1 차트에 새로운 촛대 가 나타나는 순간에 계산을 해야 합니다.
매시(NN:00분) 마지막 M1 촛대 다음으로 M1 촛대의 시작점을 잡을 수 있는데, 어쩐지 못생겼다... 그리고 H1 촛대가 이 순간에 뽑히지 않을 수도 있습니다.
어쩌면 누군가가 더 우아하게 그것을 했습니까?
2. EA 텍스트의 표시 코드와 비교하여 iCustom()을 통해 표시 값을 가져오는 데 얼마나 걸립니까?
3. Expert Advisor의 텍스트에 있는 지표 코드가 훨씬 더 빠르게 계산된다면, M1 차트에 첨부된 Expert Advisor의 H1 차트를 사용하여 지표 값을 어떻게 계산할 수 있습니까?

 
MikeZv :

MT4, 커뮤니티를 도와주세요.
1. M1 차트에서 (틱 또는 0.5초 타이머로) 작업하는 Expert Advisor에서 H1 차트에 새로운 촛대 가 나타나는 순간에 계산을 해야 합니다.
매시(NN:00분) 마지막 M1 촛대 다음으로 M1 촛대의 시작점을 잡을 수 있는데, 어쩐지 못생겼다... 그리고 H1 촛대가 이 순간에 뽑히지 않을 수도 있습니다.
어쩌면 누군가가 더 우아하게 그것을 했습니까?
2. EA 텍스트의 표시 코드와 비교하여 iCustom()을 통해 표시 값을 가져오는 데 얼마나 걸립니까?
3. Expert Advisor의 텍스트에 있는 지표 코드가 훨씬 더 빠르게 계산된다면, M1 차트에 첨부된 Expert Advisor의 H1 차트를 사용하여 지표 값을 어떻게 계산할 수 있습니까?

첫 번째 질문에 답하면 이 함수는 새 막대를 정의합니다.

 bool NevBar( int period)
  {
   static datetime StatTime;

   if (StatTime!= iTime ( NULL ,period, 0 ))
     {
      StatTime= iTime ( NULL ,period, 0 );
       return ( true );
     }
   return ( false );
  }

사용 사례

int OnInit()
  {
//---
   NevBar(PERIOD_H1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(NevBar(PERIOD_H1))
     {
      производим вычисления.
     }
  }
//+------------------------------------------------------------------+

 
Sergey Gritsay :

첫 번째 질문에 답하면 이 함수는 새 막대를 정의합니다.

Sergey, 정말 감사합니다. 문서를 살펴보았지만 iTime()을 놓쳤습니다...:
OnInit()에서 NevBar()를 호출하는 이유는 무엇입니까?

 
MikeZv :

첫 번째 함수 호출 , 그렇지 않으면 즉시 트리거됩니다. 다음으로 수정됨   OnInit()가 호출되지 않음

 bool NevBar( int period)
  {
   static datetime StatTime;
   
   if (StatTime== 0 )StatTime= iTime ( NULL ,period, 0 );

   if (StatTime!= iTime ( NULL ,period, 0 ))
     {
      StatTime= iTime ( NULL ,period, 0 );
       return ( true );
     }
   return ( false );
  }
 
Sergey Gritsay :

첫 번째 함수 호출 , 그렇지 않으면 즉시 트리거됩니다. 다음으로 수정됨   OnInit()가 호출되지 않음

고마워, 세르게이! 포럼에서 "정적 변수를 사용하지 마십시오!"라고 말했습니다. :)
 
MikeZv :
고마워, 세르게이! 포럼에서 "정적 변수를 사용하지 마십시오!"라고 말했습니다. :)
사용할 필요가 있으면 듣지 마십시오. 대담하지만 올바르게 사용하십시오!
 
MikeZv :
고마워, 세르게이! 포럼에서 "정적 변수를 사용하지 마십시오!"라고 말했습니다. :)
나는 이것에 대해 처음 듣는다. 나는 그것들에 대해 그렇게 끔찍한 것이 무엇인지 궁금하고 나도 거의 사용하지 않지만 특정 작업에 더 적합합니다.
 
Sergey Gritsay :
나는 이것에 대해 처음 듣는다. 나는 그것들에 대해 그렇게 끔찍한 것이 무엇인지 궁금하고 나도 거의 사용하지 않지만 특정 작업에 더 적합합니다.
요점은 Expert Advisor의 전체 기간 동안 동일한 기호와 시간대에 NevDay()가 호출되는 경우에만 정적 변수를 사용할 수 있다는 것입니다. 2개 이상의 문자가 있는 경우 NevDay()는 잘못된 값을 반환합니다. 내 EA는 다중 통화로 설계되었습니다... :(
 
MikeZv :
요점은 Expert Advisor의 전체 기간 동안 동일한 기호와 시간대에 NevDay()가 호출되는 경우에만 정적 변수를 사용할 수 있다는 것입니다. 2개 이상의 문자가 있는 경우 NevDay()는 잘못된 값을 반환합니다. 내 EA는 다중 통화로 설계되었습니다... :(

다중 통화 모드가 필요한 경우 다음은 MT4 및 MT5에서 모두 작동하는 예입니다.

 //+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   int SymbolTotal= SymbolsTotal ( true );
   Comment ( "SymbolTotal = " ,SymbolTotal);
   for ( int i= 0 ;i<SymbolTotal;i++)
     {
       if (NewBar(SymbolTotal,i, SymbolName (i, true ), PERIOD_H1 ))
        {
         Alert ( SymbolName (i, true ), " Новый бар на Н1" );
        }
     }

  }
//+------------------------------------------------------------------+
bool NewBar( int size, int i, string symbol, ENUM_TIMEFRAMES   period)
  {
   datetime curbar[];
   static datetime lastbar[];
   ArrayResize (curbar,size);
   ArrayResize (lastbar,size);

   curbar[i]=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );

   if (lastbar[i]== 0 )lastbar[i]=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar[i]!=curbar[i])
     {
      lastbar[i]=curbar[i];
       return ( true );
     }
   return ( false );
  }
//+------------------------------------------------------------------+
 
MikeZv :
요점은 Expert Advisor의 전체 기간 동안 동일한 기호와 시간대에 NevDay()가 호출되는 경우에만 정적 변수를 사용할 수 있다는 것입니다. 2개 이상의 문자가 있는 경우 NevDay()는 잘못된 값을 반환합니다. 내 EA는 다중 통화로 설계되었습니다... :(

다음은 클래스를 사용하는 또 다른 옵션입니다.

 //+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link        "https://www.mql5.com"
#property version    "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private :
   datetime           curbar;
   datetime           lastbar;
public :
                     CNevBar();
                    ~CNevBar();
   bool               new_bar( string symbol, ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar( void )
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: new_bar( string symbol, ENUM_TIMEFRAMES period)
  {
   curbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar== 0 )lastbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar!=curbar)
     {
      lastbar=curbar;
       return ( true );
     }
   return ( false );
  }

CNevBar *eurusd_H1; // объявим экземпляр класса для симмвола EURUSD
CNevBar *eurusd_M15; // объявим экземпляр класса для симмвола EURUSD

CNevBar *audusd_M30; // объявим экземпляр класса для симмвола AUDUSD
CNevBar *audusd_M5; // объявим экземпляр класса для симмвола AUDUSD

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   eurusd_H1= new CNevBar(); // создадим экземпляр класса для симмвола EURUSD
   audusd_M30= new CNevBar(); // создадим экземпляр класса для симмвола AUDUSD
   eurusd_M15= new CNevBar(); // создадим экземпляр класса для симмвола EURUSD
   audusd_M5= new CNevBar(); // создадим экземпляр класса для симмвола AUDUSD

//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   delete eurusd_H1; // удалим экземпляр класса для симмвола EURUSD
   delete audusd_M30; // удалим экземпляр класса для симмвола AUDUSD
   delete eurusd_M15; // удалим экземпляр класса для симмвола EURUSD
   delete audusd_M5; // удалим экземпляр класса для симмвола AUDUSD

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {

   if (eurusd_H1.new_bar( "EURUSD" , PERIOD_H1 ))
     {
       Alert ( "EURUSD" , " Новый бар на Н1" );
     }

   if (eurusd_M15.new_bar( "EURUSD" , PERIOD_M15 ))
     {
       Alert ( "EURUSD" , " Новый бар на M15" );
     }

   if (audusd_M30.new_bar( "AUDUSD" , PERIOD_M30 ))
     {
       Alert ( "AUDUSD" , " Новый бар на M30" );
     }
   if (audusd_M5.new_bar( "AUDUSD" , PERIOD_M5 ))
     {
       Alert ( "AUDUSD" , " Новый бар на M5" );
     }

//---

  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

검사 결과

 2016.02 . 20 21 : 09 : 43      2015.01 . 10 00 : 00   тест 3 test started
2016.02 . 20 21 : 09 : 45      2015.01 . 12 00 : 00   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 09 : 47      2015.01 . 12 00 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M30
2016.02 . 20 21 : 09 : 50      2015.01 . 12 00 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 09 : 53      2015.01 . 12 00 : 05   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 09 : 59      2015.01 . 12 00 : 10   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 04      2015.01 . 12 00 : 15   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 04      2015.01 . 12 00 : 15   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 10      2015.01 . 12 00 : 20   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 13      2015.01 . 12 00 : 25   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 16      2015.01 . 12 00 : 30   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 16      2015.01 . 12 00 : 30   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M30
2016.02 . 20 21 : 10 : 16      2015.01 . 12 00 : 30   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 23      2015.01 . 12 00 : 35   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 26      2015.01 . 12 00 : 40   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 29      2015.01 . 12 00 : 45   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 29      2015.01 . 12 00 : 45   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 34      2015.01 . 12 00 : 50   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 36      2015.01 . 12 00 : 55   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на Н 1
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M30
2016.02 . 20 21 : 10 : 39      2015.01 . 12 01 : 00   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 46      2015.01 . 12 01 : 05   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 50      2015.01 . 12 01 : 10   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 55      2015.01 . 12 01 : 15   тест 3 EURUSD,M1: Alert : EURUSD Новый бар на M15
2016.02 . 20 21 : 10 : 55      2015.01 . 12 01 : 15   тест 3 EURUSD,M1: Alert : AUDUSD Новый бар на M5
2016.02 . 20 21 : 10 : 57      2015.01 . 12 01 : 17   Tester: stop button pressed
사유: