Я бы делал все через массив и не заморачивался с разными мэджик. Ведь нет гарантии, что разные мэджик не пересекуться с мэджик другого эксперта у какого-нибудь пользователя.
Про дочерний и родительский тикеты я схематично написал. Можно завести массив, каждый элемент которого - структура: тикет, признак (основной ордер или лок), номер пачки (например дата открытия первого ордера).
Логику то я понял. Но чую что это головняк. Не так всё тут просто и кратко. Придётся писать приличный кусман кода, чтобы всё это реализовать. А я хотел как-нить кратче...
Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!!
borilunad: Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!!
А по конкретнее? Борис, у меня такое ощущение, что Вы не допоняли всё ситуацию. Она не так проста, чтоб посылать мэджики не контролируя процесс.
borilunad: Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!!
Если делать как Вы говорите, тогда все мэджики будут разные. А это, опять-таки, порождает задачу контроля неповторяемости магиков, которые нужно либо генерировать в процессе, либо налупить в файл пачку и в том же ИНИТЕ загонять в массив. Вы б определились? )
Постоянно сталкиваюсь с такой задачей. Поэтому пришел к решению: идентифицировать ордера через магик.
В магик записываю информацию: непосредственно 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. Если их уже достаточно, ставим лок. Это самый простой вариант. Вот и нужно хотя б его сдвинуть с места...
Всё в принципе видно. В данном упрощённом варианте количество исходных поз ограничено вводной переменной i_iCountOpenLimp. Если их уже достаточно, ставим лок. Это самый простой вариант. Вот и нужно хотя б его сдвинуть с места...
Вить, на одно предложение ты очень эмоционально реагировал типа "Зачем мне функции Кима... Я сам могу написать..." А мне предлагаешь разбираться с куском кода... Но это не страшно, я не скромный могу и ...
Мой вопрос был к тому, что если можно первый ордер назвать ГЛАВНЫМ, то-есть от него всё начато, то можно ему назначить заданный магик, а всем от него зависящим, пусть это будут доливки или локи всей этой кучки ордеров им всем в качестве магика назначить тикет этого главного ордера.
Попросить бы разработчиков увеличить длину Magic до long. Столько можно было бы туда позапихивать. :)
Вариант, предложеный выше, тоже не плох. Тикет первого ордера выступает как ID пачки ордеров. Я бы его назвал GroupID. Соответственно остальные ордера хранят в комментарии, в своем Magic или в связанном массиве номер этого тикета и тип ордера (основной или лок). Таким образом ордера можно группировать и обрабатывать.
Вить, на одно предложение ты очень эмоционально реагировал типа "Зачем мне функции Кима... Я сам могу написать..." А мне предлагаешь разбираться с куском кода... Но это не страшно, я не скромный могу и ...
Мой вопрос был к тому, что если можно первый ордер назвать ГЛАВНЫМ, то-есть от него всё начато, то можно ему назначить заданный магик, а всем от него зависящим, пусть это будут доливки или локи всей этой кучки ордеров им всем в качестве магика назначить тикет этого главного ордера.
Алексей, касательно Кима, там было явно не в тему.Автор поста того сам не понимал что говорил. есс-но это отвлекает и других участников форума. Так что тот момент можно опустить. На Ваши же комментарии я реагирую всегда легко. А это значит, что обсуждение выходит у нас адекватное.
Всё то как-бы и с большего понятно. Но есть некоторые базовые моменты.
Во-первых, откуда брать магики? Что делать что б они не повторялись? Постоянно проверять на повторение перед каждый потенциальным входом? Не будет ли это расчточительством к ресурсам?
Я бы делал все через массив и не заморачивался с разными мэджик. Ведь нет гарантии, что разные мэджик не пересекуться с мэджик другого эксперта у какого-нибудь пользователя.
Про дочерний и родительский тикеты я схематично написал. Можно завести массив, каждый элемент которого - структура: тикет, признак (основной ордер или лок), номер пачки (например дата открытия первого ордера).
Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!!
Не за чем усложнять! Меджик задаётся при открытии лока, и тот, который у локируемой позиции, а доливки оставьте до момента, когда избавитесь от лока! Всё это просто, и без всех заморочек! Я сам пользуюсь двумя меджиками без классов, структур, массивов и прочего! Имеем только два направления! А вы, как на распутье, куда податься и как!!
Виктор, хочу уточнить. Мои предположения:
1. Открывается ордер по стратегии...
2. Возможна доливка... и может не одна
3. Возможен лок... и тоже может быть не один
И вот эту всю пачку надо как-то идентифицировать.
или:
1. Открывается ордер по стратегии...
2. Открывается ещё один тоже по стратегии, возможно противоположный...
3 и далее необъяснимо как открываются локи... ?
Постоянно сталкиваюсь с такой задачей. Поэтому пришел к решению: идентифицировать ордера через магик.
В магик записываю информацию: непосредственно ID ордеров эксперта, время регистрации сигнала, по которому открыт ордер, и индекс ордера (если нужно различать несколько ордеров в пределах обработки одного сигнала).
Для того чтобы записать в магик время, укорачиваю его до минут. Такой точности обычно хватает. В итоге получается две функции. Одна для синтеза магика:
Вторая - для анализа магика ордера:
Только вот появляется небольшое ограничение для эксперта. Он может работать только в пределах дат BASE_TIME ... MAX_TIME. Но это не слишком большая проблема ))
Пример использования функций. Если требуется сгенерировать магик, то:
При обработке списка ордеров используется анализ магика:
Алексей, если кратко то у меня так:
Всё в принципе видно. В данном упрощённом варианте количество исходных поз ограничено вводной переменной i_iCountOpenLimp. Если их уже достаточно, ставим лок. Это самый простой вариант. Вот и нужно хотя б его сдвинуть с места...
Алексей, если кратко то у меня так:
Всё в принципе видно. В данном упрощённом варианте количество исходных поз ограничено вводной переменной i_iCountOpenLimp. Если их уже достаточно, ставим лок. Это самый простой вариант. Вот и нужно хотя б его сдвинуть с места...
Вить, на одно предложение ты очень эмоционально реагировал типа "Зачем мне функции Кима... Я сам могу написать..." А мне предлагаешь разбираться с куском кода... Но это не страшно, я не скромный могу и ...
Мой вопрос был к тому, что если можно первый ордер назвать ГЛАВНЫМ, то-есть от него всё начато, то можно ему назначить заданный магик, а всем от него зависящим, пусть это будут доливки или локи всей этой кучки ордеров им всем в качестве магика назначить тикет этого главного ордера.
Попросить бы разработчиков увеличить длину Magic до long. Столько можно было бы туда позапихивать. :)
Вариант, предложеный выше, тоже не плох. Тикет первого ордера выступает как ID пачки ордеров. Я бы его назвал GroupID. Соответственно остальные ордера хранят в комментарии, в своем Magic или в связанном массиве номер этого тикета и тип ордера (основной или лок). Таким образом ордера можно группировать и обрабатывать.Вить, на одно предложение ты очень эмоционально реагировал типа "Зачем мне функции Кима... Я сам могу написать..." А мне предлагаешь разбираться с куском кода... Но это не страшно, я не скромный могу и ...
Мой вопрос был к тому, что если можно первый ордер назвать ГЛАВНЫМ, то-есть от него всё начато, то можно ему назначить заданный магик, а всем от него зависящим, пусть это будут доливки или локи всей этой кучки ордеров им всем в качестве магика назначить тикет этого главного ордера.
Алексей, касательно Кима, там было явно не в тему.Автор поста того сам не понимал что говорил. есс-но это отвлекает и других участников форума. Так что тот момент можно опустить. На Ваши же комментарии я реагирую всегда легко. А это значит, что обсуждение выходит у нас адекватное.
Всё то как-бы и с большего понятно. Но есть некоторые базовые моменты.
Во-первых, откуда брать магики? Что делать что б они не повторялись? Постоянно проверять на повторение перед каждый потенциальным входом? Не будет ли это расчточительством к ресурсам?
Да и хранить то нужно получается где-то магики.