Я привык всегда иметь под рукой некоторые необходимые данные во время торговли. В приведенной статье я приведу перечень таких данных, используемый способ получения и способ вывода. Выглядит это так (левый верхний угол терминала):
В качестве показателей обычно выбираю следующие данные:
- чистый капитал (Equity);
- значение показателя Margin;
- количество отложенных ордеров;
- количество открытых ордеров;
- уровень стоп-аута для текущего счета;
- текущий профит по всем открытым ордерам;
- профит за день (сумма профита закрытых за текущий день ордеров);
- величина лота, которым я торгую на текущем счете.
Некоторые из показателей возвращаются встроенными функциями 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_++; }
...