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

 

안녕하세요!

코드 자체에서 코드 컴파일을 설정할 수 있습니까? 고맙습니다.

 

마우스 매개변수와 휠을 클릭할 때 4자의 가격이 있는 레이블을 주석에 표시합니다.

휠을 누르고 있는 동안에는 커서 뒤에 마크가 표시되지만 마우스 LC를 누르기 전에 휠을 놓으면 동일한 일이 발생하지 않습니다.

이해하도록 도와주세요.


 //+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
void OnInit () 
  { 
//--- включение сообщений о перемещении мыши по окну чарта 
   ChartSetInteger ( 0 , CHART_EVENT_MOUSE_MOVE , 1 ); 
//--- принудительное обновление свойств графика гарантирует готовность к обработке событий 
   ChartRedraw (); 
  } 
//+------------------------------------------------------------------+ 
//| MouseState                                                       | 
//+------------------------------------------------------------------+ 

string xlabel= "Bid" ;
input color xcolor = clrCrimson ;

string MouseState( uint state) 
  { 
   string res; 
   res+= "\nML: "    +(((state& 1 )== 1 )? "DN" : "UP" );   // mouse left 
   res+= "\nMR: "    +(((state& 2 )== 2 )? "DN" : "UP" );   // mouse right  
   res+= "\nMM: "    +(((state& 16 )== 16 )? "DN" : "UP" );   // mouse middle 
   res+= "\nMX: "    +(((state& 32 )== 32 )? "DN" : "UP" );   // mouse first X key 
   res+= "\nMY: "    +(((state& 64 )== 64 )? "DN" : "UP" );   // mouse second X key 
   res+= "\nSHIFT: " +(((state& 4 )== 4 )? "DN" : "UP" );   // shift key 
   res+= "\nCTRL: " +(((state& 8 )== 8 )? "DN" : "UP" );   // control key 
   res+= "\nBID" + DoubleToString ( SymbolInfoDouble ( Symbol (), SYMBOL_BID ), _Digits - 1 );
   return (res); 
  }
   
//+------------------------------------------------------------------+ 
//| ChartEvent function                                              | 
//+------------------------------------------------------------------+ 
void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam) 
  { 
  
int x=( int )lparam; 
int y=( int )dparam; 
datetime dt    = 0 ; 
double    price = 0 ;
int       window= 0 ;

   if (id== CHARTEVENT_MOUSE_MOVE ) 
       Comment ( "POINT: " ,( int )lparam, "," ,( int )dparam, "\n" ,MouseState(( uint )sparam)); 

   if (sparam == "16" )
      {
         
       if (! ObjectCreate ( 0 , xlabel, OBJ_LABEL , 0 , 0 , 0 ));
       //ObjectCreate(0, xlabel, OBJ_LABEL,0, 0, 0);
       ObjectSetInteger ( 0 , xlabel, OBJPROP_XDISTANCE , 100 );
           ObjectSetInteger ( 0 , xlabel, OBJPROP_YDISTANCE , dparam+ 7 );
       ChartXYToTimePrice ( 0 ,x,y,window,dt,price);
       ObjectSetString ( 0 , xlabel, OBJPROP_TEXT , DoubleToString (price, _Digits - 1 ));
      }
      
      
   /*  while(sparam !="1")
      {
         ObjectMove(0,xlabel,0,lparam,dparam+7);      
      }
  */
  }
  
void OnDeinit ( const int reason) 
   { 
       Comment ( "" );
       ObjectDelete ( 0 ,xlabel);
   } 
 
psyman :

마우스 매개변수와 휠을 클릭할 때 4자의 가격이 있는 레이블을 주석에 표시합니다.

휠을 누르고 있는 동안에는 커서 뒤에 마크가 표시되지만 마우스 LC를 누르기 전에 휠을 놓으면 동일한 일이 발생 하지 않습니다.

제거(주석 제거)
// if(sparam =="16")

 
Taras Slobodyanik :

제거(주석 제거)
// if(sparam =="16")


그러면 레이블이 항상 화면에 표시되지만 휠을 누른 후에만 나타나려면 레이블이 필요합니다.



추신

당신의 대답은 나에게 올바른 아이디어를주었습니다. 감사합니다 :-)

 
psyman :

마우스 매개변수와 휠을 클릭할 때 4자의 가격이 있는 레이블을 주석에 표시합니다.

휠을 누르고 있는 동안에는 커서 뒤에 레이블이 표시되지만 마우스 LC를 누르기 전에 휠에서 손을 떼면 동일한 일이 발생하지 않습니다.

이해하도록 도와주세요.


 if (label)
{
   //применение изменяющихся параметров(перемещение и прочее)
}
if (sparam == "16" )
{
   label = true ;
   //создание метки и настройка неизменяющихся параметров метки
}
if (sparam == "1" ) // или какой там символ у ЛК мыши
{
   label = false ;
   //удаление/скрытие метки, если нужно
}

bool 유형의 레이블

 
Ilya Prozumentov :

bool 유형의 레이블

레이블이 생성되기 전에 이동을 수행할 수 있습니까?


이제 또 다른 질문이 생겼습니다. 레이블을 화면 오른쪽에 바인딩하고 싶습니다. 이것은 OnCalculate에서 계산됩니다.

 int width = ( int ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS , 0 );

ObjectSetInteger ( 0 , objname, OBJPROP_XDISTANCE , width); 

Print (width);

어떤 이유로 인해 가장 왼쪽 위치에 있는 반면 다른 레이블에 대한 OnChartEvent의 동일한 계산은 올바른 결과를 제공합니다.

카운트 반전이 켜진 이유는 무엇입니까?

 
psyman :

레이블이 생성되기 전에 이동을 수행할 수 있습니까?


이제 또 다른 질문이 생겼습니다. 레이블을 화면 오른쪽에 바인딩하고 싶습니다. 이것은 OnCalculate에서 계산됩니다.

어떤 이유로 인해 가장 왼쪽 위치에 있는 반면 다른 레이블에 대한 OnChartEvent의 동일한 계산은 올바른 결과를 제공합니다.

카운트 반전이 켜진 이유는 무엇입니까?

label은 초기에 false로 설정되어 있으므로 레이블을 이동하는 코드는 실행되지 않습니다. 그러나 레이블이 생성되기 전에 실행되더라도 아무 일도 일어나지 않고 프로그램은 계속 작동하며 생성된 레이블은 영향을 받지 않습니다.

앵커 포인트 를 참조하십시오 . 포인트가 다르기 때문에 결과가 다릅니다. 너비 대신 0을 즉시 쓰려고 시도할 수 있으며, 정상적으로 작동하면 앵커 포인트에 있는 것입니다.

OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
OBJ_LABEL - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL4
  • docs.mql4.com
Следующий скрипт создает и перемещает на графике объект "Текстовая метка". Для создания и изменения свойств графического объекта написаны специальные функции, которые вы можете использовать "как есть" в своих собственных программах. //| Создает текстовую метку                                          |...
 
Ilya Prozumentov :

label은 초기에 false로 설정되어 있으므로 레이블을 이동하는 코드는 실행되지 않습니다. 그러나 레이블이 생성되기 전에 실행되더라도 아무 일도 일어나지 않고 프로그램은 계속 작동하며 생성된 레이블은 영향을 받지 않습니다.

앵커 포인트 를 참조하십시오 . 포인트가 다르기 때문에 결과가 다릅니다. 너비 대신 0을 즉시 쓰려고 시도할 수 있으며, 정상적으로 작동하면 앵커 포인트에 있는 것입니다.

앵커 포인트가 없고 수직 이동만 있고 화면 너비를 통해 수평을 한 번 설정합니다. 다른 쪽에서 세는 것은 문제가 아니지만 다른 기능에서 동일한 작업이 다르게 수행되는 것은 놀라운 일입니다.


그리고 또 다른 질문이 있습니다. Bid가 레이블의 텍스트로 표시되는 경우 OnChartEvent 또는 OnCalculate 중 어떤 기능에서 이 작업을 수행하는 것이 더 적합합니까?

 
novichok2018 :

안녕하세요!

코드 자체에서 코드 컴파일을 설정할 수 있습니까? 고맙습니다.

아무도 대답하지 않기 때문에 질문이 어리석은 것일 수 있지만 고문의 작업을 중지하고 컴파일 후 다시 시작하는 방법은 무엇입니까?

플랫폼이 메시지를 발행합니다: 배열이 범위를 벗어났습니다(284,17).

284행: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); 위치 17은 NomNews(고양이)로 대괄호를 엽니다. 글로벌 시작 0.  

0에서 1로 변경되어 아무 소용이 없습니다.
if(NomNews==300)break; 줄에서 변경됨 300 이상 360,000, 아무 소용이 없습니다.

나는 컴파일 - 몇 분 동안 잘 작동합니다. 그리고 무엇을 해야 할까요?

 
novichok2018 :

아무도 대답하지 않기 때문에 질문이 어리석은 것일 수 있지만 고문의 작업을 중지하고 컴파일 후 다시 시작하는 방법은 무엇입니까?

플랫폼이 메시지를 발행합니다: 배열이 범위를 벗어났습니다(284,17).

284행: NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh); 위치 17은 NomNews, cat으로 대괄호를 엽니다. 글로벌 시작 0.  

0에서 1로 변경되어 아무 소용이 없습니다.
if(NomNews==300)break; 줄에서 변경됨 300 이상 360,000, 아무 소용이 없습니다.

나는 컴파일 - 몇 분 동안 잘 작동합니다. 그리고 무엇을 해야 할까요?

두 번째 차원에서 NewsArr 배열의 차원은 얼마입니까?