Закрытие позиции при окончании тестирования.

 
OneBillionUSD:

Добрый день!

Возникла необходимость отследить убыточную сделку  при окончании тестирования. Как можно это сделать?

 

 

 

Можно в функции OnDeinit
 
stringo:
Можно в функции OnDeinit
Благодарю, разобрался!
 
Теперь встал вопрос как отличить убыточную сделку от StopOut?
 
OneBillionUSD:
Теперь встал вопрос как отличить убыточную сделку от StopOut?    
В смысле? Как отличить одну убыточную сделку от другой?
 
Yedelkin:
В смысле? Как отличить одну убыточную сделку от другой?
Мне нужно понимать советник слил или просто не успел выйти в плюс так как тестирование закончилось.
 
OneBillionUSD:
Мне нужно понимать советник слил или просто не успел выйти в плюс так как тестирование закончилось.
А при Стопаут есть какой-нибудь комментарий в последней сделке?
 
tol64:
А при Стопаут есть какой-нибудь комментарий в последней сделке?

Да присутствует.  

Как вариант смотреть комментарий можно. А существует еще какой-либо способ? 

Может как то использовать TesterStatistics?

 

Нашел примерно следующее решение проблемы:

if(TesterStatistics(STAT_MIN_MARGINLEVEL)<MathMax(AccountInfo.MarginStopOut(),AccountInfo.MarginCall()))
     {
      Print("Стопаут");
     }

 Cпасибо.

 
OneBillionUSD:

Нашел примерно следующее решение проблемы:

 Cпасибо.

Либо просто принтуйте каждый раз, как советник будет закрывать сделку и в конце теста смотрите журнал.. если принта нет, то сделку закрыл не советник. Ведь, как я понял, у вас нет ТП и СЛ.
 
Cmu4:
Либо просто принтуйте каждый раз, как советник будет закрывать сделку и в конце теста смотрите журнал.. если принта нет, то сделку закрыл не советник. Ведь, как я понял, у вас нет ТП и СЛ.
Совершенно верно данный эксперт не использует стоп уровни. Задача стояла отслеживать убыточные позиции при завершении тестирования во время оптимизации. Вот примерно что у меня получилось: 
double OnTester()
  {
   double ret=0.0;
   HistorySelect(0,TimeCurrent()+86400);
   int total=HistoryDealsTotal();
   ulong Ticket=0;
   for(uint i=total;i>0;i--)
     {
      Ticket=HistoryDealGetTicket(i);
      if(HistoryDealGetInteger(Ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT
         && HistoryDealGetDouble(Ticket,DEAL_PROFIT)<0)
        {
         if(TesterStatistics(STAT_MIN_MARGINLEVEL)
            >MathMax(AccountInfo.MarginStopOut(),AccountInfo.MarginCall()))
           {
            ret=NormalizeDouble(MathAbs(HistoryDealGetDouble(Ticket,DEAL_PROFIT))+
                                TesterStatistics(STAT_PROFIT),2);
           }
         break;
        }
     }
   return(ret);
  }
 Еще к сожалению оптимизацией не занимался но думаю ход мыслей у меня верный)
Причина обращения: