mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 18

 
데니스 키리첸코 :
정적 입니까?

문맥에서 벗어났기 때문에 원본 게시물 을 참조하세요.
 

OnInit() 함수의 문서화된 기능이 아니라 이 함수는 프로그램의 모든 부분에서 실행할 수 있습니다. 테스트 코드.

 //+------------------------------------------------------------------+
//|                                                       test10.mq5 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com/ru/users/sergey1294"
#property version    "1.00"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNevBar
  {
private :
   datetime           curbar;
   datetime           lastbar;
public :
                     CNevBar();
                    ~CNevBar();
   bool               bar( string symbol, ENUM_TIMEFRAMES period);
  };
//+------------------------------------------------------------------+
void CNevBar::CNevBar()
  {

  }
//+------------------------------------------------------------------+
void CNevBar::~CNevBar( void )
  {

  }
//+------------------------------------------------------------------+
bool CNevBar:: bar( string symbol, ENUM_TIMEFRAMES period)
  {
   curbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar== 0 )lastbar=( datetime ) SeriesInfoInteger (symbol,period, SERIES_LASTBAR_DATE );
   if (lastbar!=curbar)
     {
      lastbar=curbar;
       return ( true );
     }
   return ( false );
  }

int test= 0 ;
CNevBar newbar;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---

   test= 5 ;
   Print ( __FUNCTION__ , ": test = " ,test);
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   if (newbar.bar( _Symbol , PERIOD_CURRENT ))
     {
      test= 10 ;
       Print ( __FUNCTION__ , ": test = " ,test);
       OnInit ();
     }
  }
//+------------------------------------------------------------------+

결과

 2017.03 . 10 19 : 26 : 02.977 test10 (EURUSD,M1)       OnInit : test = 5
2017.03 . 10 19 : 27 : 03.041 test10 (EURUSD,M1)       OnTick : test = 10
2017.03 . 10 19 : 27 : 03.042 test10 (EURUSD,M1)       OnInit : test = 5
2017.03 . 10 19 : 28 : 03.245 test10 (EURUSD,M1)       OnTick : test = 10
2017.03 . 10 19 : 28 : 03.245 test10 (EURUSD,M1)       OnInit : test = 5
2017.03 . 10 19 : 29 : 02.995 test10 (EURUSD,M1)       OnTick : test = 10
2017.03 . 10 19 : 29 : 02.995 test10 (EURUSD,M1)       OnInit : test = 5


...

 
세르게이 그리제이 :

OnInit() 함수의 문서화된 기능이 아니라 이 함수는 프로그램의 모든 부분에서 실행할 수 있습니다. 테스트 코드.


모든 On-function은 일반 함수이므로 언제든지 호출할 수 있습니다. OnCalculate 또는 OnTradeTransaction.
 
fxsaber :

모든 On-function은 일반 함수이므로 언제든지 호출할 수 있습니다. OnCalculate 또는 OnTradeTransaction.


그러나 문서에 기록되어 있지 않습니다.

초기화

OnInit() 함수는 Init 이벤트에 대한 처리기입니다. void 또는 int 유형일 수 있으며 매개변수가 없습니다.

무효의   초기화 ();

Init 이벤트는 Expert Advisor 또는 표시기를 로드한 직후에 생성되며 이 이벤트는 스크립트에 대해 생성되지 않습니다. OnInit() 함수는 초기화에 사용됩니다. OnInit()에 int 반환 값이 있는 경우 0이 아닌 반환 코드는 초기화 실패를 나타내고 REASON_INITFAILED의 초기화 해제 이유 코드 함께 Deinit 이벤트를 생성합니다 .

Expert Advisor의 입력 매개변수를 최적화하려면 ENUM_INIT_RETCODE 열거형의 값을 반환 코드로 사용하는 것이 좋습니다. 이러한 값은 가장 적합한 테스트 에이전트 의 선택을 포함하여 최적화 프로세스의 관리를 구성하기 위한 것입니다. Expert Advisor 초기화 직후, 테스트 자체가 시작되기 전에도 TerminalInfoInteger() 함수를 사용하여 에이전트의 구성 및 리소스(코어 수, 여유 메모리 등)에 대한 정보를 요청할 수 있습니다. 그리고 받은 정보를 바탕으로 이 테스트 에이전트의 사용을 허용하거나 이 Expert Advisor를 최적화할 때 거부합니다.

ENUM_INIT_RETCODE

식별자

설명

INIT_SUCCEDED

초기화에 성공했습니다. Expert Advisor 테스트를 계속할 수 있습니다.

이 코드는 0 값과 동일함을 의미합니다. 테스터에서 Expert Advisor의 초기화가 성공했습니다.

INIT_FAILED

초기화에 실패했습니다. 치명적인 오류로 인해 테스트를 계속할 수 없습니다. 예를 들어 Expert Advisor가 작동하는 데 필요한 지표를 생성할 수 없었습니다.

이 값을 반환하는 것은 0이 아닌 값을 반환하는 것과 같습니다. 테스터에서 Expert Advisor 초기화가 실패했습니다.

INIT_PARAMETERS_INCORRECT

이는 프로그래머가 잘못된 입력 매개변수 세트를 나타내기 위한 것이며, 일반 최적화 테이블에서 이러한 리턴 코드가 있는 결과 라인은 빨간색으로 강조 표시됩니다.

이 전문가 매개변수 집합에 대한 테스트는 수행되지 않으며 에이전트는 새 작업을 자유롭게 받을 수 있습니다.

이 값을 받으면 전략 테스터는 재실행을 위해 이 작업을 다른 에이전트에게 전송하지 않도록 보장합니다.

INIT_AGENT_NOT_SUITABLE

초기화하는 동안 프로그램에 오류가 없었지만 어떤 이유로 이 에이전트는 테스트에 적합하지 않습니다. 예를 들어 RAM이 충분하지 않고 OpenCL에 대한 지원 이 없습니다.

이 코드가 반환된 후 에이전트는 이 최적화 가 끝날 때까지 더 이상 작업을 수신하지 않습니다.

void 유형의 OnInit() 함수는 항상 성공적인 초기화를 의미합니다.

Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
주말에 OnInit에 코드를 작성할 때 OnTick을 삽입합니다. 그리고 새로운 진드기가 없더라도 모든 것이 잘됩니다.
 
세르게이 그리제이 :


그러나 문서에 기록되어 있지 않습니다.

초기화

OnInit() 함수 Init 이벤트에 대한 처리기입니다. void 또는 int 유형일 수 있으며 매개변수가 없습니다.

무효의   초기화 ();

Init 이벤트는 Expert Advisor 또는 표시기를 로드한 직후에 생성됩니다.

기능이라고 합니다.

OnInit 이전과 OnDeinit 이후에는 여전히 전역 개체의 생성자/소멸자에 대한 호출이 있습니다(도움말의 부정확함). 따라서 예를 들어 OnInit 없이 표시기에서 표시기 버퍼를 선언할 수 있습니다. 기초는 그런 것입니다.

 
FullOnCalculate에 대한 검색 은 MT4/MT5의 표시기 버퍼 작업에 대한 완전히 문서화되지 않은 많은 기능으로 즉시 연결되지 않습니다. 위치가 심각하게 다릅니다.
 
문제를 해결하기 위한 최종 비전은 다음과 같습니다.
 iCustom (... inputs, PRICE_CLOSE ,
         color &colors[], int &widths[], int &styles[] );

iAlligator (... params, PRICE_CLOSE ,
         color &colors[], int &widths[], int &styles[] );
표시기에 다음 매개변수가 있다고 가정해 보겠습니다.
 #property indicator_plots 5
#property indicator_color1 clrAquamarine , clrBeige , clrBurlyWood
#property indicator_color2 clrRed , clrGreen

#property indicator_color5 clrGold , clrCrimson , clrCadetBlue
그러면 색상 배열은 다음과 같습니다.
 color colors[] = {
   clrAquamarine , clrBeige , clrBurlyWood ,   // 1 plot
   clrRed , clrGreen ,                       // 2 plot
   clrBlack ,                               // 3 plot
   clrWhite ,                               // 4 plot
   clrGold , clrCrimson , clrCadetBlue ,       // 5 plot
   clrBurlyWood , clrBlue                    // ignore
};

배열이 더 작으면 색상의 일부만 전송됩니다. 배열이 더 크면 잘립니다.

너비와 스타일 배열의 경우 원칙은 동일합니다.‌

 
fxsaber :

오버로드된(위 참조) HistoryDealSelect가 OrderSendSync에서 호출됩니다.

마지막 위치 를 여는 시간, 마지막 위치를 닫는 시간을 어떻게 결정할 수 있습니까?

그리고 일반적으로 mql5‌의 오픈/클로즈드 포지션 정보를 얻기 위한 일반 원칙과 알고리즘을 알고 싶습니다.

고려해야 할 사항, 현재 존재하는 기능은 무엇입니까?

 
Artyom Trishkin :

마지막 위치 를 여는 시간, 마지막 위치를 닫는 시간을 어떻게 결정할 수 있습니까?

그리고 일반적으로 mql5‌의 오픈/클로즈드 포지션 정보를 얻기 위한 일반 원칙과 알고리즘을 알고 싶습니다.

고려해야 할 사항, 현재 존재하는 기능은 무엇입니까?


이 모든 것은 주문 및 거래 내역의 선택과 주문 속성의 후속 읽기에 의해 결정됩니다.

 bool    HistorySelectByPosition ( 
   long    position_id     // идентификатор позиции - POSITION_IDENTIFIER 
   );

POSITION_IDENTIFIER

Position ID는 새로 개설된 각 Position에 할당되는 고유 번호로 평생 동안 변경되지 않습니다. 위치를 연 주문 티켓에 해당합니다.

 

포지션 ID는 각 주문(ORDER_POSITION_ID)과 거래(DEAL_POSITION_ID)를 개설, 변경 또는 마감한 순서로 표시됩니다. 이 속성을 사용하여 위치와 연결된 주문 및 거래를 검색합니다.

 

네팅 모드에서 포지션이 반전되면(단일 인/아웃 거래에 의해) 포지션 ID POSITION_IDENTIFIER는 변경되지 않습니다. 그러나 동시에 POSITION_TICKET은 취소로 이어진 주문의 티켓으로 변경됩니다. 헤지 모드에서는 포지션 반전이 제공되지 않습니다.


‌그리고 열거형의 속성 사용하기 ENUM_DEAL_ENTRY

DEAL_ENTRY_IN

시장 진입

DEAL_ENTRY_OUT

시장 출구

DEAL_ENTRY_INOUT

반전

DEAL_ENTRY_OUT_BY

반대 위치로 닫기