Помогитеп не могу никак понять в чем дело и как сделать

 
extern double BuyTral = 2;
extern double SellTral = 0.5;
extern double TakeProfit = 15;
extern double Lots = 1;
extern double TrailingStop = 12;
extern double Stop = 20;
extern double Delta = 5;
extern double DeltaTral_inPerset = 80;
extern double total= 0;
//+----------------------------------------------------------+
 
int start()
  {
   
 
   double Buy, Sell, TakePrFalseBuy, StopLossFalseBuy, 
          TakePrFalseSell, StopLossFalseSell  ;
   double alfa, alfaprev;
   int cnt, ticket, FalsStart;
 
// initial data checks ---------------------------------------+
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<2)
     {
      Print("TakeProfit less than 2");
      return(0);  // check TakeProfit
     }
 
     alfa=iCustom(NULL,0,"alfae",7,350,0,0);    
     alfaprev=  iCustom(NULL,0,"alfafprev",7,350,0,1);
  
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", 
               AccountFreeMargin());
         return(0);  
        }
        
 
 
      if(alfa>alfaprev && Bid<=BuyTral && total==0)
      
        {                                         
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,
                          Ask-Stop*Point,Ask+TakeProfit*Point,
                          "priceEX",16384,0,Green);
        
         if(ticket>0)
           {
            total=1;
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                Print("BUY order opened : ",OrderOpenPrice()); 
                //MODE_TRADES
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
        
       if(alfa>alfaprev && OrdersTotal()==0 && FalsStart==0)
      
        {                                       
         Buy=Ask;
         TakePrFalseBuy=Buy+TakeProfit*Point;
         StopLossFalseBuy=Buy-Stop*Point;
         BuyTral=TakePrFalseBuy-Point*TakeProfit*(DeltaTral_inPerset/100);
         total=1;   
         
                     
         return(0); 
        }
 
 
 
       if(alfa<alfaprev  && Ask>=SellTral && total==0)
        
        {                                         
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,
                          Bid+Stop*Point,Bid-TakeProfit*Point,
                          "priceEX",16384,0,Red);
         
         if(ticket>0)
           {      
            total=1;                            
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                Print("SELL order opened : ",OrderOpenPrice()); 
            //,MODE_TRADES
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
               if(alfa<alfaprev && OrdersTotal()==0 && FalsStart==0 )
                  {                                       
                   
                     Sell=Bid;
                     TakePrFalseSell=Sell-TakeProfit*Point;
                     StopLossFalseSell=Sell+Stop*Point;
                     SellTral=TakePrFalseSell+Point*TakeProfit*
                              (DeltaTral_inPerset/100);
                     total=1;
            
                     return(0); 
                  }
        
      return(0);
     }
 
 
  
  if (Ask >= TakePrFalseBuy)
     { 
     
       
           FalsStart=0;
       
        return(0);  
     }   
  
  if (Bid <= TakePrFalseSell)
     { 
     
     
           FalsStart=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(alfa<alfaprev)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,5,
                            Violet); 
                 total=0;
                 return(0); // exit
                }
                
            // check for trailing stop
         if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),
                                 Bid - Point*TrailingStop,
                                 OrderTakeProfit(),0,Green);
                     BuyTral=Ask+TakeProfit*Point-Point*
                             TakeProfit*(DeltaTral_inPerset/100);
              
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
           
           
              if(alfa>alfaprev)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,5,Violet); 
               total=0;
               return(0); // exit
              }
              
            // check for trailing stop
           if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || 
                     (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),
                                 Ask+Point*TrailingStop,
                                 OrderTakeProfit(),0,Red);
                     SellTral=Bid-TakeProfit*Point+Point*
                              TakeProfit*(DeltaTral_inPerset/100);
                    
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
Люди!!! Всю голову сломал уже! Не могу придумать как сделать!!! Нужно сделать так: открывается позиция стоп 20п. профит 15п. если достигается профит то открываемся в этом же направлении только если цена вернется "назад" на определенное количество пунктов. В программе этот параметр SellTral && BuyTrall. Если не варачивается и идет в том же направлении то нужно, чтобы при закрытии позици по тэйк профиту как бы заново отсчитывался тэйк профит и до тех пор пока не вернется на опр кол-во пунктов назад. Хелп ми плиз.
 

help

 
Попробуй вместо T/P использовать максимально достигнутую величину профита (MaxProf) и его цену (MaxBid) и сравнивай ее с текущим профитом (CurProf). И попробуй реализовать свою идею. Закрывать ордер можно по условию: if (MaxProf>=15 && MaxProf-CurProf>2), т.е. снижение от макс на N пунктов. “Если достигается профит то открываемся в этом же направлении только если цена вернется "назад" на определенное количество пунктов”, это можно реализовать примерно так, if (LastType==OP_BUY && MaxBid-Bid>X), то открываем на BUY. И продолжаем в этом духе.
 
         Buy=Ask;
Строчка изумила. Тут что то не то.
 
Itso:
         Buy=Ask;
Строчка изумила. Тут что то не то.

Да сейчас сам посмотрел не очень понимаю зачем так.
Вот вроде теперь все правильно а не работает... так чего не так сдела?

lvs вот что то вроде этого,?! или идея другая, я что-то не совсем понял что такое MaxProf MaxBid, как их задать ?
extern double BuyTral = 2;
extern double SellTral = 0.5;
extern double TakeProfit = 17;
extern double Lots = 1;
extern double TrailingStop = 12;
extern double Stop = 20;
extern double Delta = 5;
extern double DeltPersent = 30;
//+------------------------------------------------------------------+
double TPsel, TPbuy;
 
 
int start()
  {
   
   double buy, sell,SL;
   double coef;
   int cnt, ticket, total;
 
// initial data checks ----------------------------------------------+
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<2)
     {
      Print("TakeProfit less than 200");
      return(0);  // check TakeProfit
     }
 
     coef=iCustom(NULL,0,"CoeffofLine",5,3000,0,0);    
    
       
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
        
//      000000    00    00   00    00                                            00
//      00   00   00    00    00  00                                            0000
//      000000    00    00     0000                                           00000000
//      00   00   00    00      00                                               00
//      000000     000000       00                     0000000000000000000000000000
 
      if(coef>0 && Bid<=BuyTral)
      
        {                                        
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Ask-Stop*Point,Ask+TakeProfit*Point,"priceEX",16384,0,Green);
         
         if(ticket>0)
           {
        
             TPbuy=Ask+TakeProfit*Point;
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); //MODE_TRADES
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
        
//      0000000   0000000   00        00               0000000000000000000000000000
//      00        00        00        00                                         00
//      0000000   00000     00        00                                      00000000 
//           00   00        00        00                                        0000
//      0000000   0000000   0000000   0000000                                    00
 
       if(coef<0 && Ask>=SellTral)
        
        {                                         //Bid+TrailingStop*Point,Bid-TakeProfit*Point
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Bid+Stop*Point,Bid-TakeProfit*Point,"priceEX",16384,0,Red);
         
         if(ticket>0)
           {  
             TPsel=Bid-TakeProfit*Point;
                                              
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); //,MODE_TRADES
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
        
     }
 
if (Ask>=(TPbuy+TakeProfit*Point)) TPbuy=Ask; 
if (Bid<=(TPsel-TakeProfit*Point)) TPsel=Bid;
 
if (Ask>=TPbuy) BuyTral=TPbuy-Point*TakeProfit*(DeltPersent/100);
if (Bid<=TPsel) SellTral=TPsel+Point*TakeProfit*(DeltPersent/100);
 
 
   
   
 
 
 
//                                                                                 00
//                                                                                00 
//      0000000   00         000000    0000000   00000000                        00 
//     00         00        00    00   00        00                     00      00
//     00         00        00    00   0000000   000000                  00   000
//     00         00        00    00        00   00                       000000
//      0000000   00000000   000000    0000000   00000000                  0000
  
   for(cnt=0;cnt<total;cnt++)
     {              
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);              
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   
           {
             if(coef<0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,5,Violet); 
                 
                 return(0); // exit
                }
                
            // check for trailing stop
         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 // go to short position
           {
           
           
              if(coef>0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,5,Violet); 
               return(0); // exit
              }
              
            // check for trailing stop
           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);
  }
 
MaxProf – это максимальная прибыль, которая была достигнута с момента открытия ордера, а MaxBid – курс валютной пары в точке где был зафиксирован MaxProf. Анализирую MaxProf тебе не придется открывать новый ордер каждый раз, когда старый закрылся по t/p, а курс продолжает идти в том же направлении.
 
lsv писал (а):
MaxProf – это максимальная прибыль, которая была достигнута с момента открытия ордера, а MaxBid – курс валютной пары в точке где был зафиксирован MaxProf. Анализирую MaxProf тебе не придется открывать новый ордер каждый раз, когда старый закрылся по t/p, а курс продолжает идти в том же направлении.

ну если я все правильно понял, то в этой программе я и так пытаюсь реализовать такую систему, посмотрите, возможно я где то что то сделал не так или вообще все не так. Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
 
projectX писал (а):
Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь
extern double TakeProfit = 15;
extern double Lots = 1;
extern double TrailingStop = 12;
extern double Stop = 20;
extern double Delta = 5;
extern double DeltaTral_inPerset = 80;
 
double BuyTral;
double SellTral;
int total=0;
int prevtotal;
//+----------------------------------------------------------+
int GetLastOrderHist() 
{
  int ticket = -1;
  datetime dt = 0;
  int cnt = HistoryTotal();
    
  for (int i=0; i < cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    if (OrderSymbol() != Symbol()) continue;
    if (OrderMagicNumber() != 16384) continue;
    if (OrderType() != OP_BUY && OrderType() != OP_SELL) continue;
    
    if (OrderCloseTime() > dt) {
      dt = OrderCloseTime();
      ticket = OrderTicket();
    }
  }
  return (ticket);
}
//+----------------------------------------------------------+
 
int start()
  {
   
 
   double Buy, Sell, TakePrFalseBuy, StopLossFalseBuy, TakePrFalseSell, StopLossFalseSell, LimitPrice;
   double alfa, alfaprev;
   int cnt, ticket, FalsStart;
 
   BuyTral = Point*TakeProfit*(1-DeltaTral_inPerset/100);
   SellTral = Point*TakeProfit*(1-DeltaTral_inPerset/100);
 
// initial data checks ---------------------------------------+
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<2)
     {
      Print("TakeProfit less than 2");
      return(0);  // check TakeProfit
     }
 
     alfa=iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,0);   
     alfaprev=iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,1);
 
   prevtotal=total;
   total = 0;
   for (int i=0; i<OrdersTotal(); i++) 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==16384)&&(OrderComment()=="priceEX"))total++;
   
   if (prevtotal-total>=1) // только что закрылся ордер - проверяем условия
      {
      ticket=GetLastOrderHist();
      if (ticket>0)
         {
         if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY))
            {
            if (MathAbs(OrderClosePrice()-OrderTakeProfit())<5*Point)
               {
               if (OrderType() == OP_BUY) 
                  {
                  LimitPrice=NormalizeDouble(OrderOpenPrice()-BuyTral,Digits);
                  ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,LimitPrice,5,
                          LimitPrice-Stop*Point,LimitPrice+TakeProfit*Point,
                          "priceEX",16384,0,Green);
                  return;
                  }
               if (OrderType() == OP_SELL) 
                  {
                  LimitPrice=NormalizeDouble(OrderOpenPrice()+BuyTral,Digits);
                  ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,LimitPrice,5,
                          LimitPrice+Stop*Point,LimitPrice-TakeProfit*Point,
                          "priceEX",16384,0,Green);
                  return;
                  }
               } // для else со слипажом больше 5 пунктов - что это за ордер был? 
            } // для else совсем не срослось - ордер нашли, а выбрать не смогли :)
         } // для else не нашли ордера
      } // для else ордера не закрывались, не удалялись и не пропадали - тоже хорошо
   
   for (i=0; i<OrdersTotal(); i++) 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==16384)&&(OrderComment()=="priceEX"))
            {
            if (OrderType() == OP_BUYLIMIT && Ask-OrderOpenPrice()>BuyTral)
               {
               LimitPrice=NormalizeDouble(Ask-BuyTral,Digits);
               OrderModify(OrderTicket(),LimitPrice, LimitPrice-Stop*Point,LimitPrice+TakeProfit*Point,0,Green);
               }
            if (OrderType() == OP_SELLLIMIT && OrderOpenPrice()-Bid>SellTral)
               {
               LimitPrice=NormalizeDouble(Bid+BuyTral,Digits);
               OrderModify(OrderTicket(),LimitPrice, LimitPrice+Stop*Point,LimitPrice-TakeProfit*Point,0,Green);
               }
            
            }
 
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", 
               AccountFreeMargin());
         return(0);  
        }
 
 
 
      if(alfa>alfaprev && total==0)
        {                                         
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,5,
                          Ask-Stop*Point,Ask+TakeProfit*Point,
                          "priceEX",16384,0,Green);
        
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                Print("BUY order opened : ",OrderOpenPrice()); 
                //MODE_TRADES
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
        
       if(alfa<alfaprev  && total==0)
        
        {                                         
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,5,
                          Bid+Stop*Point,Bid-TakeProfit*Point,
                          "priceEX",16384,0,Red);
         
         if(ticket>0)
           {      
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                Print("SELL order opened : ",OrderOpenPrice()); 
            //,MODE_TRADES
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
return(0);
  }
// the end.



Вот, типа того. Открывает покупку или продажу по индикатору. Если закрывается по тэйкпрофиту, то выставляет лимит ордера с ожиданием отката на Buy/SellTral и тралит их на таком же расстоянии.
 
Vita писал (а):
projectX писал (а):
Знаю что дело это неблагодарное разбираться в чужих кодах, но другой надежды у меня нет, ну не получается у меня. Я только учусь


Вот, типа того. Открывает покупку или продажу по индикатору. Если закрывается по тэйкпрофиту, то выставляет лимит ордера с ожиданием отката на Buy/SellTral и тралит их на таком же расстоянии.

Спасибо, действительно очень благодарен. Еще раз спасибо.
 
Я бы порекомендовал ВСЕМ начинающим прочитать “Справочник MQL4 - Основы языка - Функции”. projectX, я надеюсь намек понятен. Если нет, поясню, разбей код на функции, это облегчит всем понимание твоих мыслей и сделает код красивее.
Причина обращения: