//+------------------------------------------------------------------+ // ot - OrderType() который изменяется, sl - price Stop Loss, tp - price Take Profit void Modify_SL_TP (int ot, double sl, double tp) { if (ot<0 || ot>5) return; int i, k=OrdersTotal(); for (i=k-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(ot==OrderType()){ if(OrderStopLoss()!=sl || OrderTakeProfit()!=tp) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) Print("Не удалось изменить ордер ", OrderTicket()); } } } } } } //+------------------------------------------------------------------+
как то так
Если только take profit:
//+------------------------------------------------------------------+ // ot - OrderType() который изменяется, tp - price Take Profit void Modify_SL_TP (int ot, double tp) { if (ot<0 || ot>5) return; int i, k=OrdersTotal(); for (i=k-1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { if(ot==OrderType()){ if(OrderTakeProfit()!=tp) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), tp, 0)) Print("Не удалось изменить ордер ", OrderTicket()); } } } } } } //+------------------------------------------------------------------+
Простите лузера не понимаю)))
Вот обычный советник в него я добавил формулу расчета takeprofit (ТР=В). При следующем пересчете В=другому значению вот его нужно изменить в открытых уже позициях. Советник вроде работает, проверяю эту формулу, а вот изменить значения ТР не знаю как.
Для вставки кода служит кнопка SRC!
А для правки кода лучше обратиться ныне ещё живущему автору, всегда готовый Вам услужить! Координаты в шапке кода!
double B = (формула расчета); // Советник не догадается, как никто не догадается, чему равно В!
Заодно, оцените, как лучше с SRC!
Для вставки кода служит кнопка SRC!
А для правки кода лучше обратиться ныне ещё живущему автору, всегда готовый Вам услужить! Координаты в шапке кода!
Заодно, оцените, как лучше с SRC!
SRC! Для меня это темный лес как и все остальное. Вот и прошу помочь с советником!
Простите лузера не понимаю)))
Вот обычный советник в него я добавил формулу расчета takeprofit (ТР=В). При следующем пересчете В=другому значению вот его нужно изменить в открытых уже позициях. Советник вроде работает, проверяю эту формулу, а вот изменить значения ТР не знаю как.
//+------------------------------------------------------------------+ //| EMA WMA.mq4 | //| Copyright © 2009, Vladimir Hlystov | //| cmillion@narod.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Vladimir Hlystov" #property link "cmillion@narod.ru" //-------------------------------------------------------------------- extern int period_EMA = 28, period_WMA = 8 , risk = 10; double LOT; //-------------------------------------------------------------------- double SL,TP; int TimeBar; //global variable //-------------------------------------------------------------------- int start() { if (TimeBar==Time[0]) return(0); if (TimeBar==0) {TimeBar=Time[0];return(0);}//first program run double EMA0 = iMA(NULL,0,period_EMA,0,MODE_EMA, PRICE_OPEN,0); double WMA0 = iMA(NULL,0,period_WMA,0,MODE_LWMA,PRICE_OPEN,0); double EMA1 = iMA(NULL,0,period_EMA,0,MODE_EMA, PRICE_OPEN,1); double WMA1 = iMA(NULL,0,period_WMA,0,MODE_LWMA,PRICE_OPEN,1); double B = (формула расчета); if (EMA0<WMA0&&EMA1>WMA1) //Buy { TimeBar=Time[0]; TP = B; SL = 0; LOT = LOT(risk,1); CLOSEORDER("Sell"); OPENORDER ("Buy"); } if (EMA0>WMA0&&EMA1<WMA1) //Sell { TimeBar=Time[0]; TP = B; SL = 0; LOT = LOT(risk,1); CLOSEORDER("Buy"); OPENORDER ("Sell"); } return(0); } //-------------------------------------------------------------------- void CLOSEORDER(string ord) { for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_BUY && ord=="Buy") OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);// Close Buy if (OrderType()==OP_SELL && ord=="Sell") OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);// Close Sell } } } //-------------------------------------------------------------------- void OPENORDER(string ord) { int error; if (ord=="Buy" ) error=OrderSend(Symbol(),OP_BUY, LOT,Ask,2,SL,TP,"", 1,3); if (ord=="Sell") error=OrderSend(Symbol(),OP_SELL,LOT,Bid,2,SL,TP,"",-1,3); if (error==-1) //operation failed { ShowERROR(error,0,0); } return; } //-------------------------------------------------------------------- void ShowERROR(int Ticket,double SL,double TP) { int err=GetLastError(); switch ( err ) { case 1: return; case 2: Alert("Error Connection with trade server absent ",Ticket," ",Symbol());return; case 3: Alert("Error Invalid trade parameters Ticket ", Ticket," ",Symbol());return; case 130: Alert("Error Invalid stops Ticket ", Ticket," ",Symbol());return; case 134: Alert("Error Not enough money ", Ticket," ",Symbol());return; case 146: Alert("Error Trade context is busy. ", Ticket," ",Symbol());return; case 129: Alert("Error Invalid price ", Ticket," ",Symbol());return; case 131: Alert("Error Invalid volume ", Ticket," ",Symbol());return; case 4051:Alert("Error Invalid function parameter value ", Ticket," ",Symbol());return; case 4105:Alert("Error No order selected ", Ticket," ",Symbol());return; case 4063:Alert("Error Integer parameter expected ", Ticket," ",Symbol());return; case 4200:Alert("Error Объект уже существует ", Ticket," ",Symbol());return; default: Alert("Error Object already exists " ,err," Ticket ", Ticket," ",Symbol());return; } } //-------------------------------------------------------------------- double LOT(int risk,int ord) { double MINLOT = MarketInfo(Symbol(),MODE_MINLOT); LOT = AccountFreeMargin()*risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/ord; if (LOT>MarketInfo(Symbol(),MODE_MAXLOT)) LOT = MarketInfo(Symbol(),MODE_MAXLOT); if (LOT<MINLOT) LOT = MINLOT; if (MINLOT<0.1) LOT = NormalizeDouble(LOT,2); else LOT = NormalizeDouble(LOT,1); return(LOT); } //--------------------------------------------------------------------
TanFX:
...При следующем пересчете В=другому значению вот его нужно изменить в открытых уже позициях....
Я же вам выше написала функцию (вторая функция в моем комментарии выше). Когда пересчитаете TP, отправьте туда: Modify_SL_TP (OP_BUY, TP) или Modify_SL_TP (OP_SELL, TP) - в зависимости от того, sell или buy позиции у вас.
А если совсем: "Простите лузера не понимаю" - то вам на фриланс

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Подскажите пожалуйста, что нужно вставить (какой набор команд) в советник чтобы при пересчете он автоматически исправлял уже установленные тейкпрофиты в открытых позициях. Т.Е. советник считает стопы и открывает ордер SELL или BUY. При последующем расчете стопы меняют свои значения. Вот эти значения необходимо обновить в открытых уже ордерах!