Да, по первому пункту я явно напутал. Поясните что именно неправильно в описании, то что должна возвращаться копия?
А на счет конкатенации в вашем случае нужно было бы написать нечно типа
Поясняю. Написано текстом "Возвращает копию строки с измененным значением символа в указанной позиции." Прототип функции - bool StringSetCharacter(...). Очевидно, что в bool нельзя запихнуть строку. Если действительно возвращается логическое, то видимо это признак успеха/ошибки. Как правило, на других страницах документации есть отдельный раздел Возвращаемое значение, а на данной странице он отсутствует. Его нужно добавить, а в текстовом описании сформулировать предложение относительно семантики функции, а не возвращаемого значения.
По поводу конкатенации, если то, что Вы написали, верно, то следует также изменить описание функции StringConcatenate. В описании написано, что параметр string_var - это [in][out] Строка, которая будет сформирована в результате конкатенации. Вы утверждаете, что этот параметр только [out].
Новый вопросик. Что означает ситуация, когда BarsCalculated возвращает 0. Это вроде бы не ошибка, но как может быть посчитано 0 баров? Фактически - ничего не посчитано. Чем не ошибка?
К сожалению, проблема в том, что ордер на закрытие позиции с комментарием терминал публикует только во вкладке "Результаты".
В список 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);
}
}
}
Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен???
Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен???
Всё когда-нибудь проходит. Значит ли это, что ничего делать не нужно...?
Спасибо! Разобрался. Необходимо и достаточно вместо TimeCurrent() использовать TimeTradeServer().
В конце торговой недели нет свежих котировок и поэтому TimeCurrent() длительное время не обновляется.
Дело не в котировках, а в том, что сделки 'end of test' осуществляются уже после окончания периода тестирования. Так что, ни в 'OnTick', ни в 'OnTimer' их получить из истории не удастся. По крайней мере, так было год назад, поэтому перенёс их проверку в 'OnDeinit'.
Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен???
P.S честное слово в документации не нашел :)
Не создавайте динамических объектов - не придется использовать now и всего прочего что связано с этими объектами (Правда тогда Вы не сможете много чего сделать).
Понять то видимо хочется не то в чем смысл now, а в чем смысл работы с динамическими объектами...
Инициализация и деинициализация динамически размещаемых объектов
Особый случай представляет из себя указатели объектов, так как объявление указателя не влечет за собой инициализации соответствующего объекта. Динамически размещаемые объекты инициализируются только в момент создания экземпляра класса оператором new. Инициализация объекта предполагает вызов конструктора соответствующего класса. Если соответствующего конструктора в классе нет, то его члены, имеющие простой тип, не будут автоматически проинициализированы; члены типов строка, динамический массив и сложный объект будут автоматически проинициализированы.
Указатели могут быть объявлены на локальном или глобальном уровне, и при этом могут быть проинициализированы пустым значением NULL или значением указателя такого же или порожденного типа. Если для указателя, объявленного на локальном уровне, был вызван оператор new, то и оператор delete для этого указателя должен быть выполнен до выхода из этого уровня. В противном случае указатель будет потерян и объект не сможет быть удален явно.
Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных, и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, то деструктор будет вызван в момент выполнения оператора delete.
Таким образом, динамически размещаемые объекты создаются только в момент создания оператором new, и гарантированно уничтожаются либо оператором deleteлибо автоматически исполняющей системой MQL5 в момент выгрузки программы. Порядок объявления указателей динамически создаваемых объектов не влияет на порядок их инициализации. Порядок инициализации и деинициализации полностью контролируется программистом.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Спасибо!
Да, по первому пункту я явно напутал. Поясните что именно неправильно в описании, то что должна возвращаться копия?
А на счет конкатенации в вашем случае нужно было бы написать нечно типа
Поясняю. Написано текстом "Возвращает копию строки с измененным значением символа в указанной позиции." Прототип функции - bool StringSetCharacter(...). Очевидно, что в bool нельзя запихнуть строку. Если действительно возвращается логическое, то видимо это признак успеха/ошибки. Как правило, на других страницах документации есть отдельный раздел Возвращаемое значение, а на данной странице он отсутствует. Его нужно добавить, а в текстовом описании сформулировать предложение относительно семантики функции, а не возвращаемого значения.
По поводу конкатенации, если то, что Вы написали, верно, то следует также изменить описание функции StringConcatenate. В описании написано, что параметр string_var - это [in][out] Строка, которая будет сформирована в результате конкатенации. Вы утверждаете, что этот параметр только [out].
К сожалению, проблема в том, что ордер на закрытие позиции с комментарием терминал публикует только во вкладке "Результаты".
В список HistoryDealsTotal() соответствующий ордер не заносится.
В общем списке ордеров HistoryOrdersTotal() ордера также нет, даже если период выбирать с запасом.
Смею Вас заверить, что и ордера и сделки, в случае закрытия по 'end of test', в мстории имеются. У меня в мультивалютнике подсчитывается профит, полученный по каждому символу. Чтобы учесть сделки, закрытые в тестере по 'end of test' , в де-ините делается поправка на данные сделки. Суммарный профит по всем инструментам совпадает с данными из отчёта тестирования. Вот этот код;
Коллеги, подскажите, нет ли какой возможности заставить работать SymbolInfoSessionTrade в тестере стратегий?
Банальная запись не работает:
Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен???
P.S честное слово в документации не нашел :)
Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен???
P.S честное слово в документации не нашел :)
Спасибо! Разобрался. Необходимо и достаточно вместо TimeCurrent() использовать TimeTradeServer().
В конце торговой недели нет свежих котировок и поэтому TimeCurrent() длительное время не обновляется.
При деинициализации эксперта TimeCurrent() выдает время 23:00; TimeTradeServer() - 23:59, что совпадает со временем окончания теста.
Спасибо! Разобрался. Необходимо и достаточно вместо TimeCurrent() использовать TimeTradeServer().
В конце торговой недели нет свежих котировок и поэтому TimeCurrent() длительное время не обновляется.
Если можно еще вопросик. Хотелось бы понять в чем смысл оператора new??? В чем его идея?? Почему не создать объект обычным способом??? Ведь после завершения блока доступ к объекту объявленому через new будет утерян, так зачем он тогда вообщее нужен???
P.S честное слово в документации не нашел :)
Не создавайте динамических объектов - не придется использовать now и всего прочего что связано с этими объектами (Правда тогда Вы не сможете много чего сделать).
Понять то видимо хочется не то в чем смысл now, а в чем смысл работы с динамическими объектами...
Инициализация и деинициализация динамически размещаемых объектов
Особый случай представляет из себя указатели объектов, так как объявление указателя не влечет за собой инициализации соответствующего объекта. Динамически размещаемые объекты инициализируются только в момент создания экземпляра класса оператором new. Инициализация объекта предполагает вызов конструктора соответствующего класса. Если соответствующего конструктора в классе нет, то его члены, имеющие простой тип, не будут автоматически проинициализированы; члены типов строка, динамический массив и сложный объект будут автоматически проинициализированы.
Указатели могут быть объявлены на локальном или глобальном уровне, и при этом могут быть проинициализированы пустым значением NULL или значением указателя такого же или порожденного типа. Если для указателя, объявленного на локальном уровне, был вызван оператор new, то и оператор delete для этого указателя должен быть выполнен до выхода из этого уровня. В противном случае указатель будет потерян и объект не сможет быть удален явно.
Все объекты, созданные выражением указатель_объекта=new Имя_Класса, обязательно должны быть впоследствии уничтожены оператором delete(указатель_объекта). Если по каким то причинам такая переменная по окончании работы программы не была уничтожена оператором delete, то об этом будет выведено сообщение в журнал "Эксперты". Можно объявить несколько переменных, и всем им присвоить указатель одного объекта.
Если динамически создаваемый объект имеет конструктор, то этот конструктор будет вызван в момент выполнения оператора new. Если объект имеет деструктор, то деструктор будет вызван в момент выполнения оператора delete.
Таким образом, динамически размещаемые объекты создаются только в момент создания оператором new, и гарантированно уничтожаются либо оператором delete либо автоматически исполняющей системой MQL5 в момент выгрузки программы. Порядок объявления указателей динамически создаваемых объектов не влияет на порядок их инициализации. Порядок инициализации и деинициализации полностью контролируется программистом.