Ошибки, баги, вопросы - страница 1747

 

Как убрать визуальное прилипание НЕ LABEL-объектов к временным координатам баров?

Задаю время-координату объекта с точностью до секунд, а визуализируется так, будто задал с точностью до таймфрейма.

Откопал вопрос

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

Andrew Petras, 2014.11.26 13:34

При перемещении объектов типа треугольник, эллипс, прямоугольник непропорционально "плывут" точки привязки.

От этих настроек не зависит


Создаю


перетаскиваю


У прямоугольника "плывет" вторая точка, у треугольника и эллипса - третья.

Это как то можно пофиксить? Нужны точные "мерки".

Когда выбираю "Точная шкала времени", то упомянутая привязка исчезает, и все показывается, как надо. Но в MQL5 нигде не нашел, как включать/выключать этот параметр. Не предусмотрено что ли?

 

Очень нужна помощь! Несколько часов пытался выловить причину странного поведения. В итоге написал советник с совсем неожиданным результатом

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

Результат (снизу-вверх)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

SymbolInfoTick возвращает иногда (надо подождать) тик со временем меньше, чем был предыдущий!

Что это за фигня такая?! Конфигурация

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)


 

 
fxsaber:

Очень нужна помощь! Несколько часов пытался выловить причину странного поведения. В итоге написал советник с совсем неожиданным результатом

#define TOSTRING(A) #A + " = " + (string)A + "\n"

string TimeToString( const ulong Time )
{
  return(TimeToString(Time / 1000, TIME_DATE|TIME_SECONDS) + "." + ::IntegerToString(Time % 1000, 3, '0'));
}

void OnTick()
{
  static MqlTick PrevTick = {0};
  
  MqlTick NowTick;
  
  if (SymbolInfoTick(_Symbol, NowTick) && (PrevTick.time_msc > NowTick.time_msc))
    Alert(TOSTRING(TimeToString(PrevTick.time_msc)) + TOSTRING(TimeToString(NowTick.time_msc)));
    
  PrevTick = NowTick;  
}

Результат (снизу-вверх)

2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.698
2016.10.31 11:55:51.031 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.702
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:10.654
2016.10.31 11:55:50.979 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:10.656
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:58:05.458
2016.10.31 11:55:45.792 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:58:05.464
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(NowTick.time_msc) = 2016.10.31 12:56:05.474
2016.10.31 11:53:45.807 Test10 (Si-12.16,M1)    TimeToString(PrevTick.time_msc) = 2016.10.31 12:56:05.476

SymbolInfoTick возвращает иногда (надо подождать) тик со временем меньше, чем был предыдущий!

Что это за фигня такая?! Конфигурация

Network 'xxx': authorized on BCS-MetaTrader5 through Access Server #2 (ping: 112.19 ms)
Terminal        C:\Program Files\BCS Broker MetaTrader 5 Terminal
Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11327 / 16301 Mb, HDD: 4346 / 30000 Mb, GMT+02:00
Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
Да, не Вам одному помощь нужна здесь. Я вот несколько недель пытаюсь тики закатать нормально в свечу. Так что... тики еще сыроваты. Заявка в СД #1598238
 

Волшебная строка

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Последовательность действий (строгая)

  1. Поместить прилагаемые файлы в одну папку. Далее мышью в MetaEditor  
  2. Файл->Открыть->выбрать Test.mqh->кнопка Открыть
  3. Правка->Поиск и замена->Заменить->заполнить поля Найти: и 'Заменить на:' как показано ниже->кнопка 'Заменить все'

Результат: 

Настройки здесь: https://www.mql5.com/ru/forum/1111/page1127#comment_795376 

Файлы:
Test.mqh  1 kb
key.mqh  1 kb
 
Alexey Kozitsyn:
Да, не Вам одному помощь нужна здесь. Я вот несколько недель пытаюсь тики закатать нормально в свечу. Так что... тики еще сыроваты. Заявка в СД #1598238
Тики нормально закатываются в свечу.
 
fxsaber:
Тики нормально закатываются в свечу.
Серьезно? И объемы совпадают? И Вы контроль делали? И даже логи можете показать?
 
Alexey Kozitsyn:
Серьезно? И объемы совпадают? И Вы контроль делали? И даже логи можете показать?

Контроль делал - смотреть кодобазу. На несовпадение объемов свечей и вычисленных - плевать, т.к. там идет речь о граничном тике, который может попасть либо в один бар, либо в другой. И это не принципиально. Индикатор торгового оборота также выкладывал на форуме. Так что никаких проблем.

 

В Вашем случае, если очень сильно занудствовать, можно придираться к механизму создания баров, но не к CopyTicks. 

 

 Ошибка при компиляции

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

А если убрать строку (*), то все нормально. А чем B::f(uint) не устроила?. Если рассмотреть ситуацию с другой стороны

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

то проявляются фундаментальные недостатки MQL алгоритма поиска подходящей функции. Во 2-ом примере пока нет строки (**) - будет вызываться B::f(uint). Как только появится строка (**), то будет вызываться  A::f(int). А значит изменения в базовом классе влияют на конечный результат - в то время как в С++ всегда будет вызываться B::f(uint) независимо от изменений в базовом классе, что гарантирует стабильность конечного результата.

В MQL получается, что разработчик класса A придумал всего лишь новую public\protected\private функцию, а из-за этого у пользователя класса B перестал компилироваться код и/или что более критично - изменился конечный результат

 
A100:

Волшебная строка

#include "key.mqh"
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }

Последовательность действий (строгая)

  1. Поместить прилагаемые файлы в одну папку. Далее мышью в MetaEditor  
  2. Файл->Открыть->выбрать Test.mqh->кнопка Открыть
  3. Правка->Поиск и замена->Заменить->заполнить поля Найти: и 'Заменить на:' как показано ниже->кнопка 'Заменить все'

Результат: 

Настройки здесь: https://www.mql5.com/ru/forum/1111/page1127#comment_795376 

Спасибо за сообщение, ошибка будет исправлена в следующем обновлении.
 
A100:

 Ошибка при компиляции

class A {
protected:
        void f(  int ) {} //(*)
};
class B : public A {
public:
        void f( uint ) {}
};
void OnStart()
{
        B b;
        b.f( 1 ); //'A::f' - cannot call protected member function
}

А если убрать строку (*), то все нормально. А чем B::f(uint) не устроила?. Если рассмотреть ситуацию с другой стороны

class A {
public:
        void f(  int ) {} //(**)
};
class B : public A {
public:
        void f( uint ) {}
};

то проявляются фундаментальные недостатки MQL алгоритма поиска подходящей функции. Во 2-ом примере пока нет строки (**) - будет вызываться B::f(uint). Как только появится строка (**), то будет вызываться  A::f(int). А значит изменения в базовом классе влияют на конечный результат - в то время как в С++ всегда будет вызываться B::f(uint) независимо от изменений в базовом классе, что гарантирует стабильность конечного результата.

В MQL получается, что разработчик класса A придумал всего лишь новую public\protected\private функцию, а из-за этого у пользователя класса B перестал компилироваться код и/или что более критично - изменился конечный результат

Просто константа "1" в вызове b.f( 1 ) интерпретируется как int. Сделайте явное приведение, и всё заработает:

b.f( (uint)1 ); 

Причина обращения: