Задачка. Найти точку нулевого профита.

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Re: Задачка. Найти точку нулевого профита.

Сообщение Haos » 07 сен 2016, 16:03

Наверное, нужно пример привести.
1 бай: 102.16 *** 1.5 лот
2 бай: 103.00 *** 0.5 лот
3 селл: 102.77 *** 1.8 лот
Yc = (102.6 * 1.5 + 103.0 * 0.5 + 102.77 * 1.8) / (1.5 + 0.5 + 1.8) = 390.386 / 3.8 = 102.73.
Таким образом уровень безубытка - 102.73 (оранжевая линия на рисунке).
Вложения
01.png
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Задачка. Найти точку нулевого профита.

Сообщение Kalkin » 09 окт 2016, 19:30

Вот функция для поиска точки нулевого профита, учитывающая комиссии и накапливающиеся свопы. При локе точка профита будет "0" (отсутствовать).
Код: выделить все
double ZeroLevel()
{
 double BuyLots=0;
 double SellLots=0;
 double BuyProfit=0;
 double SellProfit=0;
 int Total=OrdersTotal();
 for (int i=Total-1;i>=0;i--)
 {
  if (OrderSelect(i,SELECT_BY_POS))
  {
   if (OrderSymbol()!=Symbol()) continue;
   if (OrderType()==OP_BUY)
   {
    BuyLots=BuyLots+OrderLots();
    BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap();
   }
   if (OrderType()==OP_SELL)
   {
    SellLots=SellLots+OrderLots();
    SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap();
   }
  }
 }
 double Price=0;
 double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE)/(MarketInfo(Symbol(),MODE_TICKSIZE)/Point);
 if ((BuyLots-SellLots)>0) Price=NormalizeDouble(Bid-((BuyProfit+SellProfit)/(TickValue*(BuyLots-SellLots))*Point),Digits);
 if ((SellLots-BuyLots)>0) Price=NormalizeDouble(Ask+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);
 return (Price);
}
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Re: Задачка. Найти точку нулевого профита.

Сообщение Haos » 13 май 2017, 08:59

Kalkin писал(а):Вот функция для поиска точки нулевого профита, ...

В конце кода закрывающей скобки не хватало. Исправил.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Задачка. Найти точку нулевого профита.

Сообщение piter » 17 мар 2018, 22:51

Kalkin писал(а):Вот функция для поиска точки нулевого профита, учитывающая комиссии и накапливающиеся свопы. При локе точка профита будет "0" (отсутствовать).
Код: выделить все
double ZeroLevel()
{
 double BuyLots=0;
 double SellLots=0;
 double BuyProfit=0;
 double SellProfit=0;
 int Total=OrdersTotal();
 for (int i=Total-1;i>=0;i--)
 {
  if (OrderSelect(i,SELECT_BY_POS))
  {
   if (OrderSymbol()!=Symbol()) continue;
   if (OrderType()==OP_BUY)
   {
    BuyLots=BuyLots+OrderLots();
    BuyProfit=BuyProfit+OrderProfit()+OrderCommission()+OrderSwap();
   }
   if (OrderType()==OP_SELL)
   {
    SellLots=SellLots+OrderLots();
    SellProfit=SellProfit+OrderProfit()+OrderCommission()+OrderSwap();
   }
  }
 }
 double Price=0;
 double TickValue=MarketInfo(Symbol(),MODE_TICKVALUE)/(MarketInfo(Symbol(),MODE_TICKSIZE)/Point);
 if ((BuyLots-SellLots)>0) Price=NormalizeDouble(Bid-((BuyProfit+SellProfit)/(TickValue*(BuyLots-SellLots))*Point),Digits);
 if ((SellLots-BuyLots)>0) Price=NormalizeDouble(Ask+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);
 return (Price);
}


Вот сдесь Вы писали
Код: выделить все
Price=NormalizeDouble(Ask+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);

А по моему надо
Код: выделить все
Price=NormalizeDouble(Ask-((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);

Вот кусок кода из моего индюка
Код: выделить все
if((so+s)>(bo+b)){
     Dpop2=((ProfitB+ProfitS)-Valjut_pljus);
     pop2=NormalizeDouble(Dpop2/TICKVALUE/(lot_b-lot_s),Digits);
    pop = -pop2;
  Dpop=Dpop2;
      NL = NormalizeDouble(Ask- pop2*Point,Digits);

Когда я поменял за Ask - на +, стал безобразничать...
Не подумайте, что умничаю, я не "волшебник", я только учусь, но при всём к Вам уважении счёл нужным вставить свои "пять копеек", буду признателен за подсказки моих ошибок с Вашей стороны...
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Задачка. Найти точку нулевого профита.

Сообщение piter » 18 мар 2018, 04:07

Haos писал(а):Наверное, нужно пример привести.
1 бай: 102.16 *** 1.5 лот
2 бай: 103.00 *** 0.5 лот
3 селл: 102.77 *** 1.8 лот
Yc = (102.6 * 1.5 + 103.0 * 0.5 + 102.77 * 1.8) / (1.5 + 0.5 + 1.8) = 390.386 / 3.8 = 102.73.
Таким образом уровень безубытка - 102.73 (оранжевая линия на рисунке).


У Вас здесь почти лок! Правильно будет по этой функции
Код: выделить все
NL = NormalizeDouble((price_b-price_s)/(lot_b-lot_s)
т.е. (102.16+103.00-102.77)/(1.5+0.5-1.8)=5128
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Задачка. Найти точку нулевого профита.

Сообщение piter » 18 мар 2018, 04:17

Извиняюсь...
Код: выделить все
NL = NormalizeDouble((price_b-price_s)/(lot_b-lot_s),Digits)
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Задачка. Найти точку нулевого профита.

Сообщение Haos » 18 мар 2018, 07:24

piter, чтобы не превращать тему в бессмысленные разговоры о том что кажется, приобретите опыт использования данного кода в работе советника, тогда и можем поговорить что как и нужны ли улучшения. Поймите главное - надо не ошибки пытаться искать Вам, а учиться сначала на простых примерах программированию, тогда и сложные со временем будут понятны.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Задачка. Найти точку нулевого профита.

Сообщение piter » 18 мар 2018, 10:52

Haos писал(а):piter, чтобы не превращать тему в бессмысленные разговоры о том что кажется, приобретите опыт использования данного кода в работе советника, тогда и можем поговорить что как и нужны ли улучшения. Поймите главное - надо не ошибки пытаться искать Вам, а учиться сначала на простых примерах программированию, тогда и сложные со временем будут понятны.

А мои примеры и доводы разве не подтверждают факты ошибочного подхода к вычислениям, кстати при общении мы как раз и постигаем все премудрости программирования..., так сказать,- от простого к сложному....
Последний раз редактировалось Haos 18 мар 2018, 14:03, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Задачка. Найти точку нулевого профита.

Сообщение Kalkin » 18 мар 2018, 12:00

piter писал(а):Вот сдесь Вы писали
Код: выделить все
Price=NormalizeDouble(Ask+((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);

А по моему надо
Код: выделить все
Price=NormalizeDouble(Ask-((BuyProfit+SellProfit)/(TickValue*(SellLots-BuyLots))*Point),Digits);



Почему Вы так думаете? Если нашли ошибку, прошу обосновать. Лично я не вижу причин ставить "минус" там, где должен быть "плюс" :-):
Последний раз редактировалось Haos 18 мар 2018, 14:04, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Задачка. Найти точку нулевого профита.

Сообщение Haos » 18 мар 2018, 14:02

Коллеги, просьба ко всем: чтобы не превращать темы в бессмысленный флуд типа: "здесь у вас скорее всего не так", "с чего это не так? " и т.п. просьба того, кто высказывает претензии:
1. не провоцировать других на ответы в свою "защиту".
2. доказательно и аргументированно приводить претензии, вроде того как "по формуле провели расчет получили то-то и то-то, а у вас то-то и то-то".
Если нет формулы по которой можно провести аргументированный факт неправильного вычисления, то на чем может быть основаны сомнения? Так бесконечно можно по любой строчке любого коды начать писать всякую чушь типа, это не то, а это не это. Надеяться, что посты будут засчитаны такие не стоит, более того, при продолжении флуда будут выдаваться предупреждения. Коротко говоря, только доказательные аргументы принимаются!
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения