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

 
AkaEdie #мнекажется мне нужно выбрать "Максимум комплексного критерия", я так и сделал но что означает цифра 40 в результате желтого цвета,  при просадке в 26 процентов и прибыли 675

я так понимаю это коэфицент текущего от стартового капитала в процентах дохода?

Скорее всего, нет. Это просто число, вычисляемое по некоторой формуле из нескольких расчётных характеристик прохода в тестере. Эта формула написана так, что максимальное её значение равно 100. Соответственно, чем ближе к 100 результат, тем лучше. Если вы получаете 40, то это значит, что результаты не особо хороши, ниже средних.

 
Vitaly Muzichenko #:

Проверил.

Ваша конструкция идентична моей, но без ChartSetSymbolPeriod и проверки, что МА не вернула результат

Она начинает работать только вот так

Я не знаю что у вас там не так работает


Что-то гифка нормальная не получается. Ткни в неё…

 
Alexey Viktorov #:

Я не знаю что у вас там не так работает


Что-то гифка нормальная не получается. Ткни в неё…

Вот и Вы ткните, это тоже гифка

Как видим, не работает без ChartSetSymbolPeriod

работает только с родным периодом, на котором создана МА: hMA1=iMA(Symbol(), PERIOD_H1, MA1, 0, Metod_MA, Price_MA);

 

 
Vitaly Muzichenko #:

Вот и Вы ткните, это тоже гифка

Как видим, не работает без ChartSetSymbolPeriod

работает только с родным периодом, на котором создана МА: hMA1=iMA(Symbol(), PERIOD_H1, MA1, 0, Metod_MA, Price_MA);

 

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

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  if(rates_total-prev_calculated==0)
    return(rates_total);
  int res=Start(rates_total); // если "0" - то данные от МА не получены
  if(fl && res==0) {
    ChartSetSymbolPeriod(0,Symbol(),PERIOD_CURRENT);
    ChartRedraw();
    fl=false;
    return(0);
  }
  return(rates_total);
}

Такая хрень.

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

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

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

 
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))