기고글 토론 "MQL5 마법사: 신호 거래 모듈을 만드는 방법" - 페이지 7

 
t101:
OnInit()에서 수동으로 추가해야 하나요? 마법사를 통해 원하는 작업을 할 수 없나요?
어떤 문제가 있나요? 추가 기능을 도입하고 있으므로 약간의 수동 작업을 수행해야 합니다.
 
Karputov Vladimir:
무슨 문제인가요? 추가 기능을 도입하고 있으므로 약간의 수작업이 필요합니다.

전혀 문제는 없지만 마스터가 신호, 자본 등에 대한 사용자 지정 모듈을 기반으로 모든 것을 수행한다는 개념과 일치하지 않습니다. 그리고 그 기사는 구식이며 사실이 아닙니다:

CheckCloseLong() 메서드는 종료 레벨을 결정하여 매수 포지션을 청산하는 신호를 생성합니다. 이 메서드는 전문가 어드바이저가 롱 포지션 청산의 필요성을 판단하기 위해 호출합니다. 매수 포지션을 청산하기 위한 신호 생성이 의도된 경우 이 메서드를 재정의해야 합니다.

virtual bool CheckCloseLong(double& price);
어쨌든 도움을 주셔서 감사합니다.
[삭제]  
거의 6년이 지났는데 기사가 오래되지 않았나요? 거의 매주 터미널이 업데이트되는 것을 볼 때 잘 모르겠습니다.
 
yerlan Imangeldinov:
거의 6년이 지났는데 기사가 구식이 아닌가요? 거의 매주 터미널이 업데이트되는 것을 볼 때 잘 모르겠습니다.
트레이딩 신호 모듈 작성에 대한 최신 기사가 있습니다:"6시간 안에 트레이딩 로봇 만들기!".
 

안녕하세요,

여기에 제안 된 접근 방식과 표준 라이브러리의 거래 전략 클래스 탐색-하베스터 별전략 사용자 정의에서 제안한 접근 방식을 사용하여 관찰 된 거래 범위에서 "브레이크 아웃"및 "브레이크 인"두 패턴을 사용하여 CExpertSignal의 자손을 만드는 방법이 궁금합니다 . 제 생각에는 모든 신호 클래스는 오버로딩을 통해 구현할 수 있고 구현해야 한다는 것입니다.

//+------------------------------------------------------------------+
//| 가격이 상승할 것이라고 '투표'합니다.|
//| INPUT: no.|
//| OUTPUT: 가격이 상승할 '투표' 수. |
//| REMARK: no.|
//+------------------------------------------------------------------+
int CSignalBreakOutOrIn::LongCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   //--- 일종의 기본 패턴을 원할 경우를 대비하여
   if(IS_PATTERN_USAGE(0)) result=m_pattern_0;                                   // "확인" 신호 번호 0
   //--- 모델 1을 사용하는 경우, 패턴 1의 조건을 확인합니다.
   if(IS_PATTERN_USAGE(1) && ConditionForPattern1(idx)) result=m_pattern_1;      // 신호 번호 1
   //--- 모델 2를 사용하는 경우, 패턴 2의 조건을 확인합니다.
   if(IS_PATTERN_USAGE(2) && ConditionForPattern2(idx)) result=m_pattern_2;      // 신호 번호 2
//--- 결과를 반환합니다.
   return(result);
  }

//+------------------------------------------------------------------+
//| 가격이 하락할 것이라고 '투표'합니다.|
//| INPUT: no.|
//| OUTPUT: 가격이 하락할 "투표" 수. |
//| REMARK: no.|
//+------------------------------------------------------------------+
int CSignalBreakOutOrIn::ShortCondition()
  {
   int result=0;
   int idx   =StartIndex();
//---
   //--- 일종의 기본 패턴을 원할 경우를 대비하여
   if(IS_PATTERN_USAGE(0)) result=m_pattern_0;                                   // "확인" 신호 번호 0
   //--- 모델 1을 사용하는 경우, 패턴 1의 조건을 확인합니다.
   if(IS_PATTERN_USAGE(1) && ConditionForPattern1(idx)) result=m_pattern_1;      // 신호 번호 1
   //--- 모델 2를 사용하는 경우, 패턴 2의 조건을 확인합니다.
   if(IS_PATTERN_USAGE(2) && ConditionForPattern2(idx)) result=m_pattern_2;      // 신호 번호 2
//--- 결과를 반환합니다.
   return(result);
  }

그런 다음

int CExpertSignal::Direction()
  {
   ...
   int result=LongCondition()-ShortCondition();
   ...
  }

에서signal.m_threshold_opensignal.m_threshold_close에대해 테스트한 결과를 찾습니다.

  1. bool CExpertSignal::CheckOpenLong(...),
  2. bool CExpertSignal::CheckOpenShort(...),
  3. bool CExpertSignal::CheckCloseLong(...),
  4. bool CExpertSignal::CheckCloseShort(...),
  5. bool CExpertSignal::CheckReverseLong(...), 및
  6. bool CExpertSignal::CheckReverseShort(...).

시장 진입 및 손절 및 테이크프로핏 가격 설정을 위한 레벨을 지정하는 파라미터는 다음과 같이 반환됩니다.

//+------------------------------------------------------------------+
//| 구매 레벨 감지하기|
//+------------------------------------------------------------------+
bool CExpertSignal::OpenLongParams(double &price,double &sl,double &tp,datetime &expiration)
  {
  }
//+------------------------------------------------------------------+
//| 판매할 레벨 감지하기|
//+------------------------------------------------------------------+
bool CExpertSignal::OpenShortParams(double &price,double &sl,double &tp,datetime &expiration)
  {
  }

베이스 클래스에 정의된 대로bool CExpertSignal::CheckOpenLong(...)bool CExpertSignal::CheckOpenShort(...)의 표준 구현에 의해 호출됩니다 . 따라서 오버로드하는 것으로 충분해야 합니다 .

  1. int CExpertSignal::LongCondition(...),
  2. int CExpertSignal::ShortCondition(...),
  3. bool CExpertSignal::OpenLongParams(...),
  4. bool CExpertSignal::OpenShortParams(...),
  5. bool CExpertSignal::CloseLongParams(...), 및
  6. bool CExpertSignal::CloseShortParams(...)

를 사용하여 임의의 새 신호를 정의할 수 있습니다. CExpertTrade에는 원하는 진입 가격이 시장가 주문을 위한 현재 가격에서 너무 멀리 떨어져 있는지 감지하는 코드가 포함되어 있으며, 진입 가격 선택을 사용하여 자동으로 스톱 또는 지정가 주문을 할 것인지 여부를 결정합니다.

그러나 거래 범위가 마지막 n개의 막대에서 가장 높은 고가(HH)와 가장 낮은 저가(LL) 사이의 영역으로 정의된 경우 LL < 가격 < HH 조건은 항상 참입니다. 따라서 int CExpertSignal::LongCondition(...) int CExpertSignal::ShortCondition(...)모두 항상 0 "브레이크 아웃" 패턴을 감지해야 하며, 이 패턴에 어떤 값을 연결하든 int CExpertSignal::Direction() 함수는 항상 0을 반환합니다!

오버로딩의 자연스러운 접근 방식

  1. bool CExpertSignal::CheckOpenLong(...)
  2. bool CExpertSignal::CheckOpenShort(...)

를 호출하여 전자가

  1. LongCondition()>m_threshold_open을 확인하고 후자는
  2. ShortCondition()>m_threshold_open

대신

  1. m_direction>=m_threshold_open
  2. -m_direction>=m_threshold_open

은 아직 성공적인 버전으로 전환할 수 없습니다. 지적한 대로 bool CExpertSignal::OpenLongParams(...)가 진입가 HH를 반환하고 bool CExpertSignal::OpenShortParams(...)가진입가 LL을 반환하여 2개의 스톱 주문을 지속적으로 생성하는 신호를 완료하는것이 간단할 수 있습니다 .

제 생각에는 표준 라이브러리에서 이 표준 브레이크 아웃 전략을 구현하는 방법을 보여주는 예제가 있고, LL과 HH에서 지정가 주문을 생성하는 대체 패턴 "브레이크 인"을 제공하여 충분히 유연하게 만드는 것이 바람직합니다. 분명히 이러한 신호는 다음과 같은 전략을 결합할 것입니다.

  1. 고가 매수 후 고가 매도 또는 저가 매도 후 저가 매수 및 대체 패턴
  2. 저점 매수 후 고점 매도 또는 고점 매도 후 저점 매수.

패턴으로 제공함으로써. 이 접근법을 완성하는 데 도움을 주시면 대단히 감사하겠습니다.

 
AnonymousTrades:

안녕하세요,

여기에 제안 된 접근 방식과 표준 라이브러리의 거래 전략 클래스 탐색 - 수확기로 전략 사용자 정의에서 제안한 접근 방식을 사용하여 관찰 된 거래 범위에서 "브레이크 아웃"및 "브레이크 인"두 패턴을 사용하여 CExpertSignal의 자손을 만드는 방법이 궁금합니다 . 제 생각에는 모든 신호 클래스는다음 두 함수를 오버로드하여 구현할 수 있습니다(그래야 합니다).

int CSignalBreakOutOrIn::LongCondition()  { if(IS_PATTERN_USAGE(X) && LongConditionForPatternX(idx)) return(m_pattern_X); }
int CSignalBreakOutOrIn::ShortCondition() { if(IS_PATTERN_USAGE(X) && ShortConditionForPatternX(idx)) return(m_pattern_X); }

CExpertTrade에는 원하는 진입 가격이 시장가 주문을 하기 위한 현재 가격에서 너무 멀리 떨어져 있는지 감지하는 코드가 포함되어 있으며, 진입 가격 선택을 사용하여 자동으로 스톱 또는 지정가 주문을 할 것인지 여부를 결정합니다.

[...]

제 생각에는 표준 라이브러리 측면에서이 표준 브레이크 아웃 전략을 구현하는 방법을 보여주는 예제가 있고 LL 및 HH에서 제한 주문을 초래하는 대체 패턴 "브레이크 인"을 제공하여 충분히 유연하게 만드는 것이 바람직합니다. 이 접근 방식을 완성하는 데 도움을 주시면 대단히 감사하겠습니다.


가능한 한 쉽게 이해하기 위해 제 우려를 다시 표현하기로 결정했습니다. 제 눈에는 두 개의 문서가 보입니다.

  1. MQL5 마법사: 매매신호 모듈을 만드는 방법 (이 글) 및
  2. 표준 라이브러리의 트레이딩 전략 클래스 살펴보기 - 하베스터 트레이딩으로전략 커스터마이징하기

는 가장 간단한 방법으로 자체 신호 클래스를 작성하는 방법을 전반적으로 설명합니다. 아래에서 이러한 제 인식을 요약해 보겠습니다.

하지만 이 접근법을 사용하여 지난 n 기간 동안 관찰된 최고/최저가보다 가격이 높거나 낮을 때 매수/매도를 제안하는 신호 구현을 완료하려면 여전히 아이디어가 필요합니다. 이렇게 하면 현재 가격 위와 아래에 한 쌍의 스톱 주문을 넣을 수 있습니다. 저는 이미 다음 조건을 대체하여 이를 달성하려고 시도했습니다.

  • 방향()>=m_임계값_개방으로
  • LongCondition()>=m_threshold_open으로 대체해 보았습니다,

로 바꾸어 보았지만 여전히 작동하지 않는 것 같습니다. OpenLongParams(...)OpenShortParams(...) 함수도 오버로드했기 때문에 이것은 이해가 되지 않습니다. 이 함수는 원하는 스톱 주문을 할 레벨을 결정합니다. 메타쿼츠 개발자의 아이디어에 대해 더 많은 통찰력을 가진 사람이 이 가장 기본적인 브레이크 아웃 전략을 어떻게 구현했을지 설명해줄 수 있을까요?

소스 코드는 모든 소프트웨어의 가장 좋은 문서로 간주되기 때문에 저는 MQL5\Include\Expert\ExpertSignal.mqh의 CExpertSignal 클래스를 분석하는 데 시간을 보냈습니다.

그 결과 거래 조건을 확인하는 함수는 본질적으로 다음과 같이 Direction() { return(LongCondition()-ShortCondition()); } 함수의 값을 테스트하는 것으로 축소된다는 것을 알았습니다:

bool CExpertSignal::CheckOpenLong(...)     { if(Direction()>=m_threshold_open && OpenLongParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckOpenShort(...)    { if(-Direction()>=m_threshold_open && OpenShortParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckCloseLong(...)    { if(-Direction()>=m_threshold_close && CloseLongParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckCloseShort(...)   { if(Direction()>=m_threshold_close && CloseShortParams(price,sl,tp,expiration)) return(true); return(false); }
bool CExpertSignal::CheckReverseLong(...)  { if(!CheckCloseLong(c_price) || !CheckOpenShort(price,sl,tp,expiration)) return(false); return(true); }
bool CExpertSignal::CheckReverseShort(...) { if(!CheckCloseShort(c_price) || !CheckOpenLong(price,sl,tp,expiration)) return(false); return(true); }

(어떤 식으로든 기능에 기여하지 않고 안정적인 실행에만 필요한 것으로 보이는 일부 코드를 제거했습니다).

이 요약은 모든 사용자 정의 전략 클래스의 경우 함수를 오버로드하는 것으로 충분하다는 것을 보여줍니다.

  1. int CExpertSignal::LongCondition(...),
  2. int CExpertSignal::ShortCondition(...),
  3. bool CExpertSignal::OpenLongParams(...),
  4. bool CExpertSignal::OpenShortParams(...),
  5. bool CExpertSignal::CloseLongParams(...), 및
  6. bool CExpertSignal::CloseShortParams(...)

매크로를 사용하는 방법과 위에 링크된 하베스터의 글 2. 에서 이 중 처음 두 개에서 IS_PATTERN_USAGE(x) 사용하여 결과 신호가 미리 정의된 여러 패턴을 감지하도록 하는 방법을 설명합니다.

여기서가지 문제가 있습니다: 가격이 마지막 n개의 막대 중 가장 높은 고점과 가장 낮은 저점 사이에 있는지 여부의 조건은 항상 참이어야 합니다. 따라서 LongCondition(...)ShortCondition(...)은 모두 브레이크 아웃 거래 패턴과 관련된 동일한 값을 반환하며, CheckOpenLong(... )CheckOpenShort(...) 의 조건이 변경되지 않는 한 Direction() 값은 반드시 0입니다.

하지만 LongCondition()>=m_-threshold_open 및 ShortCondition()>=m_-threshold_open을 사용하는 것으로 충분하지 않은 이유는 무엇입니까?

 
yankai0219:

기사에 첨부한 파일을 사용할 때 문제가 있습니다.

유형에 대한 주석이 다음과 같아야합니다:

//| Type=SignalAdvanced                                          |

메시지를 보내주셔서 감사합니다. 메시지가 제 문제를 해결해 주었습니다. 건배!

George

 

안녕하세요,

코드를 컴파일할 때 세 가지 경고를 받았습니다.

'm_open' 선언은 멤버를 숨깁니다 samplesignal.mqh 42 23

'm_close' 선언은 samplesignal.mqh 43 23 멤버를 숨깁니다.

'm_expiration' 선언은 samplesignal.mqh 52 23 멤버를 숨깁니다.


m_open과 m_close는 ExpertBase.mqh에 정의되었지만 유형이 다릅니다.

m_expiratin은 ExpertSignal.mqh에 정의되었습니다.

위의 세 줄을 주석 처리합니다. 경고가 사라졌습니다.

George

 
이 프로그램의 정확하고 완전하며 실행 가능한 코드를 다시 작성하고 버그를 수정하여 여기에 넣을 수 있습니다.
 
touhid Qolizadeh #:
이 프로그램의 정확하고 완전하며 실행 가능한 코드를 다시 작성하고 버그를 수정하여 여기에 넣을 수 있습니다.

여기 있습니다!

건배, 자릭

파일: