MQL5에서 함께 배우고 쓰기 - 페이지 35

 

클래스가 아닌 멤버 함수를 클래스의 멤버가 아닌 다른 함수에 대한 참조(주소) 인수로 전달할 수 있는지 누가 압니까?

또는 클래스 멤버 함수를 클래스의 멤버가 아닌 다른 함수에 대한 참조(주소) 인수로 전달할 수 있습니까?

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
victorg :

클래스가 아닌 멤버 함수를 클래스의 멤버가 아닌 다른 함수에 대한 참조(주소) 인수로 전달할 수 있는지 누가 압니까?

또는 클래스 멤버 함수를 클래스의 멤버가 아닌 다른 함수에 대한 참조(주소) 인수로 전달할 수 있습니까?

아니요. 아니요.

당신은 할 수 없습니다. MQL5에는 "함수 주소" 또는 "함수 참조"라는 개념이 없습니다.

 

고맙습니다!

다른 질문.

mql 5 코드 가 있는 두 개의 파일이 있습니다 . 첫 번째 파일 은 기본 파일(지시자 또는 스크립트)입니다. 두 번째 mqh 파일 .

// f_01.mqh
double extfunc( int a);
//-------------------------------------
double example( void )
  {
   double a;
  a=extfunc( 35 );
   return (a);
  }
//-------------------------------------
두 번째 mqh 파일은 주로 맨 처음에 연결됩니다. 기본 파일의 컴파일은 오류나 경고 없이 진행됩니다. 그러나 mqh 파일을 별도로 컴파일하려고 하면 - ' 함수 를 얻습니다. ~ 해야 하다 가지다 '. 문제는 컴파일러에게 모든 것이 함수에 문제가 없고 본문이 다른 파일에 있다는 것을 알리는 방법입니다.
Документация по MQL5: Файловые операции / FileMove
Документация по MQL5: Файловые операции / FileMove
  • www.mql5.com
Файловые операции / FileMove - Документация по MQL5
 
victorg :

두 번째 mqh 파일은 주로 맨 처음에 연결됩니다. 기본 파일의 컴파일은 오류나 경고 없이 진행됩니다. 그러나 mqh 파일을 별도로 컴파일하려고 하면 - ' 함수 를 얻습니다. ~ 해야 하다 가지다 '. 문제는 컴파일러에게 모든 것이 함수에 문제가 없고 본문이 다른 파일에 있다는 것을 알리는 방법입니다.
안 돼요. 생계를 위해 찢지 마십시오. 코드를 읽을 때 더 쉽게 이해할 수 없습니다.
 
Yedelkin :

제가 너무 생각을 많이 하고 있는 것 같습니다만, 또 다른 질문이 있습니다. 시장가 주문 요청을 보내기 전에 (포지션을 열기 위해) 거래 티켓을 재설정합니다. 나는 result.deal=0을 한다. 서버가 MqlTradeResult 응답 구조에서 제로 거래 티켓을 반환하는 것이 가능하지만 동시에 거래가 조금 늦게 완료되고 포지션이 열릴 것입니까? 아니면 서버에서 제로 트레이드 티켓을 반환하면 이 요청에 따라 포지션을 열 수 없으며 향후 열리지 않을 것이라고 보장합니까?

좋아, 답이 없기 때문에 그리고 이 줄 때문에

구조체 MqlTradeResult
{
장기 거래; // 딜 티켓, 완료되면
};

서버에서 제로 딜 티켓을 반환하는 것은 해당 포지션을 열 수 없고 이 요청에 따라 앞으로 열지 않을 것이라는 것을 의미한다는 결론에 도달했습니다.

 

나는 포럼의 구조를 정말로 이해하지 못합니다. 거기에 없다면 올바른 방향으로 저를 인도하십시오.

왜냐하면 나는 전문적인 전문가는 아니지만 프로그래밍에 관심이 있고, 학습과정에 대한 나의 성향을 바탕으로 기존의 코드를 분석하여 알아내려고 노력한다.

단순함을 위해 사용자 정의 MA 코드 조각을 가져 와서 어떤 일이 일어나고 있는지 이해하려고합니다 (주석에 반영됨)

일반적으로 어렵지 않다면 코드에 댓글을 달아주세요. 각 명령 후에 어떻게 되는지 알고 싶습니다. 고맙습니다.

void CalculateSimpleMA( int Rates_total, int prev_calculated, int begin, const double &price[]) // 정렬된 &price[]

  {
   int i,limit;
//--- first calculation or number of bars was changed
   if (prev_calculated== 0 ) // first calculation
     {
      limit=InpMAPeriod+begin;                                                //почему переменная begin=0 ???
       //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;                             //здесь инициализируются значения индикатора на барах с индексами от 0 до limit-1 ??? крайне правых на графике???
       //--- calculate first visible value
       double firstValue= 0 ;                                                     //при инициализации переменной имеющей тип double не обязательно использовать значения типа double???
       for (i=begin;i<limit;i++)
         firstValue+=price[i];                                                //разобрался, здесь идет накопление переданной цены
      firstValue/=InpMAPeriod;
      ExtLineBuffer[limit- 1 ]=firstValue;                                      
     }
   else limit=prev_calculated- 1 ;                                              //в результате чего prev_calcutated не должно равняться 0, если индикатор поместили на оффлайн график?
//--- main loop
   for (i=limit;i<rates_total && ! IsStopped ();i++)                              //цикл для индикатора на баре с индексами от limit до последнего на графике
      ExtLineBuffer[i]=ExtLineBuffer[i- 1 ]+(price[i]-price[i-InpMAPeriod])/InpMAPeriod;
//---
  }

출력물에 표시되고 ExtLineBuffer의 값 이 limit-1 인덱스에서 Rates_total-1 인덱스로 할당되고 차트에서 표시기가 전체 공간(hmm)에 그려지는 것을 봅니다. 여기서 다음은 할당된 값 입니다. 1에서 limit-1까지 간격의 표시기 버퍼 ?? ?

Документация по MQL5: Основы языка / Операции и выражения / Операции присваивания
Документация по MQL5: Основы языка / Операции и выражения / Операции присваивания
  • www.mql5.com
Основы языка / Операции и выражения / Операции присваивания - Документация по MQL5
 
Profi_R :

나는 포럼의 구조를 정말로 이해하지 못합니다. 거기에 없다면 올바른 방향으로 저를 인도하십시오.

왜냐하면 나는 전문적인 전문가는 아니지만 프로그래밍에 관심이 있고, 학습과정에 대한 나의 성향을 바탕으로 기존의 코드를 분석하여 알아내려고 노력한다.

단순함을 위해 사용자 정의 MA 코드 조각을 가져 와서 어떤 일이 일어나고 있는지 이해하려고합니다 (주석에 반영됨)

일반적으로 어렵지 않다면 코드에 댓글을 달아주세요. 각 명령 후에 어떻게 되는지 알고 싶습니다. 고맙습니다.

나는 자세히 언급하지 않을 것입니다. 아마도 인식의 주요 실수를 수정하는 것으로 충분할 것이며 퍼즐을 직접 조립할 것입니다. 이것은 훨씬 더 유용합니다.

따라서 혼란의 근거는 mql5의 많은 표시기(특히 이 표시기)가 표시기 버퍼의 인덱싱을 반대로 하지 않고 작성되었다는 것입니다. AsSeries=거짓입니다.

이것은 역사상 가장 오래된 막대의 인덱스 = 0이고 "가장 신선한" 막대의 인덱스 = RatesTotal-1임을 의미합니다.

// 뭔가 정리??..

이 접근 방식의 의미는 발사 속도에 약간의 이득이 있다는 것입니다. 버퍼에 액세스할 때 인덱싱은 [숨겨진] 재계산을 필요로 하지 않습니다("하드웨어"로 유지됨)

// 표시기 버퍼의 경우 인덱싱이 항상 기록의 끝에서 시작까지 발생한다는 믿음(오류)에서 혼란이 생겼을 것입니다. 이것은 mql4 에서 항상 사실이지만 mql5 에서 반드시 그런 것은 아닙니다 .

// 여기서 기본 인덱싱 방향은 항상 히스토리의 처음부터 끝까지이며, 인덱싱을 반대로 하려면 SetAsSeries(...) 함수를 명시적으로 사용해야 합니다.

// 또한, 도움말 에서 개발자는 일반적으로 기본값에 의존하는 것을 권장하지 않으며(변경되는 경우) 항상 SetAsSeries() 함수를 사용하여 인덱싱 방향을 설정합니다 .

void CalculateSimpleMA( int Rates_total, int prev_calculated, int begin, const double &price[]) // 정렬된 &price[]

출력물에 표시되고 ExtLineBuffer의 값 이 limit-1 인덱스에서 Rates_total-1 인덱스로 할당되고 차트에서 표시기가 전체 공간(hmm)에 그려지는 것을 봅니다. 여기서 다음은 할당된 값 입니다. 1에서 limit-1까지 간격의 표시기 버퍼 ?? ?

위의 내용에 비추어 스스로 알아낼 것이라고 생각하지만 만일의 경우를 대비하여 내일 지점을 살펴보겠습니다.
 
MetaDriver : ..

답변해주셔서 감사합니다)

중간 데이터가 변수에 인쇄된 후 제거된 의구심이 있었지만 배열의 방향성 순서와 도움말에서 방향성을 명시적으로 지정하기 위한 권장 사항에 대해 읽었습니다.

지금까지 방향만 결정되었습니다. 초기화에 대한 주석이 잘못되어 차트 왼쪽의 지정된 범위에서 표시기 버퍼 값이 초기화됩니다.

에 대한 질문이 있습니다

1. 변수 begin, 이벤트 핸들러에 전달된 값에 대해 터미널이 책임이 있습니까? 그 가치는 어디에서 오는가?

2. double 유형의 변수가 int 유형의 값이 될 수 있습니까?

3. 분명히 터미널은 prev_calculated 변수의 값도 담당합니다.

4. 명확하지 않습니까? 여기서 표시기는 0에서 한계-1까지의 간격으로 계산 됩니다.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Profi_R :

에 대한 질문이 있습니다

1. 변수 begin, 이벤트 핸들러에 전달된 값에 대해 터미널이 책임이 있습니까? 그 가치는 어디에서 오는가?

3. 분명히 터미널은 prev_calculated 변수의 값도 담당합니다.

논의된 함수는 OnCalculate() 함수를 호출하는 첫 번째 형식을 위해 작성되었을 가능성이 큽니다. 핸드북을 참조하십시오.

Profi_R :

에 대한 질문이 있습니다

2. double 유형의 변수가 int 유형의 값이 될 수 있습니까?

그래 넌 할수있어. 암시적 유형 캐스팅에 대한 섹션을 참조하세요. 컴파일러는 암시적 캐스팅을 사용할 때 데이터 손실 가능성에 대한 경고를 표시하는 경우가 많습니다.

Profi_R :

에 대한 질문이 있습니다

4. 명확하지 않습니까? 여기서 표시기는 0에서 한계-1까지의 간격으로 계산 됩니다.

다음 행이 귀하의 질문에 답합니까?

 //--- set empty value for first limit bars
       for (i= 0 ;i<limit- 1 ;i++) ExtLineBuffer[i]= 0.0 ;                            
//--- calculate first visible value
... и далее по коду
?
 
Profi_R :

답변해주셔서 감사합니다)

중간 데이터가 변수에 인쇄된 후 제거된 의구심이 있었지만 배열의 방향성 순서와 도움말에서 방향성을 명시적으로 지정하기 위한 권장 사항에 대해 읽었습니다.

지금까지는 방향만 결정되었습니다. 초기화에 대한 주석이 잘못되어 차트 왼쪽의 지정된 범위에서 표시기 버퍼 값이 초기화됩니다.

확인.

에 대한 질문이 있습니다

1. 변수 begin, 이벤트 핸들러에 전달된 값에 대해 터미널이 책임이 있습니까?

예, 터미널은 표시기로의 전송에 대한 책임이 있습니다.


여기에서 이 매개변수의 목적을 주목하는 것이 중요합니다. 이 매개변수는 입력 시리즈의 초기 기록 값이 몇 개나 잘못되었는지 계산에 사용해서는 안 되므로 무시(건너뛰기)해야 하는 지표를 알려줍니다. 그러한 부정확성은 어디에서 올 수 있으며, 그 기원은 무엇입니까? 가격 데이터가 아닌 다른 지표가 제공하는 데이터를 기반으로 계산된 지표를 구축할 가능성과 관련이 있습니다. MT5에는 다른 지표에서 지표 입력으로 데이터를 수신할 수 있는 세 가지 메커니즘이 있습니다.

첫 번째 방법입니다. 단계 순서:

1. iIndicator(...) 시리즈의 기능 중 하나를 사용하여 입력 표시기 핸들을 생성합니다. 또는 IndicatorCreate(...) 함수.

2. 필요에 따라 CopyBuffer(...) 함수를 사용하여 버퍼에서 값을 가져옵니다.

두 번째 방법입니다. 첫 번째의 확장입니다. 첫 번째 방법으로 가격 계열이 아닌 지표 계열을 입력 지표의 입력에 제출해야 하는 경우 필요합니다. 저것들. 이 경우 다른 표시기(1)의 데이터를 자체 입력으로 사용하여 입력 표시기(2)에 의해 계산된 값을 프로그램에서 수신하려고 합니다. 저것들. 지표에서 지표 체인을 구축합니다.

단계 순서:

1. iIndicator(...) 시리즈의 기능 중 하나를 사용하여 첫 번째(1) 입력 표시기의 핸들을 생성합니다. 또는 IndicatorCreate(...) 함수.

2. 두 번째(2) 인디케이터의 핸들도 같은 방법으로 생성하되 생성 시 마지막 파라미터로 지정( applyed_price ) 첫 번째 핸들(1).

3. 필요에 따라 CopyBuffer(...) 함수를 사용하여 버퍼에서 값을 가져옵니다.

세 번째 방법입니다. 지표에서 지표 체인을 구축할 때도 사용됩니다. 그러나 이전 버전과 달리 데이터 소스(입력 행)는 컴파일 전에 고정되지 않고 사용자가 터미널에서 직접 설정할 수 있습니다. 표시기가 실행되는 순간에 적절한 매개변수를 지정합니다.

이러한 메커니즘을 독립적으로 이해할 수 있는 기회를 제공합니다. 나는 이전 텍스트에서 이에 도움이 될 문서의 주요 위치에 대한 몇 가지 직접 링크를 표시했습니다.

OnCalculate() 호출의 짧은 형식의 매개변수에 대해서만 설명하겠습니다. 그래서:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])

그들의 목적은 잘 문서화되어 있습니다. 여기에서 나는 그들이 이 기능으로 옮겨야 하는 바로 그 필요성(정당화)을 설명하고자 합니다. 첫 번째와 마지막 매개변수를 사용하여 모든 것이 충분히 명확하기를 바랍니다. 계산을 위해서는 입력 데이터(price[])가 있는 버퍼가 있어야 하고 현재 길이를 알아야 합니다. (따옴표가 터미널에 도착함에 따라 길이가 커짐을 잊지 마십시오).

그러나 또한 입력 시리즈의 맨 처음부터 데이터가 엄격하게 정확한지 아니면 초기 값의 (가능성 또는 보장된) 부정확성으로 인해 초기 값을 무시해야 하는지 여부도 알아야 합니다. 입력 데이터가 다른 지표의 출력 일 때 대부분의 경우 부정확성이 보장됩니다 . 글쎄, 다른 방법은? 막대의 값을 계산하는 대부분의 지표는 일정량의 과거 데이터를 사용해야 합니다. 그리고 그들은 "태초에" 어디로 가나요? 그들은 거기에 없으므로 시작 기록 막대가 아니라 다소 나중에 (오른쪽으로) 막대에서 이전 (왼쪽으로) 이미 필요한 출력 값 생성을 시작해야 합니다. 과거 데이터의 양.

이제 위에서 그린 세부 사항 덕분에 질문에 대한 답변

그 가치는 어디에서 오는가? // 시작 매개변수에 대해 이야기하기

완전히 이해했습니다. 나는 대답합니다. 이 매개변수가 터미널에 의해 함수에 전달된다는 사실에도 불구하고 그 내용은 입력 표시기에 의해 처리되어야 합니다 ! 터미널 자체는 가격 입력 계열만 제어할 수 있습니다(이 경우 시작 값은 0이고 이것이 올바른 값입니다). 따라서 (순전히 실험적인 것을 제외하고) 표시기를 작성할 때 출력 버퍼에 있는 올바른 데이터의 시작 인덱스를 터미널에 알려준다는 점에 주의해야 합니다 . 이것은 분명하다? 그렇지 않으면 이 표시기의 "후손"이 매우 맛이 없는 잘못된 데이터를 먹을 수 있고 어떤 경우에는 매우 중독될 수도 있습니다... :) 이제 수행 방법에 대해 이야기하겠습니다. 이를 위해 PLOT_DRAW_BEGIN 속성 식별자를 지정하는 PlotIndexSetInteger() 함수가 사용됩니다. 중요한! 생성된 표시기 속성의 100% 정확성을 위해 OnInit()에서 PlotIndexSetInteger(...,PLOT_DRAW_BEGIN,...)에 대한 단일 호출로 자신을 제한하는 것은 불가능합니다! 왜 그런 겁니까? 그러나 우리 지표는 이미 기록에 초기 들여 쓰기가있는 다른 지표의 데이터를 기반으로 자체적으로 형성 될 수 있기 때문에.! 저것들. 입력 히스토리에 0이 아닌 시작 값이 있고 OnInit()에서 가져올 방법이 없습니다. 그래서 우리는 이런 일을 해야 합니다.

  PlotIndexSetInteger(MySymbol,PLOT_DRAW_BEGIN,MyBeginPeriod-1+begin);

전화. 그리고 OnInit의 begin 값을 알 수 없기 때문에 OnCalculate()에서 강제로 수행해야 합니다.

물론 우리에게 예비(매우 의미 있는 것은 아니지만) 전화를 걸 수 있는 권리가 있습니다.

  PlotIndexSetInteger(MySymbol,PLOT_DRAW_BEGIN,MyBeginPeriod);

OnInit()에서.

이것은 연구를 위해 샘플을 가져온 표시기(Custom Moving Average.mq5)에서 수행된 작업입니다.

2. double 유형의 변수가 int 유형의 값이 될 수 있습니까?

예, 이중 유형의 변수 는 상수로 설정된 경우 int 유형의 값으로 안전하게 초기화할 수 있습니다. // 귀하의 예에서와 같이

3. 분명히 터미널은 prev_calculated 변수의 값도 담당합니다.

여기에 미묘함이 있습니다. 대부분의 경우 이 값은 이전 호출에서 OnCalculate() 함수가 반환한 값과 동일합니다. 즉, 사실, 그것은 당신의 손에 있습니다. :) 반면 에, 첫 번째 호출 에서는 0 값이 있을 것입니다. 게다가 값은 터미널이 원할 때마다 (터미널에 의해) 0으로 재설정될 수 있습니다 . :) 그리고 그는 역사의 끝에서 한 바 이상 떨어진 곳에서 입력 데이터를 변경할 가능성에 대해 조금이라도 의심을 품고 이것을 원합니다. 예를 들어 브로커 시세 조정 시, 중단 후 연결 복구 시, 이전(입력) 표시기 재초기화 시 발생할 수 있습니다. 등.

4. 명확하지 않습니까? 여기서 표시기는 0에서 한계-1까지의 간격으로 계산 됩니다.

이 경우 이러한 값을 올바르게 계산할 수 없습니다(계산할 내역이 충분하지 않음). 따라서 어리석게도 0 값이 할당됩니다.

// 적절한 입력을 제공하고 싶지만 큰 차이는 없습니다.