Init() 및 DeInit() 실행 순서

 

안녕하세요 !

그런 문제에 직면

지표 또는 Expert Advisor가 작성되었습니다.

Init() 및 DeInit() 두 가지 기능이 있습니다.

TF(시간 프레임)를 변경할 때 이러한 기능의 실행 순서는 무엇입니까 ???

표시기를 시작하거나 연결할Init() 이 작동해야 한다는 것을 이해합니다.

차트에서 제거되면 DeInit() 가 작동해야 합니다.

TF를 변경할 때 현재 TF의 DeInit() 가 먼저 작동하고 새 TF의 Init() 이 작동해야 합니다.

그러나 항상 이 순서대로 실행되는 것은 아니므로 프로그램 작성 논리를 크게 망칩니다.

지표 및 로그의 예를 첨부했습니다.

누군가가 이 문제를 해결했거나 방금 점수를 매겼다고 말해주세요!!!

파일:
ERROR.mq5  2 kb
Log.txt  1 kb
 

어떤 논리가 망쳐 놓았습니까?

기간을 변경할 때 표시기의 새 복사본이 생성되며 이전 복사본에 대해서는 전혀 알지 못합니다. 얼마 동안(매우 짧은 시간) 표시기의 두 복사본이 병렬로 존재합니다. 그런 다음 이전 복사본이 언로드됩니다.

문서 읽기 https://www.mql5.com/ru/docs/runtime/running

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
시간대를 변경할 때마다 OnInit가 호출되어 약간의 불편함을 줍니다.
 
Slawa :

어떤 논리가 망쳐 놓았습니까?

기간을 변경할 때 표시기의 새 복사본이 생성되며 이전 복사본에 대해서는 전혀 알지 못합니다. 얼마 동안(매우 짧은 시간) 표시기의 두 복사본이 병렬로 존재합니다. 그런 다음 이전 복사본이 언로드됩니다.

문서 읽기 https://www.mql5.com/ru/docs/runtime/running


답변 해주셔서 감사합니다

"논리 스포일러"에 대해

메인 차트(촛대)를 자체 드로잉 유형 DRAW_CANDLES로 대체하는 지표를 작성했습니다.

요점은 메인 가격 차트를 제거하고 내 것만 표시하는 것입니다.

- Inita 를 사용하여 기본 차트의 색상을 투명하게 설정했습니다.

내 일정을 그립니다(내 매개변수에 따라)


내 지표를 제거한 후 메인 차트의 색상을 복원하고 싶기 때문에

- DeInit 에서 메인 차트의 색상을 복원합니다.


TF를 변경할 때 먼저 DeInit(색상 복원)을 의미한 다음 Init(다시 투명)을 의미합니다.


따라서 명령 실행은 TF를 변경할 때 주기적으로 순차적이지 않습니다.

내 지표에 기본 차트(복원된 색상)를 오버레이합니다.

다음은 "논리 손상"의 한 예입니다.


추신: (((문서 https://www.mql5.com/en/docs/runtime/running 참조 )))

Expert Advisor가 첨부된 차트의 기호 또는 기간을 변경할 때 Expert Advisor가 언로드되거나 로드되지 않습니다 . 동시에 이전 심볼/타임프레임의 OnDeinit() 핸들러와 새로운 심볼/타임프레임(있는 경우)의 OnInit( ) 핸들러 순차적으로 호출되며 전역 변수 및 정적 변수의 값은 재설정되지 않습니다. ( OnInit() 함수의) 초기화가 완료되기 전에 Expert Advisor에 대해 수신된 모든 이벤트를 건너뜁니다.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr :


에 대한

" 이전 복사본에 대해 아무것도 모르는 지표의 새 복사본이 생성됩니다"

그렇다면 DeInit에서 새 Init의 복사본에서 생성된 객체가 삭제되는 이유는 무엇입니까? 그냥 카피라면.



 
Petros Shatakhtsyan :
시간대를 변경할 때마다 OnInit가 호출되어 약간의 불편함을 줍니다.


매번 OnInit은 무엇을 의미합니까?

OnInit이란 무엇입니까 - 모든 변수와 매개변수를 한 번 초기화하기 위해

예를 들어

현재 TF가 무엇인지 쓸 차트에 텍스트 레이블을 생성 하는 표시기를 작성 하고 싶습니다.

지표를 삭제할 때 차트에서 이 텍스트 레이블을 제거했습니다.

그리고 TF를 변경할 때 내용을 새 것으로 업데이트했습니다(기존 항목을 삭제하고 새 항목 생성).

무슨 일이 일어날 것

TF를 몇 번 변경하고 텍스트 레이블이 사라졌습니다. (OnInit이 먼저 작동한 다음 DeInit가 작동했기 때문에 이 레이블이 제거됨)

그러다가 TF를 여러 번 갈아타고 등장했다.

이것은 잘못된 것입니다.

 
nmaratr :

이것이 그래픽 개체인 경우 채팅에 속하며 이 채팅에서 실행 중인 모든 프로그램에서 사용할 수 있습니다.
 
Alexander Bereznyak :

이것이 그래픽 개체인 경우 채팅에 속하며 이 채팅에서 실행 중인 모든 프로그램에서 사용할 수 있습니다.


그러면 이 문제를 어떻게 해결할 수 있습니까? (이거 해본사람???)

또는 그대로 가져 가라. 계산 속도를 높이기 위해 순차적이지 않은 명령을 실행할 수 있습니다.

문서와 모순되는 것


엑스퍼트가 붙은 차트의 심볼이나 타임프레임을 변경할 경우 엑스퍼트의 언로딩과 로딩은 하지 않는다 . 어디에서

순차적으로

핸들러 OnDeinit() 는 이전 심볼/시간 프레임에서 호출되고 OnInit() 은 새 심볼/시간 프레임(있는 경우)에서 호출됩니다.

 
nmaratr :


그러면 이 문제를 어떻게 해결할 수 있습니까? (이거 해본사람???)



나는이 주제의 저자와 합류합니다. 질문은 실제로 유휴 상태가 아닙니다. 그리고 매우 구체적입니다.
나는 오래전에 이 기능을 발견했다. 나는 2016년 6월에 이 주제의 저자와 절대적으로 유사한 예를 가지고 서비스 데스크에 연락했습니다. 무시됨 - 열린 주제가 계속 걸려 있습니다.

서비스 데스크 애플리케이션

물론 탬버린을 사용하면 TF를 변경할 때 표시기의 매개 변수를 전송하여 많은 시간을 할애했습니다. 그러나 탬버린으로 간단한 작업을 수행하고 싶지는 않습니다.
물론 멀티스레딩이 매우 필요하고 매우 복잡한 일이고 동기화로 모든 것이 그렇게 간단하지 않다는 것을 이해합니다만, 개발자 여러분은 변경 시 재초기화되지 않는 특수 타입의 인디케이터에 전역 변수를 생성하는 기능을 구현해 주십시오. 기간. Expert Advisors에서는 TF 변경 시 재초기화되지 않지만 표시기에서는 발생합니다. 표시기에서 일부 변수와 배열을 다시 초기화하지 않을 수 있었다면 OnInit와 OnDeinit의 동기화에 대한 주제가 발생하지 않았고 프로그래머에게 새로운 흥미로운 가능성이 열렸습니다. 변수를 다시 초기화하지 않을 가능성이 있다고 해서 프로그램 보안에 영향을 미칠 것이라고는 생각하지 않습니다.

무엇을 위한 것입니까?
예, 많은 상황.

예를 들어:
-지표가 실행되면 시간 프레임에 의존하지 않는 변수, 인덱스 배열, 데이터 배열에 대한 계산이 있으며 상당히 크고 길 수 있습니다. 문제는 TF를 변경할 때마다 왜 이렇게 해야 하느냐는 것입니다.
- 또는 매개변수 창을 통해 표시기 매개변수를 변경하지 않고 마우스로 차트에서 직접 편리함과 명확성을 위해 표시기 매개변수를 변경합니다(이 표시기는 다이아몬드로 구현된 예로 이 표시기 를 보고 사용할 수 있음). 그리고 TF를 변경할 때마다 설정이 잘못되지 않도록 합니다.

 

이 문제는 두 손가락으로 해결됩니다 ... 당신은 무엇을 알고 ...

OnDeinit에서는 객체를 삭제하기 전에 초기화 해제 사유 의 조건을 설정해야 합니다... 기간이 변경되지 않으면 객체를 삭제합니다. 그리고 모든 것...

 
Alexey Viktorov :

이 문제는 두 손가락으로 해결됩니다 ... 당신은 무엇을 알고 ...

OnDeinit에서는 객체를 삭제하기 전에 초기화 해제 사유 의 조건을 설정해야 합니다... 기간이 변경되지 않으면 객체를 삭제합니다. 그리고 모든 것...

그리고 모든 것이 무엇입니까!?
이 이유 코드(REASON_CHARTCHANGE)를 최대한 실험하고 사용했습니다. 그리고 모든 변수가 다시 원래 상태로 재설정되고 새 TF의 OnInit 후에 OnDeinit를 실행할 수 있다면 요점은 무엇입니까?
사유: