Автоматическое создание признака принадлежности позиции к некоторой пачке позиций - страница 3

 
RickD:

Я бы делал все через массив и не заморачивался с разными мэджик. Ведь нет гарантии, что разные мэджик не пересекуться с мэджик другого эксперта у какого-нибудь пользователя.

Про дочерний и родительский тикеты я схематично написал. Можно завести массив, каждый элемент которого - структура: тикет, признак (основной ордер или лок), номер пачки (например дата открытия первого ордера).

Логику то я понял. Но чую что это головняк. Не так всё тут просто и кратко. Придётся писать приличный кусман кода, чтобы всё это реализовать. А я хотел как-нить кратче...
 
Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!! 
 
borilunad:
Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!! 
А по конкретнее? Борис, у меня такое ощущение, что Вы не допоняли всё ситуацию. Она не так проста, чтоб  посылать мэджики не контролируя процесс.
 
borilunad:
Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!! 
Если делать как Вы говорите, тогда все мэджики будут разные. А это, опять-таки, порождает задачу контроля неповторяемости магиков, которые нужно либо генерировать в процессе, либо налупить в файл пачку и в том же ИНИТЕ загонять в массив. Вы б определились? )
 

Виктор, хочу уточнить. Мои предположения:

1. Открывается ордер по стратегии...

2. Возможна доливка... и может не одна

3. Возможен лок... и тоже может быть не один

И вот эту всю пачку надо как-то идентифицировать.

или:

1. Открывается ордер по стратегии...

2. Открывается ещё один тоже по стратегии, возможно противоположный...

3 и далее необъяснимо как открываются локи... ?

 

Постоянно сталкиваюсь с такой задачей. Поэтому пришел к решению: идентифицировать ордера через магик.

В магик записываю информацию: непосредственно ID ордеров эксперта, время регистрации сигнала, по которому открыт ордер, и индекс ордера (если нужно различать несколько ордеров в пределах обработки одного сигнала).

Для того чтобы записать в магик время, укорачиваю его до минут. Такой точности обычно хватает. В итоге получается две функции. Одна для синтеза магика:

// m_magicNumber - член класса CalculateTradeType. Является ID ордеров эксперта. Допустимые значения: 0 - 7.
#define BASE_TIME       D'2000.01.01 00:00'                                                        // Отсчет минут в эксперте ведется, начиная с указанной даты
#define MAX_TIME        BASE_TIME + 0xFFFFFF * 60                                                  // Самое позднее дата/время, которым может оперировать эксперт

int CalculateTradeType::GetMagicNumber(datetime time, int orderIndex)
{
   int minuteNumber = (int)((time - BASE_TIME) / 60);                                              // Дата представляется в виде количества минут, прошедших с базовой даты

   int id = m_magicNumber & 0x00000007;
   minuteNumber &= 0x00FFFFFF;
   orderIndex &= 0x0000001F;
   
   // Идентификатор ордеров эксперта - биты 29..31 (значения 0 - 7), минуты - биты 5..28 (значения 0 - 16 777 215), порядковый номер ордера в серии - биты 0..4 (значения 0 - 31)
   return ((id << 29) | (minuteNumber << 5)) | orderIndex;                                                             
}

Вторая - для анализа магика ордера:

int GetOrderIndexTimeAndID(int mn, datetime &time, int &id)
{
   uint umn = mn;
   id = (int)(umn >> 29);
   time = ((umn & 0x1FFFFFFF) >> 5) * 60 + BASE_TIME;
   
   return mn & 0x0000001F;
}

Только вот появляется небольшое ограничение для эксперта. Он может работать только в пределах дат BASE_TIME ... MAX_TIME. Но это не слишком большая проблема ))

 

Пример использования функций. Если требуется сгенерировать  магик, то:

int magic = GetMagicNumber(TimeCurrent(), 0);
OrderSend(..., magic, ..);

При обработке списка ордеров используется анализ магика:

datetime time;
int id;
...
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
   if (!OrderSelect(i, SELECT_BY_POS))          
      continue;
      
   if (OrderSymbol() != Symbol())
      continue;   
      
   int orderIndex = GetOrderIndexTimeAndID(OrderMagicNumber(), time, id);
   if (id != m_magicNumber)
      continue;

   // Найден ордер эксперта
}
 

Алексей, если кратко то у меня так:

if (g_dtLastBarTime != Time[0])     // Работаем только на новом баре
   {
      // Осуществляем вход по сигналу
         if (g_iOTotal < i_iCountOpenLimp)
           TradeBySignal (GSym);
         else
           LockCurrentLoss (GSym, GPos, i_iCountOpenLimp, 0);
   }

 Всё в принципе видно. В данном упрощённом варианте количество исходных поз ограничено вводной переменной i_iCountOpenLimp. Если их уже достаточно, ставим лок. Это самый простой вариант. Вот и нужно хотя б его сдвинуть с места...

 
shanty:

Алексей, если кратко то у меня так:

 Всё в принципе видно. В данном упрощённом варианте количество исходных поз ограничено вводной переменной i_iCountOpenLimp. Если их уже достаточно, ставим лок. Это самый простой вариант. Вот и нужно хотя б его сдвинуть с места...

 

Вить, на одно предложение ты очень эмоционально реагировал типа "Зачем мне функции Кима... Я сам могу написать..." А мне предлагаешь разбираться с куском кода... Но это не страшно, я не скромный могу и ...

Мой вопрос был к тому, что если можно первый ордер назвать ГЛАВНЫМ, то-есть от него всё начато, то можно ему назначить заданный магик, а всем от него зависящим, пусть это будут доливки или локи всей этой кучки ордеров им всем в качестве магика назначить тикет этого главного ордера.

 

Попросить бы разработчиков увеличить длину Magic до long. Столько можно было бы туда позапихивать. :)

Вариант, предложеный выше, тоже не плох. Тикет первого ордера выступает как ID пачки ордеров. Я бы его назвал GroupID.  Соответственно остальные ордера хранят в комментарии, в своем Magic или в связанном массиве номер этого тикета и тип ордера (основной или лок). Таким образом ордера можно группировать и обрабатывать.
 
AlexeyVik:

Вить, на одно предложение ты очень эмоционально реагировал типа "Зачем мне функции Кима... Я сам могу написать..." А мне предлагаешь разбираться с куском кода... Но это не страшно, я не скромный могу и ...

Мой вопрос был к тому, что если можно первый ордер назвать ГЛАВНЫМ, то-есть от него всё начато, то можно ему назначить заданный магик, а всем от него зависящим, пусть это будут доливки или локи всей этой кучки ордеров им всем в качестве магика назначить тикет этого главного ордера.

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

 Всё то как-бы и с большего понятно. Но есть некоторые базовые моменты.

Во-первых, откуда брать магики? Что делать что б они не повторялись? Постоянно проверять на повторение перед каждый потенциальным входом? Не будет ли это расчточительством к ресурсам?

Да и хранить то нужно получается где-то магики.