MQL4 실시간 클록(초 단위) - 페이지 3

 
brewmanz :

A) MT4를 실시간 시계로 사용하지 마십시오. 이것은 개가 뒷다리로 걷게 하는 것과 비슷합니다. 완성되는 것을 보는 것은 흥미롭지만 실제로는 많은 것을 성취하지 못합니다.

B) 1초를 처리하는 것이 왜 그렇게 중요한가요? 진드기에 대해 아무 일도 일어나지 않는다면 가격에는 아무 일도 일어나지 않는 것입니다.

(각 댓글의 가치는 1센트)


A) 왜 안 돼! PC 또는 서버 시간입니다 . 정확한 정보를 얻을 수 있을 것 같습니다.

B) 그것이 왜 중요한지 ... 보자- 고주파 거래 - 틱 바이 틱이 아닌 비동기 정보를 기반으로하지 않습니다! 그것이 타당한 이유라고 생각합니다.

나는 아직도 나의 2센트를 기다리고 있다.

 
Ais :

MQL4 참조: https://docs.mql4.com/runtime/start : "스크립트와 전문가는 자체 스레드에서 작동합니다. 사용자 지정 표시기는 기본 인터페이스 스레드에서 작동합니다."


따라서 표시기는 GUI의 사용자 인터페이스에 시간을 표시합니까? 실시간 / 초 단위.
 

"초 단위로" 작업하려면 "Sleep()" 함수를 사용합니다.

이를 위해 메인 루틴의 실행 시간을 측정합니다.

예를 들어, 런타임은 변수 "int Runtime;"에 저장되고 let 런타임은 "RunTime < 1000"입니다.

그런 다음 "Sleep (1000 - RunTime) ;"을 호출합니다. 물론 주어진 정밀도로 다음 실행이 1000ms 내에 발생하는지 확인합니다.

하지만.

MQL4 참조: https://docs.mql4.com/common/Sleep : "사용자 지정 표시기에서 Sleep() 함수를 호출할 수 없습니다. 인터페이스 스레드에서 계산하고 감속할 수 없기 때문입니다."

 

간단한 솔루션:

EA에 계산을 포함하면 괜찮습니다.

장점:

icustom을 호출 할 필요가 없습니다.

표시 없음

단점:

표시기가 없습니다. 그러나 고주파 거래의 경우 사람이 느려지기 때문에 *반드시* EA를 사용해야 합니다.

 

"고주파"와 "저지연"은 약간 다릅니다.

그리고 시각화는 거래뿐만 아니라 분석이나 모니터링에 자주 사용됩니다.

 
Ais :

"고주파"와 "저지연"은 약간 다릅니다.

그리고 시각화는 거래뿐만 아니라 분석이나 모니터링에 자주 사용됩니다.

모니터링이 정말로 필요한 경우 행을 사용하여 표시기 동작을 다시 작성할 수 있습니다. 물론 고성능은 다릅니다.

 

이벤트를 시간 간격으로 분석하고 모니터링하려면 어떻게 해야 합니까?
예를 들어 1초마다.

 
Ais :

이벤트를 시간 간격으로 분석하고 모니터링하려면 어떻게 해야 합니까?
예를 들어 1초마다.

틱 바이 틱에 대해 이야기하자마자 초고주파를 의미한다....

'고급 푸리에 변환을 사용한 초고주파 금융 데이터 분석'(2009) Finance Research Letters Vol 6, pp 47-53 (with I.Giampaoli 및 WLNg)

미리 정의된 간격의 샘플링은 T<t인 고주파수 샘플링으로 정의할 수 있습니다.

 
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 Black
#property indicator_color2 Black
#property indicator_color3 Red
#property indicator_color4 Blue
#property indicator_color5 Red
#property indicator_color6 Red
#property indicator_color7 Red
#property indicator_color8 Red
//---- buffers
double open[];
double close[];
double high[];
double low[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double ExtMapBuffer7[];
double ExtMapBuffer8[];
 
extern int MaxHistory= 200 ;
extern int TimeInSeconds= 5 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
double a.open[];
double a.close[];
double a.high[];
double a.low[];
 
int init()
  {
//---- indicators
   SetIndexStyle( 0 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 0 ,high);
   SetIndexStyle( 1 , DRAW_HISTOGRAM );
   SetIndexBuffer ( 1 ,low);
   SetIndexStyle( 2 , DRAW_HISTOGRAM , STYLE_SOLID , 5 );
   SetIndexBuffer ( 2 ,open);
   SetIndexStyle( 3 , DRAW_HISTOGRAM , STYLE_SOLID , 5 );
   SetIndexBuffer ( 3 ,close);
   SetIndexStyle( 4 , DRAW_LINE );
   SetIndexBuffer ( 4 ,ExtMapBuffer5);
   SetIndexStyle( 5 , DRAW_LINE );
   SetIndexBuffer ( 5 ,ExtMapBuffer6);
   SetIndexStyle( 6 , DRAW_LINE );
   SetIndexBuffer ( 6 ,ExtMapBuffer7);
   SetIndexStyle( 7 , DRAW_LINE );
   SetIndexBuffer ( 7 ,ExtMapBuffer8);
   ArrayResize (a.high,MaxHistory);
   ArrayResize (a.low,MaxHistory);
   ArrayResize (a.open,MaxHistory);
   ArrayResize (a.close,MaxHistory);      
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void redraw(){
   for ( int i= 200 ;i>= 0 ;i--){
       if (i== 200 ){
      open[i]= 0 ;
      close[i]= 0 ;
      high[i]= 0 ;
      low[i]= 0 ;
      } else {
      open[i]=a.open[i];
      close[i]=a.close[i];
      high[i]=a.high[i];
      low[i]=a.low[i];      
      }
   }
}
 
void shift(){
   for ( int i= 200 ;i> 0 ;i--){
      a.open[i]=a.open[i- 1 ];
      a.close[i]=a.close[i- 1 ];
      a.high[i]=a.high[i- 1 ];
      a.low[i]=a.low[i- 1 ];
   }
}
 
extern int sleep= 100 ;
int start()
  {
   int     counted_bars=IndicatorCounted();
//----
   bool running=true;
   static double price= 0 ;
   static int t= 0 ;
   static datetime t.r= 0 ; 
   static bool updates=false;
   //t=TimeCurrent();
   //while(running){
      updates=false;
       if ( TimeCurrent ()>(t+TimeInSeconds)){
 
         shift();
         if (a.open[ 1 ]==EMPTY || a.open[ 1 ]== EMPTY_VALUE || a.open[ 1 ]== 0 ){
            a.open[ 0 ]=Bid;
            a.close[ 0 ]=Bid;
            a.high[ 0 ]=Bid;
            a.low[ 0 ]=Bid;
         } else {
         a.open[ 0 ]=a.close[ 1 ];
         a.high[ 0 ]=a.close[ 1 ];
         a.low[ 0 ]=a.close[ 1 ];
         a.close[ 0 ]=a.close[ 1 ];
         }
         Print ( "shift " +a.open[ 0 ]+ " - " +a.open[ 1 ]);
         updates=true;
         t= TimeCurrent ();
      }
       if (price!=Bid){
            price=Bid;
            a.close[ 0 ]=price;
            a.high[ 0 ]= MathMax (price,a.high[ 0 ]);
            a.low[ 0 ]= MathMin (price,a.low[ 0 ]);
            updates=true;
      }       
       if (Time[ 0 ]!=t.r){
         t.r=Time[ 0 ];
         redraw();
      } else {
         if (updates){
            redraw();
         }
      }
       if ( IsStopped ()) running=false;
   //   Sleep(sleep);
   //}
//----
   return ( 0 );
  }
적절한 수면 기능 을 사용하기 위해 EA로 쉽게 다시 코딩할 수 있습니다. 이미 했습니다.
 
zzuegg :
적절한 수면 기능을 사용하기 위해 EA로 쉽게 다시 코딩할 수 있습니다. 이미 했습니다.


좋은 프로그램 . TimeCurrent()는 컴퓨터 가격을 얻는 데 필요한 틱 단위 가격입니다!

예를 들어 다음과 같이 합성 시계를 만들 수 있습니다.

if (시간[ 0 ]!=tr){
tr=시간[ 0 ];
다시 그리기();

힌트를 주세요! 쭈에그 :)