EA에서 막대를 거꾸로 분석하기

 

여러분, 안녕하세요,

이것은 정말 어리석은 질문일 수 있지만 정말 방법을 찾지 못했습니다. EA를 만들려고 합니다. 일부 바를 분석한 후 개봉 여부를 결정합니다. 주문을 연다고 가정해 보겠습니다. 어떻게든 내 EA가 중지되거나 메타 트레이더가 종료되면 다시 열 때 주문을 여는 막대를 찾고 싶습니다. 그래서 주문을 찾고 내 주문(EA가 방금 개설한 주문)을 찾고 막대 분석을 시작하려고 합니다. 어떻게 하면 될까요? 내 주문이 열린 바를 찾고 다시 바를 시작하려면 어떻게 해야 합니까?

예를 들어:

나는 H1 기간에 실행 중이며 12:00, 13:00, 14:00 및 15:00에 바를 찾은 다음 16:00에 주문을 열기로 결정합니다. 중요한 막대는 12:00부터 15:00까지이며 이 막대를 다시 식별하고 싶습니다. 따라서 EA를 먼저 다시 실행할 때 주문을 찾고 열린 날짜를 찾고, 이 날짜가 속한 막대를 감지하고, 그 날짜 이전의 막대에서 뒤로 이동을 시작합니다.

Time 배열 등을 사용한다고 생각했는데 막대를 찾는 동안 새 막대가 나타나면 어떻게 될까요? 교대가 변경되고 내 검색이 비논리적일 것입니다.

또한 이 정보를 파일에 쓰고 싶지 않습니다. 너무 많은 시간과 많은 예외 처리 등이 필요합니다.

감사해요.

 
paranoyakX :

Time 배열 등을 사용한다고 생각했는데 막대를 찾는 동안 새 막대가 나타나면 어떻게 될까요? 교대가 변경되고 내 검색이 비논리적일 것입니다.


EA가 코드를 실행하는 동안 새 막대가 나타나지 않아야 합니다. OnTick()이 호출될 때 로드된 데이터와 함께 작동합니다.

그러나 RefreshRates()가 사용되면 어떻게 될지 확실하지 않습니다.

 
GumRai : RefreshRates()가 사용되면 어떻게 될지 확실하지 않습니다.

자주 발생하지는 않지만(사실 매우 드물게) RefreshRates() 를 사용할 때 새로운 막대가 형성되어 막대 데이터가 이동하는 경험을 했습니다. 이 문제를 해결하기 위해 처음에는 필요한 모든 데이터를 변수에 복사한 다음 나머지 이벤트 실행 동안 다시 히스토리 데이터 배열 또는 이에 상응하는 함수 에 의존하지 않으려고 합니다. 이렇게 하면 내 코드에서 RefreshRates() 를 사용해야 하는 경우에도 여전히 초기 조건을 안전하게 참조할 수 있습니다.

@paranoyakX: 따라서 RefreshRates() 사용 여부에 관계없이 유사한 접근 방식을 시도할 수 있습니다. 사실, MQL5에서는 MQL4와 같은 기능이 없으며 데이터를 처리하기 위해 데이터를 자신의 어레이에 복사해야 합니다. 따라서 이러한 방식으로 수행하면 실제로 MQL4 및 MQL5 모두와 호환되는 코드를 만드는 데 몇 단계 더 가까워집니다.

그러나 가장 좋은 해결책은 이 모든 것을 EA에서 코딩하는 것이 아니라 접근 방식이 완전히 다르기 때문에 이 문제를 겪지 않는 Indicator에서 대부분의 논리를 코딩하는 것입니다. 표시기의 신호 논리를 최대한 많이 프로그래밍하십시오. 이는 원하는 대로 정확하게 작동할 때까지 표시기를 시각적으로 사용하고 테스트할 수 있기 때문에 유용합니다. 지표 솔루션의 또 다른 용도는 EA뿐만 아니라 수동 거래에 대한 신호를 제공한다는 것입니다. EA는 시그널링이 아닌 거래 관리에만 집중해야 합니다.

 
paranoyakX :

[...] Time 배열 등을 사용하는 줄 알았는데, 막대를 찾는 동안 새 막대가 나타나면 어떻게 될까요? 교대가 변경되고 내 검색이 비논리적일 것입니다.

당신이 묻는 것은 잠재적으로 너무 간단해서 내가 요점을 놓치고 있는지 궁금합니다. 이전 OrderSelect()가 주어지면 다음을 수행하여 OrderOpenTime()과 관련된 막대 이동을 조회할 수 있습니다.

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

예를 들어:

  • H1 차트
  • 현재 시간 은 16:32입니다.
  • 14:23에 주문이 열렸습니다.
  • 위의 코드는 BarShiftOfOrderOpen = 2, 즉 14:00의 H1 막대를 반환해야 하며 Time[BarShiftOfOrderOpen]은 14:00이 됩니다.
 
jjc : 당신이 묻는 것은 잠재적으로 너무 간단해서 내가 요점을 놓치고 있는지 궁금합니다. 이전 OrderSelect()가 주어지면 다음을 수행하여 OrderOpenTime()과 관련된 막대 이동을 조회할 수 있습니다.

예를 들어:

  • H1 차트
  • 현재 시간은 16:32입니다.
  • 14:23에 주문이 열렸습니다.
  • 위의 코드는 BarShiftOfOrderOpen = 2, 즉 14:00의 H1 막대를 반환해야 하며 Time[BarShiftOfOrderOpen]은 14:00이 됩니다.

예, 그것은 정확히 OP가 말하는 것입니다. 그러나 그가 질문하는 것은 그것을 수행하는 방법이 아니라 처리하는 동안 새로운 막대를 형성하는 새로운 들어오는 틱으로 인한 막대 이동으로 인해 유효하지 않게 되는 것을 방지하는 방법입니다. 자료.

그러나 RefreshRates() 를 사용하는 경우를 제외하고는 발생하지 않아야 합니다. 그 가능성(드물게)에 대해 MQL5가 수행하는 것과 동일한 방식으로 대체 방법을 제안했습니다.

 
FMIC :

그러나 새로운 막대를 형성하는 새로운 들어오는 틱으로 인한 막대 이동으로 인해 무효화되는 것을 방지하는 방법

OP는 어디에서 그렇게 말합니까? 그것이 질문일 있지만, 나는 당신이 발굽 소리를 듣고 말이 아니라 얼룩말을 생각한다고 생각합니다. MT4를 다시 시작해도 파일에 EA 상태를 유지한다는 언급은 그 질문이 사실 훨씬 훨씬 간단하다는 것을 시사합니다.
 

안녕하세요 여러분,

답변 주셔서 대단히 감사합니다.

@FMIC, 흥미롭게도 나는 지표를 사용하는 것을 생각해본 적이 없으며 당신이 말했듯이 지표를 만들고 사용하면 훨씬 더 쉬울 수 있지만 물론 이것은 내 주문과 쌍을 이루는 지표 값을 찾는 방법과 같은 새로운 질문을 가져올 것입니다. 또한 저는 매번 그 프로세스를 수행하지 않고 OnInit() 한 번만 수행합니다. 따라서 EA를 사용하는 것이 좋습니다.

@jjc, 솔루션도 주셔서 감사합니다. 나는 실제로 "새로운 막대"에 대해 약간 걱정했지만 여러분 모두가 말했듯이 거기에서 EA가 실행되는 동안 시프트 변경이 없을 것입니다(그리고 저는 RefreshRates() 함수 를 사용하지 않습니다). 그래서 저도 여러분의 코드를 사용할 수 있습니다. @FMIC가 말한 후 지금 궁금한 점이 있습니다. 이것을 지표로 만드는 것이 더 좋을까요?

 
jjc :
OP는 어디에서 그것을 말합니까? 그것이 질문일 있지만, 나는 당신이 발굽 소리를 듣고 말이 아니라 얼룩말을 생각한다고 생각합니다. MT4를 다시 시작해도 파일에 EA 상태를 유지한다는 언급은 그 질문이 사실 훨씬 훨씬 간단하다는 것을 시사합니다.

GumRai조차도 그것을 선택하고 그를 인용했습니다. 나는 여기서 다시 할 것입니다.

편집증X :

Time 배열 등을 사용한다고 생각했는데 막대를 찾는 동안 새 막대가 나타나면 어떻게 될까요? 교대가 변경되고 내 검색이 비논리적일 것입니다.

 
paranoyakX :

@FMIC, 흥미롭게도 나는 지표를 사용하는 것을 생각해본 적이 없으며 당신이 말했듯이 지표를 만들고 사용하면 훨씬 더 쉬울 수 있지만 물론 이것은 내 주문과 쌍을 이루는 지표 값을 찾는 방법과 같은 새로운 질문을 가져올 것입니다. 또한 저는 매번 그 프로세스를 수행하지 않고 OnInit() 한 번만 수행합니다. 따라서 EA를 사용하는 것이 좋습니다.

@jjc, 솔루션도 주셔서 감사합니다. 저는 사실 "새 막대"에 대해 약간 걱정했지만 여러분 모두가 말했듯이 거기에서 EA가 실행되는 동안에는 시프트 변경이 없을 것입니다(그리고 저는 RefreshRates() 함수를 사용하지 않습니다). 그래서 저도 여러분의 코드를 사용할 수 있습니다. @FMIC가 말한 후 지금 궁금한 점이 있습니다. 이것을 지표로 만드는 것이 더 좋을까요?

내 제안이 당신에게 너무 복잡하더라도 신경쓰지 마세요! 지금 가장 쉬운 방법으로 하고 더 편안해지면 다른 방법도 시도해 보세요.

추신! OnInit()에 논리 코드를 넣으면 안 됩니다. 초기화하는 곳일 뿐이며 히스토리 데이터 시리즈 배열의 데이터와 아무 관련이 없습니다. 모든 논리와 기본 코드는 OnTick() 또는 OnCalculate()에 있어야 합니다.

 
FMIC :

GumRai조차도 그것을 선택하고 그의 말을 인용했습니다. 나는 여기서 다시 할 것입니다.

당신과 Gumrai는 증거가 아직 보증하지 않는 "만약 새로운 기준이 나온다면"의 의미에 대해 엄청난 가정을 하고 있습니다. OP는 아직 " OnStart 중에 새 막대가 나타나는 경우"라고 말하지 않았습니다.

나는 paranoyakX가 EA의 전역 변수에 거래/신호 세부 정보를 저장하고 있다고 생각합니다. 문제는 OnStart()를 호출하는 동안 형성되는 새로운 막대가 아니라 EA의 수명 동안 형성되는 새로운 막대가 아닐까 생각합니다.

 
jjc :

당신과 Gumrai는 증거가 아직 보증하지 않는 "만약 새로운 기준이 나온다면"의 의미에 대해 엄청난 가정을 하고 있습니다. OP는 아직 " OnStart 중에 새 막대가 나타나는 경우"라고 말하지 않았습니다.

나는 paranoyakX가 EA의 전역 변수에 거래/신호 세부 정보를 저장하고 있다고 생각합니다. 문제는 OnStart()를 호출하는 동안 형성되는 새로운 막대가 아니라 EA의 수명 동안 형성되는 새로운 막대가 아닐까 생각합니다.

EA에는 OnStart() 가 없지만 의미하는 바는 알겠습니다. 그러나 OP는 귀하의 의견에 대해 다음과 같이 말했습니다.

나는 실제로 "새로운 막대"에 대해 약간 걱정했지만 여러분 모두가 말했듯이 EA가 실행되는 동안에는 교대 근무가 변경되지 않습니다(그리고 저는 RefreshRates() 기능을 사용하지 않습니다)