Расчёт ТП от профита

 

Не понимаю почему есть погрешность в расчёте ТП от нужной суммы
баланс =10usd, лот =0.01
я пытаюсь установить ТП чтобы получить 100% баланса и в итоге общий ТП должен быть с прибылью 10usd
1-ая позиция правильно рассчитывается, а если позиций больше то и размер ТП увеличивается

расчёт такой:

// Кол-во пунктов для единого ТП от профита
   double TV=MarketInfo(Symbol(),MODE_TICKVALUE);   
   int tpB=0,tpS=0;
   if (Lots(0)>0) tpB=int(AccountBalance()/(TV*Lots(0)));
   if (Lots(1)>0) tpS=int(AccountBalance()/(TV*Lots(1)));

//+------------------------------------------------------------------+
//| Лоты по типу                                                     |
//+------------------------------------------------------------------+
double Lots(int type=-1){
   double lt=0.0;
   for(i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()) {
   if(OrderType()==type || (OrderType()>=0 && type==-1)) lt+=OrderLots();}
return(lt);}
Файлы:
561.png  3 kb
mn2.png  3 kb
8x3.png  3 kb
 
forex2030:

Не понимаю почему есть погрешность в расчёте ТП от нужной суммы
баланс =10usd, лот =0.01
я пытаюсь установить ТП чтобы получить 100% баланса и в итоге общий ТП должен быть с прибылью 10usd
1-ая позиция правильно рассчитывается, а если позиций больше то и размер ТП увеличивается

расчёт такой:

Вообще у вас верно расчёт, вопрос куда вы этот ТП потом ставите?) Ну в смысле ваш расчёт показывает сколько пунктов должна пройти совокупная позиция чтобы получить прибыль в размере баланса.

Как вы потом распределяете ТП между ордерами? или как работаете с совокупной позицией?, надо же средневзвешенную цену входа получать.

А если верно понял вашу задачу, вам надо от обратного считать, так проще. Вместо баланса ставьте эквити, и полученный ТП прибавляйте к самому верхнему (нижнему для продаж) ордеру, или к текущей цене в момент расчета ТП, поняли?

 
Aleksey Mavrin:

Вообще у вас верно расчёт, вопрос куда вы этот ТП потом ставите?) Ну в смысле ваш расчёт показывает сколько пунктов должна пройти совокупная позиция чтобы получить прибыль в размере баланса.

Как вы потом распределяете ТП между ордерами? или как работаете с совокупной позицией?, надо же средневзвешенную цену входа получать.

// Установить ТП
   double TPb=0.0,TPs=0.0;
   if(tpB>0 && OP(0)>0) TPb=ND(PrcOp(0)+tpB*Point,Digits);
   if(tpS>0 && OP(1)>0) TPs=ND(PrcOp(1)-tpS*Point,Digits);

   Stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(TPb>0 && OP(0)>0 && TPb>=ND(Ask+Stoplevel*Point,Digits)){ 
   for(i=OrdersTotal()-1; i>=0; i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol()){ 
   if(OrderType()==0 && TPb!=OrderTakeProfit() && 
     !OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TPb,0,Blue)) Print(GetLastError());}
     }
   if(TPs>0 && OP(1)>0 && TPs<=ND(Bid-Stoplevel*Point,Digits)){ 
   for(i=OrdersTotal()-1; i>=0; i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol()){
   if(OrderType()==1 && TPs!=OrderTakeProfit() && 
     !OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TPs,0,Red)) Print(GetLastError());}
     }
//==================================================================================================|
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int OP(int type=-1){
   int count=0;
   for(i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()) {
   if(OrderType()==type || (OrderType()>=0 && type==-1)) count++;}
return(count);}
//+------------------------------------------------------------------+
//| Цена ордеров по типу                                             |
//+------------------------------------------------------------------+
double PrcOp(int type=-1){
   datetime t=0;
   double pr=0.0;
   for(i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()) {
   if((OrderType()==type || (OrderType()>=0 && type==-1)) && t<OrderOpenTime()) {t=OrderOpenTime();pr=OrderOpenPrice();}}
return(pr);}
Aleksey Mavrin:

А если верно понял вашу задачу, вам надо от обратного считать, так проще. Вместо баланса ставьте эквити, и полученный ТП прибавляйте к самому верхнему (нижнему для продаж) ордеру, или к текущей цене в момент расчета ТП, поняли?

Эквити меняется и ТП модифицируется в итоге, ну и расчёт всё-рано не тот
Для бай

   double TV=MarketInfo(Symbol(),MODE_TICKVALUE);   
   int tpB=0,tpB1=0,tpB2=0;
   if (Lots(0)>0 && OP(0)==1) tpB1=int(AccountBalance()/(TV*Lots(0)));
   if (Lots(0)>0 && OP(0)>1) tpB2=int(AccountEquity()/(TV*Lots(0)));

       tpB = tpB1 + tpB2;
 
forex2030:

Эквити меняется и ТП модифицируется в итоге, ну и расчёт всё-рано не тот
Для бай

последний код - неверный, от этого и результат, вы почему то сначала малый кусок кода выложили от того в котором могла быть ошибка)

а ваше утверждение тоже неверно - в момент расчета и установки ТП, нужная вам цифра зависит от текущего эквити, если вам нужно чтоб прибыль зависела именно от  первоначального баланса, тогда используйте разницу (желаемая прибыль -(эквити - баланс)),  раз у вас желаемая прибыль=баланс, то (2*баланс-эквити), и прибавляйте его к цене в момент расчета

 
Aleksey Mavrin:

желаемая прибыль=баланс, то (2*баланс-эквити), и прибавляйте его к цене в момент расчета

Уже ближе, но всё равно увеличивает (скрин)

Для бай:

bool NewOp=true;

void start()
{ 
   double TV=MarketInfo(Symbol(),MODE_TICKVALUE);   
   int tpB=0;
   if (OP(0)==1) tpB=int(AccountBalance()/(TV*Lots(0)));
   if (OP(0)>1 && NewOp) {tpB=int((2*AccountBalance()-AccountEquity())/(TV*Lots(0))); NewOp=false;}
   if (tOp(0)>=TimeCurrent()-1 && !NewOp) NewOp=true;
}
//+------------------------------------------------------------------+ 
//| Время открытия новой позиции                                     | 
//+------------------------------------------------------------------+ 
datetime tOp(int type=-1){
   datetime t=0;
   for(i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol()) {   
   if(t<OrderOpenTime() && (OrderType()==type || (OrderType()>=0 && type==-1))) t=OrderOpenTime();}
return(t);}
Файлы:
d24.png  6 kb
 
forex2030:

Уже ближе, но всё равно увеличивает (скрин)

Для бай:

Что-то вообще не понял. Код вы писали? Там элементарные ляпы, найти сами не можете? Пытались?) подсказка - ответьте на вопросы 1.что возвращает  PrcOp? 2. Что такое TPb и TPs ?

 
Aleksey Mavrin:

Что-то вообще не понял. Код вы писали? Там элементарные ляпы, найти сами не можете? Пытались?) подсказка - ответьте на вопросы 1.что возвращает  PrcOp? 2. Что такое TPb и TPs ?

Код я писал
Какие там ляпы, может вы недопонимаете исход?

Все вызываемые функции я привожу в примере

1. PrcOp это цена открытия последнего ордера (Price Open)
2. TPb и TPs это полученный Тейк Профит для ордеров бай и селл

 
forex2030:

Код я писал
Какие там ляпы, может вы недопонимаете исход?

Все вызываемые функции я привожу в примере

1. PrcOp это цена открытия последнего ордера (Price Open)
2. TPb и TPs это полученный Тейк Профит для ордеров бай и селл

Может  и я не понимаю, вы же кусками его выложили а не целиком.

в какой момент вы OrderModify то применяете? я же намекал что и как.

а вообще прежде чем на форуме спросить пробовали отладчиком и/или логами отследить что где не так?

 
Aleksey Mavrin:

а вообще прежде чем на форуме спросить пробовали отладчиком и/или логами отследить что где не так?

Ошибок то нет, что-то добавить надо при расчёте если открываются новые ордера, т.к. (ТП) почему-то увеличивается при каждом новом ордере.

 
forex2030:

Ошибок то нет, что-то добавить надо при расчёте если открываются новые ордера, т.к. (ТП) почему-то увеличивается при каждом новом ордере.

Если ошибок нет- значит всё работает - радуйтесь и пользуйтесь!)))

 
Aleksey Mavrin:

Если ошибок нет- значит всё работает - радуйтесь и пользуйтесь!)))

Я пользуюсь и радуюсь, но сам факт интересен, почему увеличивает ТП хотя по расчётам всё верно

допустим по золоту:

10 баксов (0.01лот) = 1000пп, тут верно 10 итог
10 баксов (0.02лот) = 500пп, но тут почему то 10.7 итог
10 баксов (0.03лот) = 300пп, но тут почему то 11.8 итог

Причина обращения: