Ограничение одновременно открытых позиций

 
Добрый день, может кто-нибудь подсказать как правильнее всего прописать, что бы советник одновременно со всех графиков держал не более определенного количества ордеров. То есть в случае если работа идет по нескольким инструментам и одновременно поступит сигнал на открытие ордера, то робот не смог открыть одновременно больше сделок чем указано. Но тем не менее не прекращал свою работу, а по факту уменьшения количества сделок имел возможность открыть еще в пределах ограничения.Для языка МКЛ4 Подскажите пожалуйста, буду признателен)
 
Mikhail Vlasov:
Добрый день, может кто-нибудь подсказать как правильнее всего прописать, что бы советник одновременно со всех графиков держал не более определенного количества ордеров. То есть в случае если работа идет по нескольким инструментам и одновременно поступит сигнал на открытие ордера, то робот не смог открыть одновременно больше сделок чем указано. Но тем не менее не прекращал свою работу, а по факту уменьшения количества сделок имел возможность открыть еще в пределах ограничения. Подскажите пожалуйста, буду признателен)
//+------------------------------------------------------------------+
//|                                                    Positions.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
input int MaxPos = 10; //Максимальное кол-во позиций
//
int cur_pos;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  cur_pos = GetPositions();
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  // 
}
  //+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int GetPositions()
{
  return(PositionsTotal());
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  cur_pos = GetPositions();
  if(cur_pos < MaxPos)
  {
    int cur_vol = MaxPos - cur_pos; //Сколько позиций мы можем открыть
    //Открываем позиции, если необходимо
  }    
}
//+------------------------------------------------------------------+
 
prostotrader:

Большое спасибо!

 
prostotrader:

А для мкл4 подскажите?

 
Mikhail Vlasov:

А для мкл4 подскажите?

https://www.mql5.com/ru/forum/131859/page2#comment_3359663

Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 
Mikhail Vlasov:

А для мкл4 подскажите?

Вы задали вопрос на MQL5 форуме, Вы задали вопрос в главном разделе - поэтому естественно получили ответ для MQL5.

Для всех вопросов по старом терминалу есть специальный раздел: MQL4 и MetaTrader 4.

 
Vladimir Karputov:

Вы задали вопрос на MQL5 форуме, Вы задали вопрос в главном разделе - поэтому естественно получили ответ для MQL5.

Для всех вопросов по старом терминалу есть специальный раздел: MQL4 и MetaTrader 4.

Бывает, ошибся, спасибо!

 

Точно синхронизировать так не получится. Каждый график работает в своем потоке, поэтому запросто получится ситуация, когда с одного графика уже ушла и обрабатывается команда на открытие позиции, при этом уже и ордер выставлен и ответ от ДЦ положительный получен, но позиции еще по факту нет, соответственно робот абсолютно законно откроет свою позицию.

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

Синхронизирована ли работа с ними?

Допустим, что я использую глобальную переменную терминала для счетчика и контроля количества открытых позиций группой экспертов. Не рискую ли я получить race condition при параллельном использовании  GlobalVariableSet и GlobalVariableGet из разных экспертов/индикаторов/скриптов?

 
Vladimir Simakov:

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

Синхронизирована ли работа с ними?

не проверял, но вот ответ от разработчиков, только не давно писали

https://www.mql5.com/ru/forum/294975/page15#comment_11136831

Сервисы. Уже работают?
Сервисы. Уже работают?
  • 2019.02.22
  • www.mql5.com
Билд 1961. В редакторе создал новый вид программы - сервис. В OnStart прописал: Далее запустил сервис: и сразу результат: В общем работает...
 
Igor Makanu:

не проверял, но вот ответ от разработчиков, только не давно писали

https://www.mql5.com/ru/forum/294975/page15#comment_11136831

Если Вы про GlobalVariableSetOnCondition, то это не то. В приведенном мною умозрительном примере, первый робот отдает команду на увеличение значения gVal на 1, но передача процессорного времени другому потоку произошла до изменения значения, а другой поток запросил значение этой переменной и на основании него принял решение, уже ложное, если, например gVal=max-1. Вуаля и лишний ордер, как пример, а то и что похуже, в зависимости от того, какая логика там висит.

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

 
Vladimir Simakov:


Кстати, как это надежно оттестить, я с ходу не придумал

Как вариант - самый быстрый таймер, один сов по наступлению новой секунды пишет гвар, второй читает ( тут же и/или через минимальный отсчёт таймера), всё в список и через пару часов потом там искать расхождения.