Обсуждение статьи "Пользовательские символы: основы применения на практике" - страница 6

 
Mr David Frederick Roberts #: Спасибо, Фернандо, я подозревал, что делаю что-то глупое, но просто не мог этого увидеть! Как я уже сказал, я гораздо лучше знаком с MT4 (около 8 лет) и не заметил, что в MT5 есть две опции "£Every Tick". Я просто запустил ее, увидел, что она установлена на "Every Tick" и предположил, что если у нее есть реальные тики, она будет их использовать. Это должно было быть что-то простое, и я еще раз благодарю вас за то, что вы это заметили.
Пожалуйста!
 

Может быть где-нибудь есть новая версия EqualVolumeBars? При использовании этого эксперта обнаружил 2 проблемы:

1. При компиляции EqualVolumeBars появляется 1 предупреждение (легко исправляется в Symbol.mqh заменой time на _time например):

declaration of 'time' hides global variable	Symbol.mqh	28	47

2. Исчезают бары. Как я понял, это происходит тогда, когда в терминале наступил новый день. Например дата в TimeCurrent() 2023.06.03 (BTCUSD тикает по выходным), а последний range бар открыт 2023.06.02. Исчезнут все бары за 2023.06.02.

Воспроизвести эту проблему можно всего в несколько этапов:

  • Закомментить линию 360 в EqualVolumeBars (чтобы график не обновился сам):
//ChartSetSymbolPeriod(id,symbolName,PERIOD_M1);
  • Добавить EqualVolumeBars на график EURAUD со следующими параметрами:

Получится такой график:

  • Нажать правой кнопкой мыши по графику и нажать обновить (Refresh). Результат:


 
Andrei Iakovlev #:

Может быть где-нибудь есть новая версия EqualVolumeBars? При использовании этого эксперта обнаружил 2 проблемы:

1. При компиляции EqualVolumeBars появляется 1 предупреждение (легко исправляется в Symbol.mqh заменой time на _time например):

2. Исчезают бары. Как я понял, это происходит тогда, когда в терминале наступил новый день. Например дата в TimeCurrent() 2023.06.03 (BTCUSD тикает по выходным), а последний range бар открыт 2023.06.02. Исчезнут все бары за 2023.06.02.

Воспроизвести эту проблему можно всего в несколько этапов:

  • Закомментить линию 360 в EqualVolumeBars (чтобы график не обновился сам):
  • Добавить EqualVolumeBars на график EURAUD со следующими параметрами:

Получится такой график:

  • Нажать правой кнопкой мыши по графику и нажать обновить (Refresh). Результат:


Новой версии нет.

В реализации кастом символов в терминале есть баги, о которых я где-то писал, но они не особо исправляются.

В данном случае можете посмотреть по коду - существующий символ перезаполняется полностью при старте эксперта, так что если что-то остается лишнее или наоборот исчезает начало дня - так работает MQL5 API.

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

 

Здравствуйте, Станислав Короткий

Спасибо за все, что вы сделали по различным способам и типам в теме "Пользовательские символы".

Во-вторых, извините, что пишу на английском, так как не знаю русского - :)

Возникла 1 проблема в коде "RenkoTicks" (вроде как ошибка).

1

Не могли бы вы найти время, чтобы устранить эту ошибку.

с уважением

Stanislav Korotky
Stanislav Korotky
  • 2023.04.26
  • www.mql5.com
Trader's profile
 
mntiwana #:

Не могли бы вы уделить время устранению этой ошибки

Просто удалите 0 внутри фигурных скобок. Пожалуйста, следите за изменениями синтаксиса MQL5 в новостных анонсах. Эта статья немного устарела - я не могу вспомнить точную ссылку.

 
Stanislav Korotky #:

Этот уже немного устарел,

И снова, мне понадобилось 3 года, чтобы найти это произведение искусства. Если это и "старое", то старое только что... медленно. Ха. Спасибо.

 

Что касается RenkoTicks.mq5, я столкнулся с проблемой конвертации пунктов в пипсы при использовании трехзначных цен. Ранее я столкнулся с тем же самым с некоторыми утилитами в MT4, поэтому я реализовал то же самое исправление:


//в глобальные файлы, вставить
double _PntsToPips;

//в OnInit, вставка
if(_Digits == 3 || _Digits == 5)
{
 PntsToPips = 10;
}
else
{
 _PntsToPips = 1;
}

//в 2 строки, содержащие _Point (не в sendSpread...), вставьте
* _PntsToPips //2 новые строки будут:

double Renko::boxPoints = NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits);
Renko::setBoxPoints(NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits));


 

Вот небольшое, но важное улучшение в пользовательском сигнале, основанном на пересечении 2 МА. Базовые объекты индикаторов хранят внутренние буферы с данными индикатора (не только в случае MA, но и вообще), поэтому вызов m_maFast.Main(ind) или m_maSlow.Main(ind) приводит к чтению несколько устаревших (кэшированных) данных из объектов, а не из самих индикаторов, если ваша торговая система торгует тиками (!). Теперь это заменено на следующие вызовы GetData, которые, по сути, являются оберткой для прямого CopyBuffer:

class Signal2MACross : public CExpertSignal
{
    ...
    // вспомогательные функции для чтения данных индикаторов
    double FastMA(int ind) { static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer); return buffer[0]; }
    double SlowMA(int ind) { static double buffer[1]; m_maSlow.GetData(ind, 1, 0, buffer); return buffer[0]; }
};

Обновленный заголовочный файл прилагается. Его следует поместить в /MQL5/Include/Expert/Signal/MySignals/. Без этого сигналы были построены по заполненным барам.

Файлы:
 
<br/ translate="no">.

Оказалось, что все еще хуже. Иногда таймсерии еще не пересчитываются при новом тике, поэтому для анализа торговых сигналов необходимо динамически подстраивать барный индекс. Например (грубый подход):

    double FastMA(int ind)
    {
      MqlTick t;
      SymbolInfoTick(m_symbol.Name(), t);
      bool correction = false;

      if(t.time / 60 * 60 != iTime(m_symbol.Name(), PERIOD_CURRENT, 0) && ind > 0)
      {
        ind--;
        correction = true;
      }
      
      static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer);
      
      if(correction)
        PrintFormat("F: %s'%03d %s %.5f", TimeToString(t.time, TIME_SECONDS), t.time_msc % 1000, TimeToString(iTime(m_symbol.Name(), PERIOD_CURRENT, 0)), buffer[0]);
        
      return buffer[0]; 
    }

Это критично для советников, торгующих на открытии бара, и для символов с редкими тиками.

 

А как сделать онлайн график со средней ценой по формуле (bid+ask)/2?