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

 

Спасибо!

 
alexvd:

Да, по первому пункту я явно напутал. Поясните что именно неправильно в описании, то что должна возвращаться копия?

А на счет конкатенации в вашем случае нужно было бы написать нечно типа 

Поясняю. Написано текстом "Возвращает копию строки с измененным значением символа в указанной позиции." Прототип функции - bool  StringSetCharacter(...). Очевидно, что в bool нельзя запихнуть строку. Если действительно возвращается логическое, то видимо это признак успеха/ошибки. Как правило, на других страницах документации есть отдельный раздел Возвращаемое значение, а на данной странице он отсутствует. Его нужно добавить, а в текстовом описании сформулировать предложение относительно семантики функции, а не возвращаемого значения.


По поводу конкатенации, если то, что Вы написали, верно, то следует также изменить описание функции StringConcatenate. В описании написано, что параметр string_var - это [in][out]  Строка, которая будет сформирована в результате конкатенации. Вы утверждаете, что этот параметр только [out].

 
Новый вопросик. Что означает ситуация, когда BarsCalculated возвращает 0. Это вроде бы не ошибка, но как может быть посчитано 0 баров? Фактически - ничего не посчитано. Чем не ошибка?
 
MoneyJinn:

К сожалению, проблема в том, что ордер на закрытие позиции с комментарием терминал публикует только во вкладке "Результаты".

В список HistoryDealsTotal() соответствующий ордер не заносится.

В общем списке ордеров HistoryOrdersTotal() ордера также нет, даже если период выбирать с запасом.

Смею Вас заверить, что и ордера и сделки, в случае закрытия по 'end of test', в мстории имеются. У меня в мультивалютнике подсчитывается профит, полученный по каждому символу. Чтобы учесть сделки, закрытые в тестере по 'end of test' , в де-ините делается поправка на данные сделки. Суммарный профит по всем инструментам совпадает с данными из отчёта тестирования. Вот этот код;

       if(HistorySelect(0,TimeTradeServer()))   // Поправка для 'end of test'
        {
         int DeelsTotal=HistoryDealsTotal();
         for(int i=0;i<SymbolsNumber;i++)
           {
            ulong ticket=HistoryDealGetTicket(DeelsTotal-1-i);
            string comment=HistoryDealGetString(ticket,DEAL_COMMENT);
            if(comment!="end of test"&&StringSubstr(comment,0,3)!="so ")
               break;
            for(int j=0;j<SymbolsNumber;j++)
              {
               if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=m_expert[j].Name())
                continue;
               m_Profit[j]=m_Profit[j]+HistoryDealGetDouble(ticket,DEAL_PROFIT)+  // Добавим профит закрытой позиции для "end of test" и "so"
                           HistoryDealGetDouble(ticket,DEAL_SWAP)+HistoryDealGetDouble(ticket,DEAL_COMMISSION);
              }
           }
        }
 

Коллеги, подскажите, нет ли какой возможности заставить работать SymbolInfoSessionTrade в тестере стратегий?

Банальная запись не работает:

void OnTick() {
  datetime from, to;
  if (SymbolInfoSessionTrade(_Symbol, FRIDAY, 0, from, to)) Print("WOW!");
}
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 

Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен??? 

P.S честное слово в документации не нашел :)

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
220Volt:

Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен??? 

Всё когда-нибудь проходит. Значит ли это, что ничего делать не нужно...?


P.S честное слово в документации не нашел :)

Я  Вам верю... :))
 
Valmars:

Спасибо! Разобрался. Необходимо и достаточно вместо TimeCurrent() использовать TimeTradeServer().

В конце торговой недели нет свежих котировок и поэтому TimeCurrent() длительное время не обновляется.

При деинициализации эксперта TimeCurrent() выдает время 23:00; TimeTradeServer() - 23:59, что совпадает со временем окончания теста. 

 
MoneyJinn:

Спасибо! Разобрался. Необходимо и достаточно вместо TimeCurrent() использовать TimeTradeServer().

В конце торговой недели нет свежих котировок и поэтому TimeCurrent() длительное время не обновляется.

Дело не в котировках, а в том, что сделки 'end of test' осуществляются уже после окончания периода тестирования. Так что, ни в 'OnTick', ни в 'OnTimer' их получить из истории не удастся. По крайней мере, так было год назад, поэтому перенёс их проверку в 'OnDeinit'.
 
220Volt:

Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен??? 

P.S честное слово в документации не нашел :)

Не создавайте динамических объектов - не придется использовать now и всего прочего что связано с этими объектами (Правда тогда Вы не сможете много чего сделать).

Понять то видимо хочется не то в чем смысл now, а в чем смысл работы с динамическими объектами...

Инициализация и деинициализация динамически размещаемых объектов

Особый случай представляет из себя указатели объектов, так как объявление указателя не влечет за собой инициализации соответствующего объекта. Динамически размещаемые объекты инициализируются только в момент создания экземпляра класса оператором new. Инициализация объекта предполагает вызов конструктора соответствующего класса. Если соответствующего конструктора в классе нет, то его члены, имеющие простой тип, не будут автоматически проинициализированы; члены типов строка, динамический массив и сложный объект будут автоматически проинициализированы.

Указатели могут быть объявлены на локальном или глобальном уровне, и при этом могут быть проинициализированы пустым значением NULL или значением указателя такого же или порожденного типа. Если для указателя, объявленного на локальном уровне, был вызван оператор new, то и оператор delete для этого указателя должен быть выполнен до выхода из этого уровня. В противном случае указатель будет потерян и объект не сможет быть удален явно.

Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных, и всем им присвоить указатель одного объекта.

Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, то деструктор будет вызван в момент выполнения оператора delete.

Таким образом, динамически размещаемые объекты создаются только в момент создания оператором new, и гарантированно уничтожаются либо оператором delete либо автоматически исполняющей системой MQL5 в момент выгрузки программы. Порядок объявления указателей динамически создаваемых объектов не влияет на порядок их инициализации. Порядок инициализации и деинициализации полностью контролируется программистом.


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