- Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов
- Новая версия платформы MetaTrader 5 build 2360: Расширение интеграции с SQLite
- Сервисы. Уже работают?
Баг 01.
Открыт чарт кастомного символа. Если, например, руками удалить всю баровую и тиковую историю, то окно чарта просто подвиснет - не обновляясь.
Ожидалось поведение, как с пустым кастомным символом.
Баг 02.
Нужно удалить последнюю неделю котировок кастомного символа. Удалить то получится, но визуального эффекта даже ChartRedraw не дает.
Только если мышкой поскроллить чарт, он приходит в норму. Могли бы поправить визуализацию по ChartRedraw?
ЗЫ Делаю пока подобное передергивание
ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT)); Sleep(1000); ChartRedraw(); ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
Баг 03.
TicksAdd имеет следующую защиту. Если тик раньше того, что есть в Обзоре рынка, то он игнорируется.
К сожалению, такой механизм не предусматривает взаимодействие с TicksDelete и TicksReplace.
Требуется удалить последние сутки истории кастомного символа и выставить в Обзор рынка последний тик после удаления.
Если с удалением все в порядке, то с выставлением последнего тика ничего не выйдет, из-за правила, что описал выше.
Предлагаю либо менять правило TicksAdd, либо чтобы TicksDelete/TicksReplace заменял тик в Обзоре рынка на последний в истории, если его время меньше, чем текущее.
Воспроизведение проблемы
template <typename T> T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); } #define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A) // Макрос для удобного и наглядного вывода значений void OnStart() { const string Name = "TEMP1235"; // Имя кастомного символа const string SymbOrig = "EURUSD"; // Имя оригинального символа MqlTick Ticks[]; const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год. if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true))) // Создали символ на основе EURUSD. { _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks)); // Поместили в него историю EURUSD. MqlTick AddTicks[1]; AddTicks[0] = Ticks[Size - 1]; // Последний тик в истории. _P(CustomTicksAdd(Name, AddTicks)); // Последний тик добавили в Обзор рынка и еще раз в историю _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX)); // Удалили все тики, оставив только данные за январь 2019. _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1)); // Взяли последний тик из оставшейся истории. ArrayPrint(AddTicks); // Посмотрели, что это, действительно, последний тик января. _P(CustomTicksAdd(Name, AddTicks)); // Попробовали записать его в Обзор рынка - не получилось. _P(SymbolSelect(Name, false)); // Удалили символ из Обзора рынка. _P(CustomSymbolDelete(Name)); // Удалили символ. } }
Результат
void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638 void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true void OnStart(), Line = 13: SymbolSelect(Name,true) = true void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638 void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1 void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087 void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1 [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000 0 1548979198644 2 0.00000 void OnStart(), Line = 26: CustomTicksAdd(Name,AddTicks) = -1 void OnStart(), Line = 28: SymbolSelect(Name,false) = true void OnStart(), Line = 29: CustomSymbolDelete(Name) = true
Понимаю, что без исходника сообщение об ошибке так и останется словами. Насколько же влом было расписывать, но это, наверное, самый эффективный способ показать, найти и устранить ошибку.
Только вчера начал разбираться с синтетиками, в тестере какая-то чушь. В тестере работают синтетики с формулами?
Создал синтетик, формула из хелпа. Все верно?
Вот что показал тест
Какая-то чушь, все трейды прибыльные, чего даже по картинке быть не может, все закрыты по окончании тестирования, прибыль ноль. Наверное, я чего-то не так делаю. Что еще посмотреть? Лог прилагаю.
Наверное, я чего-то не так делаю. Что еще посмотреть?
На скрине видно, что валюта прибыли символа не совпадает с валютой счета. Поэтому конвертация дает ноль.
Чтобы работало "из коробки", называйте по подобию "EURUSD_ALEX1".
Подскажите в каких папках лежат custom символы и их настройки ? Что то удаление в терминале и программное не помогает.
\MetaTrader5\Bases\Custom\
Баг 04.
Очередной баг со специфическим воспроизведением
template <typename T> T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); } #define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A) // Макрос для удобного и наглядного вывода значений void OnStart() { const string Name = "TEMP8"; // Для каждого запуска нужно менять имя символа, чтобы увидеть проблему const string SymbOrig = "EURUSD"; // Имя оригинального символа MqlTick Ticks[]; const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год. if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true))) // Создали символ на основе EURUSD. { _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks)); // Поместили в него историю EURUSD. MqlTick AddTicks[1]; AddTicks[0] = Ticks[Size - 1]; // Последний тик в истории. _P(CustomTicksAdd(Name, AddTicks)); // Последний тик добавили в Обзор рынка и еще раз в историю _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX)); // Удалили все тики, оставив только данные за январь 2019. _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1)); // Взяли последний тик из оставшейся истории. ArrayPrint(AddTicks); // Посмотрели, что это, действительно, последний тик января. const int NewSize = _P(CopyTicksRange(Name, Ticks)); // Запросили всю историю тиков кастомного символа _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1)); // Снова Взяли последний тик из истории. ArrayPrint(AddTicks); // Увидели, что последний тик изменился! _P(SymbolSelect(Name, false)); // Удалили символ из Обзора рынка. _P(CustomSymbolDelete(Name)); // Удалили символ. } }
Результат
void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638 void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true void OnStart(), Line = 13: SymbolSelect(Name,true) = true void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638 void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1 void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087 void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1 [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000 0 1548979198644 2 0.00000 void OnStart(), Line = 26: CopyTicksRange(Name,Ticks) = 2157552 void OnStart(), Line = 28: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1 [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2019.02.22 23:57:59 1.13303 1.13316 0.0000 0 1550879879799 6 0.00000 void OnStart(), Line = 31: SymbolSelect(Name,false) = true void OnStart(), Line = 32: CustomSymbolDelete(Name) = true
Баг содержится в CopyTicksRange - меняет тиковую историю! Прошу заметить, что для воспроизведения нужно в скрипте все время менять название кастомного символа. И это несмотря на то, что скрипт успешно удаляет его. Получается, что удаление символа - вовсе не удаление.
На скрине видно, что валюта прибыли символа не совпадает с валютой счета. Поэтому конвертация дает ноль.
Чтобы работало "из коробки", называйте по подобию "EURUSD_ALEX1".
Спасибо, дело было в этом. Назвал, как есть на счете, заработало. Еще вопрос. А что происходит при реальной торговле, ордера синтетика транслируются в ордера и позиции на реальных парах, в данном случае (см. формулу) EURUSD и USDCAD?
Где это можно посмотреть, в журнале тестера только синтетик.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования