Mt4 지원 종료. - 페이지 20

 
Alexey Viktorov :
이것으로 시작하지 않는 것이 좋습니다. 그게 벅찬 일입니다. 이 글에서 그를 잘 알지도 못하는 OOP의 서포터인 나조차도 혼미에 빠졌다... 나는 아무것도 이해하지 못했다. 따라서 가장 낮은 수준에서 차이점을 설명하려고합니다.

더 쉬울 수 있습니다.

OOP - 단일 인터페이스를 정의할 수 있습니다. 그 후 - 모든 플랫폼 관련 사항은 "숨겨져" 작업을 방해하지 않습니다.

물론 이것은 순전히 절차적 접근 방식으로 수행될 수 있습니다. 그러나 각 기능에서 모든 플랫폼을 한 번에 처리해야 하기 때문에 절차 버전을 지원하는 것이 더 어려울 것입니다.

 

약간의 지연에 대해 사과드립니다.

다음은 함수의 첫 번째 버전입니다. 그것은 더 개선되고 발전될 수 있습니다. 누구든지 오류를 발견하면 의견을 말하십시오.

 //+------------------------------------------------------------------+
//|                                                    Новый бар.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//------------------------
datetime Время_последнего_бара;
//------------------------
//Счетчики
//------------------------
int Частота_таймера = 25 ;
int Минута;
int 5 _Минут;
int 15 _Минут;
int 30 _Минут;
int 1 _Час;
int 4 _Часа;
int 1 _День;
//------------------------
//Флаги
//------------------------
bool Новый_минутный_бар;
bool Новый_5_минутный_бар;
bool Новый_15_минутный_бар;
bool Новый_30_минутный_бар;
bool Новый_часовой_бар;
bool Новый_4_часовой_бар;
bool Новый_дневной_бар;
//--------------------------------------------
//Значения временных периодов в миллесекундах.
//--------------------------------------------
#define M1     60000
#define M5     300000
#define M15   900000
#define M30   1800000
#define H1     3600000
#define H4     14000000
#define D1     84000000
//------------------------
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetMillisecondTimer ( 25 );
   //-------------------------------------------------------------
   //Записываем время последнего бара на момент загрузки эксперта.  
   //Для корректного начала работы, робота нужно запустить на М1. 
   //-------------------------------------------------------------
   Время_последнего_бара = Time [ 0 ];
   //-------------------------------------------------------------
   
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
//---------------------------------------------------------------
//Считаем время в счетчиках. Для каждого таймфрейма свой счетчик.
//Как только значение счетчика достигает количество миллесекунд в 
//периоде таймфрейма, счетчик обнуляется и выставляется флаг нового
//бара этого таймфрейма. Этот флаг остается до тех пор, пока 
//один из вызовов функции Новый_бар() не снимет его. 
//Таким образом, флаг нового бара любого таймфрейма остается до тех
//пор, пока пользователь не узнает этот факт, вызвав функцию Новый_бар().
//---------------------------------------------------------------
void OnTimer ()
{
 static bool Ведется_отсчет;
   //---------------------------
   if (!Ведется_отсчет && Time [ 0 ] != Время_последнего_бара) 
     {
      Ведется_отсчет = true ;
     }   
   //---------------------------
   if (Ведется_отсчет)
     {
      Минута ++;
       5 _Минут  ++;
       15 _Минут ++;
       30 _Минут ++;
       1 _Час    ++;
       4 _Часа   ++;
       1 _День   ++;
       //--------------------------
       if (Минута*Частота_таймера >= M1)
        {
         Новый_минутный_бар = true ;
         Минута = 0 ;
        } 
       //--------------------------
       if ( 5 _Минут*Частота_таймера >= M5)
        {
         Новый_5_минутный_бар = true ;
         5 _Минут = 0 ;
        } 
       //--------------------------   
       if ( 15 _Минут*Частота_таймера >= M15)
        {
         Новый_15_минутный_бар = true ;
         15 _Минут = 0 ;
        } 
       //--------------------------   
       if ( 30 _Минут*Частота_таймера >= M30)
        {
         Новый_30_минутный_бар = true ;
         30 _Минут = 0 ;
        } 
       //--------------------------   
       if ( 1 _Час*Частота_таймера >= H1)
        {
         Новый_часовой_бар = true ;
         1 _Час = 0 ;
        } 
       //--------------------------  
       if ( 4 _Часа*Частота_таймера >= H4)
        {
         Новый_4_часовой_бар = true ;
         4 _Часа = 0 ;
        } 
       //--------------------------  
       if ( 1 _День*Частота_таймера >= D1)
        {
         Новый_дневной_бар = true ;
         1 _День = 0 ;
        } 
   //-------------------------- 
   }          
}
//--------------------------





//--------------------------
bool Новый_бар( int Таймфрейм = M1)
{
 bool Новый_бар;
 //-----------------------
 switch (Таймфрейм)
   {
     case M1: 
           //-----------------------
          Новый_бар  = Новый_минутный_бар;
           if (Новый_бар)Новый_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------      
     case M5: 
           //-----------------------
          Новый_бар  = Новый_5_минутный_бар;
           if (Новый_бар)Новый_5_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------  
     case M15: 
           //-----------------------
          Новый_бар  = Новый_15_минутный_бар;
           if (Новый_бар)Новый_15_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------  
     case M30: 
           //-----------------------
          Новый_бар  = Новый_30_минутный_бар;
           if (Новый_бар)Новый_30_минутный_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------  
     case H1: 
           //-----------------------
          Новый_бар  = Новый_часовой_бар;
           if (Новый_бар)Новый_часовой_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------      
     case H4: 
           //-----------------------
          Новый_бар  = Новый_4_часовой_бар;
           if (Новый_бар)Новый_4_часовой_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------              
     case D1: 
           //-----------------------
          Новый_бар  = Новый_дневной_бар;
           if (Новый_бар)Новый_дневной_бар = false ;
           return (Новый_бар);
           //-----------------------
           break ;
     //-----------------------------     
   }
 //-----------------------
 return ( false );
}
//--------------------------
//+------------------------------------------------------------------+
 
@Peter Konow 는 OOP가 없어도 쉽게 만들 수 있고 생각하고 시도할 수 있습니다.

감사합니다.
 
사용자가 New_bar() 함수를 호출하는 즉시 요청된 시간 프레임의 새 막대 이벤트에 대한 응답을 받습니다. 이 경우 함수 호출 후 새로운 막대의 이벤트가 발생하면 이벤트 플래그가 제거됩니다. 즉, 원하는 시간대의 새로운 바에 대한 알림은 각 바에 대해 한 번만 받을 수 있습니다. 결국 새 막대에 대한 알림을 받은 후 이 막대는 더 이상 새 것이 아닙니다.
 
Реter Konow :

다음은 함수의 첫 번째 버전입니다. 그것은 더 개선되고 발전될 수 있습니다. 누구든지 오류를 발견하면 의견을 말하십시오.

오프핸드 - 모든 것이 괜찮은 것처럼. 깊이 파고 들지 않았습니다.

개인적으로 나는 아마도 이전 시간과 현재 시간 을 막대의 지속 시간으로 나눌 것입니다. 값이 변경되면 새 막대가 나타납니다. 그러나 가능합니다.

스타일은 개인적으로 변수의 타입으로 어떤 타입인지 판단이 불가능해서 조금 짜증이 납니다. (저는 "헝가리식 표기법, 어떤 변수의 접두어가 그 타입의 축약명일 때"에 익숙합니다) , 하지만 아마도 이것은 불필요할 것입니다.

 
Andrey Kisselyov :
@Peter Konow 는 OOP가 없어도 쉽게 만들 수 있고 생각하고 시도할 수 있습니다.

감사합니다.
물론 가능한 일입니다. 나는 그것을 위해 한 시간이 있었다. 무언가를 생각하고 잘라낼 수 있습니다. 이 모든 것이 가능합니다.
 
Andrey Kisselyov :
@Peter Konow 는 OOP가 없어도 쉽게 만들 수 있고 생각하고 시도할 수 있습니다.

감사합니다.

내가 올바르게 이해하는 한. 목표는 그것을 작동시키는 것입니다. 그가 이 기능으로 보호된 파일을 게시했다면 - 인생에서 그들은 그것이 그런 식으로 작성되었다고 추측하지 않았을 것입니다.

 
George Merts :

오프핸드 - 모든 것이 괜찮은 것처럼. 깊이 파고 들지 않았습니다.

개인적으로 나는 아마도 이전 시간과현재 시간 을 막대의 지속 시간으로 나눌 것입니다. 값이 변경되면 새 막대가 나타납니다. 그러나 가능합니다.

스타일은 개인적으로 변수의 타입으로 어떤 타입인지 판단이 불가능해서 조금 짜증이 납니다. (저는 "헝가리식 표기법, 어떤 변수의 접두어가 그 타입의 축약명일 때"에 익숙합니다) , 하지만 아마도 이것은 불필요할 것입니다.

글쎄요, 스타일에 대한 인식은 습관의 문제입니다. 나뭇가지에 있는 코드를 읽는 것도 어렵습니다. 가끔 짜증날 뿐입니다.

 
George Merts :

더 쉬울 수 있습니다.

OOP - 단일 인터페이스를 정의할 수 있습니다. 그 후 - 모든 플랫폼 관련 사항은 "숨겨져" 작업을 방해하지 않습니다.

물론 이것은 순전히 절차적 접근 방식으로 수행될 수 있습니다. 그러나 각 기능에서 모든 플랫폼을 한 번에 처리해야 하기 때문에 절차 버전을 지원하는 것이 더 어려울 것입니다.

단일 인터페이스는 모든 계산 작업을 프로그래밍하는 데 완전히 적용할 수 없다는 것은 이미 논의된 것 같습니다... 인터페이스의 형태로 아름다움을 가져오는 것은 기성 코드에만 적용할 수 있는 순전히 미용적인 절차이며, 코드의 추가 지원 및 개선 ...

 
Mickey Moose :

내가 올바르게 이해하는 한. 목표는 그것을 작동시키는 것입니다. 그가 이 기능으로 보호된 파일을 게시했다면 - 인생에서 그들은 그것이 그런 식으로 작성되었다고 추측하지 않았을 것입니다.

단순히 작동하는 것이 아니라 오류 없이 빠르고 정확하게 작동하고 소스 코드에서 구조화된 모양과 이해하기 쉬운 쓰기가 있는 것이 바람직합니다.

감사합니다.