기고글 토론 "MQL5 표준 라이브러리 확장 및 코드 재사용"

 

새로운 기고글 MQL5 표준 라이브러리 확장 및 코드 재사용 가 게재되었습니다:

MQL5 표준 라이브러리는 개발자로서의 삶을 더 쉽게 만들어줍니다. 그럼에도 불구하고 전 세계 모든 개발자의 요구 사항을 모두 구현하지는 않으므로 사용자 지정 항목이 더 필요하다고 느끼면 한 단계 더 나아가 확장할 수 있습니다. 이 글은 MetaQuotes의 Zig-Zag 기술 지표를 표준 라이브러리에 통합하는 방법을 안내합니다. 우리는 MetaQuotes의 디자인 철학에서 영감을 얻어 목표를 달성합니다.

간단히 말해서 MQL5 API는 코드 재사용, 안정성, 유연성 및 손쉬운 유지 관리의 이점을 누릴 수 있도록 고안되었습니다. 이것이 이론이 말하는 바이지만, 이 모든 것을 넘어서 MQL5를 계속 발전시키고 다중 통화 Experts Advisors와 같은 보다 정교한 것들을 개발할 계획이라면 먼저 표준 라이브러리 방식으로 코딩할 수 있어야 합니다. 그래야 당신의 앱이 성공적인 삶을 보장할테니까요.

EA와 지표가 점점 더 복잡해짐에 따라 프레임워크 개발과 관련된 개념을 마스터하는 것이 더 필요합니다. 실생활의 예로, 내 프로젝트의 기반을 처음부터 강화해야 할 필요성을 지시하는 복잡한 다중 통화 EA를 개발하는 것이 개인적 필요입니다.


그림 2. MetaTrader 5 터미널에서 MetaQuotes의 ZigZag 다운로드를 시작합니다.

작성자: Jordi Bassaganas

[삭제]  

감사합니다. 매우 유익한 정보입니다.

 

이 문서에서 이 코드가 의미하는 바를 이해하려고 노력합니다. 왜 CINDICATOBUFFER 근처에 *가 있는지 그리고 에서 사용하세요.

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

자세한 설명을 부탁드립니다.

고마워요

 
rodlivar:<br/ translate="no">.

이 문서에서 이 코드가 의미하는 바를 이해하려고 노력합니다. 왜 CINDICATOBUFFER 근처에 *가 있고 at를 사용하는지.

((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
((CIndicatorBuffer*)At(1)).Name("HIGH");
((CIndicatorBuffer*)At(2)).Name("LOW");

자세한 설명을 부탁드립니다.

고마워요

* 는 포인터를 나타냅니다. 이 문서에서 자세한 설명 MQL5에서 객체 포인터 사용하기
 

문자열

m_handle=iCustom(기호,마침표,지그재그,깊이,편차_생성,백스텝);

인디케이터의 경로를 찾을 수 없습니다.

여기서 경로를 지정하는 올바른 방법은 무엇인가요, 제가 호출하려는 인디케이터는 표준 폴더에 있습니다.

 
Tango_X:

문자열

m_handle=iCustom(기호,마침표,지그재그,깊이,편차_생성,백스텝);

인디케이터의 경로를 찾을 수 없습니다.

여기서 지정하는 올바른 방법은 무엇인가요, 제가 호출하려는 인디케이터는 표준 폴더에 있습니다.

표준 지그재그는 폴더에 있습니다 예제 - 경로에 폴더 이름을 추가해야 합니다.


 
Rashid Umarov:

표준 지그재그는 예제 폴더에 있습니다 - 경로에 폴더 이름을 추가해야 합니다.



2017.07.12 10:38:05.703 Proba2(EURUSD.m,M1) 사용자 지정 인디케이터 '예시\ZigZag' [4302]를 로드할 수 없습니다.

무슨 문제인가요? 모든 것이 사진과 같습니다.
 
Tango_X:

2017.07.12 10:38:05.703 Proba2 (EURUSD.m,M1) 사용자 지정 인디케이터 '예시\지그재그'[4302]를 로드할 수 없습니다.

무슨 문제인가요? 모든 것이 사진과 같습니다.

누가 오류 코드를 볼까요?

ERR_MARKET_NOT_SELECTED

4302

마켓워치에서 기호가 선택되지 않았습니다.

 
Rashid Umarov:

오류 코드는 누가 확인하나요?

ERR_MARKET_NOT_SELECTED

4302

마켓워치에서 기호가 선택되지 않았습니다.


NULL 입력 - 작동, "EURUSD" 입력 - 작동하지 않음!!!!

bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- 기록 확인
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- create
   //m_handle=iCustom(기호,마침표,"예제\\\지그재그",깊이,편차_생성,백스텝);
     //m_handle=iCustom("EURUSD",period,"Examples\\\ZigZag",depth,deviation_create,backstep); - 작동하지 않습니다.
     m_handle=iCustom(NULL,period,"Examples\\ZigZag",depth,deviation_create,backstep);       - работает
//--- 결과 확인
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- 표시기가 성공적으로 생성되었습니다.
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- 초기화 오류
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- ok
   return(true);
  }
 
찾았습니다! 문제가 해결되었습니다! 접두사가 붙은 심볼 이름이 있습니다) - "EURUSD.m".
 
//+------------------------------------------------------------------+
//|| "지그재그" 표시기 만들기|
//+------------------------------------------------------------------+
bool CiZigZag::Create(const string symbol,const ENUM_TIMEFRAMES period,
                      const int depth,const int deviation_create,const int backstep)
  {
//--- 기록 확인
   if(!SetSymbolPeriod(symbol,period))
      return(false);
//--- create
   m_handle=iCustom(symbol,period,"zigzag",depth,deviation_create,backstep);
//--- 결과 확인
   if(m_handle==INVALID_HANDLE)
      return(false);
//--- 표시기가 성공적으로 생성되었습니다.
   if(!Initialize(symbol,period,depth,deviation_create,backstep))
     {
      //--- 초기화 오류
      IndicatorRelease(m_handle);
      m_handle=INVALID_HANDLE;
      return(false);
     }
//--- 확인
   return(true);
  }
bool CiZigZag::Initialize(const string symbol,const ENUM_TIMEFRAMES period,
                        const int depth,const int deviation_init,const int backstep)
  {
   if(CreateBuffers(symbol,period,3))
     {
      //--- 렌더링 상태 표시줄
      m_name  ="ZigZag";
      m_status="("+symbol+","+PeriodDescription()+","+
               IntegerToString(depth)+","+IntegerToString(deviation_init)+","+
               IntegerToString(backstep)+") H="+IntegerToString(m_handle);
      //--- 설정 저장
      m_depth=depth;
      m_deviation=deviation_init;
      m_backstep=backstep;       
      //--- 버퍼 생성
      ((CIndicatorBuffer*)At(0)).Name("ZIGZAG");
      ((CIndicatorBuffer*)At(1)).Name("HIGH");
      ((CIndicatorBuffer*)At(2)).Name("LOW");
      //--- 확인
      return(true);
     }
//--- 오류
   return(false);
  }


인디케이터 버퍼 배열의 인덱싱 방향이 여기에서 어떻게 설정되는지, 즉 ArraySetAsSeries와 동일하게 설정되는지 이해하도록 도와주세요. 기본 방향은 현재에서 과거로이지만 과거에서 현재로 만들어야합니다. 어제부터이 질문으로 어려움을 겪고 있습니다! 도와주세요!