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

 
George Merts:

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

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

Мне кажется или вы не работали с языками о которых речь? Индекс добавляемому элементу указывать не нужно вообще, он присваивается автоматом и размерность массива увеличивается также. У программиста просто нет шанса ошибиться в индексе при этой операции

Можно реализовать похожее поведение классами, добавить связанные с ним функции pop, shift, unshift итд. И таскать телегу классов из кода в код, при том что в каждом коде из неё используются %10..20 функций. Похоже это на правильное решение? Пример правильного решения на моё имхо - добавление в функцию ObjectsDeleteAll возможности удалять по префиксу - это ещё микрон в сторону более высокоуровневого программирования - и у большинства кодеров улетела в корзину соотв самопальная функция. Увы, с массивами мы такого вряд ли дождёмсо..

 

И таскать телегу классов из кода в код, при том что в каждом коде из неё используются %10..20 функций.

О включаемых mqh файлах не слышали?
 

Не нужно писать классы "умных массивов", они уже есть в Стандартной библиотеке MetaQuotes, посмотрите семейство классов Arry

 
Здравствуйте.Я пытаюсь использовать MT5 для работы с фьючерсами через брокера "Открытие".
При обращении к функции SymbolInfoTick выяснилось, что два последних параметра структуры MqlTick
 - time_msc, flag отсутствуют. Можно ли решить данную проблему? Например, взяв MT5 c этого сайта,
попробовать подключить его к серверу брокера. Или можно получить требуемую информацию другим образом.
Меня интересует: кто был инициатором сделки, продавец или покупатель?
 
Alexander Puzanov:

Мне кажется или вы не работали с языками о которых речь? Индекс добавляемому элементу указывать не нужно вообще, он присваивается автоматом и размерность массива увеличивается также. У программиста просто нет шанса ошибиться в индексе при этой операции

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

Все эти "действия по умолчанию" - должны быть свойствами сложных объектов. Только классов.  Простые же объекты типа переменных, массивов и простых структур - должны иметь как можно меньше "умолчательных" свойств.

Например, при создании - в них должно храниться неопределенное значение, а вовсе не нуль.

Можно реализовать похожее поведение классами, добавить связанные с ним функции pop, shift, unshift итд. И таскать телегу классов из кода в код, при том что в каждом коде из неё используются %10..20 функций. Похоже это на правильное решение?

Это правильное решение с точки зрения логики. При работе с такими классами - их поведение прозрачно.

А насчет "таскать телегу классов" - при кодировании вы их не таскаете, просто подключаете библиотеку. А при компиляции - нормальный компоновщик не должен пихать в исполняемый модуль все методы из библиотеки подряд, а только те, что используются.

Пример правильного решения на моё имхо - добавление в функцию ObjectsDeleteAll возможности удалять по префиксу - это ещё микрон в сторону более высокоуровневого программирования - и у большинства кодеров улетела в корзину соотв самопальная функция. Увы, с массивами мы такого вряд ли дождёмсо..

А на мой взгляд - это тоже неверный подход, по той же причине. Функция нагружается несвойственными ей задачами, которые не следуют из логики ее применения. 

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

 
Demal:
Здравствуйте.Я пытаюсь использовать MT5 для работы с фьючерсами через брокера "Открытие".
При обращении к функции SymbolInfoTick выяснилось, что два последних параметра структуры MqlTick
 - time_msc, flag отсутствуют. Можно ли решить данную проблему? Например, взяв MT5 c этого сайта,
попробовать подключить его к серверу брокера. Или можно получить требуемую информацию другим образом.
Меня интересует: кто был инициатором сделки, продавец или покупатель?
  1. Какой билд терминала у Вас сейчас?
  2. Подключаетесь к какому серверу: демо- или реал?
 
version 5.0 build 1150, демо
 
Demal:
version 5.0 build 1150, демо

Обновите свой терминал (нужно подключится к демо-серверу MetaQuotes-Demo). Текущий билд:

Terminal        MetaTrader 5 build 1210 started (MetaQuotes Software Corp.)

Вот такой скрипт:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2015, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlTick last_tick;
//--- 
   if(SymbolInfoTick(Symbol(),last_tick))
     {
      Print("time = ",last_tick.time,"; bid = ",last_tick.bid,
            "; ask = ",last_tick.ask,"; volume = ",last_tick.volume,
            "; time_msc = ",last_tick.time_msc,"; flag = ",last_tick.flags);
     }
   else Print("SymbolInfoTick() failed, error = ",GetLastError());
  }
//+------------------------------------------------------------------+

 

даёт такой результат: 

Test (RTS-12.15,H1)     time = 2015.11.26 09:42:57; bid = 88360.0; ask = 88400.0; volume = 2; time_msc = 1448530977000; flag = 0

Файлы:
Test.mq5  2 kb
 
Karputov Vladimir:

Обновите свой терминал (нужно подключится к демо-серверу MetaQuotes-Demo). Текущий билд:

Вот такой скрипт:

 

даёт такой результат: 

Спасибо, а не знаете почему у флага значение 0 , как будто ничего не изменилось
 
Demal:
Спасибо, а не знаете почему у флага значение 0 , как будто ничего не изменилось
Используйте CopyTicks и будет Вам счастье. А SymbolInfoTick, вероятно, пока ещё не умеет работать с новой структурой тиков.
Файлы:
CopyTicks.mq5  4 kb
Причина обращения: