Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1516

 
Aleksandr Slavskii #:

Выбрать "Максимум пользовательского критерия"

В код советника добавить, что то типа такого.

ого спасибо тебе большое

 
Alexey Viktorov #:

Виталий, я только на гифке заметил что в коде

Такая хрень.

 Удалите эти строки и попробуйте повторить.

Я не понимаю, зачем надо вносить свои поправки и говорить о том, что совет не работает…

потом на гифке у вас не тот индикатор который вы показываете тут…

if(rates_total-prev_calculated==0)

Это не выполнится, если будет ошибка получения данных от МА и return(0); вернёт 0 

На гифке тот-же индикатор.

Можно убрать, но проблему это не решит, только будет пересчёт индикатора на каждом тике, а это не нужно.

PS. И да, убрал и проверил - проблема не ушла, только ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT);

 
Vitaly Muzichenko #:

Это не выполнится, если будет ошибка получения данных от МА и return(0); вернёт 0 

На гифке тот-же индикатор.

Можно убрать, но проблему это не решит, только будет пересчёт индикатора на каждом тике, а это не нужно.

PS. И да, убрал и проверил - проблема не ушла, только ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT);

Ну как знаешь. Если без этого жить не можешь, то пусть будет так…

Как можно говорить о том, что индикатор тот-же, если в примере просто распечатка значения, а на гифке строятся графические элементы…


Ну да… Больше вносит проблему эта строка

  int res=Start(rates_total); // если "0" - то данные от МА не получены

Уберите её вниз и проверьте ещё раз. И даже перерисовка графика не нужна.


Да, Виталий, извини это у меня закралась ошибка и печать шла из другого места.

 
Alexey Viktorov # :

Ну как знаешь. Если без этого жить не можешь, то пусть будет так…

Как можно говорить о том, что индикатор тот-же, если в примере просто распечатка значения, а на гифке строятся графические элементы…


Ну да… Больше вносит проблему эта строка

Уберите её вниз и проверьте ещё раз. И даже перерисовка графика не нужна.


Да, Виталий, извини это у меня закралась ошибка и печать шла из другого места.

объекты строятся по расчетам МА

 

нашел такую статью  https://www.mql5.com/ru/articles/286

и в исходнике его советника такой код 

   criterion_Ptr=new TCustomCriterionArray();
   if(CheckPointer(criterion_Ptr)==POINTER_INVALID)
     {
      return(-1);
     }
   criterion_Ptr.Add( new TSimpleCriterion( STAT_PROFIT ));
   criterion_Ptr.Add( new TSimpleDivCriterion( STAT_BALANCE_DD ));
   criterion_Ptr.Add( new TSimpleMinCriterion( STAT_TRADES, 50.0 ));

но никак не соображу как выставить нужные параметры, а конкретно:

  1. Минимальная просадка
  2. Максимальный баланс
  3. Максимальная прибыль
  4. Максимальное количество ордеров
Создание собственных критериев оптимизации параметров эксперта
Создание собственных критериев оптимизации параметров эксперта
  • www.mql5.com
Терминал МetaTrader 5 дает новые возможности для оптимизации параметров создаваемых экспертов. Кроме уже имеющихся в тестере критериев оптимизации, разработчики получили инструмент для создания собственных критериев. Это открывает поистине безграничные возможности в тестировании и оптимизации экспертов. В статье рассматриваются практические способы построения таких критериев - как простых, так и достаточно сложных.
 
Alexey Viktorov #:

Нет.

Выбирать позицию надо не по символу, а по тикету функцией PositionGetTicket(i) и потом проверять магик и символ.

   int         total            = PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      string position_symbol       = PositionGetString(POSITION_SYMBOL);
      ulong  ticket                = PositionGetTicket(i);
      if(total == 0 || (ticket > 0 && position_symbol==Symbol() && magic != Magic_m))

Верно ли я понимаю, что в данном случае position_symbol и magic относятся именно к данному ticket? Работает ли конкатенация, вроде ticket.magic  или ticket.symbol? Верна ли запись теперь?

Верна ли следующая запись?

   int         total            = PositionsTotal();
   for(int i=total-1; i>=0; i--)
   {
      int      position_magic        = position.Magic();
      string position_symbol       = position.Symbol(); /*PositionGetString(POSITION_SYMBOL)*/;
      ulong  position_ticket        = position.SelectByIndex(i);
      string symbol                      = Symbol();
      if(total == 0 || (position_ticket > 0 && position_symbol == symbol && position_magic != Magic_m))
 

Небольшое уточнение к Вашему коду:

  1. сначала нужно получить тикет позиции по индексу в списке открытых позиций;
  2. затем получить символ у открытой позиции.
Почему именно так, а не наоборот? В документации всё чётко прописано:

Функция PositionGetTicket возвращает тикет позиции по индексу в списке открытых позиций
и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

С уважением, Владимир.

 
maxvoronin74 #:
Верно ли я понимаю, что в данном случае position_symbol и magic относятся именно к данному ticket? Работает ли конкатенация, вроде ticket.magic  или ticket.symbol? Верна ли запись теперь?

так будет почти правильно.

    for(int i = PositionsTotal(); i-- > 0;)
     {
      ulong posTicket = PositionGetTicket(i);
      long posMagic = PositionGetInteger(POSITION_MAGIC);
      string posSymbol = PositionGetString(POSITION_SYMBOL);
      if(posSymbol == _Symbol && posMagic == Magic_m)
       {

У каждого свой принцип программирования и на мой взгляд вот эта строка вашего кода выглядит как-то странно

      if(total = 0 || (ticket > 0 && position_symbol==Symbol() && magic != Magic_m))

Зачем проверка if(total = 0 ……… ведь если нет открытых позиций, то и цикл выполняться просто не будет.

Да и проверка if(………magic != Magic_m)) ничего не даёт. Ведь если позиция имеет иной магик, то просто начнётся новая итерация цикла и без дополнительных команд.

Но это всё на любителя. Если нравится так, то пишите так…

 
MrBrooklin #:
автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString

Благодарю. Выяснял, что конкретно может значить это "автоматически".

 
Alexey Viktorov #:

так будет почти правильно.

У каждого свой принцип программирования и на мой взгляд вот эта строка вашего кода выглядит как-то странно

Зачем проверка if(total = 0 ……… ведь если нет открытых позиций, то и цикл выполняться просто не будет.

Да и проверка if(………magic != Magic_m)) ничего не даёт. Ведь если позиция имеет иной магик, то просто начнётся новая итерация цикла и без дополнительных команд.

Но это всё на любителя. Если нравится так, то пишите так…

Возможно, это из-за того, что у меня i >= 0. У Вас - больше нуля. И конкатенация, о которой я спрашивал, не принимается MetaEditor-ом. Хотя я взял ее из статьи МетаКвот (https://www.mql5.com/ru/articles/12103)...

А почему Вы не проверяете posTicket на равенство нулю? Ведь равенство нулю по документации свидетельствует об ошибке?

Касаемо ненужности проверки магика я пока не понимаю. Смысл кода - быть уверенным, что не открыта позиция именно этим экспертом на данном инструменте. Экспертов на инструменте несколько. У каждого - свое окно. Эксперты магиком и отличаются.

Тестирование и оптимизация стратегий для бинарных опционов в MetaTrader 5
Тестирование и оптимизация стратегий для бинарных опционов в MetaTrader 5
  • www.mql5.com
Проверяем и оптимизируем стратегии для бинарных опционов в MetaTrader 5.
Причина обращения: