MQL4 リアルタイムクロック(秒単位) - ページ 3

 
brewmanz:

A) MT4をリアルタイムクロックとしてわざわざ使う必要はありません。犬に後ろ足で歩かせるようなもので、やっているのを見るのは面白いが、実際には大したことはできない。

B) なぜ、1秒1秒を処理することがそんなに重要なのですか?もし、刻みに何も起こっていないのなら、価格にも何も起こっていない。

(各コメントは1セントの価値あり)


A) なぜ、そうしてはいけないのでしょうか?PCの時間かサーバーの
時間か、どちらかだけで、正確な情報が得られると思うのですが。

B) なぜそれが重要な のか......えーと 高頻度取引 - ティックバイティックの非同期情報に基づいていない! それが正当な理由であるべきだと私は思います。

私はまだ私の2セントを待っています。

 
Ais:

MQL4 Reference :https://docs.mql4.com/runtime/start: "Scripts and experts work in their own thread.カスタム・インジケータはメイン・インターフェイス・スレッドで動作します。"


つまり、あなたのインジケータは、GUIでユーザーのInterfaceに時間を表示する? リアルタイム/秒単位で。
 

秒単位で動作させるために、「Sleep()」関数を使用します。

そのために、メインルーチンの実行時間を計測する。

たとえば、実行時間を変数「int Runtime;」に格納し、「RunTime < 1000」とする。

そして、"Sleep (1000 - RunTime) ;" を実行し、次の実行が1000ミリ秒後に行われることを確認します。もちろん、所定の精度で。

しかし

MQL4 Reference :https://docs.mql4.com/common/Sleep: "Sleep()関数は、インターフェイススレッドで計算し、それを減速させない可能性があるため、カスタムインジケータから呼び出すことはできません。"

 

簡単な解決方法です。

EAに計算を含めれば問題ありません。

長所

icustomを呼び出す 必要がない

インジケータがない

短所

インジケータがない。しかし、高フレックの取引では、人間は遅いので、EAを使用する必要があります*。

 

「高頻度」と「低遅延」は少し違います。

また、ビジュアライゼーションは、取引だけでなく、分析やモニタリングにもよく使われます。

 
Ais:

「高頻度」と「低遅延」は少し違います。

また、ビジュアライゼーションは、取引だけでなく、分析や監視にもよく使われます。

本当にモニタリングが必要な場合は、インジケータの動作をラインで再構築することができます。確かにハイパフォーマンスとは違うものです。

 

時間間隔でイベントを分析・監視したい場合はどうすればよいのでしょうか。
例えば、1秒ごとなど。

 
Ais:

時間間隔でイベントを分析、監視したい場合はどうすればよいでしょうか。
例えば、1秒ごとなど。

ティックバイティックの話をするとすぐに 超高周波を意味 します.

このような場合、「超高頻度の金融データの分析には、高度なフーリエ変換が必要」 (2009) Finance Research Letters Vol 6, pp 47-53 (I.Giampaoli and W.L.Ng と共同) となる。

あらかじめ定義された間隔でサンプリングすることは、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(Time[0]!=t.r){。
t.r=Time[0];
redraw();

ヒントをください! zzuegg :)