CustomTicksAdd

カスタム銘柄の価格履歴にMqlTick型の配列からデータを追加します。カスタム銘柄は気配値ウィンドウで選択されなければなりません。

int  CustomTicksAdd(
  const string    symbol,            // 銘柄名
  const MqlTick& ticks[],           // カスタム銘柄に適用されるティックデータの配列
  uint            count=WHOLE_ARRAY  // 使用されるticks[]配列要素の数
  );

パラメータ

symbol

[in]  カスタム銘柄名

ticks[]

[in]   [in]以前のデータから最近のものまでの時間順に配列されたMqlTick型のティックデータの配列、すなわちk<nの場合はticks[k].time_msc <= ticks[n].time_msc。

count=WHOLE_ARRAY

[in] 追加に使用されるticks[]配列要素の数。WHOLE_ARRAYはすべてのticks[]配列要素が使用されることを意味します。

戻り値

追加されたティックの数(エラーの場合は -1 )

さらなる注記

CustomTicksAdd関数は、気配値ウィンドウで開かれているカスタム銘柄に対してのみ機能します。銘柄が気配値ウィンドウで選択されていない場合にはCustomTicksReplaceを使用してティックを追加するべきです。

MqlTick 構造体には、1970年1月1日からカウントされた時間(秒単位のティック時間)とtime_msc(ミリ秒単位のティック時間)の2つの時間値を持つフィールドがあります。追加されたティックのこれらのフィールドは、次の順序で処理されます。

  1. ticks[k].time_msc!=0の場合、これはticks[k].timeフィールドへの書き入れに使われます。すなわちticks[k].time=ticks[k].time_msc/1000(整数除算)がtickに設定されます。
  2. ticks[k].time_msc==0でticks[k].time!=0の場合、ミリ秒単位の時間は、1000を掛けることによって得られます。すなわちticks[k].time_msc=ticks[k].time*1000です。
  3. ticks[k].time_msc==0でticks[k].time==0の場合、これらのフィールドにはCustomTicksAddが呼ばれたときの現在の取引サーバ時間がミリ秒まで書かれます。

ticks[k].bid, ticks[k].ask、ticks[k].lastまたはticks[k].volume の値が正の場合は、適切なフラグの組み合わせがticks[k].flags fieldに書かれます。

  • TICK_FLAG_BID – ティックが買値を変更した
  • TICK_FLAG_ASK  – ティックが売値を変更した
  • TICK_FLAG_LAST – ティックが直近の約定値を変更した
  • TICK_FLAG_VOLUME – ティックが取引量を変更した

フィールドの値がゼロ以下の場合、対応するフラグは ticks[k].flagsフィールドに書き込まれません。

 

TICK_FLAG_BUYフラグとTICK_FLAG_SELLフラグはカスタム銘柄の履歴には追加されません。

 

例:

//+------------------------------------------------------------------+
//|                                               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"     // カスタム銘柄名
#define   CUSTOM_SYMBOL_PATH     "Forex"           // 銘柄が作成されるグループの名前
#define   CUSTOM_SYMBOL_ORIGIN   Symbol()         // カスタム銘柄の基となる銘柄の名前
 
#define   DATATICKS_TO_COPY     UINT_MAX         // コピーされたティックの数
#define   DATATICKS_TO_PRINT     20               // 操作ログに送信されるティックの数
 
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- カスタム銘柄を作成するときにエラーコードを取得する
  int create=CreateCustomSymbol(CUSTOM_SYMBOL_NAME, CUSTOM_SYMBOL_PATH, CUSTOM_SYMBOL_ORIGIN);
 
//--- エラーコードが0(銘柄の作成に成功)でも5304(銘柄がすでに作成されている)でもない場合は、終了する
  if(create!=0 && create!=5304)
    return;
 
//--- 標準銘柄ティックデータをMqlTick配列に取得する
  MqlTick array[]={};
  if(!GetTicksToArray(CUSTOM_SYMBOL_ORIGIN, DATATICKS_TO_COPY, array))
    return;
 
//--- 標準銘柄の最初と最後に受信したティックの時間を出力する
  int total=(int)array.Size();
  PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
              TimeToString(array[0].time, TIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
              TimeToString(array[total-1].time, TIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
             
/--- 標準銘柄の最後のDATATICKS_TO_PRINTティックを操作ログに出力する
  PrintFormat("\nThe last %d ticks for the standard symbol '%s':", DATATICKS_TO_PRINT, CUSTOM_SYMBOL_ORIGIN);
  for(int i=total-DATATICKS_TO_PRINT; i<total; i++)
    {
    if(i<0)
        continue;
    PrintFormat("  %dth Tick: %s", i, GetTickDescription(array[i]));
    }
 
//--- 気配値表示ウィンドウにカスタム銘柄を追加する
  ResetLastError();
  if(!SymbolSelect(CUSTOM_SYMBOL_NAME, true))
    {
    Print("SymbolSelect() failed. Error ", GetLastError());
    return;
    }
   
//--- カスタム銘柄の価格履歴にティック配列データを追加する
  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_NAME, array);
  PrintFormat("Added %u ticks to the history of the custom symbol '%s' in %u ms", added, CUSTOM_SYMBOL_NAME, GetTickCount()-start);
 
//--- カスタム銘柄のティックデータをMqlTick配列に取得する
  Print("...");
  if(!GetTicksToArray(CUSTOM_SYMBOL_NAME, array.Size(), array))
    return;
 
//--- カスタム銘柄の最初と最後に受信したティックの時間を出力する
  total=(int)array.Size();
  PrintFormat("First tick time: %s.%03u, Last tick time: %s.%03u",
              TimeToString(array[0].time, TIME_DATE|TIME_MINUTES|TIME_SECONDS), array[0].time_msc%1000,
              TimeToString(array[total-1].time, TIME_DATE|TIME_MINUTES|TIME_SECONDS), array[total-1].time_msc%1000);
             
/--- カスタム銘柄の最後のDATATICKS_TO_PRINTティックを操作ログに出力する
  PrintFormat("\nThe last %d ticks for the custom symbol '%s':", DATATICKS_TO_PRINT, CUSTOM_SYMBOL_NAME);
  for(int i=total-DATATICKS_TO_PRINT; i<total; i++)
    {
    if(i<0)
        continue;
    PrintFormat("  %dth Tick: %s", i, GetTickDescription(array[i]));
    }
 
//--- チャートのコメントにスクリプト終了キーに関するヒントを表示する
  Comment(StringFormat("Press 'Esc' to exit or 'Del' to delete the '%s' symbol and exit", CUSTOM_SYMBOL_NAME));
//--- EscキーまたはDelキーが押されるまで待機して無限ループを終了する
  while(!IsStopped() && TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE)==0)
    {
    Sleep(16);
    //--- Delキーを押すと、作成したカスタム銘柄とそのデータが削除される
    if(TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE)<0)
       {
        //--- バーデータを削除する
        int deleted=CustomRatesDelete(CUSTOM_SYMBOL_NAME, 0, LONG_MAX);
        if(deleted>0)
          PrintFormat("%d history bars of the custom symbol '%s' were successfully deleted", deleted, CUSTOM_SYMBOL_NAME);
       
        //--- ティックデータを削除する
        deleted=CustomTicksDelete(CUSTOM_SYMBOL_NAME, 0, LONG_MAX);
        if(deleted>0)
          PrintFormat("%d history ticks of the custom symbol '%s' were successfully deleted", deleted, CUSTOM_SYMBOL_NAME);
       
        //--- 銘柄を削除する
        if(DeleteCustomSymbol(CUSTOM_SYMBOL_NAME))
          PrintFormat("Custom symbol '%s' deleted successfully", CUSTOM_SYMBOL_NAME);
        break;
       }
    }
//--- 終了する前にチャートをクリアする
  Comment("");
  /*
   結果:
  Requested 4294967295 ticks to download tick history for the symbol 'EURUSD'
  The tick history for the 'EURUSD' symbol is received in the amount of 351183943 ticks in 56454 ms
  First tick time: 2011.12.19 00:00:08.000, Last tick time: 2024.06.20 21:18:12.010
 
  The last 20 ticks for the standard symbol 'EURUSD':
    351183923th Tick: 2024.06.20 21:17:46.380 Bid=1.07124 (Info tick)
    351183924th Tick: 2024.06.20 21:17:47.779 Ask=1.07125 Bid=1.07125 (Info tick)
    351183925th Tick: 2024.06.20 21:17:48.584 Ask=1.07124 Bid=1.07124 (Info tick)
    351183926th Tick: 2024.06.20 21:17:49.481 Ask=1.07125 (Info tick)
    351183927th Tick: 2024.06.20 21:17:49.985 Ask=1.07122 Bid=1.07122 (Info tick)
    351183928th Tick: 2024.06.20 21:17:50.482 Ask=1.07124 Bid=1.07124 (Info tick)
    351183929th Tick: 2024.06.20 21:17:51.584 Ask=1.07123 Bid=1.07123 (Info tick)
    351183930th Tick: 2024.06.20 21:17:52.786 Ask=1.07124 Bid=1.07124 (Info tick)
    351183931th Tick: 2024.06.20 21:17:53.487 Ask=1.07125 Bid=1.07125 (Info tick)
    351183932th Tick: 2024.06.20 21:17:53.989 Ask=1.07126 Bid=1.07126 (Info tick)
    351183933th Tick: 2024.06.20 21:17:55.789 Ask=1.07125 Bid=1.07125 (Info tick)
    351183934th Tick: 2024.06.20 21:17:58.495 Ask=1.07126 Bid=1.07126 (Info tick)
    351183935th Tick: 2024.06.20 21:18:00.102 Bid=1.07126 (Info tick)
    351183936th Tick: 2024.06.20 21:18:00.698 Ask=1.07129 Bid=1.07129 (Info tick)
    351183937th Tick: 2024.06.20 21:18:03.699 Bid=1.07129 (Info tick)
    351183938th Tick: 2024.06.20 21:18:04.699 Ask=1.07128 Bid=1.07128 (Info tick)
    351183939th Tick: 2024.06.20 21:18:05.901 Ask=1.07129 Bid=1.07129 (Info tick)
    351183940th Tick: 2024.06.20 21:18:07.606 Ask=1.07128 Bid=1.07128 (Info tick)
    351183941th Tick: 2024.06.20 21:18:11.512 Ask=1.07127 Bid=1.07127 (Info tick)
    351183942th Tick: 2024.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.C' in 269890 ms
  ...
  Requested 351183943 ticks to download tick history for the symbol 'EURUSD.C'
  The tick history for the 'EURUSD.C' symbol is received in the amount of 351183943 ticks in 116407 ms
  First tick time: 2011.12.19 00:00:08.000, Last tick time: 2024.06.20 21:18:12.010
 
  The last 20 ticks for the custom symbol 'EURUSD.C':
    351183923th Tick: 2024.06.20 21:17:46.380 Ask=1.07124 Bid=1.07124 (Info tick)
    351183924th Tick: 2024.06.20 21:17:47.779 Ask=1.07125 Bid=1.07125 (Info tick)
    351183925th Tick: 2024.06.20 21:17:48.584 Ask=1.07124 Bid=1.07124 (Info tick)
    351183926th Tick: 2024.06.20 21:17:49.481 Ask=1.07125 Bid=1.07125 (Info tick)
    351183927th Tick: 2024.06.20 21:17:49.985 Ask=1.07122 Bid=1.07122 (Info tick)
    351183928th Tick: 2024.06.20 21:17:50.482 Ask=1.07124 Bid=1.07124 (Info tick)
    351183929th Tick: 2024.06.20 21:17:51.584 Ask=1.07123 Bid=1.07123 (Info tick)
    351183930th Tick: 2024.06.20 21:17:52.786 Ask=1.07124 Bid=1.07124 (Info tick)
    351183931th Tick: 2024.06.20 21:17:53.487 Ask=1.07125 Bid=1.07125 (Info tick)
    351183932th Tick: 2024.06.20 21:17:53.989 Ask=1.07126 Bid=1.07126 (Info tick)
    351183933th Tick: 2024.06.20 21:17:55.789 Ask=1.07125 Bid=1.07125 (Info tick)
    351183934th Tick: 2024.06.20 21:17:58.495 Ask=1.07126 Bid=1.07126 (Info tick)
    351183935th Tick: 2024.06.20 21:18:00.102 Ask=1.07126 Bid=1.07126 (Info tick)
    351183936th Tick: 2024.06.20 21:18:00.698 Ask=1.07129 Bid=1.07129 (Info tick)
    351183937th Tick: 2024.06.20 21:18:03.699 Ask=1.07129 Bid=1.07129 (Info tick)
    351183938th Tick: 2024.06.20 21:18:04.699 Ask=1.07128 Bid=1.07128 (Info tick)
    351183939th Tick: 2024.06.20 21:18:05.901 Ask=1.07129 Bid=1.07129 (Info tick)
    351183940th Tick: 2024.06.20 21:18:07.606 Ask=1.07128 Bid=1.07128 (Info tick)
    351183941th Tick: 2024.06.20 21:18:11.512 Ask=1.07127 Bid=1.07127 (Info tick)
    351183942th Tick: 2024.06.20 21:18:12.010 Ask=1.07126 Bid=1.07126 (Info tick)
  */
 }
//+------------------------------------------------------------------+
//| カスタム銘柄ルを作成し、エラーコードを返す                                    |
//+------------------------------------------------------------------+
int CreateCustomSymbol(const string symbol_name, const string symbol_path, const string symbol_origin=NULL)
 {
//--- カスタム銘柄の基となる銘柄の名前をする
  string origin=(symbol_origin==NULL ? Symbol() : symbol_origin);
 
//--- カスタム銘柄の作成に失敗し、エラー5304ではない場合は、操作ログに報告する
  ResetLastError();
  int error=0;
  if(!CustomSymbolCreate(symbol_name, symbol_path, origin))
    {
    error=GetLastError();
    if(error!=5304)
        PrintFormat("CustomSymbolCreate(%s, %s, %s) failed. Error %d", symbol_name, symbol_path, origin, error);
    }
//--- 成功
  return(error);
 }
//+------------------------------------------------------------------+
//| カスタム銘柄を削除する                                                 |
//+------------------------------------------------------------------+
bool DeleteCustomSymbol(const string symbol_name)
 {
//--- 気配値表示ウィンドウから銘柄を非表示にする
  ResetLastError();
  if(!SymbolSelect(symbol_name, false))
    {
    PrintFormat("SymbolSelect(%s, false) failed. Error %d", GetLastError());
    return(false);
    }
     
//--- カスタム銘柄の削除に失敗した場合は、操作ログにこれを報告してfalseを返す
  ResetLastError();
  if(!CustomSymbolDelete(symbol_name))
    {
    PrintFormat("CustomSymbolDelete(%s) failed. Error %d", symbol_name, GetLastError());
    return(false);
    }
//--- 成功
  return(true);
 }
//+------------------------------------------------------------------+
//| 配列内の指定された数のティックを取得する                                    |
//+------------------------------------------------------------------+
bool GetTicksToArray(const string symbol, const uint count, MqlTick &array[])
 {
//--- 履歴データの読み込み開始を通知する
  PrintFormat("Requested %u ticks to get tick history for the symbol '%s'", count, symbol);
 
//--- ティックの受信を3回試行する
  int attempts=0;
  while(attempts<3)
    {
    //--- ティックを受信する前に開始時間を測定する
    uint start=GetTickCount();
     
    //--- 1970.01.01 00:00.001 以降のティック履歴を要求する (パラメータ from=1 ms)
    int received=CopyTicks(symbol, array, COPY_TICKS_ALL, 1, count);
    if(received!=-1)
       {
        //--- ティック数と経過時間に関する情報を表示する
        PrintFormat("The tick history for the '%s' symbol is received in the amount of %u ticks in %d ms", symbol, received, GetTickCount()-start);
       
        //--- ティック履歴が同期されている場合、エラーコードはゼロになる - trueを返す
        if(GetLastError()==0)
          return(true);
 
        PrintFormat("%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d",
                    symbol, received, GetTickCount()-start, GetLastError());
       }
    //--- 試行回数を数える
    attempts++;
    //--- ティック データベースの同期が終了するまで1秒間待機する
    Sleep(1000);
    }
//--- 3 回の試行でティックをコピーできない
  return(false);
 }
//+------------------------------------------------------------------+
//| ティックの文字列の説明を返す                                             |
//+------------------------------------------------------------------+
string GetTickDescription(MqlTick &tick)
 {
  string desc=StringFormat("%s.%03u ", TimeToString(tick.time, TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick.time_msc%1000);
 
//--- ティックのフラグを確認する
  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);
 
//--- まず取引フラグのティックを確認する (CustomTicksAdd()には何も存在しない)
  if(buy_tick || sell_tick)
    {
    //--- 取引ティックの出力を作成する
    desc += (buy_tick ? StringFormat("Buy Tick: Last=%G Volume=%d ", tick.last, tick.volume)  : "");
    desc += (sell_tick? StringFormat("Sell Tick: Last=%G Volume=%d ",tick.last, tick.volume) : "");
    desc += (ask_tick ? StringFormat("Ask=%G ", tick.ask) : "");
    desc += (bid_tick ? StringFormat("Bid=%G ", tick.ask) : "");
    desc += "(Trade tick)";
    }
  else
    {
    //--- 情報ティックの出力を少し異なる方法で作成する
    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_tick? StringFormat("Volume=%d ",tick.volume): "");
    desc += "(Info tick)";
    }
//--- ティックの説明を返す
  return(desc);
 }

 

参照

CustomRatesDeleteCustomRatesUpdateCustomTicksReplaceCopyTicksCopyTicksRange