Как узнать, что отложенный ордер перешёл в состояние позиции? - страница 3

 
Alexey Viktorov:

Вот опять перечисления минусов МТ и прочих проблем. Вы лучше покажите терминал который при прерывании связи на минуту и больше всё отработает как вы хотите.

С ходу не скажу. Да и рекламой не занимаюсь я других терминалов. Хотя, скоро думаю на JForex податься или cTrader. Но это чутка позже. щяс влом переписывать всё, что уже имеется.

Alexey Viktorov:

Ну ведь не идиоты работают в MQ тем-более на руководящих должностях. Вы думаете они об этом не думали никогда? Видимо нет возможности всё это учесть и всё предугадать. Либо затраты на решение некоторых проблем несоизмеримы с пользой.

Нет, конечно. Но они явно не трейдеры, раз такой важный момент упустили из вида. Не трейдеры могли об этом и не думать. Они хотели как-нить скорость увеличить, ну и.. вроде как, у них это получилось. А то, что гарантий никаких нет об получении данных.. так это чуть-что к брокеру предъявы.. они не при делах здесь..

Alexey Viktorov:

Реально о периодическом прерывании тырнета отписался только Виталий. Один из всех читавших эту тему. А ваши рассуждения только теоретические. Но почему-то вместо решения проблем с тырнетом и электричеством вы считаете уместным обсуждать возможности терминала и языка программирования. И думаете, что даже если решение таких проблем не очень трудозатратны, то MQ будет их решать? А сами-то на их месте куда послали-бы всех? На почту???

То что кто-то будет что-то решать я не писал и думать об этом не планировал т.к. мне оно ни к чему. А то, что нужно учитывать все варианты, пусть даже теоритические, то это правильно. Я не продаю ничего, а пишу для себя. Поэтому мне нужны гарантии, что я получу данные. Мы видимо размышляем о разных вещах.

 

Viktar Dzemikhau:

Мы видимо размышляем о разных вещах.

Видимо ДА, о разных.

Я однажды смотрел фильм "Миллионы Брюстера", так там один персонаж в ясную погоду всегда ходил с зонтом. Мало-ли что может случиться, синоптики-то не всегда угадывают. И тем не-менее как он выглядел среди остальных можно представить.

 
Alexey Viktorov:

Видимо ДА, о разных.

Я однажды смотрел фильм "Миллионы Брюстера", так там один персонаж в ясную погоду всегда ходил с зонтом. Мало-ли что может случиться, синоптики-то не всегда угадывают. И тем не-менее как он выглядел среди остальных можно представить.

Главное в крайности не впадать. Я то написал о вещах, которые очевидны, а не о том, что метеорит может свалится на кого-нить случайно.

Это не нормально, когда, например, в API, скажем так, управляющей базой данных будет написано, что " мол так и так.. запрос может быть не выполнен и данные могут быть не записаны, потому что мы сделали всё, что бы наша СУБД была быстрее чем раньше"..

Ещё чутка додумаю и выложу свою наброску по этому поводу.

 
Viktar Dzemikhau:

Вопрос в названии темы. Мысли мои по этому поводу просты: можно узнать что количество позиций в истории, и, если количество позиций увеличилось, то появился новая позиция. Это как-бы очевидно. Но откуда мне знать, это позиция открыта по рынку или отложенный ордер перешёл в состояние позиции т.е. открытого ордера?

Если бы была отдельно история сделок и ордеров, можно было бы тикет последней сделки запомнить, и посмотреть, есть ли ордер с таким тикетом в истории тикетов. А этак что-то не особо понятно как это реализовать..

Сделать разные магики для рыночных и отложенных

 
Evgeniy Zhdan:

Сделать разные магики для рыночных и отложенных

По моему это лишнее. Если нужно контролировать событие, что ордер стал позицией, это ничего не даст..
 

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

1. Если позиция закрылась по тейку или словила лося, значит ищем последнюю закрытую позицию и проверяем её профитность.

2. Остаётся лишь только контролировать факт того, что ордер стал позицией. А для этого можно проверить всё со 100% вероятностью вот так:

#import    "EnvironmentInfo\OrdersInfo.ex4"
  int      ordersTotal(const string symbolName, const int magic);    // Возвращает общее количество ордеров
#import

#include  <HOZ_Code\Structures\OrderInstance.mqh>
//+================================================================================================================================================================================+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                                                      КЛАСС ДЛЯ КОНТРОЛЯ ТОРГОВЫХ СОБЫТИЙ                                                                       |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+================================================================================================================================================================================+
class TradeEventsControl {
  private:
    OrderInstance orders[];    // Массив структур имеющихся отложенных ордеров и рыночных позиций
  public:
    bool isOrderTransformToPosition;
    bool isOrderRemoved;
    //--- Конструктор и деструктор
    TradeEventsControl(const string symbolName, const int magic);
   ~TradeEventsControl(void);
    //--- Методы
    bool checkEvents(const string symbolName, const int magic);
};
//==================================================================================================================================================================================
// Конструктор класса. =============================================================================================================================================================
TradeEventsControl :: TradeEventsControl(const string symbolName, const int magic) {
//---
  if (ArraySize(orders) == 0) {
    int ordersCount = ordersTotal(symbolName, magic);
    for (int ord = ordersCount - 1; ord >= 0; ord--) {
      OrderInstance :: addElement(orders, OrderTicket(), OrderType());
    }
  } else {
    // БУДУ ЧИТАТЬ МАССИВ ОРДЕРОВ ИЗ БАЗЫ ДАННЫХ
  }
}
//==================================================================================================================================================================================
// Деструктор класса. ==============================================================================================================================================================
TradeEventsControl :: ~TradeEventsControl(void) {
  //---
}
//==================================================================================================================================================================================
// Проверяет состояние ордеров. ====================================================================================================================================================
bool TradeEventsControl :: checkEvents(const string symbolName,
                                       const int magic) {
//---
  int ordersCount = ordersTotal(symbolName, magic),
      checkedOrdersCount = ArraySize(orders);

  for (int i = ordersCount - 1; i >= 0; i--) {
    for (int k = checkedOrdersCount - 1; k >= 0; k--) {
      if (OrderTicket() == orders[i].m_ticket) {
        if (OrderType() != orders[i].m_type)
          isOrderTransformToPosition = true;
      }
      OrderInstance :: removeElementFromArray(orders, i);
      isOrderRemoved = true;
    }
  }
//---
  return false;
}
//==================================================================================================================================================================================
// Удаляет элемент из массива. =====================================================================================================================================================
void deleteElementFromArray(int& array[],
                            int index) {
//---
  int size = ArraySize(array);
  for (int i = index; i < size - 1; i++) {
    array[i] = array[i + 1];
  }
  ArrayResize(array, size - 1);
}

И структура, в которой хранится состояние ордеров. На данный момент их лишь 2. Потом посмотри. Так же структура умеет удалять и добавлять элементы в массив своего типа:

#import   "DataTypeRepresentation.ex4"
  string  iToS(const int valueToTransform);    // Преобразование целого числа в текстовую строку, содержащую символьное представление числа
  string  ordTypeToStr(int type);              // Преобразование типа ордера в текстовую строку
#import
//+================================================================================================================================================================================+
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//|                                                                       СТРУКТУРА ДЛЯ ХРАНЕНИЯ ДАННЫХ ОРДЕРА                                                                     |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+================================================================================================================================================================================+
struct OrderInstance {
  int  m_ticket;
  int  m_type;
//--- Методы для модификации структуры
  static void  addElement(OrderInstance& orders[], int ticket, int type);
  static void  removeElementFromArray(OrderInstance& array[], int index);
//--- Вспомогательные методы
  string  toString(void);
};
//==================================================================================================================================================================================
// Добавляет новый элемент в массив. ===============================================================================================================================================
void OrderInstance :: addElement(OrderInstance& orders[],    // Массив, в который требуется добавить элемент
                                 int ticket,                 // Тикет ордера, который требуется добавить
                                 int type) {                 // Тип ордера, который требуется добавить
//---
  int newSize = ArraySize(orders) + 1;
  ArrayResize(orders, newSize);
  orders[newSize - 1].m_ticket = ticket;
  orders[newSize - 1].m_type = type;
}
//==================================================================================================================================================================================
// Удаляет элемент из массива. =====================================================================================================================================================
void OrderInstance :: removeElementFromArray(OrderInstance& array[],    // Массив, из которого требуется удалить элемент
                                             int index) {               // Индекс элемента, который нужно удалить в массиве
//---
  int size = ArraySize(array);
  for (int i = index; i < size - 1; i++) {
    array[i] = array[i + 1];
  }
  ArrayResize(array, size - 1);
}
//==================================================================================================================================================================================
// Возвращает строку, представляющую собой члены структуры разделённые запятыми. ===================================================================================================
string OrderInstance :: toString(void) {
  return iToS(m_ticket) + ", " + ordTypeToStr(m_type);
}

Проверить ещё я не успел как это работает. Если что не понятно, спрашивайте.. Предлагаю обсудить этот вопрос. Не только мне это интересно, в плане 4-ки.

 
Viktar Dzemikhau:

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

1. Если позиция закрылась по тейку или словила лося, значит ищем последнюю закрытую позицию и проверяем её профитность.

2. Остаётся лишь только контролировать факт того, что ордер стал позицией. А для этого можно проверить всё со 100% вероятностью вот так:

И структура, в которой хранится состояние ордеров. На данный момент их лишь 2. Потом посмотри. Так же структура умеет удалять и добавлять элементы в массив своего типа:

Проверить ещё я не успел как это работает. Если что не понятно, спрашивайте.. Предлагаю обсудить этот вопрос. Не только мне это интересно, в плане 4-ки.

Ну да... проще... и ничего лишнего.

Портянка на три экрана, да еще хранение данных в массивах.

 
Viktar Dzemikhau:

Ну я примерно такой вариант и описался выше. На самом деле, это касается не только 4-ки и на 5-ку применять будет не лишних. По крайне мере, от различных факторов случайных можно уберечься..

...

Оно и видно

 
Dmitry Fedoseev:

Оно и видно

Легче всего просто сказать, мол заведи переменную и всё. А пример какой-то есть? Я тоже могу сказать, что это просто, но не всё так однозначно. Я вообще не встречал что бы кто-то на 4-ке события контролировал. Как-будто это никому не нужно.
 
Viktar Dzemikhau:
Легче всего просто сказать, мол заведи переменную и всё. А пример какой-то есть? Я тоже могу сказать, что это просто, но не всё так однозначно. Я вообще не встречал что бы кто-то на 4-ке события контролировал. Как-будто это никому не нужно.

Хорошо, попробуем еще раз. Что непонятного в этом:

После установки ордера создаем глобальную переменную, в имя которой входит тикет ордера. Регулярно перебирая рыночные ордера, проверяем эту глобальную переменную, если она есть, значит, только что произошло срабатывание, делаем что надо с ордером и удаляем переменную.

Что такое глобальная переменная? Что такое тикет? Где взять тикет сразу после открытие ордера? Что такое перебор ордеров? Как проверяется существование глобальной переменной?