Скачать MetaTrader 5

Автоматическое исправление Take Profit открытых ордеров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
TanFX
15
TanFX 2015.12.10 17:42 

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

Oksana Berenko
2627
Oksana Berenko 2015.12.10 18:10  
//+------------------------------------------------------------------+
// 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());
          }
        }
      } 
    }
  }  
}
//+------------------------------------------------------------------+
Boris
3896
Boris 2015.12.10 18:59  
TanFX:

 

Простите лузера не понимаю)))

Вот обычный советник в него я добавил формулу расчета takeprofit (ТР=В). При следующем пересчете В=другому значению вот его нужно изменить в открытых уже позициях. Советник вроде работает, проверяю эту формулу, а вот изменить значения ТР не знаю как. 

 Для вставки кода служит кнопка SRC!

 А для правки кода лучше обратиться ныне ещё живущему автору, всегда готовый Вам услужить! Координаты в шапке кода!

double B = (формула расчета); // Советник не догадается, как никто не догадается, чему равно В!

 Заодно, оцените, как лучше с SRC!

TanFX
15
TanFX 2015.12.10 19:53  
Boris:

 Для вставки кода служит кнопка SRC!

 А для правки кода лучше обратиться ныне ещё живущему автору, всегда готовый Вам услужить! Координаты в шапке кода!

 Заодно, оцените, как лучше с SRC!

SRC! Для меня это темный лес как и все остальное. Вот и прошу помочь с советником!
Boris
3896
Boris 2015.12.10 20:14  
TanFX:
SRC! Для меня это темный лес как и все остальное. Вот и прошу помочь с советником!
SRC, это кнопка, когда постите, потрудитесь поднять глаза чуть выше и слева от видео увидете! А с советником лучше обратиться к уважаемому Автору!
TanFX
15
TanFX 2015.12.10 20:39  

Простите лузера не понимаю)))

Вот обычный советник в него я добавил формулу расчета 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);
}
//--------------------------------------------------------------------
Oksana Berenko
2627
Oksana Berenko 2015.12.11 00:33  

TanFX:

...При следующем пересчете В=другому значению вот его нужно изменить в открытых уже позициях....

Я же вам выше написала функцию (вторая функция в моем комментарии выше). Когда пересчитаете TP, отправьте туда: Modify_SL_TP (OP_BUY, TP) или Modify_SL_TP (OP_SELL, TP) - в зависимости от того, sell или buy позиции у вас.

А если совсем: "Простите лузера не понимаю" - то вам на фриланс

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий