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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Artyom Trishkin
Модератор
43754
Artyom Trishkin  
Так как тема достаточна обширна, решил, что стоит выделить её в отдельное обсуждение.
fxsaber
15009
fxsaber  

Баг 01.

Открыт чарт кастомного символа. Если, например, руками удалить всю баровую и тиковую историю, то окно чарта просто подвиснет - не обновляясь.

Ожидалось поведение, как с пустым кастомным символом.

fxsaber
15009
fxsaber  

Баг 02.

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

Только если мышкой поскроллить чарт, он приходит в норму. Могли бы поправить визуализацию по ChartRedraw?


ЗЫ Делаю пока подобное передергивание

    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
    Sleep(1000);
    ChartRedraw();
    
    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
fxsaber
15009
fxsaber  

Баг 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


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

Alexey Volchanskiy
27153
Alexey Volchanskiy  

Только вчера начал разбираться с синтетиками, в тестере какая-то чушь. В тестере работают синтетики с формулами?

Создал синтетик, формула из хелпа. Все верно? 

1

Вот что показал тест

2

Какая-то чушь, все трейды прибыльные, чего даже по картинке быть не может, все закрыты по окончании тестирования, прибыль ноль. Наверное, я чего-то не так делаю. Что еще посмотреть? Лог прилагаю.

Файлы:
20190224.log 9322 kb
fxsaber
15009
fxsaber  
Alexey Volchanskiy:

Наверное, я чего-то не так делаю. Что еще посмотреть?

На скрине видно, что валюта прибыли символа не совпадает с валютой счета. Поэтому конвертация дает ноль.

Чтобы работало "из коробки", называйте по подобию "EURUSD_ALEX1".

pivomoe
698
pivomoe  
Подскажите в каких папках лежат custom символы и их настройки ? Что то удаление в терминале и программное не помогает. 
Aidas Geguzis
2442
Aidas Geguzis  
pivomoe:
Подскажите в каких папках лежат custom символы и их настройки ? Что то удаление в терминале и программное не помогает. 

\MetaTrader5\Bases\Custom\

fxsaber
15009
fxsaber  

Баг 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 - меняет тиковую историю! Прошу заметить, что для воспроизведения нужно в скрипте все время менять название кастомного символа. И это несмотря на то, что скрипт успешно удаляет его. Получается, что удаление символа - вовсе не удаление.

Alexey Volchanskiy
27153
Alexey Volchanskiy  
fxsaber:

На скрине видно, что валюта прибыли символа не совпадает с валютой счета. Поэтому конвертация дает ноль.

Чтобы работало "из коробки", называйте по подобию "EURUSD_ALEX1".

Спасибо, дело было в этом. Назвал, как есть на счете, заработало. Еще вопрос. А что происходит при реальной торговле, ордера синтетика транслируются в ордера и позиции на реальных парах, в данном случае (см. формулу) EURUSD и USDCAD?

Где это можно посмотреть, в журнале тестера только синтетик.

й

fxsaber
15009
fxsaber  
Кастомные символы на реале являются только информационными, не торговыми. Торговать по ним можно только в Тестере.