Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть VIII): События модификации ордеров и позиций" - страница 2
Артем, еще раз спасибо! Метод "void CEventsCollection::CreateNewEvent(COrderControl* order)" служит для создания торгового события в зависимости от типа изменения ордера, тоесть он создает событие связаное с любым изменением ордера..... А причина изменения ордера посылается в созданное событие одна: EVENT_REASON_STOPLIMIT_TRIGGERED
//--- Создание событияif(event!=NULL)
{
event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time()); // Время событияevent.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED); // Причина события (из перечисления ENUM_EVENT_REASON)
Если я прав прошу исправить, если нет прошу объяснить что не увидел.
Большое спасибо за библиотеку вы упростили мой труд в несколько раз, особенно когда работа основная не связана с программированием.
Артем, еще раз спасибо! Метод "void CEventsCollection::CreateNewEvent(COrderControl* order)" служит для создания торгового события в зависимости от типа изменения ордера, тоесть он создает событие связаное с любым изменением ордера..... А причина изменения ордера посылается в созданное событие одна: EVENT_REASON_STOPLIMIT_TRIGGERED
Если я прав прошу исправить, если нет прошу объяснить что не увидел.
Большое спасибо за библиотеку вы упростили мой труд в несколько раз, особенно когда работа основная не связана с программированием.
Без привязки к точному месту расположения цитируемых строк я не могу понять о чём именно вы говорите - просто поиском (Shift+Ctrl+F) не нашёл такого кода во всех файлах библиотеки...
Вот строки из описания в самой части этой статьи и соответсвенно кода в конце статьи:
//+------------------------------------------------------------------+//| Создаёт торговое событие в зависимости от типа изменения ордера |//+------------------------------------------------------------------+void CEventsCollection::CreateNewEvent(COrderControl* order)
{
if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
{
Print(DFUN,TextByLanguage("Не удалось получить текущие цены по символу события ","Failed to get current prices by event symbol "),order.Symbol());
return;
}
CEvent* event=NULL;
//--- Сработал отложенный StopLimit-ордерif(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
{
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
}
//--- Модификацияelse
{
//--- Модифицирована цена отложенного ордераif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
//--- Модифицирована цена отложенного ордера и его StopLosselseif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
//--- Модифицирована цена отложенного ордера и его TakeProfitelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
//--- Модифицирована цена отложенного ордера, его StopLoss и TakeProfitelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss отложенного ордераelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
//--- Модифицирован TakeProfit отложенного ордераelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss и TakeProfit отложенного ордераelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss позицииelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
//--- Модифицирован TakeProfit позицииelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss и TakeProfit позицииelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
//--- Создаём событие модификацииevent=new CEventModify(this.m_trade_event_code,order.Ticket());
}
//--- Создание событияif(event!=NULL)
{
event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time()); // Время событияevent.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);// Причина события (из перечисления ENUM_EVENT_REASON)event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Тип ордера, срабатывание которого привело к событиюevent.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket()); // Тикет ордера , срабатывание которого привело к событиюevent.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder()); // Тип ордера событияevent.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket()); // Тикет ордера событияevent.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder()); // Тип первого ордера позицииevent.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket()); // Тикет первого ордера позицииevent.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID()); // Идентификатор позицииevent.SetProperty(EVENT_PROP_POSITION_BY_ID,0); // Идентификатор встречной позицииevent.SetProperty(EVENT_PROP_MAGIC_BY_ID,0); // Магический номер встречной позицииevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev()); // Тип ордера позиции до смены направленияevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket()); // Тикет ордера позиции до смены направленияevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder()); // Тип ордера текущей позицииevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket()); // Тикет ордера текущей позицииevent.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev()); // Цена установки ордера до модификацииevent.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev()); // Цена StopLoss до модификацииevent.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev()); // Цена TakeProfit до модификацииevent.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask); // Цена Ask в момент событияevent.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid); // Цена Bid в момент событияevent.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic()); // Магический номер ордераevent.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev()); // Время первого ордера позицииevent.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev()); // Цена, на которой произошло событиеevent.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price()); // Цена установки ордераevent.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price()); // Цена закрытия ордераevent.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss()); // Цена StopLoss ордераevent.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit()); // Цена TakeProfit ордераevent.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume()); // Запрашиваемый объём ордераevent.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0); // Исполненный объём ордераevent.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume()); // Оставшийся (неисполненный) объём ордераevent.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0); // Исполненный объём позицииevent.SetProperty(EVENT_PROP_PROFIT,0); // Профитevent.SetProperty(EVENT_PROP_SYMBOL,order.Symbol()); // Символ ордераevent.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol()); // Символ встречной позиции//--- Установка идентификатора графика управляющей программы, расшифровка кода события и установка типа событияevent.SetChartID(this.m_chart_id);
event.SetTypeEvent();
//--- Если объекта-события нет в списке - добавляемif(!this.IsPresentEventInList(event))
{
this.m_list_trade_events.InsertSort(event);
//--- Отправляем сообщение о событии и устанавливаем значение последнего торгового событияevent.SendEvent();
this.m_trade_event=event.TradeEvent();
}
//--- Если это событие уже есть в списке - удаляем новый объект-событие и выводим отладочное сообщениеelse
{
::Print(DFUN_ERR_LINE,TextByLanguage("Такое событие уже есть в списке","This event is already in the list."));
delete event;
}
}
}
Без привязки к точному месту расположения цитируемых строк я не могу понять о чём именно вы говорите - просто поиском (Shift+Ctrl+F) не нашёл такого кода во всех файлах библиотеки...
Где это находится?
Может вы это уже исправили в следующих главах описания библиотеки? Мне ваша библиотека очень подходит для моей стратегии и я ее очень доскональна разбираю, так как вы сделали помимо библиотеки еще методичку для правильного программирования.
BmC: Вот строки из описания в самой части этой статьи и соответсвенно кода в конце статьи: подчеркнул эту строчку!
На данный момент - в текущей версии библиотеки, метод выглядит так:
//+------------------------------------------------------------------+//| Создаёт торговое событие в зависимости от типа изменения ордера |//+------------------------------------------------------------------+void CEventsCollection::CreateNewEvent(COrderControl* order)
{
ENUM_EVENT_REASON reason=WRONG_VALUE;
if(!::SymbolInfoTick(order.Symbol(),this.m_tick))
{
::Print(DFUN,CMessage::Text(MSG_LIB_SYS_NOT_GET_CURR_PRICES),order.Symbol());
return;
}
CEvent* event=NULL;
//--- Сработал отложенный StopLimit-ордерif(order.GetChangeType()==CHANGE_TYPE_ORDER_TYPE)
{
reason=EVENT_REASON_STOPLIMIT_TRIGGERED;this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_PLASED;
event=new CEventOrderPlased(this.m_trade_event_code,order.Ticket());
}
//--- Модификацияelse
{
//--- Модифицирована цена отложенного ордераif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE;
//--- Модифицирована цена отложенного ордера и его StopLosselseif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL;
//--- Модифицирована цена отложенного ордера и его TakeProfitelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_TP;
//--- Модифицирована цена отложенного ордера, его StopLoss и TakeProfitelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_PRICE_STOP_LOSS_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_PRICE+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss отложенного ордераelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL;
//--- Модифицирован TakeProfit отложенного ордераelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss и TakeProfit отложенного ордераelseif(order.GetChangeType()==CHANGE_TYPE_ORDER_STOP_LOSS_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_ORDER_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss позицииelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL;
//--- Модифицирован TakeProfit позицииelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_TP;
//--- Модифицирован StopLoss и TakeProfit позицииelseif(order.GetChangeType()==CHANGE_TYPE_POSITION_STOP_LOSS_TAKE_PROFIT)
this.m_trade_event_code=TRADE_EVENT_FLAG_POSITION_MODIFY+TRADE_EVENT_FLAG_SL+TRADE_EVENT_FLAG_TP;
//--- Создаём событие модификацииreason=EVENT_REASON_MODIFY;event=new CEventModify(this.m_trade_event_code,order.Ticket());
}
//--- Создание событияif(event!=NULL)
{
event.SetProperty(EVENT_PROP_TIME_EVENT,order.Time()); // Время событияevent.SetProperty(EVENT_PROP_REASON_EVENT,reason); // Причина события (из перечисления ENUM_EVENT_REASON)event.SetProperty(EVENT_PROP_TYPE_DEAL_EVENT,PositionTypeByOrderType((ENUM_ORDER_TYPE)order.TypeOrderPrev())); // Тип ордера, срабатывание которого привело к событиюevent.SetProperty(EVENT_PROP_TICKET_DEAL_EVENT,order.Ticket()); // Тикет ордера , срабатывание которого привело к событиюevent.SetProperty(EVENT_PROP_TYPE_ORDER_EVENT,order.TypeOrder()); // Тип ордера событияevent.SetProperty(EVENT_PROP_TICKET_ORDER_EVENT,order.Ticket()); // Тикет ордера событияevent.SetProperty(EVENT_PROP_TYPE_ORDER_POSITION,order.TypeOrder()); // Тип первого ордера позицииevent.SetProperty(EVENT_PROP_TICKET_ORDER_POSITION,order.Ticket()); // Тикет первого ордера позицииevent.SetProperty(EVENT_PROP_POSITION_ID,order.PositionID()); // Идентификатор позицииevent.SetProperty(EVENT_PROP_POSITION_BY_ID,0); // Идентификатор встречной позицииevent.SetProperty(EVENT_PROP_MAGIC_BY_ID,0); // Магический номер встречной позицииevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_BEFORE,order.TypeOrderPrev()); // Тип ордера позиции до смены направленияevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_BEFORE,order.Ticket()); // Тикет ордера позиции до смены направленияevent.SetProperty(EVENT_PROP_TYPE_ORD_POS_CURRENT,order.TypeOrder()); // Тип ордера текущей позицииevent.SetProperty(EVENT_PROP_TICKET_ORD_POS_CURRENT,order.Ticket()); // Тикет ордера текущей позицииevent.SetProperty(EVENT_PROP_PRICE_OPEN_BEFORE,order.PricePrev()); // Цена установки ордера до модификацииevent.SetProperty(EVENT_PROP_PRICE_SL_BEFORE,order.StopLossPrev()); // Цена StopLoss до модификацииevent.SetProperty(EVENT_PROP_PRICE_TP_BEFORE,order.TakeProfitPrev()); // Цена TakeProfit до модификацииevent.SetProperty(EVENT_PROP_PRICE_EVENT_ASK,this.m_tick.ask); // Цена Ask в момент событияevent.SetProperty(EVENT_PROP_PRICE_EVENT_BID,this.m_tick.bid); // Цена Bid в момент событияevent.SetProperty(EVENT_PROP_MAGIC_ORDER,order.Magic()); // Магический номер ордераevent.SetProperty(EVENT_PROP_TIME_ORDER_POSITION,order.TimePrev()); // Время первого ордера позицииevent.SetProperty(EVENT_PROP_PRICE_EVENT,order.PricePrev()); // Цена, на которой произошло событиеevent.SetProperty(EVENT_PROP_PRICE_OPEN,order.Price()); // Цена установки ордераevent.SetProperty(EVENT_PROP_PRICE_CLOSE,order.Price()); // Цена закрытия ордераevent.SetProperty(EVENT_PROP_PRICE_SL,order.StopLoss()); // Цена StopLoss ордераevent.SetProperty(EVENT_PROP_PRICE_TP,order.TakeProfit()); // Цена TakeProfit ордераevent.SetProperty(EVENT_PROP_VOLUME_ORDER_INITIAL,order.Volume()); // Запрашиваемый объём ордераevent.SetProperty(EVENT_PROP_VOLUME_ORDER_EXECUTED,0); // Исполненный объём ордераevent.SetProperty(EVENT_PROP_VOLUME_ORDER_CURRENT,order.Volume()); // Оставшийся (неисполненный) объём ордераevent.SetProperty(EVENT_PROP_VOLUME_POSITION_EXECUTED,0); // Исполненный объём позицииevent.SetProperty(EVENT_PROP_PROFIT,0); // Профитevent.SetProperty(EVENT_PROP_SYMBOL,order.Symbol()); // Символ ордераevent.SetProperty(EVENT_PROP_SYMBOL_BY_ID,order.Symbol()); // Символ встречной позиции//--- Расшифровка кода события и установка типа событияevent.SetTypeEvent();
//--- Если объекта-события нет в списке - добавляемif(!this.IsPresentEventInList(event))
{
this.m_list_trade_events.InsertSort(event);
//--- Отправляем сообщение о событии и устанавливаем значение последнего торгового событияthis.m_trade_event=event.TradeEvent();
this.m_is_event=true;
event.SendEvent();
CBaseObjExt::EventAdd(this.m_trade_event,order.Ticket(),order.Price(),order.Symbol());
}
//--- Если это событие уже есть в списке - удаляем новый объект-событие и выводим отладочное сообщениеelse
{
::Print(DFUN_ERR_LINE,CMessage::Text(MSG_LIB_SYS_EVENT_ALREADY_IN_LIST));
delete event;
}
}
}
//+------------------------------------------------------------------+
Т.е., либо то была ошибка, и она давно исправлена, либо в обсуждаемой версии библиотеки это не критично. Я уже и не вспомню как там точно всё обстояло с этим...
На данный момент - в текущей версии библиотеки, метод выглядит так:
Т.е., либо то была ошибка, и она давно исправлена, либо в обсуждаемой версии библиотеки это не критично. Я уже и не вспомню как там точно всё обстояло с этим...
Это очень важно, от автора это еще важнее. Если вы не отказались от вашей первоначальной идеи. Своей работой помочь начинающим программистам, таким как мне. Когда ты еще начинающий (ученик) и только познаешь язык программирования, или вообще программирование, очень много появляется сомнений и вопросов при изучении вашей работы (библиотеки). В данном случае я до последнего не был уверен, что это ошибка или вы так задумали. Прошелся не один раз по вашему коду. И для меня это очень важно: "или я не понял смысл автора, или это просто опечатка автора в его большом проекте." И как вы утверждаете, что это не критично?! Это не правильно с вашей стороны, тем самым вы и я с вами просто путаем читателей. Которые изучают или учатся как и я, по вашей библиотеки.
Это очень важно, от автора это еще важнее. Если вы не отказались от вашей первоначальной идеи. Своей работой помочь начинающим программистам, таким как мне. Когда ты еще начинающий (ученик) и только познаешь язык программирования, или вообще программирование, очень много появляется сомнений и вопросов при изучении вашей работы (библиотеки). В данном случае я до последнего не был уверен, что это ошибка или вы так задумали. Прошелся не один раз по вашему коду. И для меня это очень важно: "или я не понял смысл автора, или это просто опечатка автора в его большом проекте." И как вы утверждаете, что это не критично?! Это не правильно с вашей стороны, тем самым вы и я с вами просто путаем читателей. Которые изучают или учатся как и я, по вашей библиотеки.
:)
Я ж показал код, в котором цветом выделены исправления. Внесите их в версию библиотеки, прилагаемую к этой статье.
Конечно же я уже не помню - ошибка это моя была, или в данной версии это не критично, и поэтому прошло мимо моего взора при отладке. Ведь уже сорок с лишним статей, и эта было так давно. Скорее всего всё-таки ошибка, исправление которой было внесено в последующих статьях - очень многое в библиотеке уже создаётся "на лету". Конечно была, и не одна, тестовые версии библиотеки. Но с началом описания её создания многое было пересмотрено и добавлено. Именно поэтому цикл статей позиционируется как описание создания библиотеки. Таким образом я пытаюсь вовлечь читателя в сам процесс её создания. С пробами и ошибками, и с указанием как их исправить - чтобы был весь процесс на виду - раскрыть, так сказать, "все муки созидания" :)
Потому, прошу прощения за внесённую сумятицу в вашем осознании происходящего... Просто внесите предложенные выше изменения. Или оставьте до той статьи, в которой это будет исправлено.
Andrii Miknevich: Я хочу получить символ последнего событья, тикет и тип (открытия, закрытия, модификация), как это правильно сделать?
Я смотрю Артём так занят, что вообще не появляется на форуме.))) Может у меня получится подсказать, когда-то я экспериментировал с его библиотекой. Сегодня полазил по тем экспериментам и обнаружил такую функцию. В комментарии сказано, что функция получает список всех открытых позиций.
void OrderActivated()
{
Print(__FUNCTION__, "***", ENUM_TRADE_EVENT(engine.LastTradeEvent()));
//--- Получаем список всех открытых позиций
CArrayObj* list = engine.GetListMarketPosition();
if(list == NULL || list.Total() == 0)
return;
int index = CSelect::FindOrderMax(list, ORDER_PROP_TIME_OPEN);
COrder *pos = list.At(index);
if(pos == NULL)
return;
pos.Print();
}/*******************************************************************/
К сожалению объяснить что для чего я уже не могу, всё благополучно забыл, но может сможете разобраться…
Ну… если не получится, подождите. Артём найдёт время и ответит.
При поступлении тика, по которому устанавливается и одновременно активируется (триггерится) отложенный ордер (я тестировал с Buy Stop) ваш движок не регистрирует все события...
Приходит событие TRADE_EVENT_PENDING_ORDER_PLASED, но не TRADE_EVENT_PENDING_ORDER_ACTIVATED.
Код у меня примерно такой:
//+------------------------------------------------------------------+//| Process trade events |//+------------------------------------------------------------------+ void ProcessTradeEvents(void)
{
static ENUM_TRADE_EVENT last_event=WRONG_VALUE;
static CEvent *last_processed=NULL;
if(engine.LastTradeEvent()!=last_event)
{
if(last_event==TRADE_EVENT_NO_EVENT)
return;
CArrayObj *list=engine.GetListAllOrdersEvents();
if(list==NULL)
return;
list=CSelect::ByEventProperty(list,EVENT_PROP_SYMBOL,Symbol(),EQUAL);
if(list==NULL || list.Total()<=0)
return;
last_event=engine.LastTradeEvent();
//--- get index of old eventint index_of_old_event=0;
if(last_processed==NULL)
index_of_old_event=-1;
else
{
for(int i=list.Total()-1;i>=0;i--)
{
CEvent *event=list.At(i);
if(event==NULL)
return;
ENUM_TRADE_EVENT event_type=event.TypeEvent();
if(last_processed!=NULL && event.IsEqual(last_processed))
{
index_of_old_event=i;
break;
}
}
}
//--- checking all new eventsfor(int i=index_of_old_event+1;i<list.Total();i++)
{
CEvent *event=list.At(i);
if(event==NULL)
break;
if(last_processed!=NULL && event.IsEqual(last_processed))
break;
Print(__FUNCTION__+": event : ",event.TypeEventDescription());
switch(event.TypeEvent())
{
case TRADE_EVENT_PENDING_ORDER_PLASED:
{
// some code
}
break;
case TRADE_EVENT_PENDING_ORDER_REMOVED:
{
// some code
}
break;
case TRADE_EVENT_PENDING_ORDER_ACTIVATED:
{
// some code
}
break;
case TRADE_EVENT_POSITION_CLOSED:
{
// some code
}
break;
case TRADE_EVENT_POSITION_CLOSED_BY_SL:
{
// some code
}
break;
case TRADE_EVENT_POSITION_CLOSED_BY_TP:
{
// some code
}
break;
case TRADE_EVENT_MODIFY_ORDER_PRICE:
{
// some code
}
break;
case TRADE_EVENT_MODIFY_POSITION_SL:
{
// some code
}
break;
case TRADE_EVENT_MODIFY_POSITION_TP:
{
// some code
}
break;
}
}
last_processed=list.At(list.Total()-1);
Comment("\nLast trade event: ",last_processed.TypeEventDescription());
}
}
Сначала в цикле нахожу индекс старого (обработанного) события, а затем, начиная с него, перебираю все новые до конца. Так вот, в ситуации, когда по одному тику лимитный ордер установлен и стриггерен приходит одно событие об установке... Прокомментируйте, пожалуйста.
ProcessTradeEvents() вызываю в OnTick() следом за engine.OnTick(rates_data).
Свойства ордеров - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Артем, еще раз спасибо!
Метод "void CEventsCollection::CreateNewEvent(COrderControl* order)" служит для создания торгового события в зависимости от типа изменения ордера, тоесть он создает событие связаное с любым изменением ордера.....
А причина изменения ордера посылается в созданное событие одна: EVENT_REASON_STOPLIMIT_TRIGGERED
Если я прав прошу исправить, если нет прошу объяснить что не увидел.
Большое спасибо за библиотеку вы упростили мой труд в несколько раз,
особенно когда работа основная не связана с программированием.
Артем, еще раз спасибо!
Метод "void CEventsCollection::CreateNewEvent(COrderControl* order)" служит для создания торгового события в зависимости от типа изменения ордера, тоесть он создает событие связаное с любым изменением ордера.....
А причина изменения ордера посылается в созданное событие одна: EVENT_REASON_STOPLIMIT_TRIGGERED
Если я прав прошу исправить, если нет прошу объяснить что не увидел.
Большое спасибо за библиотеку вы упростили мой труд в несколько раз,
особенно когда работа основная не связана с программированием.
Без привязки к точному месту расположения цитируемых строк я не могу понять о чём именно вы говорите - просто поиском (Shift+Ctrl+F) не нашёл такого кода во всех файлах библиотеки...
event.SetProperty(EVENT_PROP_REASON_EVENT,EVENT_REASON_STOPLIMIT_TRIGGERED);Где это находится?
Без привязки к точному месту расположения цитируемых строк я не могу понять о чём именно вы говорите - просто поиском (Shift+Ctrl+F) не нашёл такого кода во всех файлах библиотеки...
Где это находится?
Вот строки из описания в самой части этой статьи и соответсвенно кода в конце статьи: подчеркнул эту строчку!
На данный момент - в текущей версии библиотеки, метод выглядит так:
Т.е., либо то была ошибка, и она давно исправлена, либо в обсуждаемой версии библиотеки это не критично. Я уже и не вспомню как там точно всё обстояло с этим...
На данный момент - в текущей версии библиотеки, метод выглядит так:
Т.е., либо то была ошибка, и она давно исправлена, либо в обсуждаемой версии библиотеки это не критично. Я уже и не вспомню как там точно всё обстояло с этим...
Это очень важно, от автора это еще важнее. Если вы не отказались от вашей первоначальной идеи. Своей работой помочь начинающим программистам, таким как мне. Когда ты еще начинающий (ученик) и только познаешь язык программирования, или вообще программирование, очень много появляется сомнений и вопросов при изучении вашей работы (библиотеки). В данном случае я до последнего не был уверен, что это ошибка или вы так задумали. Прошелся не один раз по вашему коду. И для меня это очень важно: "или я не понял смысл автора, или это просто опечатка автора в его большом проекте."
И как вы утверждаете, что это не критично?! Это не правильно с вашей стороны, тем самым вы и я с вами просто путаем читателей. Которые изучают или учатся как и я, по вашей библиотеки.
Это очень важно, от автора это еще важнее. Если вы не отказались от вашей первоначальной идеи. Своей работой помочь начинающим программистам, таким как мне. Когда ты еще начинающий (ученик) и только познаешь язык программирования, или вообще программирование, очень много появляется сомнений и вопросов при изучении вашей работы (библиотеки). В данном случае я до последнего не был уверен, что это ошибка или вы так задумали. Прошелся не один раз по вашему коду. И для меня это очень важно: "или я не понял смысл автора, или это просто опечатка автора в его большом проекте."
И как вы утверждаете, что это не критично?! Это не правильно с вашей стороны, тем самым вы и я с вами просто путаем читателей. Которые изучают или учатся как и я, по вашей библиотеки.
:)
Я ж показал код, в котором цветом выделены исправления. Внесите их в версию библиотеки, прилагаемую к этой статье.
Конечно же я уже не помню - ошибка это моя была, или в данной версии это не критично, и поэтому прошло мимо моего взора при отладке. Ведь уже сорок с лишним статей, и эта было так давно. Скорее всего всё-таки ошибка, исправление которой было внесено в последующих статьях - очень многое в библиотеке уже создаётся "на лету". Конечно была, и не одна, тестовые версии библиотеки. Но с началом описания её создания многое было пересмотрено и добавлено. Именно поэтому цикл статей позиционируется как описание создания библиотеки. Таким образом я пытаюсь вовлечь читателя в сам процесс её создания. С пробами и ошибками, и с указанием как их исправить - чтобы был весь процесс на виду - раскрыть, так сказать, "все муки созидания" :)
Потому, прошу прощения за внесённую сумятицу в вашем осознании происходящего...
Просто внесите предложенные выше изменения. Или оставьте до той статьи, в которой это будет исправлено.
Я хочу получить символ последнего событья, тикет и тип (открытия, закрытия, модификация), как это правильно сделать?
Я смотрю Артём так занят, что вообще не появляется на форуме.))) Может у меня получится подсказать, когда-то я экспериментировал с его библиотекой. Сегодня полазил по тем экспериментам и обнаружил такую функцию. В комментарии сказано, что функция получает список всех открытых позиций.
К сожалению объяснить что для чего я уже не могу, всё благополучно забыл, но может сможете разобраться…
Ну… если не получится, подождите. Артём найдёт время и ответит.
При поступлении тика, по которому устанавливается и одновременно активируется (триггерится) отложенный ордер (я тестировал с Buy Stop) ваш движок не регистрирует все события...
Приходит событие TRADE_EVENT_PENDING_ORDER_PLASED, но не TRADE_EVENT_PENDING_ORDER_ACTIVATED.
Код у меня примерно такой:
Сначала в цикле нахожу индекс старого (обработанного) события, а затем, начиная с него, перебираю все новые до конца. Так вот, в ситуации, когда по одному тику лимитный ордер установлен и стриггерен приходит одно событие об установке... Прокомментируйте, пожалуйста.
ProcessTradeEvents() вызываю в OnTick() следом за engine.OnTick(rates_data).