MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 645

 

타라스, 마우스를 클릭하여 프레임을 변경하는 그래프의 이러한 정규화를 수행할 수 있습니까?

가끔 습관적으로 버튼 옆에 커서가 있을 때 누르는데 동작 결과가 전혀 마음에 들지 않습니다.

이벤트 처리 목록에서 적절한 것을 찾지 못했습니다 . 특정 설명 없이 CHARTEVENT_CHART_CHANGE만 있습니다. 마우스 버튼을 바인딩할 수 있지만 내가 이해하는 한 사용자는 고유한 버튼을 만드는 경우에만 시스템 메뉴로 작업할 수 없습니다. 간단한 해결책이 있습니까?

 
psyman :

타라스, 마우스를 클릭하여 프레임을 변경하는 그래프의 이러한 정규화를 수행할 수 있습니까?

가끔 습관적으로 버튼 옆에 커서가 있을 때 누르는데 동작 결과가 전혀 마음에 들지 않습니다.

이벤트 처리 목록에서 적절한 것을 찾지 못했습니다 . 특정 설명 없이 CHARTEVENT_CHART_CHANGE만 있습니다. 마우스 버튼을 바인딩할 수 있지만 내가 이해하는 한 사용자는 고유한 버튼을 만드는 경우에만 시스템 메뉴로 작업할 수 없습니다. 간단한 해결책이 있습니까?

즉, 차트의 특정 "탭 영역"을 마우스로 클릭하려면?
할 수 있습니다. 커서의 좌표를 추적하고 마우스 버튼을 클릭해야 합니다.

CHARTEVENT_MOUSE_MOVE

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MQL4에 대한 모든 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론

타라스 슬로보디아닉 , 2018.10.04 09:37

즉, 차트의 특정 "탭 영역"을 마우스로 클릭하려면?
할 수 있습니다. 커서의 좌표를 추적하고 마우스 버튼을 클릭해야 합니다.



문제는 이것이 시스템 메뉴의 버튼이 아니라 차트를 클릭한 것입니다. 그런 이벤트를 처리하는 방법을 모르겠습니다.
 
psyman :

문제는 이것이 시스템 메뉴의 버튼이 아니라 차트를 클릭한 것입니다. 그런 이벤트를 처리하는 방법을 모르겠습니다.

우리는 현재 기호 기간을 기억하고 " CHARTEVENT_CHART_CHANGE "일 때 변경 사항을 확인하고 필요한 작업을 수행합니다.

 
알겠습니다. 다시 한 번 감사드립니다.
 

OnTick() 어드바이저 본문의 동일한 기능이 작동하지 않는 이유를 알려주십시오(또는 오히려 작동하지만 오류가 있는 모든 차트에서 올바르게 작동하지 않음).

, 그리고 OnInit() 프로시저에서 일반 스크립트에서도 잘 작동합니다. 어드바이저는 80개의 차트에 즉시 설치됩니다(각 4개의 창 W1 D1 H4 H1에 대해 20개의 통화). 아마도 컴퓨터가 대처할 수 없을 것입니다. 말해 주세요. 로봇의 임무는 차트 중 하나에서 신호가 감지되면 화면에 MessageBox 메시지를 표시하는 것입니다. 이러한 메시지가 표시될 때 컴퓨터가 느려질 수 있습니까?
 

어째서인지 이벤트 처리 전 기간이 기억나지 않는데 어디서 해야 하나요?

메시지를 따르기로 결정했는데 한 번의 클릭으로 CHARTEVENT_CHART_CHANGE가 2번 처리되고 ctime 변수가 재설정되는 것으로 나타났습니다.


#속성엄격

#속성 표시기_차트_창

정수 시간;


무효 OnInit()

{

Print(" OnInit------------1 ", ChartPeriod(0));

Print("OnInit ctime = ", ctime);

// ctime=ChartPeriod(0);

}


int OnCalculate(const int rate_total,

const int prev_calculated,

const 날짜/시간 및 시간[],

const 이중 및 열기[],

const 더블 & 하이[],

const 더블 & 로우[],

const 이중 및 닫기[],

const long &tick_volume[],

const 긴 볼륨[],

const int &spread[])

{

ctime=ChartPeriod(0);

반환(요금 합계);

}

무효 OnChartEvent(const int id,

const long &lparam,

const 이중 &dparam,

const 문자열(&sparam)


{


if(id==CHARTEVENT_CHART_CHANGE)

{

Print("CHARTEVENT_CHART_CHANGE 시작 ctime=", ctime);

if(ctime!=ChartPeriod(0))

{

Print(ChartPeriod(0), "변경됨!!!!!!!!!!!!!!!!", ctime);

}

}

}



시계에 표시기를 추가한 다음 데일리로 전환

2018.10.05 01:04:45.171 _t1 CADJPY,매일: CHARTEVENT_CHART_CHANGE 시작 ctime=1440

2018.10.05 01:04:45.156 _t1 CADJPY,일일: 1440 변경되었습니다!!!!!!!!!!!!!!!!! 0

2018.10.05 01:04:45.156 _t1 CADJPY,매일: CHARTEVENT_CHART_CHANGE 시작 ctime=0

2018.10.05 01:04:45.156 _t1 CADJPY,일일: 초기화됨

2018.10.05 01:04:45.156 _t1 CADJPY, 매일: OnInit ctime = 0

2018.10.05 01:04:45.156 _t1 CADJPY,일일: OnInit-----------1 1440

2018.10.05 01:04:45.156 _t1 CADJPY,H1: 단위 이유 3

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE 시작 ctime=60

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 60 변경되었습니다!!!!!!!!!!!!!!!!! 0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: CHARTEVENT_CHART_CHANGE가 시작됨 ctime=0

2018.10.05 01:02:02.000 _t1 CADJPY,H1: 초기화됨

2018.10.05 01:02:02.000 _t1 CADJPY,H1: OnInit ctime = 0

2018.10.05 01:02:02.000 _t1 CADJPY, H1: OnInit------------1 60

2018.10.05 01:02:01.078 사용자 지정 표시기 _t1 CADJPY,H1: 성공적으로 로드됨





 
psyman :

어째서인지 이벤트 처리 전 기간이 기억나지 않는데 어디서 해야 하나요?

메시지를 따르기로 결정했는데 한 번의 클릭으로 CHARTEVENT_CHART_CHANGE가 2번 처리되고 ctime 변수가 재설정되는 것으로 나타났습니다.

메시지에 올바른 코드를 붙여넣으세요! 이렇게 읽기가 너무 어렵습니다. 이렇게 해야 합니다.

 #property strict
#property indicator_chart_window
int ctime;
void OnInit ()
   {
     Print ( "  OnInit------------1  " , ChartPeriod ( 0 ));
     Print ( "OnInit ctime = " , ctime);
   //  ctime=ChartPeriod(0);   
   }
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[])
  {
   ctime= ChartPeriod ( 0 );         
   return (rates_total);
  }
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam)
{
   if (id== CHARTEVENT_CHART_CHANGE )
      {
       Print ( "CHARTEVENT_CHART_CHANGE     is started  ctime=" , ctime);
       if (ctime!= ChartPeriod ( 0 ))
      {
       Print ( ChartPeriod ( 0 ), "  CHANGED!!!!!!!!!!!!!!!   " , ctime);
      }
      } 
}

차트 매개변수가 변경되면 표시기가 강제로 다시 로드됩니다. 초기화 해제 이유 및 이유 변수에 대한 문서를 읽으십시오.

터미널 전역 변수를 사용하여 필요한 매개변수를 저장할 수 있습니다.

 
Vitaly Gorbunov :

메시지에 올바른 코드를 붙여넣으세요! 이렇게 읽기가 참 어렵습니다. 이렇게 해야 합니다.

차트 매개변수가 변경되면 표시기가 강제로 다시 로드됩니다. 초기화 해제 이유 및 이유 변수에 대한 문서를 읽으십시오.

터미널 전역 변수를 사용하여 필요한 매개변수를 저장할 수 있습니다.

네, GlobalVariable에 값을 저장한 다음, 처음에 그 존재를 확인해야 합니다.

즉, 차트 번호, 기호, 기간을 저장해야 합니다.
그렇다면 불필요한 변수를 삭제하거나 초기에 임시 전역 변수 로 만드십시오.

추신. 차트의 개체에 정보를 저장할 수도 있습니다. 차트가 있는 동안 개체가 있습니다.

 

훨씬 수월할 것 같아요 :-)

그런 다음 완전히 유치한 질문입니다. 내 코드는 거래 또는 그래픽을 의미하지 않습니다. 어떤 유형의 프로그램을 사용하는 것이 더 낫습니까?

스크립트는 일회용이지만 한 주기로 실행할 수 있습니까? Expert Advisors를 사용한 적이 없기 때문에 순전히 관성 으로 사용자 지정 지표를 선언했습니다 . 그러나 자체 재부팅되는 것으로 나타났습니다. 전혀 필요하지 않다는 점을 고려해야합니다. 일반적으로 조언하십시오.

추신

시각적으로 방해가 되지 않도록 개체의 크기를 0으로 만들 수 있습니까?

사유: