Вопрос к специалистам

 

Помогите пожалуйста. Скомпоновал простой советник с использованием трейлинг-стопом.

Как сделать так, чтобы трейлинг стоп ставился один раз +5 пунктов и далее не переносился, закрытие происходило

заложенным индикаторам? Если можно на примере!!!

extern double Lots = 0.1;
extern double TrailingStop = 25;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
 
extern double Lots = 0.1;
extern double TrailingStop = 25;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;

   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 

   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop && Bid-OrderOpenPrice() <= 5*Point)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop) && (OrderOpenPrice()-Ask) <= 5*Point)
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
Вроде бы так...
 

Ничего не выходит! Непроисходит ни какой модификации ордеров!

Цель модификации ордера: создать минимальный плюс по пунктам, но при этом далее модификация не должна происходить. Закрытие должно происходить по индикатору. Но если цена достигла +5 пунктов, а потом вернулась, то на этих 5 пунктах позиция и должна закрыться!

Получается, что 1) не должно быть трелинг стопа (т. к. это подразумевает дальнейшее движение ордара),2) модификация должна состоять из спреда (у всех пар разного, а поэтому его можно вынести в начальные настройки) и еще 5 пунктов. модификация произошла и далее ордер остается на этой цене пока не закроется по индикатору, либо цена не вернется обратно.

 
Kostay:

Ничего не выходит! Непроисходит ни какой модификации ордеров!

Цель модификации ордера: создать минимальный плюс по пунктам, но при этом далее модификация не должна происходить. Закрытие должно происходить по индикатору. Но если цена достигла +5 пунктов, а потом вернулась, то на этих 5 пунктах позиция и должна закрыться!

Получается, что 1) не должно быть трелинг стопа (т. к. это подразумевает дальнейшее движение ордара),2) модификация должна состоять из спреда (у всех пар разного, а поэтому его можно вынести в начальные настройки) и еще 5 пунктов. модификация произошла и далее ордер остается на этой цене пока не закроется по индикатору, либо цена не вернется обратно.

А можно индикаторы использованные в эксперте?

а спрэд можно узнать так (Ask-Bid). или MarketInfo(Symbol(),MODE_SPREAD)

 

попробовал подругому, убрал трейлинг стоп. сделал фиксированным ордер.

результат не очень: не отмечает необходимый уровень модификационного ордера 8 (спред) + 5.

посмотрите как можно задать этот уровень????!!!

ценовой индикатор вот!

extern double Lots = 0.1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
                             
               if(Bid-OrderOpenPrice()>Point*13)
                 {
                  if(OrderStopLoss()<Bid-Point*13)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
                             
               if((OrderOpenPrice()-Ask)>(Point*13))
                 {
                  if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              
           }
        }
     }
   return(0);
  }
Файлы:
 
АДХ пересечение
Файлы:
 

попробовал написать так образом но советник начинает модифицировать ордера до талого, а надо только до определенного уровня. как сделать??????????????? знатоки програмирования, если такие есть помогите!

extern double Lots = 0.1;
extern double TrailingStop = 25;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",10,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",10,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",10,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",10,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
                             
               if(Bid-OrderOpenPrice()>Point*13)
                 {
                  if(OrderStopLoss()<Bid-Point*13)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
                             
               if((OrderOpenPrice()-Ask)>(Point*13))
                 {
                  if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              
           }
        }
     }
   return(0);
  }
 

Такой вариант подойдет?

extern double SetMinProfitLevelPts = 25; 
  //мин.прибыль устанавливается только при достижении данного уровня
extern double MinProfitPts = 5; 
  //мин.прибыль в пунктах, 0 - для безубытка


//вызывать эту функцию в start() для каждого открытого ордера,
//перед вызовом обязательно выбрать нужный ордер с помощью OrderSelect
int CheckNeedSetMinProfit() {  
  if (SetMinProfitLevelPts <= 0) return(-1); //опция не используется
  if (OrderType() > 1) return(-1); //отложенник  
  if (OrderProfit() < SetMinProfitLevelPts) return(0); //уровень установки не достигнут
  double MinProfitPriceD = Point*(MarketInfo(Symbol(), MODE_SPREAD) + MinProfitPts);
  double NewStopPrice = OrderOpenPrice();
  if (OrderType()==OP_BUY) { 
    NewStopPrice += MinProfitPriceD; 
    if (OrderStopLoss() >= NewStopPrice) return(0); //стоп уже выставлен ближе
  } else if (OrderType()==OP_SELL) {
    NewStopPrice -= MinProfitPriceD; 
    if (OrderStopLoss() <= NewStopPrice) return(0); //стоп уже выставлен ближе  
  }
  NewStopPrice = NormalizeDouble(NewStopPrice, Digits);
  bool res = OrderModify(OrderTicket(), OrderOpenPrice(), NewStopPrice, OrderTakeProfit(), 0);
  if (res) {return(0);} else {return(GetLastError());}
}
 
int By(int _By=0)//переводит в безубыток если _By=0, или нужное колво пунктов трала
{
double sl;
int err;
double Diap = _By+(MarketInfo(Symbol(),MODE_STOPLEVEL)+MarketInfo(Symbol(),MODE_SPREAD));
for(int i=0;i<OrdersTotal();i++){
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
   if(OrderSymbol()==Symbol()){
    if(OrderProfit()>=Diap){
     if(OrderType()==OP_BUY){
      sl=NormalizeDouble((OrderOpenPrice()+(_By*Point)),Digits);
       if(OrderStopLoss()!=_By){err=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);}}
     if(OrderType()==OP_SELL){
      sl=NormalizeDouble((OrderOpenPrice()-(_By*Point)),Digits);
       if(OrderStopLoss()!=_By){err=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Green);}}
     }
    }
   }
  }
return(err);
}
 
Ritter:

Такой вариант подойдет?

Не получается вставить. ошибки выдает. програмист очень слабый из меня. в основном занимаюсь компиляцией. покажите как надо вставить.

extern double Lots = 0.1;
extern double SetMinProfitLevelPts = 25; 
  //мин.прибыль устанавливается только при достижении данного уровня
extern double MinProfitPts = 5; 
  //мин.прибыль в пунктах, 0 - для безубытка
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",10,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",10,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",10,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",10,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
//вызывать эту функцию в start() для каждого открытого ордера,
//перед вызовом обязательно выбрать нужный ордер с помощью OrderSelect
int CheckNeedSetMinProfit() {  
  if (SetMinProfitLevelPts <= 0) return(-1); //опция не используется
  if (OrderType() > 1) return(-1); //отложенник  
  if (OrderProfit() < SetMinProfitLevelPts) return(0); //уровень установки не достигнут
  double MinProfitPriceD = Point*(MarketInfo(Symbol(), MODE_SPREAD) + MinProfitPts);
  double NewStopPrice = OrderOpenPrice();
  if (OrderType()==OP_BUY) { 
    NewStopPrice += MinProfitPriceD; 
    if (OrderStopLoss() >= NewStopPrice) return(0); //стоп уже выставлен ближе
  } else if (OrderType()==OP_SELL) {
    NewStopPrice -= MinProfitPriceD; 
    if (OrderStopLoss() <= NewStopPrice) return(0); //стоп уже выставлен ближе  
  }
  NewStopPrice = NormalizeDouble(NewStopPrice, Digits);
  bool res = OrderModify(OrderTicket(), OrderOpenPrice(), NewStopPrice, OrderTakeProfit(), 0);
  if (res) {return(0);} else {return(GetLastError());}
}
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
                             
               if(Bid-OrderOpenPrice()>Point*13)
                 {
                  if(OrderStopLoss()<Bid-Point*13)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
                             
               if((OrderOpenPrice()-Ask)>(Point*13))
                 {
                  if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              
           }
        }
     }
   return(0);
  }
 
Ritter:

Такой вариант подойдет?

Не получается вставить. ошибки выдает. програмист очень слабый из меня. в основном занимаюсь компиляцией. покажите как надо вставить.

extern double Lots = 0.1;
extern double SetMinProfitLevelPts = 25; 
  //мин.прибыль устанавливается только при достижении данного уровня
extern double MinProfitPts = 5; 
  //мин.прибыль в пунктах, 0 - для безубытка
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",10,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",10,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",10,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",10,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
//вызывать эту функцию в start() для каждого открытого ордера,
//перед вызовом обязательно выбрать нужный ордер с помощью OrderSelect
int CheckNeedSetMinProfit() {  
  if (SetMinProfitLevelPts <= 0) return(-1); //опция не используется
  if (OrderType() > 1) return(-1); //отложенник  
  if (OrderProfit() < SetMinProfitLevelPts) return(0); //уровень установки не достигнут
  double MinProfitPriceD = Point*(MarketInfo(Symbol(), MODE_SPREAD) + MinProfitPts);
  double NewStopPrice = OrderOpenPrice();
  if (OrderType()==OP_BUY) { 
    NewStopPrice += MinProfitPriceD; 
    if (OrderStopLoss() >= NewStopPrice) return(0); //стоп уже выставлен ближе
  } else if (OrderType()==OP_SELL) {
    NewStopPrice -= MinProfitPriceD; 
    if (OrderStopLoss() <= NewStopPrice) return(0); //стоп уже выставлен ближе  
  }
  NewStopPrice = NormalizeDouble(NewStopPrice, Digits);
  bool res = OrderModify(OrderTicket(), OrderOpenPrice(), NewStopPrice, OrderTakeProfit(), 0);
  if (res) {return(0);} else {return(GetLastError());}
}
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
                             
               if(Bid-OrderOpenPrice()>Point*13)
                 {
                  if(OrderStopLoss()<Bid-Point*13)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*13,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
                             
               if((OrderOpenPrice()-Ask)>(Point*13))
                 {
                  if((OrderStopLoss()>(Ask+Point*13)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*13,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              
           }
        }
     }
   return(0);
  }