Выбор нужной позиции - страница 2

 

Так между делом. Раньше пробовал вот такую комбинацию

bool result = PositionSelect( PositionGetSymbol(index) );

По логике должна была нормально отрабатывать. Но возникала в некоторых ситуациях, как заметил выбиралась первая позиция в переборе и все. Ошибок не возникало по коду, но отработка была не по всему массиву позиций.
Хотя сейчас почитал документацию по PositionSelect, может и правильно делает данная комбинация =)

При "неттинговом" учете позиций (ACCOUNT_MARGIN_MODE_RETAIL_NETTING и ACCOUNT_MARGIN_MODE_EXCHANGE) по каждому символу в любой момент времени может быть открыта только одна позиция, которая является результатом одной или более сделок. Не следует путать между собой позиции и действующие отложенные ордера, которые также отображаются на вкладке "Торговля" в панели "Инструменты".
При независимом представлении позиций (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING) по каждому символу одновременно может быть открыто несколько позиций. В этом случае, PositionSelect выберет позицию с наименьшим тикетом.
 
Konstantin Nikitin:

Так между делом. Раньше пробовал вот такую комбинацию

По логике должна была нормально отрабатывать. Но возникала в некоторых ситуациях, как заметил выбиралась первая позиция в переборе и все. Ошибок не возникало по коду, но отработка была не по всему массиву позиций.
Хотя сейчас почитал документацию по PositionSelect, может и правильно делает данная комбинация =)

Есть разница в переборе по тикету на неттинге/хеджинге, Я так-же споткнулся, то работает, то не работает. В общем, нужно применять универсальное решение

 
Alexander Bereznyak:

где вы увидели, что нужен тикет, прочитайте внимательно справку, как работает PositionGetTicket

где в этих функциях тикет

Это не действия с позициями. Это всего-лишь информация о выбранной позиции.

1. В структуре MqlTradeRequest которая входит в OrderSend для модификации, закрытия позиции.

2. Для выборки ордеров и сделок принадлежащих этой позиции, из истории ордеров и сделок.

3. Остальное найдите сами.

 
Vitaly Muzichenko:

Есть разница в переборе по тикету на неттинге/хеджинге, Я так-же споткнулся, то работает, то не работает. В общем, нужно применять универсальное решение

Нет никакой разницы. Если позиция только одна, независимо от типа счёта, netting или hadge, она всего одна и имеет индекс 0.

 
***не работает адекватно, пока не останется одна позиция.
 
Vitaly Stepanov:
***не работает адекватно, пока не останется одна позиция.

Не работает какой вариант?

 
Vitaly Stepanov:
***не работает адекватно, пока не останется одна позиция.

даже применяю подобное. Уже как-то описывал это на форуме.

 
Alexey Viktorov:

Не работает какой вариант?

ни какой. не работает функция , которая в шапке. или выдает ошибки, выбирает противоположную позицию, или не срабатывает вторая позиция, пока не закроется первая.

 
Vitaly Stepanov:

ни какой. не работает функция , которая в шапке. или выдает ошибки, выбирает противоположную позицию, или не срабатывает вторая позиция, пока не закроется первая.

Выкладывайте цикл какой пробуете использовать с вашими изменениями. Уже даже интересно посмотреть стало, что вы там наваяли..

Ну и зачем вы прогоняете модификацию по Symbol, может правильней по тикету?

ExtTrade.PositionModify(PositionGetInteger(POSITION_TICKET),sl_buy,0)

Хотя конечно если вам все ордера нужно в куче прогнать.

Посмотрите Trade.mqh в нем
   bool              PositionModify(const string symbol,const double sl,const double tp);
   bool              PositionModify(const ulong ticket,const double sl,const double tp);
 
Konstantin Nikitin:

Выкладывайте цикл какой пробуете использовать с вашими изменениями. Уже даже интересно посмотреть стало, что вы там наваяли..

int total = 0;

  total = PositionsTotal();

for(int i=total-1;i>=0;i--)
{
     if( _Symbol != PositionGetSymbol(i) ) continue;
     
     if( PositionGetInteger(POSITION_MAGIC) != MAGIC ) continue;
      
         if( PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_BUY || PositionGetInteger(POSITION_TYPE)== POSITION_TYPE_SELL )
           
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
              {
Причина обращения: