Часы реального времени MQL4 (секунда за секундой) - страница 3

 
brewmanz:

А) Не пытайтесь использовать MT4 в качестве часов реального времени. Это похоже на то, как заставить собаку ходить на задних лапах - интересно посмотреть, как это делается, но на самом деле ничего особенного не достигается.

Б) Почему так важно обрабатывать каждую секунду? Если ничего особенного не происходит с тиками, то ничего особенного не происходит и с ценами.

(Каждый комментарий стоит 1 цент)


А) Почему бы и нет! Это просто время компьютера или сервера
; я думаю, мы можем получать информацию точно.

Б) Почему это критично ... дайте подумать - высокочастотная торговля - не основана на асинхронной информации, где тик за тиком! это должно быть веской причиной, я думаю.

Я все еще жду свои 2 цента.

 
Ais:

Справочник MQL4 : https://docs.mql4.com/runtime/start: "Скрипты и эксперты работают в собственном потоке. Пользовательские индикаторы работают в основном потоке интерфейса."


То есть ваш индикатор отображает время на интерфейсе пользователя в GUI ? в реальном времени / секунда за секундой.
 

Для работы "секунда за секундой" мы используем функцию "Sleep()".

Для этого мы измеряем время выполнения основной программы.

Например, пусть время выполнения будет храниться в переменной "int Runtime;", и пусть "RunTime < 1000".

Тогда мы вызываем функцию "Sleep (1000 - RunTime) ;", чтобы убедиться, что следующий запуск произойдет через 1000 мс, с заданной точностью, конечно.

Но.

MQL4 Reference : https://docs.mql4.com/common/Sleep: "Функция Sleep() не может быть вызвана из пользовательских индикаторов, так как они вычисляют в потоке интерфейса и не могут его замедлить."

 

Простое решение:

Включите расчеты в свой советник, и все будет в порядке.

Плюсы:

Нет необходимости вызывать icustom

Нет индикатора

Минусы:

Нет индикатора. Но для высокочастотной торговли вы *должны* использовать советника, потому что люди слишком медлительны.

 

Понятия "высокочастотный" и "низкочастотный" немного отличаются.

Кроме того, визуализации часто используются для анализа или мониторинга, а не только для торговли.

 
Ais:

Понятия "высокочастотный" и "низкочастотный" немного отличаются.

Кроме того, визуализации часто используются для анализа или мониторинга, а не только для торговли.

Если вам действительно нужен мониторинг, вы можете перестроить поведение индикатора с помощью линий. Конечно, высокая производительность - это нечто другое.

 

Что если мы хотим анализировать и отслеживать события на основе временных интервалов?
Например, каждые 1 секунду.

 
Ais:

Что если мы хотим анализировать и отслеживать события на основе временных интервалов?
Например, каждые 1 секунду.

Как только вы заговорили о тике за тиком, вы имеете в виду сверхвысокую частоту .... .

'Analysis of ultra-high-frequency financial data using advanced Fourier transforms' (2009) Finance Research Letters Vol 6, pp 47-53 (with 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);
  }
легко перекодируется в советника для использования соответствующей функции сна. Уже сделал это.
 
zzuegg:
легко перекодируется в советника, чтобы использовать правильную функцию сна. Уже сделал это.


Хорошая программа. TimeCurrent() - это цена тика за тиком, которая нам нужна для получения компьютерной цены!

Может мы сможем создать синтетические часы хотя б на основе примера?

if(Time[0]!=t.r){
t.r=Time[0];
redraw();

подскажите! zzuegg :)