Не понимаю почему есть погрешность в расчёте ТП от нужной суммы
баланс =10usd, лот =0.01
я пытаюсь установить
ТП чтобы получить 100% баланса и в итоге общий ТП должен быть с прибылью 10usd
1-ая позиция правильно рассчитывается, а если позиций больше то и размер ТП увеличивается
расчёт такой:
Вообще у вас верно расчёт, вопрос куда вы этот ТП потом ставите?) Ну в смысле ваш расчёт показывает сколько пунктов должна пройти совокупная позиция чтобы получить прибыль в размере баланса.
Как вы потом распределяете ТП между ордерами? или как работаете с совокупной позицией?, надо же средневзвешенную цену входа получать.
А если верно понял вашу задачу, вам надо от обратного считать, так проще. Вместо баланса ставьте эквити, и полученный ТП прибавляйте к самому верхнему (нижнему для продаж) ордеру, или к текущей цене в момент расчета ТП, поняли?
Вообще у вас верно расчёт, вопрос куда вы этот ТП потом ставите?) Ну в смысле ваш расчёт показывает сколько пунктов должна пройти совокупная позиция чтобы получить прибыль в размере баланса.
Как вы потом распределяете ТП между ордерами? или как работаете с совокупной позицией?, надо же средневзвешенную цену входа получать.
// Установить ТП 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);}
А если верно понял вашу задачу, вам надо от обратного считать, так проще. Вместо баланса ставьте эквити, и полученный ТП прибавляйте к самому верхнему (нижнему для продаж) ордеру, или к текущей цене в момент расчета ТП, поняли?
Эквити меняется и ТП модифицируется в итоге, ну и расчёт всё-рано не тот
Для бай
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;
Эквити меняется и ТП модифицируется в итоге, ну и расчёт
всё-рано не тот
Для бай
последний код - неверный, от этого и результат, вы почему то сначала малый кусок кода выложили от того в котором могла быть ошибка)
а ваше утверждение тоже неверно - в момент расчета и установки ТП, нужная вам цифра зависит от текущего эквити, если вам нужно чтоб прибыль зависела именно от первоначального баланса, тогда используйте разницу (желаемая прибыль -(эквити - баланс)), раз у вас желаемая прибыль=баланс, то (2*баланс-эквити), и прибавляйте его к цене в момент расчета
желаемая прибыль=баланс, то (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);}
Уже ближе, но всё равно увеличивает (скрин)
Для бай:
Что-то вообще не понял. Код вы писали? Там элементарные ляпы, найти сами не можете? Пытались?) подсказка - ответьте на вопросы 1.что возвращает PrcOp? 2. Что такое TPb и TPs ?
Что-то вообще не понял. Код вы писали? Там элементарные ляпы, найти сами не можете? Пытались?) подсказка - ответьте на вопросы 1.что возвращает PrcOp? 2. Что такое TPb и TPs ?
Код я писал
Какие там ляпы, может вы недопонимаете исход?
Все вызываемые функции я привожу в примере
1. PrcOp это цена
открытия последнего ордера (Price Open)
2. TPb
и TPs это полученный Тейк Профит для ордеров бай и селл
Код я писал
Какие там ляпы, может вы недопонимаете исход?
Все вызываемые функции я привожу в примере
1. PrcOp
это
цена
открытия последнего ордера (Price Open)
2. TPb
и TPs это полученный Тейк Профит для ордеров бай и селл
Может и я не понимаю, вы же кусками его выложили а не целиком.
в какой момент вы OrderModify то применяете? я же намекал что и как.
а вообще прежде чем на форуме спросить пробовали отладчиком и/или логами отследить что где не так?
а вообще прежде чем на форуме спросить пробовали отладчиком и/или логами отследить что где не так?
Ошибок то нет, что-то добавить надо при расчёте если открываются новые ордера, т.к. (ТП) почему-то увеличивается при каждом новом ордере.
Ошибок то нет, что-то добавить надо при расчёте если открываются новые ордера, т.к. (ТП) почему-то увеличивается при каждом новом ордере.
Если ошибок нет- значит всё работает - радуйтесь и пользуйтесь!)))
Если ошибок нет- значит всё работает - радуйтесь и пользуйтесь!)))
Я пользуюсь и радуюсь, но сам факт интересен, почему увеличивает ТП хотя по расчётам всё верно
допустим по золоту:
10 баксов (0.01лот) = 1000пп, тут верно 10 итог
10 баксов (0.02лот) = 500пп, но тут почему то 10.7 итог
10 баксов (0.03лот) = 300пп, но тут почему то 11.8 итог

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