Обновление платформы MetaTrader 4 билд 625: Журналы в MetaTrader Market и новый MetaViewer - страница 28

 
artmedia70:

Уважаемые разработчики. Просьба убрать сброс настроек советника после его перекомпиляции к настройкам по-умолчанию.

Ситуация такова: работают два одинаковых советника на разных парах. У каждого свой магик. Есть открытые позиции. После внесения небольших изменений в код советника и его перекомпиляции, спустя некоторое время я заметил что один из советников (работающий на AUDUSD) потерял некоторые свои позиции. Когда стал разбираться, понял, что после перекомпиляции его настройки сбросились в те, что заданы по-умолчанию. Теперь у меня на AUDUSD две кучки ордеров - одна с одним магиком, другая - с другим. Это не дело... Теперь те позиции, которые были открыты с магиком не по-умолчанию приходится отслеживать самому. Работа на H1 и H4. Т.е. получается, что я надолго привязан к монитору.

Если есть возможность, уберите такое поведение. Спасибо.


Сделали и для экспертов, и для индикаторов. Теперь, если Вы не меняли в исходнике количество и типы входных параметров, то после перекомпиляции входные параметры восстанавливаются теми значениями, что были до перекомпиляции

Подождите, пожалуйста, следующий билд

 

Новый странный баг. Есть параметр "input bool SignalEntryByHedgeTradeIndicators = true;"

В тестере в опциях эксперта я высталяю его значение false.

Но в ходе тестирования он почему то true.

 
RickD:

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

Исправили. Теперь при применении шаблона эксперту можно будет торговать, если соответствующее разрешение у него уже было.

НО. Если эксперту, который вызывает ChartApplyTemplate, самому не разрешено торговать, то и "шаблонному" эксперту в любом случае будет запрещено торговать. Мы не разрешаем "повышения прав"

 
RickD:

Новый странный баг. Есть параметр "input bool SignalEntryByHedgeTradeIndicators = true;"

В тестере в опциях эксперта я высталяю его значение false.

Но в ходе тестирования он почему то true.


Выставляете значение и нажимаете на кнопку OK. Или на крестик, закрывающий окно опций?
 
stringo:

Исправили. Теперь при применении шаблона эксперту можно будет торговать, если соответствующее разрешение у него уже было.

НО. Если эксперту, который вызывает ChartApplyTemplate, самому не разрешено торговать, то и "шаблонному" эксперту в любом случае будет запрещено торговать. Мы не разрешаем "повышения прав"


А чтобы разрешать или запрещать торговлю путем изменения поля flags - это надо добавлять или исключать 4?
 
stringo:

Выставляете значение и нажимаете на кнопку OK. Или на крестик, закрывающий окно опций?

Уже 7 лет как на OK нажимаю при изменении параметров. :)
 
Некоторое время назад сталкивался с такой проблемой - в коде задана переменная с очень длинным именем и есть функция так же с очень длинным именем. по отдельности все компилировалось нормально, но когда в аргументы функции подставлялась эта переменная возникала какая-то ошибка (уже не помню, кажется при компиляции). Проблема решилась уменьшением длины имени переменной. Если имя слишком длинное то компилятор должен сообщать об этом на раннем этапе, а если длина допустимая то не должно быть проблем с подстановкой этой переменной в аргументы функции.
 
simpleton:

Следует использовать специально предназначенные для этого автоматизмы: конструктор и деструктор (здесь скрипт, а не советник, чтобы лог легче читался после однократного вызова OnStart()):

Лог:

Последовательность событий в целом должна быть ясна из лога.

Вообще, в целях успешной борьбы со сложностью программ, данные следует держать в структуре/классе "под грифом" private, а "под гриф" public помещать функции, с помощью которых и осуществлять работу с данными, размещёнными в структуре "под грифом" private как с логически единым целым.

По данному коду: инициализация полей структуры/класса в конструкторе происходит между двоеточием и открывающей фигурной скобкой и имеет вид field(value), где field - поле структуры, даже если среди параметров конструктора есть одноимённый с этим полем параметр (а компилятор MQL4 из-за этого ложное предупреждение выдаёт), а value - доступная в данном месте переменная или выражение с типом, неявно приводимым к типу поля field. Если в качестве value нужно использовать значение уже инициализированного поля, и у конструктора есть одноимённый с этим полем параметр, то, чтобы использовать поле, нужно обратиться в этом месте как "this.field". В частности, из тела конструктора печатается именно значение поля rez, а не параметра конструктора rez, который "скрывает" в конструкторе поле rez. В деструкторе и в функции fun() таких мер принимать не надо.

В теле конструктора (после открывающей фигурной скобки) - уже никакая не инициализация: если поля и трогаются "на запись", то это уже будет присвоение значений. В частности, если в классе имеются сами по себе константные поля, то начальные их значения можно лишь инициализировать. Попытка присвоить эти начальные значения в теле конструктора приведёт к ошибке. Это можно проверить, сделав rez константным и попробовав не инициализировать это поле, а присвоить ему значение в теле конструктора.

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


Спасибо за развернутый ответ !

Объясните следующие моменты:

test(const double rez): rez(rez) {

    Print("test::test(), rez = ", this.rez);
 

Очень бы хотелось где то почитать и изучить более детально создание классов и структур. В элементарных примерах..

К сожалению у меня нет глубоких знаний в програмисровании в С++, или иных языках ... Поэтому я даже не знаю с чего начать..

Простые элементы я разобрал на статьях, а эти тонкости : rez(rez) {

и многие другие нигде не описаны... Как быть ? Что читать ??? Где учить ???

 
chief2000:
Некоторое время назад сталкивался с такой проблемой - в коде задана переменная с очень длинным именем и есть функция так же с очень длинным именем. по отдельности все компилировалось нормально, но когда в аргументы функции подставлялась эта переменная возникала какая-то ошибка (уже не помню, кажется при компиляции). Проблема решилась уменьшением длины имени переменной. Если имя слишком длинное то компилятор должен сообщать об этом на раннем этапе, а если длина допустимая то не должно быть проблем с подстановкой этой переменной в аргументы функции.


Вот у меня похоже тоже баг как то с длинной переменной связан. До 27 символов работает правильно.
Причина обращения: