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

 
erotin :

로트의 정상화에서 무엇이 잘못되었는지 말해주십시오.

모두 잘못 됐어. "Expert Advisor가 통과해야 하는 검사는..." 기사를 읽으십시오. 기성품 기능이 있습니다.

 

완료, 빈 템플릿을 만들고 iCustom() 함수가 작동하는 데 필요한 모든 것을 준비했습니다.

기능에 관심이 있는 iCrossAD 표시기를 등록했습니다.

기능이 작동하고 극단의 위쪽 및 아래쪽 화살표의 인덱스를 올바르게 찾지만 이 화살표가 설정된 가격 값이 잘못되었습니다.

코드가 짧아서 바로 여기에 게시하겠습니다. 만일을 대비하여 이 어드바이저와 인디케이터의 파일을 첨부하겠습니다.

 //+------------------------------------------------------------------+
//|                                             TestDoEasyPart08.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link        "https://mql5.com/ru/users/artmedia70"
#property version    "1.00"
#property description ""
#property strict
//--- includes
#include <DoEasy\Engine.mqh>
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
//---
input string                Inp_param_indi_iCrossAD = "Input parameters indicator iCrossAD" ; //----- "Внешние параметры индикатора iCrossAD" -----

input uint                  InpPeriodFind           = 400 ;                 // Bars for calculate
input uint                  InpUnheckedBars         = 2 ;                   // Unchecked bars
input uint                  InpPeriodIND            = 21 ;                   // CCI period

//--- global variables

CEngine        engine;
CTrade         trade;
CPositionInfo  apos;
CSymbolInfo    asymbol;

uint             period_find = InpPeriodFind;       //Number bars for calculate

int             CrossAD;                           //Хэндл индикатора iCrossAD

double          Buf_Arrow_Sell[],                   //Массив буфера для приема значений последних стрелок ВНИЗ из индикатора iCrossAD
               Last_Arrow_Sell_volume,             //Переменная для записи значения цены последней стрелки ВНИЗ индикатора iCrossAD
               Last_Arrow_Sell_index;             //Переменная для записи значения индекса свечи последней стрелки ВНИЗ индикатора iCrossAD
               
double          Buf_Arrow_Buy[], Last_Arrow_Buy_volume, Last_Arrow_Buy_index;
   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   ArraySetAsSeries (Buf_Arrow_Buy, true );
   ArraySetAsSeries (Buf_Arrow_Sell, true );
//---
   CrossAD = iCustom (asymbol.Name(), _Period , "iCrossAD" );
   if (CrossAD == INVALID_HANDLE )
   {
       Print ( "Не удалось создать описатель индикатора iCrossAD!" );
       return ( INIT_FAILED );
   }
       else Print ( "Хендл iCrossAD = " ,CrossAD);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- delete objects
   ObjectsDeleteAll ( 0 , "" ,- 1 );
   Comment ( "" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
   int n= 0 ;
   
   if ( CopyBuffer (CrossAD, 1 , 0 , period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for (n= 0 ; n<period_find; n++)
            {
               if (Buf_Arrow_Buy[n]!= EMPTY_VALUE ) break ;
            }
         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);
         
   if ( CopyBuffer (CrossAD, 2 , 0 , period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print ( "НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d" , GetLastError ());
         return ;
      }
         for (n= 0 ; n<period_find; n++)
            {
               if (Buf_Arrow_Sell[n]!= EMPTY_VALUE ) break ;
            }
         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);
      
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
         ); 
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
   if (! MQLInfoInteger ( MQL_TESTER ))
      engine. OnTimer ();
  }
파일:
iCrossAD.mq5  49 kb
 

"전문가" 탭의 로그 항목은 다음과 같습니다.

2019.05.20 15:11:15.025 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:15.025 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0

2019.05.20 15:11:16.798 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

2019.05.20 15:11:16.798 Test_iCustom(EURUSD,H1) Last_Arrow_Sell_volume = -11203799.85975282, Last_Arrow_Sell_index = 50.0


 
Sergey Voytsekhovsky :

"전문가" 탭의 로그 항목은 다음과 같습니다.

2019.05.20 15:11:15.025 Test_iCustom(EURUSD,H1) Last_Arrow_Buy_volume = -11211905.17483469, Last_Arrow_Buy_index = 5.0

화살표가 생성된 가격 대신 = -11211905.17483469



 

Sergey Voytsekhovsky :

...

화살표가 생성된 가격 대신 = -11211905.17483469

Ctrl+D를 누르고 표시줄 을 따라 마우스를 이동하고 데이터 창에서 버퍼의 값을 확인합니다.

 
Artyom Trishkin :

Ctrl+D를 누르고 표시줄 을 따라 마우스를 이동하고 데이터 창에서 버퍼의 값을 확인합니다.

내가 당신을 올바르게 이해한다면 거기에없는 고양이를 위해 방을 찾고 있었습니까? 그 당시 배열은 가격이 아니라 지표 값으로 채워졌습니까? 감사합니다. 다시 생각하겠습니다.

또 다른 마지막 질문 - 컴파일러는 2개의 경고를 제공합니다.


부호 불일치 Test_iCustom.mq5 79 20

부호 불일치 Test_iCustom.mq5 92 20


나는 그들의 이유를 이해할 수 없습니다. "일치하지 않는 표시"는 무엇을 의미합니까(Yandex의 번역가).


 
Sergey Voytsekhovsky :

내가 당신을 올바르게 이해했다면 거기에없는 고양이를 위해 방을 찾고 있었습니까? 그 당시 배열은 가격이 아니라 지표 값으로 채워졌습니까? 감사합니다. 다시 생각하겠습니다.

또 다른 마지막 질문 - 컴파일러는 2개의 경고를 제공합니다.


부호 불일치 Test_iCustom.mq5 79 20

부호 불일치 Test_iCustom.mq5 92 20


나는 그들의 이유를 이해할 수 없습니다. "일치하지 않는 표시"는 무엇을 의미합니까(Yandex의 번역가).


번호 기호가 누락되었을 수 있습니다. 다음 코드 줄을 표시합니다.

 
Artyom Trishkin :

번호 기호가 누락되었을 수 있습니다. 다음 코드 줄을 표시합니다.

 for (n= 0 ; n<period_find; n++)
두 번째 것은 정확히 동일합니다(Strelok 배열에서 0이 아닌 값을 찾기 위한 루프).
 
Sergey Voytsekhovsky :
두 번째 것은 정확히 동일합니다(Strelok 배열에서 0이 아닌 값을 찾기 위한 루프).

변수 nperiod_find 의 유형은 무엇입니까? 가장 중요한 것은 표시되지 않았습니다 ...

그래서 시도:

 for (n= 0 ; n<( int )period_find; n++)

일반적으로 - OnTick() 핸들러 수준에서 루프 변수를 선언하는 이유는 무엇입니까?

다음과 같이 가능합니까?

 for ( int n= 0 ; n<( int )period_find; n++)

그리고 OnTick()에서 선언 n을 제거하십시오. 거기에는 필요하지 않습니다.

 
Artyom Trishkin :

변수 n 및 period_find의 유형은 무엇입니까? 가장 중요한 것은 표시되지 않았습니다 ...

 uint             period_find = InpPeriodFind;       //Number bars for calculate
int              n= 0 ;