При расчёте разницы между ценой открытия позиции и текущей ценой, для получения текущей цены, что нужно выбирать: SymbolInfoTick или PositionGetDouble(POSITION_PRICE_CURRENT))?
- Особенности языка mql5, тонкости и приёмы работы
- [АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4.
- Вопрос к разработчикам: POSITION_PRICE_CURRENT - Bid или Ask ?
Alexander Laur:
Хочу получить разницу между текущей ценой и ценой позиции. Цена позиции, естественно известна. А вот как лучше получить текущую цену: через SymbolInfoTick или PositionGetDouble(POSITION_PRICE_CURRENT))?
Вопрос сформулируйте корректно?
Что Вы хотите сделать/получить?
Alexander Laur:
Спасибо. Мне нужно текущую цену для позиции. Значит буду использовать PositionGetDouble(POSITION_PRICE_CURRENT).
В этом случае лучше воспользоваться PositionGetDouble(POSITION_PRICE_CURRENT), т.к. этот запрос Вам выдаст текущую цену (Bid/Ask) с учетом типа позиции (Buy/Sell).
Если для получения текущих цен, Вы будете пользоваться либо SymbolInfoDouble(), либо SymbolInfoTick(), то Вам придется делать проверки соответствия цены (Bid/Ask) типу позиции (Buy/Sell) самостоятельно.
Karputov Vladimir:
Спасибо. Мне нужно текущую цену для позиции. Значит буду использовать PositionGetDouble(POSITION_PRICE_CURRENT).
Спасибо. Мне нужно текущую цену для позиции. Значит буду использовать PositionGetDouble(POSITION_PRICE_CURRENT).
//+------------------------------------------------------------------+ //| Expert Get position price function | //+------------------------------------------------------------------+ double GetPositionPrice( const string aSymbol ) { double price_in = 0; double volume_in = 0; if ( PositionSelect( aSymbol ) ) { ulong pos_id = ulong( PositionGetInteger( POSITION_IDENTIFIER ) ); if ( pos_id > 0 ) { if ( HistorySelectByPosition( pos_id ) ) { int deals = HistoryDealsTotal(); for( int i = 0; i < deals; i++ ) { ulong deal_ticket = HistoryDealGetTicket( i ); ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) ); if ( order_ticket > 0 ) { ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY( HistoryDealGetInteger( deal_ticket, DEAL_ENTRY ) ); if ( deal_entry == DEAL_ENTRY_IN ) { double price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE ); double volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME ); price_in += price * volume; volume_in += volume; } } } if ( volume_in > 0 ) return( NormalizeDouble( price_in / volume_in, _Digits ) ); } else { Print( "GetPositionPrice: Невозможно получить историю позиции по символу ", aSymbol ); } } else { Print( "GetPositionPrice: Невозможно определить идентификатор позиции по символу ", aSymbol ); } } return( 0 ); }
Функция, приведённая выше, показывает цену позиции, ТОЛЬКО, если объём позиции не уменьшался.
Если объём позиции уменьшался, то введите еще DEAL_ENTRY_OUT
P/S PositionGetDouble(POSITION_PRICE_CURRENT)
Не показывает истинную (совокупную) цену позиции.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь