Вот из этого кода пытаюсь сделать...
код
где код ?
void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- static int counter=0; // счетчик вызовов OnTradeTransaction() static uint lasttime=0; // время последнего вызова OnTradeTransaction() //--- uint time=GetTickCount(); //--- если последняя транзакция была больше 1 секунды назад if(time-lasttime>1000) { counter=0; // значит, это новая торговая операция и можно сбросить счетчик if(IS_DEBUG_MODE) Print(" Новая торговая операция"); } lasttime=time; counter++; Print(counter,". ",__FUNCTION__); //--- результат выполнения торгового запроса ulong lastOrderID =trans.order; ENUM_ORDER_TYPE lastOrderType =trans.order_type; ENUM_ORDER_STATE lastOrderState=trans.order_state; //--- имя символа, по которому произошла транзакция string trans_symbol=trans.symbol; //--- тип транзакции ENUM_TRADE_TRANSACTION_TYPE trans_type=trans.type; switch(trans.type) { case TRADE_TRANSACTION_POSITION: // изменение позиции { ulong pos_ID=trans.position; PrintFormat("MqlTradeTransaction: Position #%d %s modified: SL=%.5f TP=%.5f", pos_ID,trans_symbol,trans.price_sl,trans.price_tp); } break; case TRADE_TRANSACTION_REQUEST: // отправка торгового запроса PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST"); break; case TRADE_TRANSACTION_DEAL_ADD: // добавление сделки { ulong lastDealID =trans.deal; ENUM_DEAL_TYPE lastDealType =trans.deal_type; double lastDealVolume=trans.volume; //--- идентификатор сделки во внешней системе - тикет, присваиваемый биржей string Exchange_ticket=""; if(HistoryDealSelect(lastDealID)) Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID); if(Exchange_ticket!="") Exchange_ticket=StringFormat("(Exchange deal=%s)",Exchange_ticket); PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot %s",EnumToString(trans_type), lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket); } break; case TRADE_TRANSACTION_HISTORY_ADD: // добавление ордера в историю { //--- идентификатор ордера во внешней системе - тикет, присваиваемый биржей string Exchange_ticket=""; if(lastOrderState==ORDER_STATE_FILLED) { if(HistoryOrderSelect(lastOrderID)) Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID); if(Exchange_ticket!="") Exchange_ticket=StringFormat("(Exchange ticket=%s)",Exchange_ticket); } PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s %s",EnumToString(trans_type), lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket); } break; default: // прочие транзакции { //--- идентификатор ордера во внешней системе - тикет, присваиваемый Московской биржей string Exchange_ticket=""; if(lastOrderState==ORDER_STATE_PLACED) { if(OrderSelect(lastOrderID)) Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID); if(Exchange_ticket!="") Exchange_ticket=StringFormat("Exchange ticket=%s",Exchange_ticket); } PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s",EnumToString(trans_type), lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket); } break; } //--- тикет ордера ulong orderID_result=result.order; string retcode_result=GetRetcodeID(result.retcode); if(orderID_result!=0) PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result); //--- }
Обратите внимание на эти свойства сделок
ENUM_DEAL_ENTRY
Идентификатор | Описание |
---|---|
DEAL_ENTRY_IN | Вход в рынок |
DEAL_ENTRY_OUT | Выход из рынка |
DEAL_ENTRY_INOUT | Разворот |
DEAL_ENTRY_OUT_BY | Закрытие встречной позицией |
Если ставить так if (ENUM_DEAL_ENTRY()==DEAL_ENTRY_IN) то все равно закрытые сделки распознаются как новые
Если ставить так if (ENUM_DEAL_ENTRY()==DEAL_ENTRY_IN) то все равно закрытые сделки распознаются как новые
Потому, что это делается примерно так…
/*********************TradeTransaction function**********************/ void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) { if(trans.type == TRADE_TRANSACTION_DEAL_ADD) { if(HistoryDealSelect(trans.deal)) { if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_IN) Print("Позиция открылась"); if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT) Print("Позиция закрылась"); } } }/******************************************************************/
При неттинге и работе нескольких роботов на одном инструменте всё не так однозначно.
DEAL_ENTRY_IN - наращивание "суммарной" позиции всех роботов
DEAL_ENTRY_OUT - сокращение её же
При неттинге и работе нескольких роботов на одном инструменте всё не так однозначно.
DEAL_ENTRY_IN - наращивание "суммарной" позиции всех роботов
DEAL_ENTRY_OUT - сокращение её же
О неттинге и намёка небыло…
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вот из этого кода пытаюсь сделать алерт на открытие абсолютно новых ордеров и алерт на закрытие тех что уже были открытые до этого.
https://www.mql5.com/ru/docs/event_handlers/ontradetransaction
Может есть более простое решение? Спасибо!