Свойство PositionGetDouble(POSITION_PROFIT) бесполезно?

 

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

Суть в том, что у меня в цикле происходит проверка. Если прибыль позиции меньше требуемой, пропускается закрытие этой позиции.

Вот код:

int positionsTotal = PositionsTotal();

for (int pos = 0; pos < positionsTotal; pos++) {
        if (!position.info.choicePositionPrimary(sym.getName(), g_magic, pos)) continue;
        Print(__FUNCTION__, " :: pos = ", pos);
        Print(__FUNCTION__, " :: lastPositionTicket = ", position.info.lastPositionTicket(sym.getName(), POSITION_TYPE_SELL, g_magic));
        Print(__FUNCTION__, " :: selectedPositionTicket = ", position.info.selectedPositionTicket());
        Print(__FUNCTION__, " :: selectedPositionProfit + spread = ", position.info.selectedPositionProfit() + sym.spread());
        Print(__FUNCTION__, " :: g_minTP = ", g_minTP);
        if (selectedPositionProfit() - sym.spread() < g_minTP) continue;
        if (position.info.selectedPositionTicket() != position.info.lastPositionTicket(sym.getName(), POSITION_TYPE_SELL, g_magic)) continue;
        position.close(sym, i_deviation, pos);
        return true;
      }

Не обязательно смотреть весь этот код. Интересует меня лишь строка:

if (selectedPositionProfit() - sym.spread() < g_minTP) continue;

Это строка осеивает позиции, у которых прибыль меньше минимальной.

Вот код selectedPositionProfit() (из библиотеки):

//==================================================================================================================================================================================
// Возвращает актуальную прибыль позиции. ==========================================================================================================================================
double selectedPositionProfit(void) export {
  return (double)PositionGetDouble(POSITION_PROFIT);
}

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

 

Как так получается?

 
Viktar Dzemikhau:

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

Суть в том, что у меня в цикле происходит проверка. Если прибыль позиции меньше требуемой, пропускается закрытие этой позиции.

Вот код:

Не обязательно смотреть весь этот код. Интересует меня лишь строка:

Это строка осеивает позиции, у которых прибыль меньше минимальной.

Вот код selectedPositionProfit() (из библиотеки):

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

 

Как так получается?

вызывает большой вопрос строка

if (selectedPositionProfit() - sym.spread() < g_minTP) continue;

подозреваю что метод spread() возвратит "цену спреда" а не пункты, но спред плавающий. При закрытии он будет другим

Ещё свопы и комиссии надо учесть

 
Viktar Dzemikhau:

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

Суть в том, что у меня в цикле происходит проверка. Если прибыль позиции меньше требуемой, пропускается закрытие этой позиции.

Вот код:

Не обязательно смотреть весь этот код. Интересует меня лишь строка:

Это строка осеивает позиции, у которых прибыль меньше минимальной.

Вот код selectedPositionProfit() (из библиотеки):

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

 

Как так получается?

Вот почему я так ненавижу ООП. Разве ваш код проще написать чем этот

  int positionsTotal = PositionsTotal();
  for(int pos = 0; pos < positionsTotal; pos++)
   {
    ulong posTicket = PositionGetTicket(pos);
    if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == 123)
     {
      if(PositionGetDouble(POSITION_PROFIT) > g_minTP)
       Print("Можно закрыть позицию");
     }
   }

Разве ваш код легче читаем?

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

В общем пишите проще, проще и ошибки будет находить…

Причина обращения: