あらゆる取引のテーブル。MQL5経由でのアクセス

 

トレーディングテーブルの入手方法を教えてください。今のところ、インジケーターやExpert Advisorは関係ありません。定期的に(OnTimer()またはOnTick()で)CopyTicksを通してtickの履歴を受け取る場合、それらは配列MqlTickに 追加されることになります。

なぜなら、ティックタイムの比較は常に正しいとは限らず、1ミリ秒の間に複数の取引がある可能性もあるからです。

ティキ

 
Karputov Vladimir:

トレーディングテーブルの入手方法を教えてください。今のところ、インジケーターやExpert Advisorは関係ありません。定期的に(OnTimer()またはOnTick()で)CopyTicksを通してtickの履歴を受け取る場合、それらは配列MqlTickに 追加されることになります。

なぜなら、ティックタイムの比較は常に正しいとは限らず、1ミリ秒の間に複数の取引がある可能性もあるからです。

onBookEvent()イベントを使用します - マーケットの変更ごとにトリガーされます。

 
Karputov Vladimir:

トレーディングテーブルの入手方法を教えてください。今のところ、インジケーターやExpert Advisorは関係ありません。定期的に(OnTimer()またはOnTick()で)CopyTicksを通してtickの履歴を受け取る場合、それらは配列MqlTickに 追加されることになります。

なぜなら、ティックタイムの比較は常に正しいとは限らず、1ミリ秒の間に複数の取引がある可能性もあるからです。

セカンドカットオフを使用する。例えば、MqlTickやOnEventの中で、最後の1秒間に到着した新しいticksを配列にコピーします。前の値と配列の現在のサイズとの差は、新しい目盛りの数を示します。
 
prostotrader:

onBookEvent()イベントを使用すると、レートが変更されるたびにトリガーされます。

カップは大雑把に言うと「ティックチャートのヒネリ」であり、必ずしも全トレードの表が変わるわけではない。

ワシリー・ソコロフ
第2カットオフを使用する。例えば、MqlTickやOnEventの中で、最後の1秒間に受け取った新しいtickを配列にコピーします。前の値と配列の現在のサイズとの差は、新しい目盛りの数を示します。
マスク:0-1-0-1とかやって、5行と10行くらいで安定してれば一致確定?
 
Karputov Vladimir:

ベットとは、乱暴に言えば「ティックチャートのひねり」であり、必ずしも全取引の表が変わるわけではありません。


少し考えれば、オールトレードがあるに決まっている。

以下は、All Trades Tapeインジケータの簡単な例です。

//+------------------------------------------------------------------+
//|                                                    DealsLent.mq5 |
//|                                     Copyright 2016, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
input int  Ticks     = 100; //Тики 

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_plots   2

//--- plot Label1
#property  indicator_label1  "Sell"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- plot Label1
#property  indicator_label2  "Buy"
#property  indicator_type2   DRAW_LINE
#property  indicator_color2  clrBlue
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  1
//--- indicator buffers
double SellBuffer[];
double BuyBuffer[];
double sell_deals;
double buy_deals;
long curr_time;
int event_cnt;
bool on_call;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   curr_time=0;
   if(!MarketBookAdd(Symbol()))
     {
      Print(__FUNCTION__,": Стакан символа "+Symbol()+" не добавден!");
      return( INIT_FAILED );
     }
//--- Period 
   if(Period()!=PERIOD_M1)
     {
      Print("Ошибка! Период графика должен быть 'M1'");
      return( INIT_FAILED );
     }
//---  
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent");
//---  
   SetIndexBuffer(0,SellBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(SellBuffer,true);
//---
   SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(BuyBuffer,true);
//--- 
   event_cnt=0;
   on_call=false;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   if(reason==REASON_INITFAILED)
     {
      int window=ChartWindowFind(ChartID(),"DealsLent");
      ChartIndicatorDelete(ChartID(),window,"DealsLent");
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator On book event function                          |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   MqlTick ticks[];
   if(symbol==Symbol())
     {
      if(curr_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            curr_time=ticks[0].time_msc;
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,Ticks)==Ticks)
           {
            for(int i=0; i<Ticks; i++)
              {
               if(ticks[i].time_msc!=curr_time)
                 {
                  if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                    {
                     buy_deals++;
                    }
                  else
                  if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                    {
                     sell_deals++;
                    }
                 }
              }
           }
         curr_time=ticks[0].time_msc;
         double price[];
         on_call=true;
         OnCalculate(event_cnt,event_cnt,0,price);
        }
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   if(prev_calculated==0)
     {
      ArrayInitialize(SellBuffer,EMPTY_VALUE);
      ArrayInitialize(BuyBuffer,EMPTY_VALUE);
     }
   else
     {
      if(rates_total==event_cnt)
        {
         if(on_call)
           {
            on_call=false;
            //---        
            for(int i=rates_total-1; i>0; i--)
              {
               SellBuffer[i]= SellBuffer[i-1];
               BuyBuffer[i] = BuyBuffer[i-1];
              }
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
        }
      else
        {
         if(on_call)
           {
            on_call=false;
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
         else
           {
            SellBuffer[0]= SellBuffer[1];
            BuyBuffer[0] = BuyBuffer[1];
           }
        }
     }
   event_cnt=rates_total;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
prostotrader:

少し考えれば、すべてのトレードがあるはずです。

All Trades Ribbonのインジケータの簡単な例を示します。


実行に失敗しました。

2016.08.24 15:54:41.700 DealsLent (RTS-12.16,M1)        array out of range in 'DealsLent.mq5' (118,25)

エラー

 
Karputov Vladimir:

起動に失敗しました。

void OnBookEvent(const string &symbol)
  {
   MqlTick ticks[];
   if(symbol==Symbol())
     {
      if(curr_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            curr_time=ticks[0].time_msc;
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,Ticks)==Ticks)
           {
            for(int i=0; i<Ticks; i++)
              {
               if(ticks[i].time_msc!=curr_time)
                 {
                  if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                    {
                     buy_deals++;
                    }
                  else
                  if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                    {
                     sell_deals++;
                    }
                 }
              }
             curr_time=ticks[0].time_msc; 
             double price[];
             on_call=true;
             OnCalculate(event_cnt,event_cnt,0,price);
           }
        }
     }
  }
 
Karputov Vladimir:

ベットとは、乱暴に言えば「ティックチャートのひねり」であり、必ずしも全取引の表が変わるわけではありません。

マスクのようなものを行う:0-1-0-1、マスクは約5と10行で安定している場合 - それは保証された一致を意味する?
はい。
 

カルプトフ ウラジミール

フル装備の「All Trades Feed」インジケーター

//+------------------------------------------------------------------+
//|                                                    DealsLent.mq5 |
//|                                     Copyright 2016, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property  indicator_label1  "Sell"
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  clrRed
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  1
//--- plot Label1
#property  indicator_label2  "Buy"
#property  indicator_type2   DRAW_LINE
#property  indicator_color2  clrBlue
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  1
//--- indicator buffers
double SellBuffer[];
double BuyBuffer[];
double sell_deals;
double buy_deals;
ulong start_time;
int event_cnt;
bool on_call;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   start_time=0;
   if(!MarketBookAdd(Symbol()))
     {
      Print(__FUNCTION__,": Стакан символа "+Symbol()+" не добавден!");
      return( INIT_FAILED );
     }
//--- Bars
  int bars=Bars(Symbol(),PERIOD_CURRENT);
  if (bars<3)
  {
    Print(__FUNCTION__,": Не достаточно баров на текущем таймфрейме!");
    return( INIT_FAILED );
  }     
//---  
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent");
//---  
   SetIndexBuffer(0,SellBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(SellBuffer,true);
//---
   SetIndexBuffer(1,BuyBuffer,INDICATOR_DATA);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   ArraySetAsSeries(BuyBuffer,true);
//--- 
   event_cnt=0;
   on_call=false;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+  
void OnDeinit(const int reason)
  {
   MarketBookRelease(Symbol());
   if(reason==REASON_INITFAILED)
     {
      int window=ChartWindowFind(ChartID(),"DealsLent");
      ChartIndicatorDelete(ChartID(),window,"DealsLent");
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator On book event function                          |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   MqlTick ticks[];
   if(symbol==Symbol())
     {
      if(start_time==0)
        {
         if(CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,0,1)==1)
           {
            start_time=ulong(ticks[0].time_msc);
           }
        }
      else
        {
         sell_deals= 0;
         buy_deals = 0;
         int copied= CopyTicks(Symbol(),ticks,COPY_TICKS_ALL,start_time,0);
         if(copied>0)
           {
            for(int i=0; i<copied; i++)
              {
               if(( ticks[i].flags  &TICK_FLAG_BUY)==TICK_FLAG_BUY)
                 {
                  buy_deals++;
                 }
               else
               if(( ticks[i].flags  &TICK_FLAG_SELL)==TICK_FLAG_SELL)
                 {
                  sell_deals++;
                 }
              }
            start_time=ulong(ticks[copied - 1].time_msc);
            double price[];
            on_call=true;
            OnCalculate(event_cnt,event_cnt,0,price);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   if(prev_calculated==0)
     {
      ArrayInitialize(SellBuffer,EMPTY_VALUE);
      ArrayInitialize(BuyBuffer,EMPTY_VALUE);
     }
   else
     {
      if(rates_total==event_cnt)
        {
         if(on_call)
           {
            on_call=false;
            //---        
            for(int i=rates_total-1; i>0; i--)
              {
               SellBuffer[i]= SellBuffer[i-1];
               BuyBuffer[i] = BuyBuffer[i-1];
              }
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
        }
      else
        {
         if(on_call)
           {
            on_call=false;
            SellBuffer[0]= double(sell_deals);
            BuyBuffer[0] = double(buy_deals);
           }
         else
           {
            SellBuffer[0]= SellBuffer[1];
            BuyBuffer[0] = BuyBuffer[1];
           }
        }
     }
   event_cnt=rates_total;
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
prostotrader:

カルプトフ ウラジミール

フル装備の「All Trades Feed」インジケーター

ありがとうございます!この前思いついたんです。
 
エラーを発見し、動作を最適化しました。
ファイル:
DealsLent.mq5  6 kb
理由: