Библиотеки: Symbol - страница 9

 
Stanislav Korotky:

А интересный вопрос возник - со стаканом такая же проблема не наблюдается - то есть, чтобы в стакане цены отличались от графика?

Мне пользователь жалуется на рассинхронизацию индюка, построенного по BookEvent-ам, и чарта.

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

 
fxsaber:

Соответственно, в Тестере не получится на оригинальном символе воссоздать то, что видите в Терминале.

А вот что видно в Терминале.

Сделки совершаются "в воздухе". Индикаторы идут лесом. Только демаркап тиковой истории.

 

не пойму в чем дело, скорее всего новый билд 2515 что то не так делает

вот скрипт:

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property script_show_inputs

input int      History        = 1e5;
input double   Weierstrass_A  = 0.33;
input double   Weierstrass_B  = 1.5;
input int      Weierstrass_N  = 10;
input double   Weierstrass_Koeff = 0.45;

#include <fxsaber\Symbol.mqh> // https://www.mql5.com/ru/code/18855
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   const SYMBOL SymbDB("W" + _Symbol);
   datetime dt_end = TimeCurrent();
   if(!SymbDB.IsExist()) // Если символ не создан, выход
   {
      Alert("Error create Weierstrass func, symbol = ", "W" + _Symbol);
      return;
   }
   SymbDB.Off();
   SymbDB.CloneProperties(); // Скопировали свойства
   if(CustomRatesDelete(SymbDB.Name, 0, dt_end) == -1)
   {
      Alert("Error CustomRatesDelete , GetLastError = ", GetLastError());
      return;
   }
// ищем коэф-ты для нормирования
   int fw_MAX = INT_MIN, fw_MIN = INT_MAX;
   for(int i = 4 * History; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      if(wtmp > fw_MAX) fw_MAX = wtmp;
      if(wtmp < fw_MIN) fw_MIN = wtmp;
   }
   const int fw_knorm = fw_MAX - fw_MIN;

// создаем чарт путем записи тиков
   MqlTick ticks[];
   ArrayResize(ticks, History * 4);
   for(int i = 4 * History - 1; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      ticks[i].last = ticks[i].bid = ticks[i].ask = NormalizeDouble(1.0 + Weierstrass_Koeff * (2.0 * (wtmp - fw_MIN) / fw_knorm - 1), _Digits);
      ticks[i].bid -= _Point;
      ticks[i].time_msc = ticks[i].time = dt_end--;
      ticks[i].time_msc *= 1000;
      ticks[i].volume = 1;
      ticks[i].volume_real = 1.0;
      ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
   }
   CustomTicksAdd(SymbDB.Name, ticks);
   if(SymbDB.On()) // Включили в Обзор рынка
      ChartOpen(SymbDB.Name, PERIOD_M1); // Открыли график нового символа
}
//+------------------------------------------------------------------+
int FuncWeierstrass(const double Wa, const double Wb, const int WN, const int cnt)
{
   int result = 0;
   for(int i = 0; i <= WN; i++)
   {
      result += (int)(MathPow(Wb, i) * MathCos(MathPow(Wa, i) * M_PI * cnt));
   }
   return(result);
}
//+------------------------------------------------------------------+


все работает, но работает только один раз

при повторном запуске будет черный экран "Ожидание обновления", лечится путем удаления кастомного символа руками


что некорректно работает? библиотека или новый билд терминала?

 
Igor Makanu:

что некорректно работает? библиотека или новый билд терминала?

Не знаю. Не использую TicksAdd.

 
fxsaber:

Не знаю. Не использую TicksAdd.

кажется разобрался, заменил в своем коде

CustomTicksAdd(SymbDB.Name, ticks);

на

CustomTicksReplace(SymbDB.Name,0,TimeCurrent()*1000,ticks);

кажется теперь работает и при повторном запуске скрипта, единственное - в окне обзор рынка нет значений Аск/Бид символа, но не критично



UPD:

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

if(SymbDB.On()) // Включили в Обзор рынка
   {
      CustomTicksAdd(SymbDB.Name, ticks);
      ChartOpen(SymbDB.Name, PERIOD_M1); // Открыли график нового символа
   }
 

Наткнулся на неприятный баг МТ - он почему-то не устанавливает SYMBOL_TRADE_TICK_SIZE. При отладке видно, что в свойство записывается правильная величина (например, 0.00001 для EURUSD), но после создания символа, в нем находится 0.

Кто-нибудь фиксил такое? Это ошибка МТ или в библиотеке Symbol специфика?

 
Stanislav Korotky:

Наткнулся на неприятный баг МТ - он почему-то не устанавливает SYMBOL_TRADE_TICK_SIZE. При отладке видно, что в свойство записывается правильная величина (например, 0.00001 для EURUSD), но после создания символа, в нем находится 0.

Кто-нибудь фиксил такое? Это ошибка МТ или в библиотеке Symbol специфика?

'0' Вы просто видите или '0' Вы получаете после опроса свойства?

 
Stanislav Korotky:

Наткнулся на неприятный баг МТ - он почему-то не устанавливает SYMBOL_TRADE_TICK_SIZE. При отладке видно, что в свойство записывается правильная величина (например, 0.00001 для EURUSD), но после создания символа, в нем находится 0.

Кто-нибудь фиксил такое? Это ошибка МТ или в библиотеке Symbol специфика?

Возможно, зависит от последовательности задания полей. У меня так.

    this.SetProperty(SYMBOL_DIGITS, this.Ticks.GetDigits());

    this.SetProperty(SYMBOL_TRADE_CONTRACT_SIZE, 1e5); // https://www.mql5.com/ru/forum/330333#comment_14608694
    this.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);

    this.SetProperty(SYMBOL_TRADE_TICK_SIZE, this.GetProperty(SYMBOL_POINT));
 
fxsaber:

Возможно, зависит от последовательности задания полей. У меня так.

Я пользуюсь вызовом CloneProperties, а в ней такие строки (в текущей доступной публично версии):

...
    CLONE(SYMBOL_TRADE_CONTRACT_SIZE) &&
    CLONE(SYMBOL_TRADE_FACE_VALUE) &&
    CLONE(SYMBOL_TRADE_LIQUIDITY_RATE) &&
    CLONE(SYMBOL_TRADE_TICK_SIZE) &&
    CLONE(SYMBOL_TRADE_TICK_VALUE) &&
...

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

 

Прописал после вызова CloneProperties такую лабуду:

    Symb.CloneProperties(_Symbol);
    if(SymbolInfoDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE) == 0)
    {
      CustomSymbolSetDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE, SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
    }

Вот так оно применяется нормально. Но это какой-то костыль.