캔버스 멋지다! - 페이지 82

 
Vitaliy Kuznetsov #:

일반적인 지표 코드 개선 방법으로는 객체를 사용하는 폐쇄형 코드에서 EA와의 충돌을 전반적으로 해결할 수 없다는 것이 밝혀졌습니다.

전문가 조언자를 개선하면 모든 대시보드 지표와의 충돌을 전역적으로 해결할 수 있기를 바랍니다(이것이 제 과제입니다).

MT4 빌드 1353 스레드에 썼으니 터미널 프로그래머들이 주목할 것입니다.

추신 올빼미와 스키가 가지 않은 무언가를 변경했습니다 ...

전체 코드 (표시기 및 전문가 조언자)를 살펴보고 ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName 등이 호출되는 위치와 이유를 찾으십시오. 동기식이며 모든 것을 심각하게 느리게 할 수 있습니다. 가능하면 이러한 함수를 제거하세요.

위의 ChartRedraw()!!!! 를 호출하는 것을 잊지 마세요...

 

신사 숙녀 여러분, 저는 온갖 말도 안 되는 소리를 듣고 있는데 답변할 수 없다고요? 놀랍군요!

 
Maxim Kuznetsov #:

전체 코드(표시기 및 EA)를 살펴보고 ObjectGetXXX, ObjectFind, ObjectsTotal, ObjectName 등이 어디서 왜 호출되는지, 동기식이며 모든 속도를 심각하게 저하시킬 수 있는지 알아보세요. 가능하면 이러한 코드를 제거하세요.

위의 ChartRedraw()!!!! 를 호출하는 것을 잊지 마세요...

모든 이벤트에 연속적으로 반응하지 말고 OnChartEvent()를 현명하게 만들어야 합니다. 아니면 뭐가 있는지 모르겠네요... 그리고 왜 여기에 앉아서 문제가있는 코드를 보여주기 위해 겸손하지도 않을 사람을 위해 생각합니까?

이제 ObjectFind () 및 ObjectGet () 1000000 회 반복의 루프를 삽입했는데 모든 것이 정상입니다.

 
Dmitry Fedoseev #:

신사 숙녀 여러분, 저는 온갖 말도 안 되는 소리를 듣고 있는데 답변할 수 없다고요? 놀랍군요!

이런 편파적인 대우를 받은 사람은 여러분뿐만이 아닙니다.

 
Dmitry Fedoseev #:

모든 이벤트에 연속적으로 반응하지 말고 OnChartEvent()를 현명하게 수행하면 됩니다. 아니면 그게 뭔지 모르겠어요.... 그리고 왜 여기 앉아서 문제가 있는 코드를 보여주지도 않는 사람을 위해 생각할까요?

이제 ObjectFind () 및 ObjectGet ()의 1000000 회 반복 루프를 삽입했는데 모든 것이 정상입니다.

글쎄, 나는 그것을 네 번째로 쓸 것입니다, 그것은 나에게 어렵지 않습니다.

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


링크를 열면 게시물 하단에 코드가 첨부 된 첨부 파일을 찾을 수 있습니다. 그런 다음 게시물을 읽고 토론이 누구에 의해 어떻게 전개되었는지 읽을 수 있습니다.

문제는 특히 제안된 코드에 있는 것이 아니라(개체가 있는 모든 Expert Advisor를 직접 작성할 수 있음), 지표를 통한 차트 전환 기능으로 작업할 때 개체가 있는 모든 Expert Advisor에 영향을 미치는 전역 오류(단일 예외 제외)에 있습니다.

Nikolay가 해결책을 제시했지만 그러한 코드 작업에 오류가있어 문제를 더 처리하고 있습니다.

Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
  • 2021.11.10
  • www.mql5.com
точнее в очередностях OnInit удалении своих объектов чарта. Тут ремонт терминала не имеет смысла не создавайте объектов по крайней мере до первого OnChartEvent. И удалять объекты пачкой лучше по ChartObjectsDelete
 
Dmitry Fedoseev #:

모든 이벤트에 연속적으로 반응하지 말고 OnChartEvent()를 현명하게 수행하면 됩니다. 아니면 그게 뭔지 모르겠어요.... 그리고 왜 여기 앉아서 문제가 있는 코드를 보여주지도 않는 사람을 위해 생각할까요?

이제 ObjectFind () 및 ObjectGet ()의 1000000 회 반복 루프를 삽입했는데 모든 것이 정상입니다.

루프보다 더 복잡한 코드를 작성해 본 적이 있나요?

 
Vitaliy Kuznetsov #:

네 번째로 글을 쓰겠습니다.

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


링크를 열면 게시물 하단에 코드가 포함된 첨부 파일을 찾을 수 있습니다. 그런 다음 게시물을 읽고 누가, 어떻게 토론을 진행했는지 확인할 수 있습니다.

문제는 제안된 코드에 있는 것이 아니라(객체가 있는 모든 Expert Advisor를 직접 작성할 수 있음), 지표를 통한 차트 전환 기능으로 작업할 때 객체가 있는 모든 Expert Advisor에 영향을 미치는 전역 오류(단 한 가지 예외)에 있습니다.

Nikolay가 해결책을 제시했지만 그러한 코드 작업에 오류가있어 문제를 더 처리하고 있습니다.

다음은 변경 사항입니다:

   if(sparam=="Win_Ea_"){ // вот тут надо поцивильней сделать, из класса брать имя... но уж сами как-нибудь 
      if(id == CHARTEVENT_OBJECT_CLICK){
         if(win.BtnClickUP()){
         
            win.Process();
            
            ChartPeriodSet(true);
            
         }
         if(win.BtnClickDN()){
         
            win.Process();
            
            ChartPeriodSet(false);
            
         }
      }
   }
   if(id == CHARTEVENT_MOUSE_MOVE){
      MouseX=(int)lparam;
      MouseY=(int)dparam;
      
   }

나는 끔찍한 멈춤을 제거했습니다. 그리고 측정 된 속도로 버튼을 누르면 모든 것이 정상입니다.

그러나 딱따구리처럼 두드리기 시작하면 다시 멈추기 시작하면 더 짧고 짧아집니다. 나는 생각하지 않는다

당신은 그들을 제거 할 수 없습니다. 아마도 시간 프레임 구성과 관련이있을 수 있습니다.

버튼을 눌렀거나 누르지 않은 위치가 있도록 버튼 작업을하고 버튼이 즉시 눌리지 않도록 관성을 도입해야합니다.

0.1초의 지연이 있으면 상황이 해결되고 사용자는 눈치 채지 못할 것입니다.

--

사실, 전문가 없이도 버튼을 맹렬한 속도로 두드릴 수 있습니다....

 

그리고 여기 우리는 완전히 매달린 것을 제거했습니다.

비뚤어졌을 수도 있지만 중요한 것은 요점입니다:

void windows_class::~windows_class(){
   //Canvas.Destroy();
}
int OnDeinit(const int r){
   if(r==REASON_REMOVE){
      Canvas.Destroy();
   }
}

차트를 전환할 때 객체를 삭제하지 않는 것이 요점입니다.

Destroy()...를 실행할 때 어떤 일이 일어나는지 살펴봐야 합니다. 그대로 두는 것이 가능하다면...

 

안녕하세요 !)

미안하지만 우리가 mq4에 대해 이야기하고 있다면 아마도 이렇게 해결할 수있을 것입니다 :?)

void OnChartEvent(const int     id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id == CHARTEVENT_CLICK
   || id == CHARTEVENT_CHART_CHANGE)
   {ChartSetSymbolPeriod(0,NULL,0);}
}
 

이것이 바로 브레이크를 만들 수 있는 또 다른 이유입니다:

void OnTick(void){
  win.Process();
}

왜일까요?

사유: