PositionSelect(symbol) PositionGetInteger(POSITION_TYPE)
Вы выделяете всего ОДНУ позицию. Соответственно для неё будет или BUY или SELL. Если нужно сделать обход по всем позициям, то нужен цикл - от "PositionsTotal()-1", до ">=0":
for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic) { if(m_position.PositionType()==POSITION_TYPE_BUY) count_buys++; if(m_position.PositionType()==POSITION_TYPE_SELL) count_sells++; }
Вы выделяете всего ОДНУ позицию. Соответственно для неё будет или BUY или SELL. Если нужно сделать обход по всем позициям, то нужен цикл - от "PositionsTotal()-1", до ">=0":
А где Вы ищите последнюю позицию? Вы её нигде не ищите :). Хотите последнюю позицию:
- ловите в OnTradeTransaction()
- или делайте обход ВСЕХ позиций и удостоверьтесь, что нашли именно ПОСЛЕДНЮЮ (то есть ту, у которой время открытия самое "молодое").
А где Вы ищите последнюю позицию? Вы её нигде не ищите :)
Вот советник, который выводит ВСЕ позиции:
//+------------------------------------------------------------------+ //| ListPositions.mq5 | //| Copyright © 2017, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2017, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" #property description "Показ списка позиций" #include <Trade\PositionInfo.mqh> CPositionInfo m_position; // trade position object //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(6); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- string text=""; for(int i=PositionsTotal()-1;i>=0;i--) if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties { text+=IntegerToString(i)+ " | "+m_position.Symbol()+ " | "+IntegerToString(m_position.Ticket())+ " | "+TimeToString(m_position.Time(),TIME_DATE|TIME_MINUTES|TIME_SECONDS)+ " | "+EnumToString(m_position.PositionType())+ " | "+DoubleToString(m_position.Volume(),2)+ " | "+DoubleToString(m_position.PriceOpen(),8)+"\n"; } Comment(text); } //+------------------------------------------------------------------+
Зачем искать последнюю позицию, если это последняя позиции, у нее четко регламентированное место в записях?
Это кто сказал? Это Мы все так надеемся, но никто не гарантировал порядок позиций.
Запустите пример из поста выше и посмотрите какой номер в списке у самой последней позиции...
Ясно. Т.е. чтобы получить тип позиции надо использовать что подобное:
MqlTradeRequest request; MqlTradeResult result; int total=PositionsTotal(); // количество открытых позиций //--- перебор всех открытых позиций for(int i=total-1; i>=0; i--) { //--- параметры ордера ulong position_ticket=PositionGetTicket(i); // тикет позиции string position_symbol=PositionGetString(POSITION_SYMBOL); // символ int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой ulong magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции double volume=PositionGetDouble(POSITION_VOLUME); // объем позиции ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позицииЛадно. Так или иначе, все это придется изучать. Хотя вопросы, почему он не видит позицию и видит то, чего нет, пока остаются на повестке, возможно когда поднаторею, смогу понять. Спс за просвещение.
Ясно. Т.е. чтобы получить тип позиции надо использовать что подобное:
Ладно. Так или иначе, все это придется изучать. Хотя вопросы, почему он не видит позицию и видит то, чего нет, пока остаются на повестке, возможно когда поднаторею, смогу понять. Спс за просвещение.конструкция выбора позиции по символу
PositionSelect(symbol)
работает только на неттинговых счетах. На хеджевых счетах нужно искать нужную позицию путем перебора позиций в списке позиций как написал выше Владимир.
вот нашел в документации для
При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.
конструкция выбора позиции по символу
работает только на неттинговых счетах. На хеджевых счетах нужно искать нужную позицию путем перебора позиций в списке позиций как написал выше Владимир.
вот нашел в документации для
При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.
Buy тикет №2, sell соответственно №3. Только проснулся, сейчас попробую "разобрать" блоки кода Владимира. ... Возможно имеет смысл попробовать получить список позиции в буфер и с помощью ArraySetAsSeries изменить индексацию, возможно будет хуже, возможно лучше ... если получится. Даже если не получится, то хуже точно не будет.
И опять же. На первом скрине проверка, две позиции bay и sell, но после формирования бара и открытия позиции sell (тикет №3), sell_opened высвечивает false. Т.е., фукция PositionGetInteger позицию не видит, а она есть. Я про то, смысл в иных проверках, поиске, переборе и наращивании кода, если функция не видит конкретно указанный тип POSITION_TYPE_SELL? Я пока мало знаю, возможно чего-то не понимаю, но PositionGetInteger, как мне кажется, обязана эту сделку видеть независимо от иных факторов.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я только учусь и попал в засаду. Примитивнейшее действие: получить тип позиции. Пробовал так:
Открыл buy - total и PositionGetInteger ее видят. Листаю, открывается позиция sell, total ее видит - 2 позиции, а PositionGetInteger - false.
Пробовал так, total и PositionSelect по нолям, а PositionGetInteger видит buy:
Есть ли способ получить банальную информацию о типе последней позиции, без необходимости писать сотни строк кода?