Проблема определения позиции с максимальный убытком.
- Как можно эффективно определить максимальное и минимальное значение цены, начиная с определенного времени?
- Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
- Напишу советник бесплатно
if ((m_position.Profit()-(m_position.Volume()*2))+Profit_B_pos()>0 && (m_position.Profit()-m_position.Volume()*2)<0 && Profit_B_pos()>0 && tick==min_vol_s()) trade.PositionClose(tick);
торговля идет на ECN счётё, поэтому я сразу учитываю комиссию
а что изменится? не совсем понимаю? по мне просто потеряем время
Никакой потери времени. Сейчас у вас по два цикла в каждое направление, на север и на йух. А я вам предлагаю один цикл убрать.
допустим открылась новая позиция и нам нужно будет прогнать еще раз фунцию и обновть переменную, когда можем просто из функции забрать это значение
Даже если открылась ещё одна позиция, то она будет с меньшим убытком чем самая дальняя позиция…
int max_vol_b() { int rez = 0; double rez1=0; for(int j=PositionsTotal()-1; j>=0; j--) { if(m_position.SelectByIndex(j)) { if(m_position.PositionType() == POSITION_TYPE_BUY) if (rez==0 || m_position.PriceOpen()>rez) { rez1=m_position.PriceOpen(); rez=j; } } } return(rez); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int min_vol_s() { int rez = 0; double rez1=0; for(int j=PositionsTotal()-1; j>=0; j--) { if(m_position.SelectByIndex(j)) { if(m_position.PositionType() == POSITION_TYPE_SELL) if (rez==0 || m_position.PriceOpen()<rez) { rez1=m_position.PriceOpen(); rez=j; } } } return(rez); } //+-----------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Profit_S_pos() { double rez3 = 0; for(int j=PositionsTotal()-1; j>=0; j--) if(m_position.SelectByIndex(j)) if (m_position.PositionType()==POSITION_TYPE_SELL) if (m_position.Profit()-(m_position.Volume()*2)>0) { rez3=rez3+m_position.Profit()-(m_position.Volume()*2); } return(NormalizeDouble(rez3,2)); } double Profit_B_pos() { double rez2 = 0; for(int j=PositionsTotal()-1; j>=0; j--) if(m_position.SelectByIndex(j)) if (m_position.PositionType()==POSITION_TYPE_BUY) if (m_position.Profit()-(m_position.Volume()*2)>0) { rez2=rez2+m_position.Profit()-(m_position.Volume()*2); } return(NormalizeDouble(rez2,2)); } //+-----------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ for(int j=PositionsTotal()-1; j>=0; j--) if(m_position.SelectByIndex(j)) if(m_position.PositionType() == POSITION_TYPE_SELL) { ulong tick = m_position.Ticket(); if ((m_position.Profit()-(m_position.Volume()*2))+Profit_B_pos()>0 && (m_position.Profit()-m_position.Volume()*2)<0 && Profit_B()>0 && tick==min_vol_s()) trade.PositionClose(tick); } for(int j=PositionsTotal()-1; j>=0; j--) if(m_position.SelectByIndex(j)) if(m_position.PositionType() == POSITION_TYPE_BUY) { ulong tick = m_position.Ticket(); if ((m_position.Profit()-(m_position.Volume()*2))+Profit_S_pos()>0 && (m_position.Profit()-m_position.Volume()*2)<0 && Profit_S()>0 && tick==max_vol_b()) { trade.PositionClose(tick); }
у меня закрывается позиция с наибольшим убытком по buy, если sell позиции покрывают этот уыток и c наибольшим убытком по sell, если позиции buy покрывают этот убыток, поэтому мне нужно производить закрытие позиций в определенный момент
А по хорошему можно обойтись вообще одним циклом. Просто надо объявить две переменные для хранения тикетов Buy и Sell