Tüm işlemlerin tablosu. MQL5 üzerinden erişim

 

İşlem tablosunun makbuzu nasıl düzenlenir? Şimdilik, göstergeden veya Uzman Danışmandan fark etmez. Periyodik olarak (OnTimer() veya OnTick() içinde), tiklerin geçmişi CopyTicks aracılığıyla alınırsa, bunlar MqlTick dizisine eklenecektir.

Ancak bu dizinin basit bir analizi, yeni işlemler olup olmadığına dair bir cevap vermeyecektir, çünkü bir milisaniyede birkaç işlem olabileceğinden, tıklama zamanını karşılaştırmak her zaman doğru değildir:

tiki

 
Karputov Vladimir :

İşlem tablosunun makbuzu nasıl düzenlenir? Göstergeden veya danışmandan henüz önemli değil. Periyodik olarak (OnTimer() veya OnTick() içinde), tiklerin geçmişi CopyTicks aracılığıyla alınırsa, bunlar MqlTick dizisine eklenecektir.

Ancak bu dizinin basit bir analizi, yeni işlemler olup olmadığına dair bir cevap vermeyecektir, çünkü bir milisaniyede birkaç işlem olabileceğinden, tıklama zamanını karşılaştırmak her zaman doğru değildir:

onBookEvent() olayını kullanın, sipariş defterindeki her değişiklikte tetiklenir.

 
Karputov Vladimir :

İşlem tablosunun makbuzu nasıl düzenlenir? Şimdilik, göstergeden veya Uzman Danışmandan fark etmez. Periyodik olarak (OnTimer() veya OnTick() içinde), tiklerin geçmişi CopyTicks aracılığıyla alınırsa, bunlar MqlTick dizisine eklenecektir.

Ancak bu dizinin basit bir analizi, yeni işlemler olup olmadığına dair bir cevap vermeyecektir, çünkü bir milisaniyede birkaç işlem olabileceğinden, tıklama zamanını karşılaştırmak her zaman doğru değildir:

Saniye kullanın. Örneğin, MqlTick'te ve hatta OnEvent'te, son saniyede alınan yeni onay işaretlerini bir diziye kopyalayın. Önceki depolanan değer ile mevcut dizi boyutu arasındaki fark, yeni onayların sayısını gösterecektir.
 
prostotrader :

onBookEvent() olayını kullanın, sipariş defterindeki her değişiklikte tetiklenir.

Sipariş defteri, kabaca, "tik grafiğinin seğirmesi"dir - bu, tüm işlemlerin tablosunda mutlaka bir değişiklik değildir.

Vasili Sokolov :
Saniye kullanın. Örneğin, MqlTick'te ve hatta OnEvent'te, son saniyede alınan yeni onay işaretlerini bir diziye kopyalayın. Önceki depolanan değer ile mevcut dizi boyutu arasındaki fark, yeni onayların sayısını gösterecektir.
Maske gibi bir şey yapın: 0-1-0-1 ve maske yaklaşık beş ila on satır arasında sabitse - bu garantili bir eşleşme anlamına mı geliyor?
 
Karputov Vladimir :

Sipariş defteri, kabaca, "tik grafiğinin seğirmesi"dir - bu, tüm işlemlerin tablosunda mutlaka bir değişiklik değildir.


Biraz düşünürseniz, kesinlikle tüm fırsatlar olacaktır.

İşte "Tüm işlemlerin kaydı" göstergesinin basit bir örneği

 //+------------------------------------------------------------------+
//|                                                    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 :

Biraz düşünürseniz, kesinlikle tüm fırsatlar olacaktır.

İşte "Tüm işlemlerin kaydı" göstergesinin basit bir örneği


Çalıştırılamadı:

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

Hata

 
Karputov Vladimir :

Çalıştırılamadı:

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 :

Sipariş defteri, kabaca, "tik grafiğinin seğirmesi"dir - bu, tüm işlemlerin tablosunda mutlaka bir değişiklik değildir.

Maske gibi bir şey yapın: 0-1-0-1 ve maske yaklaşık beş ila on satır arasında sabitse - bu garantili bir eşleşme anlamına mı geliyor?
Evet.
 

Vladimir Karputov

Tam özellikli bir gösterge "Tüm işlemlerin kaseti" veriyorum

 //+------------------------------------------------------------------+
//|                                                    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 :

Karputov Vladimir

Tam özellikli bir gösterge "Tüm işlemlerin kaseti" veriyorum

Peki, teşekkürler !! geçen gün bu fikir hakkında kafamda daire çizdi
 
Bir hata buldu ve işi optimize etti.
Dosyalar:
DealsLent.mq5  6 kb
Neden: