Пользовательские символы. Ошибки, баги, вопросы, предложения. - страница 31

 

Есть какой-то механизм, чтобы можно было поделиться с кем-то сотней кастомных символов?

Историю перенести легко - просто копирование Custom-папки. А вот спецификации символов - непонятно.

 
fxsaber:

Есть какой-то механизм, чтобы можно было поделиться с кем-то сотней кастомных символов?

Историю перенести легко - просто копирование Custom-папки. А вот спецификации символов - непонятно.

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

 
Andrey Khatimlianskii:

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

Велосипед изрядных сил требует, хоть и прост на первый взгляд. Надо знать корректную последовательность задания свойств символа. Плюс заморочки с котировочными/торговыми сессиями.

Т.е. нужно муторно отлаживать и отлаживать.

 

У меня возникли проблемы с заполнением пользовательских отметок на новом графике. Я пытаюсь создать новую диаграмму символов с другим временем.

Но у меня всегда возникают проблемы с заполнением отметок в символе валюты.

Вот код:

//+------------------------------------------------------------------+
//|                                         Forward_Ticks_Sample.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 0

#include "Includes//Symbol.mqh"

string   g[];
int      total_len_history = 0,
         initialization_flag,
         symbol_history_wiped_clean,
         len_sym = StringSplit(Symbol(),'_',g);
string   Orig_Symbol_Name = g[0],
         symbol_custom=StringFormat("%s_frd",Orig_Symbol_Name);
datetime Let_start = 0;
bool     alert_once,
         commentplaced;
long     time_msc = long(Let_start)*1000,
         tick_chart_id;
ulong    LastTime_Added;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ResetLastError();
   string name = MQLInfoString(MQL_PROGRAM_NAME);
   IndicatorSetString(INDICATOR_SHORTNAME, name);
   ResetLastError();

   Close_All_Symbols_Charts(symbol_custom);

   MqlTick tick;

   while(SymbolInfoTick(Orig_Symbol_Name, tick) == false)
     {
      Sleep(1000);
     }

   alert_once = false;

   tick_chart_id = 0;

   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(Orig_Symbol_Name, tick);

//if(tick.time_msc != LastTime_Added)
     {
      ulong tick_count = tick.time_msc - LastTime_Added;
      uint get_count = uint(MathAbs(double(tick_count)));

      int len = CopyTicks(Orig_Symbol_Name, ticks, COPY_TICKS_ALL, LastTime_Added, get_count);

      if(len <= 2)
         return rates_total;

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

      if(len > 5)
        {
         commentplaced = true;
         ChartSetString(tick_chart_id, CHART_COMMENT, "Please wait while we retrieve ticks........");
        }

      int filled = Tick_Filling_Logic(ticks, len);

      if(commentplaced == true && filled > 0)
        {
         if(last_time + 60 > ulong(TimeCurrent()))
           {
            ChartSetString(tick_chart_id, CHART_COMMENT, "");
            Comment("");
            commentplaced = false;
           }
        }

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

   return rates_total;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Close_All_Symbols_Charts(string local_symbol)
  {
   tick_chart_id = 0;
   ResetLastError();
   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)));
     }
   Sleep(1000);
  }
//+------------------------------------------------------------------+
bool Remove_Symbol_From_MarketWatch_Delete_History(string local_symbol)
  {
   ResetLastError();

   Sleep(10);
   const SYMBOL SYMB(local_symbol);

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

   if(status == false)
      return true;

   if(SYMB.Off() == false)
     {
      Print("Cannot UnSelect the Symbol ", local_symbol, " because: ", GetLastError());
      Sleep(5000);
     }

   Print(__FUNCTION__, " : Error = ", GetLastError());

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

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

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

   MqlDateTime str;
   TimeToStruct(iTime(Orig_Symbol_Name, 0, 0) - 30 * 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(Orig_Symbol_Name);


   MqlTick ticks_add[];

   ulong time_start = GetMicrosecondCount();

   ResetLastError();

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

   int len = CopyTicksRange(Orig_Symbol_Name,
                            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;
     }

   Let_start = 0;
   time_msc = long(Let_start)*1000;

   int total = Tick_Filling_Logic(ticks_add, len);

   if(total <= 0)
     {
      SYMB.Off();
      CustomSymbolDelete(local_symbol);
      return -1;
     }

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

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

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

   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();

   long last = ticks_add[len - 2].time_msc,
        time_msc_local = time_msc;
   datetime Let_start_local = Let_start;
   int total_len_history_local = total_len_history;

   for(int i=0; i < len - 1 && !IsStopped(); i++)
     {
      if(i == 0 || (i > 0 && iBarShift(Orig_Symbol_Name, PERIOD_M1, ticks_add[i].time) > iBarShift(Orig_Symbol_Name, PERIOD_M1, ticks_add[i + 1].time)))
        {
         Let_start_local = datetime(TimeToString(Let_start_local, TIME_DATE|TIME_MINUTES))
                           + 60;
         MqlDateTime tt1;
         TimeToStruct(Let_start_local, tt1);
         if(tt1.day_of_week == 0)
           {
            Let_start_local = Let_start_local + 86400;
           }
         else
            if(tt1.day_of_week == 6)
              {
               Let_start_local = Let_start_local + 86400*2;
              }
         time_msc_local = long(Let_start_local)*1000;
        }
      else
        {
         if(ticks_add[i].time == ticks_add[i + 1].time)
            time_msc_local = time_msc_local + 1;
         else
           {
            Let_start_local = Let_start_local + 1;
            time_msc_local = long(Let_start_local)*1000;
           }
        }
      ticks_add[i].time       = Let_start_local;
      ticks_add[i].time_msc   = time_msc_local;
      total_len_history_local = total_len_history_local + 1;
     }
   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(total == len)
     {
      LastTime_Added    = last;
      Let_start         = Let_start_local;
      time_msc          = time_msc_local;
      total_len_history = total_len_history_local;
     }
   else
     {
      Print("Tick not replaced : ", GetLastError(), " ", len, " = len but filled = ", total, " in ", symbol_custom);
     }
   return total;
  }
//+------------------------------------------------------------------+

Я прикрепил файл зависимостей.

Я получаю эту ошибку:

Пожалуйста, помогите мне найти проблему и что именно мне нужно сделать, чтобы она работала правильно.

Ошибка означает, что я не заполняю галочки по структуре. Но если это так, то как предыдущие свечи выглядели идеально?

п

Файлы:
Symbol.mqh  7 kb
 
jaffer wilson :

У меня возникли проблемы с заполнением пользовательских отметок на новом графике. Я пытаюсь создать новую диаграмму символов с другим временем.

Но у меня всегда возникают проблемы с заполнением отметок в символе валюты.

Вот код:

Я прикрепил файл зависимостей.

Я получаю эту ошибку:

Пожалуйста, помогите мне найти проблему и что именно мне нужно сделать, чтобы она работала правильно.

Ошибка означает, что я не заполняю галочки по структуре. Но если это так, то как предыдущие свечи выглядели идеально?

п

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

 
Любая помощь, пожалуйста: https://www.mql5.com/ru/forum/372451
Имеется проблема обновления OHLC в CustomSymbol
Имеется проблема обновления OHLC в CustomSymbol
  • 2021.07.01
  • www.mql5.com
Я пробовал следующий код: Но всегда есть обновление, написанное на диаграмме. Плюс название символа другое в окне спецификации...
 

Открыл сегодня терминал, скачалось обновление 2994, MT5 перезагрузился. Смотрю пропали все символы, в том числе множество пользовательских символов.

В папке bases\Custom остались папки history и ticks с файлами данных .hc, .hcc, .tkc по пользовательским символам, как их теперь использовать?

Караул! Неужели нужно заново создавать пользовательские символы, импортировать историю и т.д.???

 
Sunriser:

Открыл сегодня терминал, скачалось обновление 2994, MT5 перезагрузился. Смотрю пропали все символы, в том числе множество пользовательских символов.

В папке bases\Custom остались папки history и ticks с файлами данных .hc, .hcc, .tkc по пользовательским символам, как их теперь использовать?

Караул! Неужели нужно заново создавать пользовательские символы, импортировать историю и т.д.???

Вы можете попробовать Custom-папку перенести в другое место и создать заново символы - спецификации, без истории. Затем выйти из Терминала, скопировать обратно Custom-папку и запустить Терминал. История должна будет подхватиться.


ЗЫ Напрашивается бэкап json-настроек символов со стороны Терминала. Случайно удалил или другая гадость - восстановил по бэкапу.

 
fxsaber:

Вы можете попробовать Custom-папку перенести в другое место и создать заново символы - спецификации, без истории. Затем выйти из Терминала, скопировать обратно Custom-папку и запустить Терминал. История должна будет подхватиться.


ЗЫ Напрашивается бэкап json-настроек символов со стороны Терминала. Случайно удалил или другая гадость - восстановил по бэкапу.

Сработало. Спасибо за сэкономленное время!

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Пользовательский Sybmol: ERROR 5308

Темный Райд3r , 2021.06.24 09:55

Я пытаюсь установить SYMBOL_VOLUME_MIN для пользовательского символа, но он возвращает ОШИБКУ 5308

Я полностью проверил, что другие параметры работают нормально, но только SYMBOL_VOLUME_MIN, для которого я устанавливаю значение как двойное, возвращая

ERR_CUSTOM_SYMBOL_PARAMETER_ERROR 5308

поэтому я думаю, что это ошибка в системе, и о ней нужно сообщить, чтобы ее можно было исправить

Этот метод я использую для создания символа и установки свойства: SYMBOL_VOLUME_MIN для пользовательского символа.

(SetProperty(SName, SYMBOL_VOLUME_MIN , 0.001 , "" )

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