Как приостановить торговый поток?

 

Есть необходимость, когда в одном роботе появляется определённый сигнал закрывать все позиции всех сов, в том числе иручных. Написал я для этого сов, который это всё отслеживает и кроет. Но бывает такое, что происходит зацикливание и хз как это понимать. Я пришёл к выводу, что нужно, что бы когда какой-то сов начинает крыть все позиции он приостанавливал работу всех роботов не всех графиках. Такое возможно вообще?

Код у меня простой:

//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                                                                                          closeAllOrdersIfEquityIsIncreased.mq4 |
//|                                                                                                                                                                            hoz |
//|                                                                                                                                                                                |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property version   "1.00"
#property strict

input  double  i_necessaryEquityIncreasing = 10;    // Процент, на который должно увеличиться эквити для того, что бы закрылись все ордера
input  int     i_deviation = 5;
input  char    i_tryCount = 15;

// ======================================================================= Включения и импорт внешних модулей =====================================================================+
#import   "AccountInfo.ex4"
  double  equity(void);                 // Возвращает значение собственных средств на счете в валюте депозита
#import

#include   <HOZ_Code\Classes\TransactionHandling\Trade.mqh>

bool result = true;
double necessaryEquityToClose;
Trade  *ptrTrade;
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                         Expert initialization function                                                                         |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit() {
//---
  necessaryEquityToClose = equity() + (equity() / 100 * i_necessaryEquityIncreasing);
      writeLog(MESSAGE_INFO, iToS(__LINE__) + " { equity = '" + dToS(equity()) + "' | " + "necessaryEquityToClose = '" + dToS(necessaryEquityToClose) + "' }");
  ptrTrade = new Trade(i_tryCount);
//---
   return INIT_SUCCEEDED;
}
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                        Expert deinitialization function                                                                        |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
  delete  ptrTrade;
}
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|                                                                              Expert tick function                                                                              |
//+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick() {
//---
  if (result == false) {
    writeLog(MESSAGE_INFO, iToS(__LINE__) + " { result == false }");
    result = ptrTrade.removeAll(i_deviation);
    if (result) {
      necessaryEquityToClose = equity() + (equity() / 100 * i_necessaryEquityIncreasing);
      writeLog(MESSAGE_INFO, iToS(__LINE__) + " { Повторная попытка закрытия выполнена успешно: equity = '" + dToS(equity()) + "' | " + "necessaryEquityToClose = '" + dToS(necessaryEquityToClose) + "' }");
    }
  }
  if ((equity() - necessaryEquityToClose > DBL_MIN)) {
    result = ptrTrade.removeAll(i_deviation);
    if (result) {
      necessaryEquityToClose = equity() + (equity() / 100 * i_necessaryEquityIncreasing);
      writeLog(MESSAGE_INFO, iToS(__LINE__) + " { Первая попытка закрытия выполнена успешно: equity = '" + dToS(equity()) + "' | " + "necessaryEquityToClose = '" + dToS(necessaryEquityToClose) + "' }");
    }
  }
}

Всегда в лог пишет, что мол всё закрыто и result == true. Здесь повторяющийся код можно было вынести в один блок. Но я специально пока не объединял т.к. тестирую.

Я думаю, что суть в том, что если на разных графиках есть совы, которые открывают позиции или выставляют ордера молниеносно, в тот момент, когда у кажжой из них нет открытых позиции, например, мой закрывающий ВСЁ бот закрывает, а они молниеносно открывают. И такая ситуация может продолжться достаточно долго. Это если открытых ордеров много. Это мысли вслух.

 

Все закрывающий советник GlobalVariableSet("Стоп-Стоп-Стоп!!!",1); Остальные прежде чем ставить ордера, проверяют и ждут.

Все закрывающий советник GlobalVariableSet("Стоп-Стоп-Стоп!!!",0); Остальные увидели и понеслись

 
Konstantin Erin:

Все закрывающий советник GlobalVariableSet("Стоп-Стоп-Стоп!!!",1); Остальные прежде чем ставить ордера, проверяют и ждут.

Все закрывающий советник GlobalVariableSet("Стоп-Стоп-Стоп!!!",0); Остальные увидели и понеслись

Всё это костыль. Я так прикинул на досуге. По скольку это обслуживающий бот, то у него свой подход. Соответственно, вопрос решается запоминанием тикетов, которые требуется закрыть. Если не получилось теоритически закрыть за 1 тик, далее дозакрываем.. и тд. Таким образом, не будет возникать бомбёжки друг в друга ботов. Ведь, когда выполнились какие-то условия, мы  запоминаем тикеты всех ордеров и позиций и все. Ну а дальше.. закрываем все уже по тикетам, а не по позициям. иначе возникает касяк. Я вчера часа полтора думал, что за хрень. Потом просимулировал всю цепочку и догнал.
 

Хм. А если нет доступа к кодам всех советников? Тогда проверку глобальной переменной не встроить.

Вот вариант, если нет доступа к кодам:

1. Обнаруживаем, что нужно приостановить все советники.

2. Меняем на всех графиках шаблоны с советниками на пустые. Все. Советников просто нигде нет!

3. Закрываем ордера.

4. Условие возникло - восстанавливаем шаблоны с советниками и они продолжают работу.

 
Viktar Dzemikhau:
Всё это костыль. Я так прикинул на досуге. По скольку это обслуживающий бот, то у него свой подход. Соответственно, вопрос решается запоминанием тикетов, которые требуется закрыть. Если не получилось теоритически закрыть за 1 тик, далее дозакрываем.. и тд. Таким образом, не будет возникать бомбёжки друг в друга ботов. Ведь, когда выполнились какие-то условия, мы  запоминаем тикеты всех ордеров и позиций и все. Ну а дальше.. закрываем все уже по тикетам, а не по позициям. иначе возникает касяк. Я вчера часа полтора думал, что за хрень. Потом просимулировал всю цепочку и догнал.

МТ4 оперирует только ордерами.

В МТ5 иначе. Есть ордера - приказы серверу. Если ордер принят - происходит сделка. Сделки формируют позиции. Сначала, в первых билдах МТ5 была одна усредненная позиция в результате всех сделок - неттинговый режим. Это и правильно - ведь встречные ордера, локирование, замки - это чепуха. Но многие трейдеры используют встречные ордера и поднялся кипиш - дайте нам локи. Ввели еще один режим - хеджинковый, где каждая сделка порождает позицию. При этом потерялся весь смысл в сделках и позициях. Выбор режима производится при открытии нового счета.

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

 
Andrei Novichkov:

Хм. А если нет доступа к кодам всех советников? Тогда проверку глобальной переменной не встроить.

Вот вариант, если нет доступа к кодам:

1. Обнаруживаем, что нужно приостановить все советники.

2. Меняем на всех графиках шаблоны с советниками на пустые. Все. Советников просто нигде нет!

3. Закрываем ордера.

4. Условие возникло - восстанавливаем шаблоны с советниками и они продолжают работу.

А как програмно изменить шаблон на графике? И, вообще, есть ли вариант шаблон для совы изменить на любой имеющийся в папке шаблонов?
 
Konstantin Erin:

МТ4 оперирует только ордерами.

В МТ5 иначе. Есть ордера - приказы серверу. Если ордер принят - происходит сделка. Сделки формируют позиции. Сначала, в первых билдах МТ5 была одна усредненная позиция в результате всех сделок - неттинговый режим. Это и правильно - ведь встречные ордера, локирование, замки - это чепуха. Но многие трейдеры используют встречные ордера и поднялся кипиш - дайте нам локи. Ввели еще один режим - хеджинковый, где каждая сделка порождает позицию. При этом потерялся весь смысл в сделках и позициях. Выбор режима производится при открытии нового счета.

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

Нет, конечно. Я подразумеваю так как оно и есть, на самом деле. Я же даже писал в своём сообщение и выделил жёлтым цветом позиции и ордера. Соответственно. я прекрасно понимаю, а чём различие этих понятий. В конце концов, я с нуля написал уже базовый функционал под 5-ки, да и под 4-ку тоже есть. Естесственно, я понимаю о чём пишу. Но есть совы, которе лупят ордера мгновенно. Один получается закрывает, а другие на различных графиках понимают, что нет уже позиций в рынке и они мгновенно открывают позиции. У меня вот есть такие боты у знакомого. Поэтому пришлось думать как обойти. Я решил вопрос запоминание, как я и писал, тикетов всех ордеров и позиций.

А поводу, локирования..не всё однозначно. Есть системы, которые достаточно гибко разруливают косяки. я сейчас над одной подобной работаю. Поглядим..

В любом случае, запрещать открыть встречный ордер не правильно. Ведь существует много трейдеров, который не способны установить стоп-лосс, хотя и торгуют в плюс на дистанции. Я таких знаю. 7-8 лет торговать в +, это не случайность. Поэтому как-бы на вкус и цвет товарища нет. Это дело привычки и вкуса что-ли..

 
Viktar Dzemikhau:
А как програмно изменить шаблон на графике? И, вообще, есть ли вариант шаблон для совы изменить на любой имеющийся в папке шаблонов?
bool  ChartApplyTemplate( 
   long          chart_id,     // идентификатор графика 
   const string  filename      // имя файла с шаблоном 
   );