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

 
Evgeny Dyuka #:

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

Есть какие то решения?

мультитестер сабера решение, там и по инструментам и по настройкам можно задать проходы.

Библиотеки: MultiTester
Библиотеки: MultiTester
  • 2019.07.19
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: MultiTester
 
Yuriy Bykov #:

Если сделать так, что пара будет определяться параметром советника, который может меняться при оптимизации, то, чтобы запустить проход по нескольким парам, просто запускаем оптимизацию по этому параметру.
Этот параметр нельзя сделать типа string, но можно сделать int или enum.
По этому параметру при инициализации советника мы присваиваем другой своей строковой переменной имя нужного символа, соответствующего значению параметра.
В коде советника придется всюду, где используется Symbol() или _Symbol заменить её на свою переменную с именем пары.

Принцип понятен или нужен пример кода?

Супер! Перебирать оптимизатором мне в голову не пришло.

 
Yuriy Bykov #:

Если сделать так, что пара будет определяться параметром советника, который может меняться при оптимизации, то, чтобы запустить проход по нескольким парам, просто запускаем оптимизацию по этому параметру.
Этот параметр нельзя сделать типа string, но можно сделать int или enum.
По этому параметру при инициализации советника мы присваиваем другой своей строковой переменной имя нужного символа, соответствующего значению параметра.
В коде советника придется всюду, где используется Symbol() или _Symbol заменить её на свою переменную с именем пары.

Принцип понятен или нужен пример кода?

А как быть с OnTick() ?
Везде могу подставить свой символ, но OnTick() всегда будет браться из символа на котором запущен тестер.
Из справки: "
Событие  OnTick() генерируется ... при поступлении нового тика по символу, к графику которого прикреплен эксперт".

Тут не может возникнуть конфликта? Например, форекс остановился на выходные, а крипта нет.

 
Да, это проблема. Я с криптой не работал, поэтому про различие периодов разрешенной торговли не думал. Но можно в тестере поставить в качестве рабочего символа какую-то криптовалюту, а в советнике добавить (или не убирать) проверку, что торговля разрешена. После этого основная проблема в несовпадении времен прихода тиков по разным инструментам. Тут можно постараться выбрать инструмент, где тиков как можно больше, чтобы уменьшить погрешность результатов тестирования. В мультивалютных экспертах, которые работают, прикрепленные к одному графику, ситуация будет та же самая - OnTick() срабатывает только по основному инструменту. Чтобы корректно отслеживать событие наступление нового бара по разным символам в этом случае использую свою библиотеку New Bar Event.
New Bar Event
New Bar Event
  • www.mql5.com
Позволяет определить наступление события нового бара в мультивалютном советнике. В вызове OnTick() можно многократно проверять, наступило ли на этом тике событие для нужного инструмента (symbol) и периода графика (timeframe).
 

Здравствуйте,

Я пытаюсь сделать очень простой советник, который сравнивает две цены закрытия и на основе этого открывает ордер на покупку или продажу.

На первом ордере все идет хорошо, но как только условие переключается с продажи на покупку, он выставляет сразу несколько ордеров.

m_trade - это объект Ctrade.

// Current position information

bool Buy_openend = false;
bool Sell_openend = false;

double currentVolume = 0;

if(PositionSelect(_Symbol) == true)
  {
   if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      Buy_openend = true;
     }
      if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
     {
      Sell_openend = true;
      }   
        currentVolume = PositionGetDouble(POSITION_VOLUME);   
  } 

// Check for trade conditions

bool SellCondition = close <= closeprev && bar[1].time == startTime;
bool BuyCondition = close >= closeprev && bar[1].time == startTime;


// Entering trade

if(SellCondition)
  {
   if(Sell_openend)
   {
   Print("We already have a sell open");
   return;
   }
   m_trade.Sell(TradeVolume+currentVolume,_Symbol,m_symbol.Ask(),NULL,NULL,NULL);
  }
if(BuyCondition)
  {
   if(Buy_openend)
     {
      Print("We already have a buy open");
   return;
     }
     m_trade.Buy(TradeVolume+currentVolume,_Symbol,m_symbol.Bid(),NULL,NULL,NULL);
  }
 
Divania111 объект Ctrade.

Вы забыли, что время 'startTime' должно быть сброшено.

 
Vladimir Karputov #:

Вы забыли, что время 'startTime' должно быть сброшено.

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

Тем не менее, я все еще удивлен. Потому что в операторе if для входа в сделку мы проверяем наличие существующего размещения ордера того же типа. Если это так, то ордер не должен быть размещен. Поэтому я подумал, что с помощью этого оператора можно одновременно ввести только 1 тип ордера.

Является ли эта мысль неверной?

 
Divania111 # :

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

Тем не менее, я все еще удивлен. Потому что в операторе if для входа в сделку мы проверяем наличие существующего размещения ордера того же типа. Если это так, то ордер не должен быть размещен. Поэтому я подумал, что с помощью этого оператора можно одновременно ввести только 1 тип ордера.

Является ли эта мысль неверной?

Вы никак не контролируете ОРДЕРЫ, вы проверяете номер и тип ПОЗИЦИИ в коде. Кроме того - вы неправильно работаете с ПОЗИЦИЯМИ (ошибка в использовании 'PositionSelect(_Symbol)', если тип вашего счета - хеджирование). В вашем алгоритме есть серьезные ошибки проектирования.

Что вы должны сделать:

1. Работать ИСКЛЮЧИТЕЛЬНО в момент рождения нового бара. Если нового бара нет - ничего не делайте, не совершайте лишних движений.

2. Этот пункт будет раскрыт после выполнения пункта 1.

 
Здравствуйте. Не подскажите Comment в void OnTick() может замедлять работу советника. Поставил в int OnInit() намного быстрее работает.
 
Marco Nicholas #:
Здравствуйте. Не подскажите Comment в void OnTick() может замедлять работу советника. Поставил в int OnInit() намного быстрее работает.

Да, в МТ5 он значительно замедляет работу.

В OnInit он отрабатывает только 1 раз при инициализации и больше не работает.