Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем.
Подскажите пожалуйста формулу, по которой можно рассчитать цену на которой нужно установить TakeProfit чтоб замок закрылся в безубыток.
См. Перевод в безубыток. - эксперт для MetaTrader 4
Правда он предназначен для перевода стоплосса в безубыток, но это уже мелочи.
См. Перевод в безубыток. - эксперт для MetaTrader 4
Правда он предназначен для перевода стоплосса в безубыток, но это уже мелочи.
Там вроде бы для каждого ордера отдельный безубыток выставляется. Человек спросил про формулу расчета общего безубыточного уровня для всех открытых ордеров, при этом часть закроется в минусе, часть в плюсе, но итог в БУ.
Тема то не плохая....
if(buy_lots>0.0) if(sell_lots>=0.0) if(buy_lots>sell_lots) if(SymbolInfoTick(_Symbol,last_tick)==true) { double def_lots=NDVD(buy_lots-sell_lots); double tick_value=MarketInfo(_Symbol,MODE_TICKVALUE); average_price=NDD(last_tick.bid-((profit_buy+profit_sell)/(tick_value*def_lots))*_Point); }
if(buy_lots>=0.0) if(sell_lots>0.0) if(buy_lots<sell_lots) if(SymbolInfoTick(_Symbol,last_tick)==true) { double def_lots=NDVD(sell_lots-buy_lots); double tick_value=MarketInfo(_Symbol,MODE_TICKVALUE); average_price=NDD(last_tick.ask+((profit_buy+profit_sell)/(tick_value*def_lots))*_Point); }
Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем.
Подскажите пожалуйста формулу, по которой можно рассчитать цену на которой нужно установить TakeProfit чтоб замок закрылся в безубыток.
//=============================================================================================== //--------------------- Возвращает уровень безубытка открытых позиций --------------------------+ //=============================================================================================== double BreakEvenOpenPos(string symb="0", int type=-1, int mg=-1) { int digit=0; double BLt=0,SLt=0,PrB=0,PrS=0,ResBr=0,TickValue=0,p=0,ask=0,bid=0; if(symb=="0") { symb=Symbol(); } BLt=AmountLotFromOpenPos(symb,OP_BUY,mg); PrB=ProfitOpenPosInCurrency(symb,OP_BUY,mg); SLt=AmountLotFromOpenPos(symb,OP_SELL,mg); PrS=ProfitOpenPosInCurrency(symb,OP_SELL,mg); p=MarketInfo(symb, MODE_POINT); ask=MarketInfo(symb, MODE_ASK); bid=MarketInfo(symb, MODE_BID); digit=(int)MarketInfo(symb, MODE_DIGITS); TickValue=MarketInfo(symb,MODE_TICKVALUE); // Расчеты if(BLt>0 && type==OP_BUY) { ResBr=NormalizeDouble(bid-(PrB/(TickValue*BLt))*p,digit); return(ResBr); } if(SLt>0 && type==OP_SELL) { ResBr=NormalizeDouble(ask+(PrS/(TickValue*SLt))*p,digit); return(ResBr); } if(BLt-SLt!=0 && type==-1) { ResBr=NormalizeDouble(bid-((PrB+PrS)/(TickValue*(BLt-SLt))*p),digit); return(ResBr); } return(0); } //=============================================================================================== //------------------------ Возвращает сумму лотов открытых позиций -----------------------------+ //=============================================================================================== double AmountLotFromOpenPos(string symb="0", int type=-1, int mg=-1) { double l=0; if(symb=="0") { symb=Symbol();} for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { l+=OrderLots(); }}}} return(l); } //=============================================================================================== //------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+ //=============================================================================================== double ProfitOpenPosInCurrency(string symb="0", int type=-1, int mg=-1) { double p=0; if(symb=="0") { symb=Symbol();} for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { if((OrderSymbol()==symb||symb=="")&&(type<0||OrderType()==type)&&(mg<0||OrderMagicNumber()==mg)) { p+=OrderProfit()+OrderSwap()+OrderCommission(); }}}} return(p); }
Применение
void OnTick() { // "Magic" = -1(все), или с конкретным double BuBuy = BreakEvenOpenPos(_Symbol,OP_BUY,-1); // Безубыток BUY double BuSell = BreakEvenOpenPos(_Symbol,OP_SELL,-1); // Безубыток SELL double BuBS = BreakEvenOpenPos(_Symbol,-1,-1); // Безубыток Общий Comment(BuBuy," | ",BuSell," | ",BuBS); }
Набор функций
Применение
Никогда не понимал программистов которые вместо слов понятных или хотябы сокращённых пишут по 1-ой 2-е буквы.
Код писал не для общего обозрения, это первое, второе - чем меньше слов и букавок, тем меньше размер файла, а когда в коде за 4000 строк, то это значительно увеличивает размер.
Название переменных внутри функции можно и одной буквой писать, к ней обращаться не нужно, но название самой функции должно быть понятным - у меня так и есть.
Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем.
Подскажите пожалуйста формулу, по которой можно рассчитать цену на которой нужно установить TakeProfit чтоб замок закрылся в безубыток.
Посмотрите скрипт "Хирурга", работает отлично, на кроссах только небольшая погрешность, но то кроссы.
https://c.mql5.com/mql4/forum/2007/06/zero_level_1.mq4
//+------------------------------------------------------------------+ //| Zero_Level.mq4 | //| Copyright © 2007, Xupypr | //+------------------------------------------------------------------+ // Скрипт вычисляющий уровни без убытка, на покупку, на продажу с учетом накопленных свопов. #property copyright "Copyright © 2007, Xupypr" #include <WinUser32.mqh> void start() { 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); if (BuyLots>0) double BuyLevel=NormalizeDouble(Bid-(BuyProfit/(TickValue*BuyLots)*Point),Digits); else BuyLevel=0; if (SellLots>0) double SellLevel=NormalizeDouble(Ask+(SellProfit/(TickValue*SellLots)*Point),Digits); else SellLevel=0; 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); string Title="Уровень без убытка для "+Symbol(); string ZeroLevel=" не существует"; if (Price>0) ZeroLevel=" = "+DoubleToStr(Price,Digits); string Buy=" не существует"; if (BuyLevel>0) Buy=" = "+DoubleToStr(BuyLevel,Digits); string Sell=" не существует"; if (SellLevel>0) Sell=" = "+DoubleToStr(SellLevel,Digits); string Message="Уровень без убытка"+ZeroLevel+"\t\nУровень на покупку"+Buy+"\t\nУровень на продажу"+Sell; MessageBox(Message,Title,MB_OK|MB_ICONINFORMATION); }
//_types поддержка! double GOrders::get_Average(int itype,int &idirect) { double dprice[2]={0,0}, m_lots[2]={0,0}, icount[2]={0,0}; idirect=0; double dask=MarketInfo(sname,MODE_ASK); double dbid=MarketInfo(sname,MODE_BID); int flag; for(int i=OrdersTotal()-1;i>=0;i--) { if(!OrderSelect(i,SELECT_BY_POS)) continue; if((OrderSymbol()==sname || sname==NULL) && (OrderMagicNumber()==imagic || imagic==-1)) { flag=toMyTypes(OrderType())&itype; if(OrderType()==OP_BUY && toDefType(flag,itype)==OP_BUY) { m_lots[0]+=OrderLots(); dprice[0]+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2); icount[0]++; } if(OrderType()==OP_SELL && toDefType(flag,itype)==OP_SELL) { m_lots[1]+=OrderLots(); dprice[1]+=NormalizeDouble(OrderProfit()+OrderCommission()+OrderSwap(),2); icount[1]++; } } } if(NormalizeDouble(m_lots[0],2)-NormalizeDouble(m_lots[1],2)==0.0) return (0); if(NormalizeDouble(m_lots[0],2)>NormalizeDouble(m_lots[1],2)) idirect=1; if(NormalizeDouble(m_lots[0],2)<NormalizeDouble(m_lots[1],2)) idirect=-1; double PriceLevel=0; double TickValue=NormalizeDouble(MarketInfo(sname,MODE_TICKVALUE),2); if(TickValue==0.0) return 0; double point=MarketInfo(sname,MODE_POINT); if(point==0.0) return 0; int idigits=(int)MarketInfo(sname,MODE_DIGITS); if(MarketInfo(sname,MODE_DIGITS)==5 || MarketInfo(sname,MODE_DIGITS)==3 || MarketInfo(sname,MODE_PROFITCALCMODE)==1) idigits=(int)(MarketInfo(sname,MODE_DIGITS)-1); if((m_lots[0]-m_lots[1])>0) PriceLevel=dbid-((dprice[0]+dprice[1])/(TickValue*(m_lots[0]-m_lots[1]))*point); if((m_lots[1]-m_lots[0])>0) PriceLevel=dask+((dprice[0]+dprice[1])/(TickValue*(m_lots[1]-m_lots[0]))*point); return (NormalizeDouble(PriceLevel,idigits)); }
пользуйтесь, функция универсальная.
toDefType можете заменить на явную проверку какой тип ордера анализируется. или можете убрать если надо сделать общий безубыток
idirect возвращает в какую сторону перевес и куда откладывать потом тр и сл.
функцию использую давно никогда не подводила. учитывает и свопы и комиссии и т.п
Офигеть! Такие портянки выложили и ни у кого нет правильно когда. За то вы все из себя тут такие.
Бурные аплодисменты.
ps. Самый прикол в том, что никто в это даже не поверит. Да?
ps2. А я опять такой злодей, критикую. Да?
Офигеть! Такие портянки выложили и ни у кого нет правильно когда. За то вы все из себя тут такие.
Бурные аплодисменты.
ps. Самый прикол в том, что никто в это даже не поверит. Да?
ps2. А я опять такой злодей, критикую. Да?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Допустим на графике есть несколько сделок открытых в разную сторону. Например, две в бай, одна в сел. У всех сделок разный объем.
Подскажите пожалуйста формулу, по которой можно рассчитать цену на которой нужно установить TakeProfit чтоб замок закрылся в безубыток.