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

 
Mikhail Tkachev :

문서 및 포럼을 통해 파고 ...
객체 포인터 유형의 전역 변수 를 만드는 방법 [var 예에서] OnInit()에서 다음 행으로 생성된 경우

게다가 객체의 개수와 생성자의 매개변수는 미리 알 수 없으며 OnInit() ?

용이하게.

CObj* var1 = NULL ;
CObj* var2 = NULL ;
CObj* var3 = NULL ;

int OnInit ()
{
   var1 = new CObj( p1, p2, p3 );
   var2 = new CObj( p1, p2, p3 );
   var3 = new CObj( p1, p2, p3 );
}
 

여보세요

MT5에는 십자형 버튼이 있습니다.

차트를 클릭하면 막대 수, 포인트 수 및 백분율 정보가 표시됩니다.

로봇에 바인딩할 수 있도록 이 값을 올바르게 계산하는 방법을 도와주세요.

고맙습니다

 
Artyom Trishkin :

이미 새로운 바 수업이 있습니까?

입력 매개변수는 정확히 어떻게 생겼습니까?

수업은 다음 사이트에서 빌립니다. https://www.mql5.com/en/code/768 , 약간의 변경이 이루어졌습니다.

 //+------------------------------------------------------------------+
//|                                                     IsNewBar.mqh |
//|                               Copyright © 2011, Nikolay Kositsin |
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+ 
#property copyright "2011,   Nikolay Kositsin"
#property link        "farria@mail.redcom.ru"
#property version    "1.00"
//+------------------------------------------------------------------+
//|  Алгоритм определения момента появления нового бара              |
//| Для каждого таймфрейма каждого символа нужно создавать объект    |
//+------------------------------------------------------------------+  
#include <Object.mqh>

class CIsNewBar : public CObject // Сделан наследником класса для возможности работы с классом CArrayObj (из библиотеки)
// class CIsNewBar   // Первоначальная редакция
  {
   //----
public :

       //---- функция определения момента появления нового бара
   bool IsNewBar()
     {
       //---- получим время появления текущего бара
       datetime TNew= datetime ( SeriesInfoInteger (m_Symbol,m_TimeFrame, SERIES_LASTBAR_DATE ));

       if (TNew!=m_TOld && TNew) // проверка на появление нового бара
        {
         m_TOld=TNew;
         return ( true ); // появился новый бар!
        }
       //----
       return ( false ); // новых баров пока нет!
     };

   //---- конструктор класса    
                     CIsNewBar( const string &pSymbol, const ENUM_TIMEFRAMES pTimeFrame){
                        m_Symbol=pSymbol; m_TimeFrame=pTimeFrame;
                        m_TOld=- 1 ;};

protected :
   datetime           m_TOld;         // Время хранится 
   ENUM_TIMEFRAMES    m_TimeFrame;   //    для каждого таймфрейма
   string             m_Symbol;       //    каждого символа

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

다음과 같이 적용할 예정입니다.

 int OnInit ()
{
    // Переменная NB_M1 - объект для контроля нового бара по символу currSymbol для таймфрейма M1

    CIsNewBar* NB_M1= new CIsNewBar(currSymbol, PERIOD_M1 );
}

void OnTick ()
{
     if (NB_M1.IsNewBar())   // (1) Если появился новый бар M1
        {....}
    ......
}
 
Koldun Zloy :

용이하게.

답변 해주셔서 감사합니다)
처음에는 그냥 그랬습니다.
따라서 객체는 두 번 생성됩니다. 처음에는 비어 있고, 그다음에는 예상대로 매개변수가 있는 생성자에 의해 생성됩니다.
하지만 ... 동시에 컴파일러는 OnInit() 줄에 경고를 표시합니다.

'var1'의 선언은 전역 변수를 숨깁니다 -> OnInit()에서 줄당
'var1'의 이전 선언 참조

그래서 지역 변수 는 전역 변수를 숨깁니다... 그러면 어떻게 될까요?
예를 들어 OnTick()과 같은 다른 함수에서 어떤 변수를 볼 수 있습니까? 우리는 전역 =NULL을 가지고 있고, 지역 것은 올바르게 초기화되었지만 다른 함수는 그것을 볼 수 없습니다 ...

 
Mikhail Tkachev :

수업은 사이트에서 빌렸습니다: https://www.mql5.com/en/code/768 , 약간의 변경이 이루어졌습니다.

다음과 같이 적용할 예정입니다.

입력 매개변수에서 모든 하위 문자열을 추출하고 이를 사용하여 기호 이름과 해당 시간 프레임을 만들어야 합니다.

그런 다음 이 목록에서 새 막대 개체를 만들고 전역 수준에서 선언된 CArrayObj에 생성된 각 "새 막대" 개체에 대한 포인터를 놓습니다.

추가 - 이 목록을 통한 루프의 OnTimer()에서 다음 개체에 대한 포인터를 가져오고 새 막대가 있는지 확인합니다. 그렇지 않은 경우 다음 막대로 이동하고 있는 경우 새 막대를 열 때 수행해야 하는 작업을 수행합니다.

일반적으로 현재가 아닌 기호의 새 막대에 반응하기에 충분하다고 생각하는 빈도로 필요에 따라(밀리초, 초, 분) 타이머를 만드십시오.

 
Mikhail Tkachev :

답변 해주셔서 감사합니다)
처음에는 그냥 그랬습니다.
따라서 객체는 두 번 생성됩니다. 처음에는 비어 있고, 그다음에는 예상대로 매개변수가 있는 생성자에 의해 생성됩니다.
하지만 ... 동시에 컴파일러는 OnInit() 줄에 경고를 표시합니다.

'var1'의 선언은 전역 변수를 숨깁니다 -> OnInit()에서 줄당
'var1'의 이전 선언 참조

그래서 지역 변수 는 전역 변수를 숨깁니다... 그러면 어떻게 될까요?
예를 들어 OnTick()과 같은 다른 함수에서 어떤 변수를 볼 수 있습니까? 우리는 전역 =NULL을 가지고 있고, 지역 것은 올바르게 초기화되었지만 다른 함수는 그것을 볼 수 없습니다 ...

잘 봐봐. 제대로 하지 않았다.

 
Artyom Trishkin :

입력 매개변수에서 모든 하위 문자열을 추출하고 이를 사용하여 기호 이름과 해당 시간 프레임을 만들어야 합니다.

그런 다음 이 목록에서 새 막대 개체를 만들고 전역 수준에서 선언된 CArrayObj에 생성된 각 "새 막대" 개체에 대한 포인터를 놓습니다.

추가 - 이 목록을 통한 루프의 OnTimer()에서 다음 개체에 대한 포인터를 가져오고 새 막대가 있는지 확인합니다. 그렇지 않은 경우 다음 막대로 이동하고 있는 경우 새 막대를 열 때 수행해야 하는 작업을 수행합니다.

밀리초, 초, 분 등 필요에 따라 타이머를 만들고 일반적으로 현재가 아닌 기호의 새 막대에 반응하기에 충분하다고 생각하는 빈도를 설정합니다.

이렇게 했는데 ArrObj.At(0) 에서 클래스의 멤버 함수가 호출되지 않습니다 ...

 
Koldun Zloy :

잘 봐봐. 제대로 하지 않았다.

이미 주목)
따라서 탈출구는 전역적으로 빈 객체를 선언하는 것입니다....
그리고 미리 알 수 없다면 몇 개나 될까요? "여백이 있음"으로 선언하시겠습니까? :)
추신 내장 도움말에서 개체를 선언하는 그런 방법을 찾지 못했습니다

CObj* var1 = NULL ;
 
Mikhail Tkachev :

이미 주목)
따라서 탈출구는 전역적으로 빈 객체를 선언하는 것입니다....
그리고 미리 알 수 없다면 몇 개나 될까요? "여백이 있음"으로 선언하시겠습니까? :)

CArrayObj에 넣습니다.

ArrObj.At(0) 함수는 파생 클래스의 멤버에 대해 아무것도 모르는 기본 클래스에 대한 포인터를 반환합니다.

그것들에 접근하기 위해서는 간단히 타입 변환을 하면 됩니다.

CIsNewBar* newBar = (CIsNewBar*)ArrayObj.At( 0 );
newBar.method( parameter );
 
Koldun Zloy :

CArrayObj에 넣습니다.

ArrObj.At(0) 함수는 파생 클래스의 멤버에 대해 아무것도 모르는 기본 클래스에 대한 포인터를 반환합니다.

그것들에 접근하기 위해서는 간단히 타입 변환을 하면 됩니다.

답변 감사합니다, 당신은 전혀 악하지 않습니다)
이제 명확해졌습니다.)
UPD
이 디자인도 작동합니다

CIsNewBar* newBar = ArrayObj.At( 0 );
newBar.method( parameter )
사유: