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

 
afsmerinostra:

Добрый День, Станислав!

В общем огромное спасибо, за статью и проделанную работу, нашел для себя много нового!

Подскажите где в коде искать логику формирования разворотных баров в РЕНКО, мучаюсь уже месяц с этим в тестере думал, найду способ просто обходить их сигналами, но не тут то было... ) В программировании начинающий, так что если можно тыкнуть пальцем конкретно, был бы благодарен.

Почему нельзя было просто отставить  OPEN как есть, зачем двигать его на разворотах? Было ло бы куда проще с тестером, да и вообще. Исторически так сложилось с ренко? И есть ли в этом практическая польза, кроме "корректности"?

Вроде все бары в RenkoTicks (если речь о нем) строятся по одному алгоритму - они помечены комментариями "up box" и "down box" в комментариях (особым образом развороты не помечаются, но их и так видно по направлению боксов). Сигналы логичнее строить в индикаторе, имхо, не вижу смысла лезть в генератор кастом-символа.

По поводу движения open я не понял. Боксы классического ренко по определению равного размера и разворот отмечается гэпом размером в бокс. Существуют и другие разновидности ренко (в том числе без гэпов), но в статье их нет.

 
Привет, может быть, я пропустил часть, но, как фитили блоков ренко могут быть больше, чем тела?
 
Adren6:
Здравствуйте, может я что-то пропустил, но как вики блоков ренко могут быть больше, чем боди?

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

Размер фитиля всегда меньше 2 размеров коробки, потому что это расстояние, которое приведет к развороту. Пока разворот не произойдет, фитиль собирает всю волатильность.

 
Станислав, я искал операцию с графиками Renko, ваша разработка закрывает все мои сомнения. Спасибо за то, что вы создали большую ценность для трейдеров. Советнику нужно только время начала и окончания торговли.
 

Тоже наткнулся на "HistoryCache: container header read error [0]" и следующий за ним "HistoryBase: invalid container (1970.01.01) found".

При этом, из истории пользовательского инструмента удаляется история за январь 2022, получается гэп с 31 декабря по сегодня.

Проявляется только на 2х компьютерах, ресурсов достаточно.

@Slava, какие нужны детали для воспроизведения?

 
Andrey Khatimlianskii #:

Тоже наткнулся на "HistoryCache: container header read error [0]" и следующий за ним "HistoryBase: invalid container (1970.01.01) found".

При этом, из истории пользовательского инструмента удаляется история за январь 2022, получается гэп с 31 декабря по сегодня.

Проявляется только на 2х компьютерах, ресурсов достаточно.

@Slava, какие нужны детали для воспроизведения?

ИМХО, давно можно было в бету-версию терминала встроить авторепортер по аналогии с тем как Android оправляет висяки и эксепшены в Google Play.

Тогда вообще не надо было бы плясок с бубном по поводу воспроизведения ситуации и предоставления доказательств - вся нужная инфа в виде дампа по согласию пользователя отправлялась бы MQ.

Но видимо это не подходит MQ, потому что они даже СД закрыли. А если бы был авторепортер, то к ним полетел бы шквал багрепортов.

 
Stanislav Korotky #:

ИМХО, давно можно было в бету-версию терминала встроить авторепортер по аналогии с тем как Android оправляет висяки и эксепшены в Google Play.

Тогда вообще не надо было бы плясок с бубном по поводу воспроизведения ситуации и предоставления доказательств - вся нужная инфа в виде дампа по согласию пользователя отправлялась бы MQ.

Но видимо это не подходит MQ, потому что они даже СД закрыли. А если бы был авторепортер, то к ним полетел бы шквал багрепортов.

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

Только fxsaber как-то умудряется доносить до MQ некоторые свои мысли.

Видимо, мы уже на том этапе, когда нужно работать с тем, что есть, и вообще ничего не ждать.

 

При использовании пользовательских символов применяется ли какое-то масштабирование к спреду?

Я импортировал некоторые тиковые данные Dukascopy для EURUSD (которые я назвал EURUSD_TDS). Сравнение цен на вкладке "Тики" пользовательского символа с ценами, показанными за тот же период с помощью следующего кода, показывает, что цены Bid практически одинаковы, но цены Ask отличаются так, что спред значительно ниже, чем на вкладке "Тики" - то есть советник видит меньший спред, чем в исходных данных.Также отличается время тиков, что меня немного удивило, но именно проблема спреда вызывает наибольшее беспокойство.

void OnTick()
{
   double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   datetime now = TimeCurrent();
   
   if ((now >= StartDate) && (now < EndDate))
   {
      double spread = (Ask - Bid) / _Point;
      writeToLog(StringFormat("%s, %.5f, %.5f, %.i", (string)now, Bid, Ask, (int)spread));
   }
}


Сырые данные, спред между 11 и 67 пунктами... То, что видит советник, спред 9 или 26 пунктов...

 
Mr David Frederick Roberts пользовательских символов применяется ли какое-то масштабирование к спреду?

Я импортировал некоторые тиковые данные Dukascopy для EURUSD (которые я назвал EURUSD_TDS). Сравнение цен на вкладке "Тики" пользовательского символа с ценами, показанными за тот же период с помощью следующего кода, показывает, что цены Bid практически одинаковы, но цены Ask отличаются так, что спред значительно ниже, чем на вкладке "Тики" - то есть советник видит меньший спред, чем в исходных данных.Также различается время тиков, что меня немного удивило, но именно проблема спреда вызывает наибольшее беспокойство.


Сырые данные, спред между 11 и 67 пунктами... То, что видит советник, спред 9 или 26 пунктов...

Здравствуйте, "масштабирования" спреда нет, но, вероятно, могут мешать другие нюансы. Например, убедитесь, что вы тестируете в режиме реальных тиков и у вас не включен вариант с фиксированным спредом (по правому логу это выглядит как одинаковый спред на каждом баре).

Было бы неплохо увидеть точную последовательность тиков как в таблице UI, так и в логе советника (включая мсек) - на вашем текущем скриншоте последовательность тиков, похоже, не совпадает.

 
Stanislav Korotky #:

Здравствуйте, "масштабирования" спреда нет, но, вероятно, могут мешать другие нюансы. Например, убедитесь, что вы тестируете в режиме реальных тиков и у вас не включен опцион с фиксированным спредом (по правому логу это выглядит как одинаковый спред на каждом баре).

Было бы неплохо увидеть точную последовательность тиков как в таблице UI, так и в логе советника (включая мсек) - на вашем текущем скриншоте последовательность тиков, похоже, не совпадает.

Спасибо за ответ. Это очень странно, я действительно использую режим реальных тиков, и я не знал, что в MT5 есть опция фиксированного спреда, так что я уверен, что это не так (я больше знаком с MT4).Я не заметил, что спреды одинаковы для каждого бара, на самом деле, просматривая полный файл, кажется, что они меняются только на границах 1 минуты. Я предполагаю, что я прав, думая, что вызовы SymbolInfoDouble() должны возвращать цены для обрабатываемого тика в результате вызова события OnTick() - а не какое-то значение M1?

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

void OnTick()
{
   double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   long timeMillis = SymbolInfoInteger(_Symbol, SYMBOL_TIME_MSC);
   datetime now = TimeCurrent();
   
   datetime time = (datetime)(timeMillis / 1000);
   long millis = timeMillis % 1000;
   
   if ((now >= StartDate) && (now < EndDate))
   {
      double spread = (Ask - Bid) / _Point;
      writeToLog(StringFormat("%s.%i, %.5f, %.5f, %.2f", (string)time, millis, Bid, Ask, spread));
   }
}

EDIT: Как я уже сказал, я относительно новичок в MQL5 - я только что нашел SymbolInfoTick(), возможно, мне следует использовать его вместо того, что я делаю! Я попробую это и посмотрю, что произойдет...


Ладно, это ничего не изменило, результаты точно такие же, но ни один из них не связан с диалогом "Symbol Ticks" в терминале. Я ошибся, сказав, что значение миллисекунды всегда нулевое - оно ненулевое ровно в течение одной минуты, а именно за минуту до полуночи!

Мне кажется, это довольно важный вопрос. Мой торговый советник ожидает получать тики с ценами, которые соответствуют исходным импортированным тиковым данным (как и любой другой!). Смею предположить, что я что-то делаю не так, но если это так, то я хотел бы знать, что именно.Если нет, то здесь очень серьезная проблема. Я приложил zip-файл с тестовым советником, таблицу с результатами за час после полуночи, а также несколько скриншотов настроек и тиков.

Файлы: