Функции подсчета прибыли/убытка

 

Коллеги, пишу функции для подсчета прибыли/убытка для советника за сегодня, за период 7 дней и за все время.

Что-то бред считает, укажите на ошибку пожалуйста.

//+------------------------------------------------------------------+
double EarnToday()
{
   double result = 0;
   
   if(OrderSelect(OrdersHistoryTotal() - 1,SELECT_BY_POS, MODE_HISTORY))
   {
      if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
      {
         if (TimeDay(OrderCloseTime()) == TimeDay(TimeCurrent()))
         {
            result =+ OrderProfit();
         }
      }
   }
   return(NormalizeDouble(result, 2));         
}
//+------------------------------------------------------------------+
double EarnSeven()
{
   double result = 0;
   
   if(OrderSelect(OrdersHistoryTotal() - 1,SELECT_BY_POS, MODE_HISTORY))
   {
      if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
      {
         if (TimeDay(OrderCloseTime()) >= iTime(Symbol(), PERIOD_D1, 6))
         {
            result =+ OrderProfit();
         }
      }
   }
   return(NormalizeDouble(result, 2));         
}
//+------------------------------------------------------------------+
double EarnTotal()
{
   double result = 0;
   
   if(OrderSelect(OrdersHistoryTotal() - 1,SELECT_BY_POS, MODE_HISTORY))
   {
      if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
      {
         result =+ OrderProfit();
      }
   }
   return(NormalizeDouble(result, 2));         
}
//+------------------------------------------------------------------+
 
Roman Meskhidze:

Коллеги, пишу функции для подсчета прибыли/убытка для советника за сегодня, за период 7 дней и за все время.

Что-то бред считает, укажите на ошибку пожалуйста.

Скачайте индикатор и посмотрите как это сделано

i-Profit
i-Profit
  • www.mql5.com
Реальный автор: Ким Игорь В. aka KimIV Этот индикатор показывает прибыль в пунктах и в валюте депозита: текущую, за сегодня, за вчера, за три предыдущих дня раздельно за каждый, за текущую неделю, за текущий месяц, за текущий квартал, за текущий год и начиная с некоторой пользовательской даты. Значения прибыли и убытка индикатор показывает...
 

похоже я не выспался ))))

у меня же нет цикла для перебора всех ордеров

 
Vitaly Muzichenko:

Скачайте индикатор и посмотрите как это сделано

Этому индикатору ещё бы научиться выполнять ежедневный и еженедельный по-трендовый подсчет 

не только фактической, но также потенциальной прибыли и убытка. Бесценная штучка была бы!

 
Roman Meskhidze:

похоже я не выспался ))))

у меня же нет цикла для перебора всех ордеров

И тут некорректное сравнение происходит, перечитайте, что возвращает каждая из функций

if (TimeDay(OrderCloseTime()) >= iTime(Symbol(), PERIOD_D1, 6))
 
Все-равно, что-то не так. Понимаете? То есть; и у Кима, что-то не так?! Я сейчас скачал, этот индикатор, посмотрел его код, предположил, что я не обращаюсь к MarketInfo() вырезал у него эти участки(что бы самому не писать, если что), поставил их себе в свою функцию(она похожа на ту, которую написал задающий вопрос по этой теме, только с циклами), и вот складывается такое впечатление, что функция все-равно считает последний ордер в прибыль и += - не работает совсем, или, когда работает, а когда не работает. И, свопом, обрушить так прибыль - невозможно. Понимаете? То есть, складывается впечатление, что не все ордера участвуют в сложении в прибыль. Тут должен быть какой-то другой расчет. Я уже пробовал в условиях, сложить прибыль с аккаунт балансом и вычитать из него аккаунт баланс и проверить что бы прибыль не была меньше вот этой суммы, и изменилось чуть стало лучше, но все-равно, советник улетает в убыток. Что-то считается не так там и что-то не соответствует своим параметрам. И у Кима написано, как и должно быть. Я так же писал, за исключением - не обращался в MarketInfo() - не с посчитал нужным, и у кого-то в инете видел то же самое давно, и давно видел так же на ютубе, и вот вся эта система - не работает должным образом. Складывается впечатление что советник начал торговать рублями против евро, и доллар и сливает все. Может при этом надо отнимать маржу?! И по ходу скорей всего, где-то тут и находится вся эта загадка и баланс считать лучше по марже. Точно. На момент входа компилятора в функцию, переменной задается маржа, с каждым проходом она складывается и при выходе из цикла делится на число проходов и сверяется в условии и если она больше чем первоначальная маржа, то закрываем ордера в прибыль. А больше я даже пока и ума не приложу как с этим со всем воевать. Удачи всем.
 
yu_k #:
Все-равно, что-то не так. Понимаете? То есть; и у Кима, что-то не так?! Я сейчас скачал, этот индикатор, посмотрел его код, предположил, что я не обращаюсь к MarketInfo() вырезал у него эти участки(что бы самому не писать, если что), поставил их себе в свою функцию(она похожа на ту, которую написал задающий вопрос по этой теме, только с циклами), и вот складывается такое впечатление, что функция все-равно считает последний ордер в прибыль и += - не работает совсем, или, когда работает, а когда не работает

Надо суммировать!!!

 
a007 #:

Надо суммировать!!!

Да, по ходу все, нашел. И не надо там ни чего придумывать. Это функция AccountProfit(), она возвращает значение прибыли текущего счета. Он может быть как плюсом, так и минусом. И вот его так же как у Кима ставишь += и в проверке допустим если сумма превышает 5 долларов, то закрываем все ордера. И вот я только что смотрел проверял - все идет как и должно идти, то есть, без всяких непонятных минусов, то есть, если там 2 ордера и их сумма больше 5 долларов он их закрывает и график в тестере стратегий показывает возрастающую тенденцию, а не непонятный обвал; если 5 ордеров - то же самое и 10 ордеров тоже самое - график идет, как и полагается в верх, то есть в прибыль 5+5+5 и т.д. И с ней я и буду уже мудрить, чем с непонятными заскоками с непонятными расчетами. Удачи Вам.

 
yu_k #:

Да, по ходу все, нашел. И не надо там ни чего придумывать. Это функция AccountProfit(), она возвращает значение прибыли текущего счета. Он может быть как плюсом, так и минусом. И вот его так же как у Кима ставишь += и в проверке допустим если сумма превышает 5 долларов, то закрываем все ордера. И вот я только что смотрел проверял - все идет как и должно идти, то есть, без всяких непонятных минусов, то есть, если там 2 ордера и их сумма больше 5 долларов он их закрывает и график в тестере стратегий показывает возрастающую тенденцию, а не непонятный обвал; если 5 ордеров - то же самое и 10 ордеров тоже самое - график идет, как и полагается в верх, то есть в прибыль 5+5+5 и т.д. И с ней я и буду уже мудрить, чем с непонятными заскоками с непонятными расчетами. Удачи Вам.

Ну-ну… А что покажет AccountProfit() если на счёте будет работать два советника или больше?
 
Alexey Viktorov #:
Ну-ну… А что покажет AccountProfit() если на счёте будет работать два советника или больше?
По поводу советников не знаю, а проблема может возникнуть на разных символах. Тут вот надо будет считать профит по каждому символу в отдельности. Типа P.S: это я искал себе и учусь скальпингу и бывает, моменты что ордера не закрываются и цена улетает, (это я рассказываю свою стратегию и вот это сообщение удалю потом), вот, я выставляю ордера в одном направлении(отложенные стопы), за уходящей ценой. Потом когда цена начинает идти обратно у меня получается уже стоит сетка ордеров, я им удаляю тайкпрофит и вот мне нужен был советник который я включаю и он их все закрывает при наступлении определенной прибыли по определенному инструменту. А по поводу AccountProfit() очень мало информации в самом справочнике - ее фактически нет там - это плохо. То есть, я предпологаю, что эта функция считает общий баланс всего счета. Вот. Если я его с ее помощью посчитаю и применю OrderSymbol()=="...";  и потом отниму от общего. И  главное, что она считает, я хоть и на демке тренируюсь, но сегодня по одному инструменты она убрала мои сопли, какие я нагородил. Так что пока все идет как надо, а дальше видно будет, точнее до этого еще надо дожить. И два советника смогут торговать, разные потоки им сделать и все; и мьютексы еще в вести, то есть, синхронизацию организовать, хотя кому как. Можно эту функцию им разделить, половину одному, а другую другому и устроить соревнования между ними.
 
yu_k #:
По поводу советников не знаю, а проблема может возникнуть на разных символах. Тут вот надо будет считать профит по каждому символу в отдельности. Типа P.S: это я искал себе и учусь скальпингу и бывает, моменты что ордера не закрываются и цена улетает, (это я рассказываю свою стратегию и вот это сообщение удалю потом), вот, я выставляю ордера в одном направлении(отложенные стопы), за уходящей ценой. Потом когда цена начинает идти обратно у меня получается уже стоит сетка ордеров, я им удаляю тайкпрофит и вот мне нужен был советник который я включаю и он их все закрывает при наступлении определенной прибыли по определенному инструменту. А по поводу AccountProfit() очень мало информации в самом справочнике - ее фактически нет там - это плохо. То есть, я предполога, что эта функция считает общий баланс всего счета. Вот. Если я его с ее помощью посчитаю и применю OrderSymbol()=="...";  и потом отниму от общего. И  главное, что она считает, я хоть и на демке тренируюсь, но сегодня по одному инструменты она убрала мои сопли, какие я нагородил. Так что пока все идет как надо, а дальше видно будет, точнее до этого еще надо дожить. И два советника смогут торговать, разные потоки им сделать и все; и мьютексы еще в вести, то есть, синхронизацию организовать, хотя кому как. Можно эту функцию им разделить, половину одному, а другую другому и устроить соревнования между ними.

И ещё AccountProfit() не считает свопы и комиссии.