Необходимые показатели на графике советника

15 февраля 2015, 20:09
free_lancer
0
286

Я привык всегда иметь под рукой некоторые необходимые данные во время торговли. В приведенной статье я приведу перечень таких данных, используемый способ получения и способ вывода. Выглядит это так (левый верхний угол терминала):

Необходимые показатели на графике советника 

В качестве показателей обычно выбираю следующие данные:

  1. чистый капитал (Equity);
  2. значение показателя Margin;
  3. количество отложенных ордеров;
  4. количество открытых ордеров;
  5. уровень стоп-аута для текущего счета; 
  6. текущий профит по всем открытым ордерам;
  7. профит за день (сумма профита закрытых за текущий день ордеров); 
  8. величина лота, которым я торгую на текущем счете. 

Некоторые из показателей возвращаются встроенными функциями mql4, а некоторые рассчитываются. Я использую для таких расчетных показателей следующее объявление:

 

string comment_/*текст, передаваемый в функцию Comment() */;
double lot_,profit_;
int open_orders_
,pending_orders_
;

Объявление размещаю непосредственно перед функцией 


int OnInit()

Данные о дневном профите

Отдельно скажу пару слов о расчете дневного профита. Код я стараюсь писать так, чтобы он минимально занимал вычислительные ресурсы и время. Обычно, все, что связано с проходом по открытым и отложенным ордерам (MODE_TRADES) я организую в единственный цикл, в котором выполняется сбор и анализ данных. Цикл организован в виде функции check_orders(), которая в свою очередь вызывается каждый раз, когда выполняется функция void OnTick().

Но поскольку для получения сведений о закрытых за день ордерах необходимо использовать другой флаг - MODE_HISTORY, получилось логичным вынести его в отдельную функцию. Вот ее код:

void check_day_profit()
{
int total=OrdersHistoryTotal();
double p=0;
int d=TimeDayOfYear(TimeCurrent());
int od=0;
for(int cnt=0;cnt<total;cnt++)
     {
      if(OrderSelect(cnt, SELECT_BY_POS,MODE_HISTORY))
      {
         if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==magic  )  
           {
              od=TimeDayOfYear(OrderCloseTime());
              if(od==d)
                 p+=OrderProfit(); 
           }
         }  
     }    
      
comment_=comment_+"day close profit:"+DoubleToStr(p,2)+"\r\n";

}

 Как видно, полученные данные о дневном профите просто добавляются к используемой переменной для вывода comment_.

Вывод информации

Вывод информации производится следующим образом:

void OnTick()
  {
//---
    comment_="version:"+sversion+"\r\n";
    check_orders();//различные расчеты и проверки ордеров
    ...
    ...
    
    comment_=comment_+"Equity:"+DoubleToStr(AccountEquity(),2)+"\r\n";//чистый капитал
    comment_=comment_+"Margin:"+DoubleToStr(AccountMargin(),2)+"\r\n";//значение показателя Margin;
    comment_=comment_+"pending_orders_:"+DoubleToStr(pending_orders_,0)+"\r\n";//количество отложенных ордеров;
    comment_=comment_+"open_orders_:"+DoubleToStr(open_orders_,0)+"\r\n";//количество открытых ордеров;
    comment_=comment_+"StopOut Level:"+DoubleToStr(AccountStopoutLevel(),2)+"\r\n";//уровень стоп-аута для текущего счета; 
    comment_=comment_+"profit:"+DoubleToStr(profit_,2)+"\r\n";//текущий профит по всем открытым ордерам;
    check_day_profit();//профит за день (сумма профита закрытых за текущий день ордеров); 
    comment_=comment_+"lot:"+DoubleToStr(lot_,2)+"\r\n";//величина лота
    Comment(comment_);
    
  }

Заключение

В заключение замечу, что расчет отложенных и открытых ордеров выполняется в функции check_orders(). Привожу фрагмент кода:

...
         if(OrderType()==OP_BUYSTOP ||OrderType()==OP_SELLSTOP  || OrderType()==OP_SELLLIMIT  ||OrderType()==OP_BUYLIMIT) 
         {
            pending_orders_++;
         }
         if(OrderType()==OP_BUY ||OrderType()==OP_SELL) 
         {
            profit_+=OrderProfit();
            open_orders_++;
         } 

... 

 

Поделитесь с друзьями: