EA에서 막대를 거꾸로 분석하기 - 페이지 3

 
paranoyakX :

조언에 감사드립니다. 여기에 내 코드의 매우 간단한 버전이 있습니다. 이것은 실제 코드가 아니지만 이것이 더 명확하기를 바랍니다.

내가 말했듯이 이것은 실제 코드가 아니며 패턴 등을 찾는 것은 단지 예일 뿐입니다. 이 스레드를 연 이유는 DetectExistingPattern() 함수 입니다.

OnTick() 의 첫 번째 실행에서 코드를 실행하는 방법에 대한 샘플 코드를 이미 제공했으므로 이제 그에 따라 코드 게시물을 업데이트하여 DetectExistingPattern() OnTick() 의 첫 번째 호출에서 실행되고 OnInit() .

또한 "막대"를 사용하여 새 막대를 감지할 수 없습니다. 그것은 잘못된 것입니다. "Time[0]" 또는 "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )"를 사용해야 합니다. 다음은 예입니다.

 bool isNewBar()
{
   static datetime last_time = WRONG_VALUE ;
   datetime lastbar_time = ( datetime ) SeriesInfoInteger ( _Symbol , _Period , SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if ( last_time != WRONG_VALUE )
   {
       if ( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return ( true );
      }
   }
   else
      last_time = lastbar_time;

   return ( false );
}
 
FMIC :

OnTick() 의 첫 번째 실행에서 코드를 실행하는 방법에 대한 샘플 코드를 이미 제공했으므로 이제 그에 따라 코드 게시물을 업데이트하여 DetectExistingPattern() OnTick() 의 첫 번째 호출에서 실행되고 OnInit() .

또한 "막대"를 사용하여 새 막대를 감지할 수 없습니다. 그것은 잘못된 것입니다. "Time[0]" 또는 "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )"를 사용해야 합니다. 다음은 예입니다.

@FMIC 감사합니다. @jjc가 요청해서 간단한 코드를 추가했습니다. 그건 그렇고, 기억에 나는 Bars를 사용하는 것을 배웠습니다. 왜 틀렸어? 제대로 작동하지 않을 수 있습니까?

ps: 저는 메타트레이더 4를 사용하는데 mql4 맞나요?

 
paranoyakX :

@FMIC 감사합니다. @jjc가 요청해서 간단한 코드를 추가했습니다. 그건 그렇고, 기억에 나는 Bars를 사용하는 것을 배웠습니다. 왜 틀렸어? 제대로 작동하지 않을 수 있습니까?

ps: 저는 메타트레이더 4를 사용하는데 mql4 맞나요?

아니요! 포럼에서 많은 사용자들이 "막대" 방법이 매우 오래 되었고 차트 의 "옵션"에 의해 막대 수가 변경될 수 있거나 당 최대 막대 수가 차트에 도달했습니다. 따라서 사용하는 것은 잘못된 것입니다. "Time[0]"을 사용하거나 MQL5와도 호환되도록 하려면 "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )"를 사용하십시오. 내 예를 참조하십시오.
 

FMIC :
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

와우 제가 귀하의 코드를 사용할 줄은 몰랐습니다 정말 감사합니다.
 
막대가 신뢰할 수 없음(새로 고침/재연결이 차트의 막대 수를 변경할 수 있음) 볼륨이 신뢰할 수 없음(눈금 누락) 항상 시간을 사용하십시오. 새로운 양초 - MQL4 forum
 
paranoyakX :

내가 말했듯이 이것은 실제 코드가 아니며 패턴 등을 찾는 것은 단지 예일 뿐입니다. 이 스레드를 연 이유는 DetectExistingPattern() 함수 입니다.

원래 질문으로 돌아가기... 이 예에서 한 가지 옵션은 특정 막대에서 시작하도록 지시할 수 있도록 CheckTrendPattern() 함수를 변경하는 것입니다. 막대 1에서 10까지의 고정 범위를 사용하는 대신 지정된 시작점에서 1에서 10까지의 오프셋을 대신 사용합니다.

 bool CheckTrendPattern( int StartAtBar){
 
   for ( int i=StartAtBar + 10 ; i>=StartAtBar + 1 ; i--) {
     if (High[i]>High[i- 1 ])
       return false ;
  };
  HighestValue = High[StartAtBar + 10 ];
  LowestValue  = Low[StartAtBar + 1 ];
  
   return true ;
};

기존 주문이 없고 패턴이 현재 충족되는지 확인하려면 CheckTrendPattern() 대신 CheckTrendPattern(0)을 사용합니다.

시작할 때 기존 주문이 있는 경우 다음과 같이 이를 트리거한 패턴을 찾을 수 있습니다. 이것은 내가 처음에 했던 것과 같은 제안입니다. 기존 주문의 오픈 시간 과 동일한 막대 인덱스를 얻고 거기에서 거꾸로 보기 시작합니다.

 int BarShiftOfOrderOpen = iBarShift( Symbol (), Period (), OrderOpenTime(), false );
CheckTrendPattern(BarShiftOfOrderOpen);

그러나 FMIC가 말했듯이 OnInit()보다는 OnTick()에 대한 첫 번째 호출에서 이 검사를 수행하는 것이 좋습니다. 이것을 제안하는 내 자신의 이유는 "초기화 보류"와 아무 관련이 없습니다. 대신, MT4가 이미 차트에 첨부된 EA로 다시 시작될 때 브로커의 주문 목록이나 업데이트된 막대 기록을 아직 100% 안정적으로 갖지 못하는 것이 걱정됩니다.

명심해야 할 또 다른 고려 사항은 다음 시나리오이며, 모두 단일 막대가 적용되는 시간 동안 발생합니다.

  • 패턴을 찾아 거래를 합니다.
  • 미결제 거래가 마감되었습니다(예: 손절매 발생)
  • MT4가 닫힙니다(의도적이든 아니든).
  • MT4 재시작
  • EA는 현재 패턴을 다시 찾고 열린 거래가 없기 때문에 같은 막대에서 다른 거래를 취합니다.

이를 방지하기 위해 마감된 주문과 열린 주문을 모두 확인하는 것이 좋습니다.

 
@ jjc , 귀하의 제안은 매우 좋습니다. 경험을 공유해 주셔서 감사합니다.
jjc :

원래 질문으로 돌아가기... 이 예에서 한 가지 옵션은 특정 막대에서 시작하도록 지시할 수 있도록 CheckTrendPattern() 함수를 변경하는 것입니다. 막대 1에서 10까지의 고정 범위를 사용하는 대신 지정된 시작점에서 1에서 10까지의 오프셋을 대신 사용합니다.

기존 주문이 없고 패턴이 현재 충족되는지 확인하려면 CheckTrendPattern() 대신 CheckTrendPattern(0)을 사용합니다.

내 진짜 패턴은 이게 아니라서 고정된 숫자가 없다(예시 10) 동적인데 패턴 체크 방식이 달라서 기억이 안나고 패턴을 찾기 위해 비슷한 코드를 작성해서 그런지 정말 귀찮다. 다시. 문제는 EA가 실행되는 동안 패턴이 계속 진행 중이면 마지막 막대를 확인하고 계속 진행 중인 경우 아무 것도 하지 않고 패턴이 깨졌을 때 주문을 엽니다. 그래서 이번에는 앞으로가 아닌 막대로 돌아가야 하기 때문에 패턴을 다시 찾는 동안 해당 코드를 사용할 수 없습니다. 또한 이 경우 동일한 막대를 계속해서 확인하기 때문에 패턴을 거꾸로 검색하고 싶지 않았습니다. 성능 문제만 걱정했는데 문제가 되지 않을 것 같아서 패턴 찾기 방법을 변경하여 말씀하신 대로 시작 시와 실행 중에 모두 사용할 수 있도록 생각하고 있습니다. 이렇게 하면 패턴을 변경하면 잊어버릴 수 있는 패턴 재탐색 절차를 변경해야 하는 것과 같은 가능한 문제도 방지할 수 있습니다. 감사합니다. 또한 @FMIC가 말했듯이 아마도 이 부분을 표시기로 만들어야 할 것입니다(많이 쓰지는 않았습니다). 그래야 다시 찾고 찾는 데 문제가 되지 않을 것입니다.
jjc :

시작할 때 기존 주문이 있는 경우 다음과 같이 이를 트리거한 패턴을 찾을 수 있습니다. 이것은 내가 처음에 했던 것과 같은 제안입니다. 기존 주문의 오픈 시간과 동일한 막대 인덱스를 얻고 거기에서 거꾸로 보기 시작합니다. 그러나 FMIC가 말했듯이 OnInit()보다는 OnTick()에 대한 첫 번째 호출에서 이 검사를 수행하는 것이 좋습니다. 이것을 제안하는 내 자신의 이유는 "초기화 보류"와 아무 관련이 없습니다. 대신, MT4가 이미 차트에 첨부된 EA로 다시 시작될 때 브로커의 주문 목록이나 업데이트된 막대 기록을 아직 100% 안정적으로 갖지 못하는 것이 걱정됩니다.

명심해야 할 또 다른 고려 사항은 다음 시나리오이며, 모두 단일 막대가 적용되는 시간 동안 발생합니다.

  • 패턴을 찾아 거래를 합니다.
  • 미결제 거래가 마감되었습니다(예: 손절매 발생)
  • MT4가 닫힙니다(의도적이든 아니든).
  • MT4 재시작
  • EA는 현재 패턴을 다시 찾고 열린 거래가 없기 때문에 같은 막대에서 다른 거래를 취합니다.

이제 OnInit에서 해야 하는 이유가 더 명확해졌고, 물론 안정성이 가장 중요한 포인트이고 고려 경고에 대해 생각하지 않았습니다. 이 부분은 정말 중요합니다. 중복 주문을 열 수 있습니다. 드물지만 가능합니다. 나는 이것을 어떻게든 처리해야 한다. 정말 감사합니다.

@ WHRoeder 의 새로운 바 체크 컨트롤은 매우 간단하고 아름답습니다. 내 코드에 방법을 추가했습니다. 감사합니다.

 

여러분, 안녕하세요,

@FMIC가 조언한 대로 나는 내 패턴을 찾는 표시기를 작성하고 내 주문에 사용할 신호와 몇 가지 추가 데이터를 제공합니다(다른 가격으로 두 개 이상의 주문을 열 수 있음). 이제 EA에서 사용하고 싶지만 질문이 있습니다. 실제로 귀하의 경험이 필요합니다. 내 표시기에서 신호를 받으면 mt4를 다시 열 때 어떤 이유로든 충돌하는 경우 주문을 열거나 주문(판매 한도 또는 구매 한도 등)합니다. 열린 주문이 어느 신호에 속하는지 어떻게 알 수 있습니까? 내 지표에서. 그것을 위해 바 시프트를 사용해도 괜찮습니까? 전에 말했듯이 주문 생성 시간을 찾은 다음 해당 막대 이동을 찾을 수 있으며 이 이동을 사용하여 표시기 값을 가져와야 합니까? 이 주문과 지표 이동 을 어떻게 일치시킬 수 있습니까?

감사해요.

 
paranoyakX : 안녕하세요 여러분, @FMIC가 조언한 대로 저는 제 패턴을 찾는 표시기를 작성하고 제 주문에 사용할 신호와 몇 가지 추가 데이터를 제공합니다(다른 가격으로 두 개 이상의 주문을 열 수 있음). 이제 EA에서 사용하고 싶지만 질문이 있습니다. 실제로 귀하의 경험이 필요합니다. 내 표시기에서 신호를 받으면 mt4를 다시 열 때 어떤 이유로든 충돌하는 경우 주문을 열거나 주문(판매 한도 또는 구매 한도 등)합니다. 열린 주문이 어느 신호에 속하는지 어떻게 알 수 있습니까? 내 지표에서. 그것을 위해 바 시프트를 사용해도 괜찮습니까? 전에 말했듯이 주문 생성 시간을 찾은 다음 해당 막대 이동을 찾을 수 있으며 이 이동을 사용하여 표시기 값을 가져와야 합니까? 이 주문과 지표 이동을 어떻게 일치시킬 수 있습니까?
예, jjc가 이전 게시물에서 설명한 것처럼 iBarShift( ) 를 사용하여 iCustom() 함수를 통해 표시기의 데이터를 참조할 수 있습니다.
 
FMIC :
예, jjc가 이전 게시물에서 설명한 것처럼 iBarShift( ) 를 사용하여 iCustom() 함수를 통해 표시기의 데이터를 참조할 수 있습니다.
@FMIC에게 대단히 감사합니다. 따라서 shift를 사용하는 것이 좋은 솔루션입니다. 내 패턴을 지표로 삼는 것은 정말 좋은 조언이었습니다. 물론 전체 코드를 변경하지만 더 일관성이 있을 것입니다.