CopyTicks() не возвращает правильное значение для пользовательского символа.

 

Здравствуйте, у меня возникла проблема с использованием пользовательского символа, которой раньше у меня не было.

Проблема заключается в получении тиков с помощью функции CopyTicks().

Вот что я заполняю символ BTCUSD:


И вот что я получил, используя функцию копирования тиков:


Значение почти делится на 100, поскольку я думаю, что символ Цифры = 2.

Я пытался проверить, есть ли проблема с моим кодом, но раньше все работало нормально. Эта проблема началась после обновления MT5.

Когда я перезапускаю МТ5, проблема исчезла. И все работает. Но опять же, если я попытаюсь создать собственный символ с другой валютой, у меня возникнет та же проблема. При перезапуске МТ5 проблема повторяется. Но я не могу продолжать перезапускать MT5 во время открытой сделки.

Пожалуйста, дайте решение этой проблемы или хотя бы попросите Metaqotes проверить проблему.

 
Также возникает та же проблема с функцией CopyTicksRange(). Но не с функцией SymbolInfoTicks().
 
Есть ли ответ? Пожалуйста, дайте мне знать.
 

Вот пример моего кода:

//+------------------------------------------------------------------+
//|                                                       Sample.mq5 |
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 0

#include "Includes//Symbol.mqh"

input    int   GO_BACK_HISTORY_LOAD_DAYS     = 30;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string Orignal_Symbol = Symbol(),
       symbol_custom = Orignal_Symbol + "_P";

int      ticks_per_sec,
         total_len_history = 0,
         initialization_flag,
         symbol_history_wiped_clean;

datetime Current_DAY;

bool alert_once = false;
long  LastTime_Added = 0,
      tick_chart_id = -1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   Close_All_Symbols_Charts(symbol_custom);

   Current_DAY = iTime(Symbol(), PERIOD_D1, 0);

   alert_once = false;
   symbol_history_wiped_clean = Remove_Symbol_From_MarketWatch_Delete_History(symbol_custom);

     {
      alert_once = true;
      initialization_flag = INIT_FAILED;
     }

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   ResetLastError();
   MqlTick tick, ticks[];

   if(symbol_history_wiped_clean == false)
     {
      Close_All_Symbols_Charts(symbol_custom);

      symbol_history_wiped_clean = Remove_Symbol_From_MarketWatch_Delete_History(symbol_custom);

      if(symbol_history_wiped_clean == false)
         return 0;
     }

   if(symbol_history_wiped_clean == true &&
      initialization_flag == INIT_FAILED
     )
     {
      Alert_me();
      if(Fill_ReFill_Custom_Symbol(symbol_custom) == -1)
         return 0;
      initialization_flag = INIT_SUCCEEDED;
      Print("History Filled Successfully.");
      Comment("");
      return rates_total;
     }

   SymbolInfoTick(Orignal_Symbol, tick);

   datetime Today = iTime(Symbol(), PERIOD_D1, 0);

   if(Today > Current_DAY)
     {
      Current_DAY = Today;
      LastTime_Added = long(TimeCurrent()) * 1000;
     }

   ulong tick_count = tick.time_msc - LastTime_Added;
   uint get_count = uint(MathAbs(double(tick_count)));


   int len = CopyTicksRange(Orignal_Symbol, ticks, COPY_TICKS_ALL, LastTime_Added, ulong(TimeCurrent() + PeriodSeconds(PERIOD_D1)) * 1000);//LastTime_Added + 1000 * PeriodSeconds(PERIOD_M1));

   if(len <= 0)
     {
      return rates_total;
     }

   ulong last_time = ticks[len - 1].time_msc;

   int filled = Tick_Filling_Logic(ticks, len);

   if(tick_chart_id <= 0)
     {
      tick_chart_id = ChartOpen(symbol_custom, PERIOD_CURRENT);
     }

   if(ChartSymbol(tick_chart_id) != symbol_custom)
     {
      tick_chart_id = ChartOpen(symbol_custom, PERIOD_CURRENT);
     }

   return rates_total;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Close_All_Symbols_Charts(string local_symbol)
  {
   tick_chart_id = 0;
   ResetLastError();

   Print(" __MQLBUILD__ =", __MQLBUILD__, "   __FILE__ =", __FILE__);

   for(long chartid = ChartFirst(); chartid != -1 && !IsStopped(); chartid = ChartNext(chartid))
     {
      string name = ChartSymbol(chartid);

      if(StringFind(name, local_symbol) < 0)
         continue;

      if(!ChartClose(chartid))
         Print("Cannot close Chart Symbol: ", name, " Period: ", EnumToString(ChartPeriod(chartid)));
     }
   SymbolSelect(local_symbol, false);
   Sleep(5000);
  }

bool Remove_Symbol_From_MarketWatch_Delete_History(string local_symbol)
  {
   ResetLastError();
   const SYMBOL SYMB(local_symbol);

   bool custom = true;
   bool status = SYMB.IsExist();//SymbolExist(local_symbol, custom);

   if(status == false)
      return true;

   int Count = 0;
   while(
      !IsStopped()
      &&
      Count < 1000
      &&
      SymbolSelect(local_symbol, false) == false
   )//(SYMB.Off() == false)
     {
      if(Count == 0)
         Print("Cannot UnSelect the Symbol ", local_symbol, " because: ", GetLastError());
      for(int i = 0; i < 1000; i++)
        {
         Comment("waiting");
        }
      Count++;
     }
   Comment("");
   if(CustomRatesDelete(local_symbol, 0, TimeCurrent()) < 0)
      Print("Cannot Delete Custom Rates: ", GetLastError());

   if(CustomTicksDelete(local_symbol, 0, TimeCurrent()) < 0)
      Print("Cannot Delete Custom Ticks: ", GetLastError());

   CustomSymbolDelete(local_symbol);
   return true;
  }
//+------------------------------------------------------------------+
int Fill_ReFill_Custom_Symbol(string local_symbol)
  {
   ResetLastError();
   total_len_history = 0;
   alert_once = false;
   LastTime_Added = 0;

   Comment("Refreshing the Tick Chart. Please Wait.");

   MqlDateTime str;
   TimeToStruct(iTime(Orignal_Symbol, 0, 0) - GO_BACK_HISTORY_LOAD_DAYS * 86400, str);
   Comment("");
   datetime start_date = datetime(StringFormat("%d.%d.01 00:00:00",str.year,str.mon));
   const SYMBOL SYMB(local_symbol);
   SYMB.CloneProperties(Orignal_Symbol);
   SYMB.SetProperty(SYMBOL_DESCRIPTION, Symbol());
   SYMB.SetProperty(SYMBOL_DIGITS, 10);

   MqlTick ticks_add[];
   if(ticks_per_sec <= 0)
      ticks_per_sec = 1;

   ulong time_start = GetMicrosecondCount();

   ResetLastError();

   if(LastTime_Added == 0)
      LastTime_Added = long(start_date) * 1000;

   int len = CopyTicksRange(Orignal_Symbol,
                            ticks_add,
                            COPY_TICKS_ALL,
                            LastTime_Added,
                            ulong(TimeCurrent()) * 1000
                           );

   if(len<=0)
     {
      string error;
      if(GetLastError() == 4401)
         error = "ERR_HISTORY_NOT_FOUND";
      else
         error = string(GetLastError());
      Print("------------------------------------------------------------------");
      Print("History Tick Length: ", len, " Error: ", error);
      Print("------------------------------------------------------------------");
      Sleep(5000);
      // Print("Waited for 10000 milliseconds. Still no history found.");
      return -1;
     }

   int total = Tick_Filling_Logic(ticks_add, len);

   if(total <= 0)
     {
      SYMB.Off();
      CustomSymbolDelete(local_symbol);
      //Print("Total  = ", total, ". There is no filling of candles yet : ", GetLastError());
      return -1;
     }

   if(GetLastError() == 4403)
     {
      Sleep(2000);
      Print("History Failed to Retrieve.");
      len = -1;
      return len;
     }

   Print("Gathering Ticks from : ", iTime(Orignal_Symbol, 0, 0) - GO_BACK_HISTORY_LOAD_DAYS * 86400, " To: ", TimeCurrent());
   Print("Symbol Working :",SYMB.On());
   Print("Started : ",ticks_add[0].time,"  Ended : ",ticks_add[len-1].time);
   Print("Error Found: ",GetLastError());
   Print("Ticks Filled: ", total);//SYMB.CloneTicks(ticks_add));//CustomTicksAdd(SYMB.Name,ticks_add));//SYMB.CloneTicks(ticks_add));


   Print("Time Required for completion: ",(GetMicrosecondCount()-time_start)/1000000);
   Print("Started : ",ticks_add[0].time,"  Ended : ",ticks_add[len-1].time);
   Print("History Loaded!!!!");
//total_len_history = len;

   Comment("");
   ChartSetString(tick_chart_id, CHART_COMMENT, "");

   return len;
  }
//+------------------------------------------------------------------+
void OnDeinit(const int r)
  {
   EventKillTimer();
  }
//+------------------------------------------------------------------+
void Alert_me()
  {
   if(alert_once == false)
      return;
   Alert(symbol_custom, " : Please Wait for Chart Refresh");
  }
//+------------------------------------------------------------------+
int Tick_Filling_Logic(MqlTick& ticks_add[],
                       int len)
  {
   ResetLastError();

   if(IsStopped())
      return 0;
   int total = CustomTicksAdd(symbol_custom, ticks_add);

   if(total <= 0)
     {
      Print("Tick Not added : ", GetLastError());
      total = CustomTicksReplace(symbol_custom, ticks_add[0].time_msc, ticks_add[len - 1].time_msc, ticks_add, len);
     }
//if(len > 0)
//  {
//   Print(ticks_add[len - 1].time, " ", ticks_add[len - 1].bid, " ", ticks_add[len - 1].time_msc);
//  }
   if(total == len)
     {
      LastTime_Added    = ticks_add[len - 1].time_msc;
     }
   else
     {
     }
   MqlTick Tick_check[];
   int hh =    CopyTicks(symbol_custom, Tick_check, COPY_TICKS_ALL, 0, 10);
   if(hh > 0)
     {
      Print("Filling Ticks =============");
      ArrayPrint(ticks_add, _Digits, NULL, (len > 10)? len - 10 : 0, len);
      Print("Retrieving Ticks ===============");
      ArrayPrint(Tick_check, 5, NULL);
      Print(Tick_check[9].bid, " ", Tick_check[9].bid * 100);
      MqlTick TT;
      SymbolInfoTick(symbol_custom, TT);
      Print(SymbolInfoDouble(symbol_custom, SYMBOL_BID), " ", TT.bid);
     }
   return total;
  }
//+------------------------------------------------------------------+
void Restart_the_Whole_Symbol()
  {
  }
//+------------------------------------------------------------------+

Пожалуйста, проверьте. И это вывод:


Я прикрепил файл Symbol.mqh к этой ветке комментариев.

Файлы:
Symbol.mqh  7 kb
 
jaffer wilson #:
Есть ли ответ?

можно же было только проблемный блок вставить

 
lynxntech # :

можно же было только проблемный блок вставить

Я не понимаю тебя. Можете ли вы уточнить, пожалуйста, что вы подразумеваете под этим? Покажите мне код, если он есть.

 
jaffer wilson #:

Я не понимаю тебя. Можете ли вы уточнить, пожалуйста, что вы подразумеваете под этим? Покажите мне код, если он есть.

Вы вставили весь код, кто будет смотреть весь этот код?

 
jaffer wilson #:

Я проверил на своём коде, котировки от  Мосбиржи, всё работает корректно. Версия метатрейдера 4040.

Другой брокер тоже всё норм.  Версия метатрейдера 4048.

код который я вставил в свой советник

   MqlTick Tick_check[];
   int hh =    CopyTicks(c_Name, Tick_check, COPY_TICKS_ALL, 0, 10);
   if(hh > 0)
     {
      Print("Retrieving Ticks ===============");
      ArrayPrint(Tick_check, 5, NULL);
      Print(Tick_check[9].bid, " ", Tick_check[9].bid * 100);
      MqlTick TT;
      SymbolInfoTick(c_Name, TT);
      Print(SymbolInfoDouble(c_Name, SYMBOL_BID), " ", TT.bid);
     }

результат

(BTCUSDT.fut,M1)        Retrieving Ticks ===============
(BTCUSDT.fut,M1)                         [time]       [bid]       [ask]      [last] [volume]   [time_msc] [flags] [volume_real]
(BTCUSDT.fut,M1)        [0] 1996.01.02 00:37:41 34369.00000 34369.10000 34370.00000       10 820543061430      30      10.67800
(BTCUSDT.fut,M1)        [1] 1996.01.02 00:37:42 34370.00000 34370.10000 34371.40000       12 820543062356      30      12.91900
(BTCUSDT.fut,M1)        [2] 1996.01.02 00:37:43 34371.40000 34371.60000 34371.50000       15 820543063129      30      15.54300
(BTCUSDT.fut,M1)        [3] 1996.01.02 00:37:43 34371.50000 34371.60000 34372.90000       14 820543063362      30      14.61600
(BTCUSDT.fut,M1)        [4] 1996.01.02 00:37:44 34372.90000 34373.00000 34376.50000        1 820543064769      30       1.18700
(BTCUSDT.fut,M1)        [5] 1996.01.02 00:37:44 34376.50000 34376.60000 34379.50000        3 820543064970      30       3.37200
(BTCUSDT.fut,M1)        [6] 1996.01.02 00:37:45 34379.50000 34379.60000 34379.90000       12 820543065186      30      12.02700
(BTCUSDT.fut,M1)        [7] 1996.01.02 00:37:45 34379.90000 34380.00000 34380.60000       16 820543065460      30      16.78500
(BTCUSDT.fut,M1)        [8] 1996.01.02 00:37:45 34380.60000 34380.70000 34381.40000       11 820543065769      30      11.67300
(BTCUSDT.fut,M1)        [9] 1996.01.02 00:37:46 34381.40000 34381.50000 34384.40000        4 820543066376      30       4.33700
(BTCUSDT.fut,M1)        34381.4 3438140.0
(BTCUSDT.fut,M1)        34380.6 34380.6

Как видите всё норм.

Проблему в вашем коде так же не обнаружил. вроде всё красиво и должно работать правильно.


Какая версия метатрейдера у вас?

 
Aleksandr Slavskii #:

Я проверил на своём коде, котировки от  Мосбиржи, всё работает корректно. Версия метатрейдера 4040.

Другой брокер тоже всё норм.  Версия метатрейдера 4048.

код который я вставил в свой советник

результат

Как видите всё норм.

Проблему в вашем коде так же не обнаружил. вроде всё красиво и должно работать правильно.


Какая версия метатрейдера у вас?

в реальном времени проверил?)

 
lynxntech #:

в реальном времени проверил?)

Конечно.

Время в тиках смущает?

Просто пользовательский символ строит секундный график, поэтому время тиков смещено назад.

 
jaffer wilson #:
Я все еще получаю ту же проблему. Пожалуйста, любая поддержка MetaQuotes или человек могут посмотреть это, пожалуйста. Я застрял в этой проблеме и не мог двигаться дальше. Я думаю перейти на CTrader или Ninja, если эта проблема останется.

Как тебе помочь если ты не отвечаешь на заданные тебе вопросы?

Проблема у тебя, а не у  MetaQuotes, но ты её не пытаешься решить. Устраиваешь истерики и детский шантаж.

Задам вопрос ещё раз.  Какая у тебя версия метатрейдера?

Причина обращения: