MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 848

 
Artyom Trishkin :

계산은 무엇입니까?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

나는 모든 것을 이해했고 질문이 제거되었으며 OnTick() 영역에서변수를 선언하는 것이 나쁘고 루프 내에서 계산을 수행할 수도 있다는 것을 알게 되었습니다.

완료, 모든 것이 감사하게 작동합니다. 가격을 얻는 것이 남아 있습니다. 매우 감사합니다.

 void OnTick ()
  {
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index);
                   break ;
               }
            }
      
Comment ( "-------------------------" , 
         "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
         "\n ---------------------- " ,
         "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky :

나는 모든 것을 이해했고 질문이 제거되었으며 OnTick() 영역에서 변수를 선언하는 것이 나쁘고 루프 내에서 계산을 수행할 수도 있다는 것을 알게 되었습니다.

완료, 모든 것이 감사하게 작동합니다. 가격을 얻는 것이 남아 있습니다. 매우 감사합니다.

이것은 주기 내에서 계산하는 것이 아니라 이 주기가 생성된 데 필요한 데이터를 얻는 것입니다.

그러나 루프 내부의 계산은 피해야 합니다.

일반적으로 접근 방식을 즉시 재고해야 합니다. 루프에서 데이터를 얻습니다. 첫 번째 카운터 데이터 다음에 루프를 끊습니다. 이 모든 것이 함수 개념에 완전히 포함되어 요청된 결과를 반환합니다.

전체 루프를 함수로 만들고 발견하면 막대 번호를 반환하고 찾지 못하면 WRONG_VALUE를 반환합니다.

다음: n=Func() ;

그런 다음 WRONG_VALUE와 같지 않은 경우 n 을 의도한 대로 사용합니다. 함수에 "말하기" 이름을 지정합니다. 그리고 OnTick()의 코드는 더 짧아지고 논리는 더 명확해집니다. 추가로 로드되는 것은 없습니다.

 
Artyom Trishkin :

전체 루프를 함수로 만들고 발견하면 막대 번호를 반환하고 찾지 못하면 WRONG_VALUE를 반환합니다.

다음: n=Func() ;

그런 다음 WRONG_VALUE와 같지 않은 경우 n 을 의도한 대로 사용합니다. 함수에 "말하기" 이름을 지정합니다. 그리고 OnTick()의 코드는 더 짧아지고 논리는 더 명확해집니다. 추가로 로드되는 것은 없습니다.

살고 배우십시오. 매우 흥미롭습니다. 나는 저녁에 싸울 것이고, 분명히 그것을 달성할 것입니다. 그 동안 제보와 큰 감사의 마음으로 가격도 받고 ..... 하루도 성공적 :-))

 void OnTick ()
  {
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index);
                   break ;
               }
            }
      
Comment ( "-------------------------" , 
         "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
         "\n ---------------------- " ,
         "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index
         ); 
  }
 

이 질문에 도움을 줄 수 있는 녀석들 https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - 댓글이 너무 멀리 갔습니까? 감소를 시작해야 하는 경우 증가를 시작해야 하는 경우 어떤 방향으로든 작동할 수 있는 주기를 생성하는 방법과 같은 질문도 있습니다. 다음은 어떻게 될 것인지에 대한 예시 다이어그램입니다.

(무언가가 발생한 경우) {값이 변수에 할당}되면 루프가 호출되고 루프의 값에 따라 계산이 달라지는 본문이 포함됩니다.

for(증가 또는 감소 위의 변수에 따라 다름)

{ 신체 }

조건을 복제할 수 있는 방법은 없으며 루프에서 한 번 지정해야 합니다. 그렇게 할 수 있습니까?

 

그리고 다시 좋은 저녁. 아직 함수로 함수를 발행하지 않았는데 새로운 질문이 생겼습니다. 첨부된 사진은 새로운 시그널(Arrow)이 등장한 것으로, 댓글에서 어드바이저가 이를 인지하지 못하고 여전히 11초 전의 시그널을 극단적인 Up 화살표로 간주하고 있음을 알 수 있다.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky :

11개의 촛불이 돌아왔습니다.

표시기는 이미 새 신호를 제공했으며(어드바이저와 병행하여 차트에서 시작됨) OnTick을 제외하고 어드바이저에 이벤트가 없으며 어드바이저는 신호를 보지 못합니다.

 
Sergey Voytsekhovsky :

그리고 다시 좋은 저녁. 아직 함수로 함수를 발행하지 않았는데 새로운 질문이 생겼습니다. 첨부된 사진은 새로운 시그널(Arrow)이 등장한 것으로, 댓글에서 어드바이저가 이를 인지하지 못하고 여전히 11초 전의 시그널을 극단적인 Up 화살표로 간주하고 있음을 알 수 있다.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

비어 있지 않은 버퍼 값을 찾을 때 로그의 bar n에 해당하는 시간을 인쇄합니다. 그가 발견한 바가 무엇인지 알 수 있을 것입니다. 버퍼를 거꾸로 읽고 있는 것일 수 있습니다.

 

감정가, 고문이 극단적 인 화살표를 보지 못하는 이유를 알려주십시오. 데이터 창으로 판단하여 이미 표시기 버퍼에 있고 고문이 OnTik을 폴링하고 있습니다. 그 밖에 무엇이 필요합니까 ??? 위의 전체 코드.


 
Artyom Trishkin :

비어 있지 않은 버퍼 값을 찾을 때 로그의 bar n에 해당하는 시간을 인쇄합니다. 그가 발견한 바가 무엇인지 알 수 있을 것입니다. 버퍼를 거꾸로 읽고 있는 것일 수 있습니다.

알겠습니다. 시간이 정확한 시간을 보여줍니다. 화살표가 놓여 있는 양초가 열리는 시간입니다. 코드를 첨부하고 사진을 첨부합니다.

 void OnTick ()
  {
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Buy_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Buy_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Buy_index  = n;
                   Print ( "Last_Arrow_Buy_volume = " ,Last_Arrow_Buy_volume, ", Last_Arrow_Buy_index = " ,Last_Arrow_Buy_index, ", Last_Arrow_Buy_time = " ,Last_Arrow_Buy_time);
                   break ;
               }   
            }
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for ( int n= 0 ; n<( int )period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE )
               {
                  Last_Arrow_Sell_volume = iOpen ( _Symbol , _Period ,n);
                  Last_Arrow_Sell_time   = iTime ( _Symbol , 0 ,n);
                  Last_Arrow_Sell_index  = n;
                   Print ( "Last_Arrow_Sell_volume = " ,Last_Arrow_Sell_volume, ", Last_Arrow_Sell_index = " ,Last_Arrow_Sell_index, ", Last_Arrow_Buy_time = " ,Last_Arrow_Buy_time);
                   break ;
               }
            }
      
Comment ( "-------------------------" , 
         "\n Last_Arrow_Buy_volume     = " ,Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = " ,Last_Arrow_Buy_index,
         "\n ---------------------- " ,
         "\n Last_Arrow_Sell_volume     = " ,Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = " ,Last_Arrow_Sell_index
         ); 
  }


 

로그가 그림에 표시되지 않으면 여기에 몇 가지 극단적인 항목이 있습니다.


2019.05.20 21:42:52.601 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00