CustomTicksAdd

Kullanıcı-tanımlı bir sembol için MqlTick tipli bir diziden veri ekler. Kullanıcı-tanımlı sembol Piyasa Gözlemi penceresinde seçilmiş olmalıdır.

int  CustomTicksAdd(
   const string     symbol,             // Sembol ismi
   const MqlTick&   ticks[],            // Kullanıcı-tanımlı sembole yüklenebilecek tik verilerini içeren dizi
   uint             count=WHOLE_ARRAY   // kullanılacak ticks[] dizisi elemanlarının sayısı
   );

Parametreler

symbol

[in]  Kullanıcı-tanımlı sembolün ismi.

ticks[]

[in]   Geçmişten şimdiye doğru düzenlenmiş (k<n ise ticks[k].time_msc <= ticks[n].time_msc) verileri içeren MqlTick tipli dizi.

count=WHOLE_ARRAY

[in]  Ekleme için kullanılacak ticks[] dizisi elemanlarının sayısı. WHOLE_ARRAY, tüm ticks[] dizisi elemanlarının kullanılması gerektiği anlamına gelir.

Geri Dönüş Değeri

Eklenen tik verilerinin sayısı veya hata durumunda '-1'.

Notlar

CustomTicksAdd fonksiyonu sadece Piyasa Gözlemi penceresinde seçili olan kullanıcı-tanımlı sembol için çalışır. Sembol Piyasa Gözleminde seçili değilse, veri eklemek için CustomTicksReplace fonksiyonunu kullanmalısınız.

CustomTicksAdd fonksiyonu, tikleri broker'ın serverından iletmeye izin verir. Veriler doğrudan tik veritabanına yazılmak yerine Market İzleme penceresine gönderilir. Terminal daha sonra Market İzlemeden tikleri bir veritabanına kaydeder. Bir fonksiyon çağrısı sırasında iletilen veri miktarı büyükse, fonksiyonun davranışı, kaynak kullanımını azaltmak için değişir. Eğer 256'dan fazla tik oluşmuşssa, data 2 parçaya bölünür. İlki, örneğin büyük parça direkt olarak tik veritabanına yazdırılır (CustomTicksReplace'de olduğu gibi). 128 tiki içeren ikinci parça, terminalin verileri bir veritabanına kaydettiği yerden Market İzleme penceresine geçirilir.

MqlTick yapısının zaman değerli iki alanı vardır: time (saniye cinsinden tik zamanı) ve  time_msc (milisaniye cinsinden tik zamanı). Bunlar, 1 Ocak 1970'den itibaren sıralanmıştır. Eklenen tikler için bu alanlar şu sırayla işlenir:

  1. ticks[k].time_msc!=0 ise, veri ticks[k].time alanını doldurmak için kullanılır, yani ticks[k].time=ticks[k].time_msc/1000 (tamsayı bölümü) tik verisine uygulanır
  2. ticks[k].time_msc==0 ve ticks[k].time!=0 ise, milisaniye cinsi zaman değeri 1000 ile çarpılarak elde edilir (ticks[k].time_msc=ticks[k].time*1000)
  3. ticks[k].time_msc==0 ve ticks[k].time==0 ise, milisaniye cinsinden alım-satım sunucusunun zamanı CustomTicksAdd çağrısı yapıldığı an bu alanlara yazılır.

ticks[k].bid, ticks[k].ask, ticks[k].last veya ticks[k].volume sıfırdan büyükse, ticks[k].flags alanına ilgili bayrakların uygun bir kombinasyonu yazılır

  • TICK_FLAG_BID – tik verisi satış fiyatını değiştirdi
  • TICK_FLAG_ASK  – tik verisi alış fiyatını değiştirdi
  • TICK_FLAG_LAST – tik verisi son işlem fiyatını değiştirdi
  • TICK_FLAG_VOLUME – tik verisi hacmi değiştirdi

Alanlardan birinin değeri sıfır veya daha küçükse, karşılık gelen bayraklar ticks[k].flags alanına yazılmaz.

 

TICK_FLAG_BUY ve TICK_FLAG_SELL bayrakları kullanıcı-tanımlı sembol geçmişine eklenmez.

 

Örnek:

//+------------------------------------------------------------------+
//|                                               CustomTicksAdd.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
#define   CUSTOM_SYMBOL_NAME     Symbol()+".C"     // özel sembol adı
#define   CUSTOM_SYMBOL_PATH     "Forex"           // sembolün oluşturulacağı grubun adı
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()          // özel sembolün temel alınacağı sembolün adı
 
#define   DATATICKS_TO_COPY      UINT_MAX          // kopyalanan tik sayısı
#define   DATATICKS_TO_PRINT     20                // günlüğe gönderilen tik sayısı
 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- özel sembol oluştururken hata kodunu al
   int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAMECUSTOM_SYMBOL_PATHCUSTOM_SYMBOL_ORIGIN);
   
//--- hata kodu 0 değilse (başarılı sembol oluşturma) ve 5304 değilse (sembol zaten oluşturulmuş) - bırak
   if(create!=0 && create!=5304)
      return;
 
//--- standart sembol tik verilerini MqlTick dizisine al
   MqlTick array[]={};
   if(!GetTicksToArray(CUSTOM_SYMBOL_ORIGINDATATICKS_TO_COPYarray))
      return;
   
//--- standart sembolün ilk ve son alınan tiklerinin zamanını yazdır
   int total=(int)array.Size();
   PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
               TimeToString(array[0].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- standart sembolün son DATATICKS_TO_PRINT tikini günlüğe yazdır
   PrintFormat("\nThe last %d ticks for the standard symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_ORIGIN);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Tick: %s"iGetTickDescription(array[i]));
     }
   
//--- Piyasa Gözlemi penceresine özel bir sembol ekle
   ResetLastError();
   if(!SymbolSelect(CUSTOM_SYMBOL_NAMEtrue))
     {
      Print("SymbolSelect() failed. Error "GetLastError());
      return;
     }
     
//--- tik dizisi verilerini özel sembol fiyat geçmişine ekle
   Print("...");
   uint start=GetTickCount();
   PrintFormat("Start of adding %u ticks to the history of the custom symbol '%s'"array.Size(), CUSTOM_SYMBOL_NAME);
   int added=CustomTicksAdd(CUSTOM_SYMBOL_NAMEarray);
   PrintFormat("Added %u ticks to the history of the custom symbol '%s' in %u ms"addedCUSTOM_SYMBOL_NAMEGetTickCount()-start);
   
//--- özel sembol tik verilerini MqlTick dizisine al
   Print("...");
   if(!GetTicksToArray(CUSTOM_SYMBOL_NAMEarray.Size(), array))
      return;
   
//--- özel sembolün ilk ve son alınan tiklerinin zamanını yazdır
   total=(int)array.Size();
   PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
               TimeToString(array[0].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
               TimeToString(array[total-1].timeTIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
               
//--- özel sembolün son DATATICKS_TO_PRINT tikini günlüğe yazdır
   PrintFormat("\nThe last %d ticks for the custom symbol '%s':"DATATICKS_TO_PRINTCUSTOM_SYMBOL_NAME);
   for(int i=total-DATATICKS_TO_PRINTi<totali++)
     {
      if(i<0)
         continue;
      PrintFormat("  %dth Tick: %s"iGetTickDescription(array[i]));
     }
 
//--- grafikte yorum olarak kod sonlandırma tuşları hakkında bir ipucu görüntüle
   Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit"CUSTOM_SYMBOL_NAME));
//--- sonsuz bir döngüde çıkmak için Esc veya Del tuşlarına basılmasını bekle
   while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
     {
      Sleep(16);
      //--- Del tuşuna basıldığında, oluşturulan özel sembol ve verilerini sil
      if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
        {
         //--- çubuk verilerini sil
         int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history bars of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- tik verilerini sil
         deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME0LONG_MAX);
         if(deleted>0)
            PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted"deletedCUSTOM_SYMBOL_NAME);
         
         //--- sembolü sil
         if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
            PrintFormat("Custom symbol '%s' deleted successfully"CUSTOM_SYMBOL_NAME);
         break;
        }
     }
//--- çıkmadan önce grafiği temizle
   Comment("");
   /*
   sonuç:
   Requested 4294967295 ticks to download tick history for the symbol 'EURUSD'
   The tick history for the 'EURUSDsymbol is received in the amount of 351183943 ticks in 56454 ms
   First tick time2011.12.19 00:00:08.000Last tick time2024.06.20 21:18:12.010
   
   The last 20 ticks for the standard symbol 'EURUSD':
     351183923th Tick2024.06.20 21:17:46.380 Bid=1.07124 (Info tick)
     351183924th Tick2024.06.20 21:17:47.779 Ask=1.07125 Bid=1.07125 (Info tick)
     351183925th Tick2024.06.20 21:17:48.584 Ask=1.07124 Bid=1.07124 (Info tick)
     351183926th Tick2024.06.20 21:17:49.481 Ask=1.07125 (Info tick)
     351183927th Tick2024.06.20 21:17:49.985 Ask=1.07122 Bid=1.07122 (Info tick)
     351183928th Tick2024.06.20 21:17:50.482 Ask=1.07124 Bid=1.07124 (Info tick)
     351183929th Tick2024.06.20 21:17:51.584 Ask=1.07123 Bid=1.07123 (Info tick)
     351183930th Tick2024.06.20 21:17:52.786 Ask=1.07124 Bid=1.07124 (Info tick)
     351183931th Tick2024.06.20 21:17:53.487 Ask=1.07125 Bid=1.07125 (Info tick)
     351183932th Tick2024.06.20 21:17:53.989 Ask=1.07126 Bid=1.07126 (Info tick)
     351183933th Tick2024.06.20 21:17:55.789 Ask=1.07125 Bid=1.07125 (Info tick)
     351183934th Tick2024.06.20 21:17:58.495 Ask=1.07126 Bid=1.07126 (Info tick)
     351183935th Tick2024.06.20 21:18:00.102 Bid=1.07126 (Info tick)
     351183936th Tick2024.06.20 21:18:00.698 Ask=1.07129 Bid=1.07129 (Info tick)
     351183937th Tick2024.06.20 21:18:03.699 Bid=1.07129 (Info tick)
     351183938th Tick2024.06.20 21:18:04.699 Ask=1.07128 Bid=1.07128 (Info tick)
     351183939th Tick2024.06.20 21:18:05.901 Ask=1.07129 Bid=1.07129 (Info tick)
     351183940th Tick2024.06.20 21:18:07.606 Ask=1.07128 Bid=1.07128 (Info tick)
     351183941th Tick2024.06.20 21:18:11.512 Ask=1.07127 Bid=1.07127 (Info tick)
     351183942th Tick2024.06.20 21:18:12.010 Ask=1.07126 Bid=1.07126 (Info tick)
   ...
   Start of adding 351183943 ticks to the history of the custom symbol 'EURUSD.C'
   Added 351183943 ticks to the history of the custom symbol 'EURUSD.Cin 269890 ms
   ...
   Requested 351183943 ticks to download tick history for the symbol 'EURUSD.C'
   The tick history for the 'EURUSD.Csymbol is received in the amount of 351183943 ticks in 116407 ms
   First tick time2011.12.19 00:00:08.000Last tick time2024.06.20 21:18:12.010
   
   The last 20 ticks for the custom symbol 'EURUSD.C':
     351183923th Tick2024.06.20 21:17:46.380 Ask=1.07124 Bid=1.07124 (Info tick)
     351183924th Tick2024.06.20 21:17:47.779 Ask=1.07125 Bid=1.07125 (Info tick)
     351183925th Tick2024.06.20 21:17:48.584 Ask=1.07124 Bid=1.07124 (Info tick)
     351183926th Tick2024.06.20 21:17:49.481 Ask=1.07125 Bid=1.07125 (Info tick)
     351183927th Tick2024.06.20 21:17:49.985 Ask=1.07122 Bid=1.07122 (Info tick)
     351183928th Tick2024.06.20 21:17:50.482 Ask=1.07124 Bid=1.07124 (Info tick)
     351183929th Tick2024.06.20 21:17:51.584 Ask=1.07123 Bid=1.07123 (Info tick)
     351183930th Tick2024.06.20 21:17:52.786 Ask=1.07124 Bid=1.07124 (Info tick)
     351183931th Tick2024.06.20 21:17:53.487 Ask=1.07125 Bid=1.07125 (Info tick)
     351183932th Tick2024.06.20 21:17:53.989 Ask=1.07126 Bid=1.07126 (Info tick)
     351183933th Tick2024.06.20 21:17:55.789 Ask=1.07125 Bid=1.07125 (Info tick)
     351183934th Tick2024.06.20 21:17:58.495 Ask=1.07126 Bid=1.07126 (Info tick)
     351183935th Tick2024.06.20 21:18:00.102 Ask=1.07126 Bid=1.07126 (Info tick)
     351183936th Tick2024.06.20 21:18:00.698 Ask=1.07129 Bid=1.07129 (Info tick)
     351183937th Tick2024.06.20 21:18:03.699 Ask=1.07129 Bid=1.07129 (Info tick)
     351183938th Tick2024.06.20 21:18:04.699 Ask=1.07128 Bid=1.07128 (Info tick)
     351183939th Tick2024.06.20 21:18:05.901 Ask=1.07129 Bid=1.07129 (Info tick)
     351183940th Tick2024.06.20 21:18:07.606 Ask=1.07128 Bid=1.07128 (Info tick)
     351183941th Tick2024.06.20 21:18:11.512 Ask=1.07127 Bid=1.07127 (Info tick)
     351183942th Tick2024.06.20 21:18:12.010 Ask=1.07126 Bid=1.07126 (Info tick)
   */
  }
//+------------------------------------------------------------------+
//| Özel sembol oluştur, bir hata kodu geri döndür                   |
//+------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_nameconst string symbol_pathconst string symbol_origin=NULL)
  {
//--- özel sembolün temel alınacağı sembolün adını tanımla
   string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
   
//--- özel bir sembol oluşturulamadıysa ve bu hata 5304 değilse, bunu günlükte raporla
   ResetLastError();
   int error=0;
   if(!CustomSymbolCreate(symbol_namesymbol_pathorigin))
     {
      error=GetLastError();
      if(error!=5304)
         PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d"symbol_namesymbol_pathoriginerror);
     }
//--- başarılı
   return(error);
  }
//+------------------------------------------------------------------+
//| Özel sembol kaldır                                               |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
  {
//--- sembolü Piyasa Gözlemi penceresinden gizle
   ResetLastError();
   if(!SymbolSelect(symbol_namefalse))
     {
      PrintFormat("SymbolSelect(%s, false) failed. Error %d"GetLastError());
      return(false);
     }
      
//--- özel sembol silinemediyse, bunu günlükte raporla ve 'false' geri döndür
   ResetLastError();
   if(!CustomSymbolDelete(symbol_name))
     {
      PrintFormat("CustomSymbolDelete(%s) failed. Error %d"symbol_nameGetLastError());
      return(false);
     }
//--- başarılı
   return(true);
  }
//+------------------------------------------------------------------+
//| Diziye belirtilen sayıda tik al                                  |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbolconst uint countMqlTick &array[])
  {
//--- geçmiş verilerin yüklenmeye başladığını bildir
   PrintFormat("Requested %u ticks to get tick history for the symbol '%s'"countsymbol);
   
//--- tikleri almak için 3 deneme yap
   int attempts=0;
   while(attempts<3)
     {
      //--- tikleri almadan önce başlangıç zamanını ölç
      uint start=GetTickCount();
      
      //--- 1970.01.01 00:00.001'den bu yana tik geçmişini iste (parametre from=1 ms)
      int received=CopyTicks(symbolarrayCOPY_TICKS_ALL1count);
      if(received!=-1)
        {
         //--- tik sayısı ve harcanan zaman hakkında bilgi görüntüle
         PrintFormat("The tick history for the '%s' symbol is received in the amount of %u ticks in %d ms"symbolreceivedGetTickCount()-start);
         
         //--- tik geçmişi senkronize edilmişse, hata kodu sıfıra eşittir - 'true' geri döner
         if(GetLastError()==0)
            return(true);
 
         PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d"
                     symbolreceivedGetTickCount()-startGetLastError());
        }
      //--- denemeleri say
      attempts++; 
      //--- tik veritabanının senkronizasyonunun bitmesini beklemek için bir saniyelik duraklama
      Sleep(1000);
     }
//--- 3 denemede tiklerin kopyalanması başarısız oldu
   return(false);
  }
//+------------------------------------------------------------------+ 
//| Bir tikin dizge açıklamasını geri döndür                         |
//+------------------------------------------------------------------+ 
string GetTickDescription(MqlTick &tick
  { 
   string desc=StringFormat("%s.%03u "TimeToString(tick.timeTIME_DATE|TIME_MINUTES|TIME_SECONDS),tick.time_msc%1000);
   
//--- tik bayraklarını kontrol et
   bool buy_tick   = ((tick.flags &TICK_FLAG_BUY)   == TICK_FLAG_BUY); 
   bool sell_tick  = ((tick.flags &TICK_FLAG_SELL)  == TICK_FLAG_SELL); 
   bool ask_tick   = ((tick.flags &TICK_FLAG_ASK)   == TICK_FLAG_ASK); 
   bool bid_tick   = ((tick.flags &TICK_FLAG_BID)   == TICK_FLAG_BID); 
   bool last_tick  = ((tick.flags &TICK_FLAG_LAST)  == TICK_FLAG_LAST); 
   bool volume_tick= ((tick.flags &TICK_FLAG_VOLUME)== TICK_FLAG_VOLUME); 
   
//--- önce işlem bayrakları için tiki kontrol et (CustomTicksAdd() için yoktur)
   if(buy_tick || sell_tick
     { 
      //--- bir işlem tiki için bir çıktı oluştur
      desc += (buy_tick ? StringFormat("Buy Tick: Last=%G Volume=%d "tick.lasttick.volume)  : ""); 
      desc += (sell_tickStringFormat("Sell Tick: Last=%G Volume=%d ",tick.lasttick.volume) : ""); 
      desc += (ask_tick ? StringFormat("Ask=%G "tick.ask) : ""); 
      desc += (bid_tick ? StringFormat("Bid=%G "tick.ask) : ""); 
      desc += "(Trade tick)"
     } 
   else 
     { 
      //--- bir bilgi tiki için biraz farklı bir çıktı oluştur
      desc += (ask_tick   ? StringFormat("Ask=%G ",  tick.ask)    : ""); 
      desc += (bid_tick   ? StringFormat("Bid=%G ",  tick.ask)    : ""); 
      desc += (last_tick  ? StringFormat("Last=%G "tick.last)   : ""); 
      desc += (volume_tickStringFormat("Volume=%d ",tick.volume): ""); 
      desc += "(Info tick)"
     } 
//--- tik açıklamasını geri döndür
   return(desc); 
  } 

 

Ayrıca bakınız

CustomRatesDelete, CustomRatesUpdate, CustomTicksReplace, CopyTicks, CopyTicksRange