Ошибки, баги, вопросы - страница 1747
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Как убрать визуальное прилипание НЕ LABEL-объектов к временным координатам баров?
Задаю время-координату объекта с точностью до секунд, а визуализируется так, будто задал с точностью до таймфрейма.
Откопал вопрос
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Andrew Petras, 2014.11.26 13:34
При перемещении объектов типа треугольник, эллипс, прямоугольник непропорционально "плывут" точки привязки.
От этих настроек не зависит
Создаю
перетаскиваю
У прямоугольника "плывет" вторая точка, у треугольника и эллипса - третья.
Это как то можно пофиксить? Нужны точные "мерки".
Когда выбираю "Точная шкала времени", то упомянутая привязка исчезает, и все показывается, как надо. Но в MQL5 нигде не нашел, как включать/выключать этот параметр. Не предусмотрено что ли?
Очень нужна помощь! Несколько часов пытался выловить причину странного поведения. В итоге написал советник с совсем неожиданным результатом
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(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 возвращает иногда (надо подождать) тик со временем меньше, чем был предыдущий!
Что это за фигня такая?! Конфигурация
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.)
Очень нужна помощь! Несколько часов пытался выловить причину странного поведения. В итоге написал советник с совсем неожиданным результатом
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(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 возвращает иногда (надо подождать) тик со временем меньше, чем был предыдущий!
Что это за фигня такая?! Конфигурация
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.)
Волшебная строка
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }
Последовательность действий (строгая)
Результат:
Настройки здесь: https://www.mql5.com/ru/forum/1111/page1127#comment_795376
Да, не Вам одному помощь нужна здесь. Я вот несколько недель пытаюсь тики закатать нормально в свечу. Так что... тики еще сыроваты. Заявка в СД #1598238
Тики нормально закатываются в свечу.
Серьезно? И объемы совпадают? И Вы контроль делали? И даже логи можете показать?
Контроль делал - смотреть кодобазу. На несовпадение объемов свечей и вычисленных - плевать, т.к. там идет речь о граничном тике, который может попасть либо в один бар, либо в другой. И это не принципиально. Индикатор торгового оборота также выкладывал на форуме. Так что никаких проблем.
В Вашем случае, если очень сильно занудствовать, можно придираться к механизму создания баров, но не к CopyTicks.
Ошибка при компиляции
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) не устроила?. Если рассмотреть ситуацию с другой стороны
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 перестал компилироваться код и/или что более критично - изменился конечный результат
Волшебная строка
virtual int f( const ABCDEFGHIJK ) const { return ABCDEFGHIJK; }
Последовательность действий (строгая)
Результат:
Настройки здесь: https://www.mql5.com/ru/forum/1111/page1127#comment_795376
Ошибка при компиляции
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) не устроила?. Если рассмотреть ситуацию с другой стороны
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 );