Как убрать открытие ордера на каждом тике ?

 

Я новичок пишу для себя эксперта в кортом есть HMA color. Вот возникла такая проблема. Открывается первый ордер  на покупку и закрывается по индикатору при смене тренда, но последующие ордера открывшись сразу закрываются не дождавшись сигнал от индикатора . Индикатор и скрин приложены.

extern double Lots       = 0.01; // Лот
extern int    StopLoss   = 300;  // Стоп лос
extern int    Step       = 200;  // Шаг между сделками
extern int    magic      = 15;   // маджик число
extern int    slippage   = 10;   // проскальзывание
extern int    ZK         = 5;    // число знаков после запятой в котировке
extern int    TakeProfit = 600;  // таке профит

//-------------------------------------------------------
// индикатор
extern string HMA              = "Параметры индикатора HMA";
extern string TimeFrame        = "Current time frame";
extern int    HMA_Period       = 20;
extern int    HMA_PriceType    = 0;
extern int    HMA_Method       = 3;
extern bool   DisplayHmaValue  = true;
extern bool   alertsOn         = false;
extern bool   alertsOnCurrent  = false;
extern bool   alertsMessage    = true;
extern bool   alertsSound      = true;
extern bool   alertsEmail      = false;

extern bool   ShowArrows       = true;
extern string arrowsIdentifier = "HMA Arrows";
extern double arrowsUpperGap   = 1.0;
extern double arrowsLowerGap   = 1.0;
extern color  arrowsUpColor    = Black;
extern color  arrowsDnColor    = Red;
extern color  arrowsUpCode     = 233;
extern color  arrowsDnCode     = 234;
extern int    arrowsUpSize     = 3;
extern int    arrowsDnSize     = 3;
//-------------------------------------------------
double SL, TP, PriceHMA;

int ticket;

bool Ticket2;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      
      PriceHMA = iCustom(NULL, 0, "HMA Color nrp & mtf & alerts + arrows 2", TimeFrame,
      HMA_Period, HMA_PriceType, HMA_Method, DisplayHmaValue, alertsOn, alertsOnCurrent,
      alertsMessage, alertsSound, alertsEmail, ShowArrows, arrowsIdentifier, arrowsUpperGap,
      arrowsLowerGap, arrowsUpColor, arrowsDnColor, arrowsUpCode, arrowsDnCode, arrowsUpSize,
      arrowsDnSize, 6, 0);
      
      
       
      
//-------------------------------------------------------      
      if(BuyCount() == 0)                                                 // проверка наличия открытых ордеров
      {
         SL = NormalizeDouble(Ask - StopLoss*Point, ZK);                                      // расчёт стоп лоса
         TP = NormalizeDouble(Ask + TakeProfit*Point, ZK);
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, slippage, SL, TP, "", magic, 0, Blue);// покупка 
      
         if (ticket < 0)
            Print("Не удалось открыть лимитный ордер на покупку");
            
      }                                                         
      
       
      CoutBuyClose();


Код функции CoutBuyClosу 

int CoutBuyClose()
{
 if (PriceHMA == 1 && BuyCount() > 0)
 {
   for( int i = OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if (OrderMagicNumber() == magic && OrderType() == OP_BUY)
            Ticket2 = OrderClose(OrderTicket(), OrderLots(), Bid, slippage, Red);
            if (Ticket2 == 0)
             Print ("Ошибка закрытия ордера на покупку");  
             
      }
   }
 }

  return(0)
 
kabalvlad:

Я новичок пишу для себя эксперта в кортом есть HMA color. Вот возникла такая проблема. Открывается первый ордер  на покупку и закрывается по индикатору при смене тренда, но последующие ордера открывшись сразу закрываются не дождавшись сигнал от индикатора

Почему используется буфер 6 если их там всего 5 (0, 1, 2, 3, 4)

      PriceHMA = iCustom(NULL, 0, "HMA Color nrp & mtf & alerts + arrows 2", TimeFrame,
      HMA_Period, HMA_PriceType, HMA_Method, DisplayHmaValue, alertsOn, alertsOnCurrent,
      alertsMessage, alertsSound, alertsEmail, ShowArrows, arrowsIdentifier, arrowsUpperGap,
      arrowsLowerGap, arrowsUpColor, arrowsDnColor, arrowsUpCode, arrowsDnCode, arrowsUpSize,
      arrowsDnSize, 6, 0);

Буферы индикатора


 
Ну во  отредактировал. Но ситуация не изменилась. Только непонятная больше стала. Если в функции == цену и    Dntrend то позиции не закрываться, а выбиваются стоп лосом. А если вписать <  или > , >=, <=,  на каждом тике открытие и закрытие позиции. Вот функция. Вот программа. Пытался добавить сдвиг  на iCustom но не помогло. Индикатор приложен.
extern int period=21;
extern int method=3; // MODE_SMA 
extern int price=0; // PRICE_CLOSE 
extern int sdvig=0;

extern bool bPlaySound=true;           // Включение звука при смене цвета
extern bool bAllert=true;           // Включение звука при смене цвета
extern string SoundName="alert.wav";   // Звуковой файл
extern int CheckBar=1;
//-------------------------------------------------
double SL, TP, Dntrend;

int ticket;

bool Ticket2;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      
      Dntrend = iCustom(NULL, 0, "VininI_HMA_sound_Alert",
      period, method, price, sdvig, bPlaySound, bAllert,
      SoundName, CheckBar,  2, 0);
      
      
       
      
//-------------------------------------------------------      
      if(BuyCount() == 0)                                                 // проверка наличия открытых ордеров
      {
         SL = NormalizeDouble(Ask - StopLoss*Point, ZK);                                      // расчёт стоп лоса
         //TP = NormalizeDouble(Ask + TakeProfit*Point, ZK);
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, slippage, SL, 0, "", magic, 0, Blue);// покупка 
      
         if (ticket < 0)
            Print("Не удалось открыть лимитный ордер на покупку");
          
          
      }                                                         
      CoutBuyClose();

int CoutBuyClose()
{
 if (Dntrend == Bid  && BuyCount() > 0)
 {
   for( int i = OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
        if (OrderMagicNumber() == magic && OrderType() == OP_BUY)
            Ticket2 = OrderClose(OrderTicket(), OrderLots(), Bid, slippage, Red);
            if (Ticket2 == 0)
             Print ("Ошибка закрытия ордера на покупку");  
             
      }
   }
 }

  return(0);
}
Файлы:
 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      
   double buy = iCustom(NULL, 0, "VininI_HMA_sound_Alert",
          period, method, price, sdvig, bPlaySound, bAllert,
          SoundName, CheckBar,  1, 0);
   
   double sell = iCustom(NULL, 0, "VininI_HMA_sound_Alert",
          period, method, price, sdvig, bPlaySound, bAllert,
          SoundName, CheckBar,  2, 0);
//====
   if(buy!=EMPTY_VALUE && OP(0)==0) //если сигнал бай и нет ордеров бай
      {
         SL = NormalizeDouble(Ask - StopLoss*Point, ZK);                                      // расчёт стоп лоса
         //TP = NormalizeDouble(Ask + TakeProfit*Point, ZK);
         SendBuy (Lots, SL);                                                                  // покупка 
      }  
//----
   if(sell!=EMPTY_VALUE && OP(1)==0) //если сигнал селл и нет ордеров селл
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, ZK);                                      // расчёт стоп лоса
         //TP = NormalizeDouble(Bid - TakeProfit*Point, ZK);
         SendSell (Lots, SL);                                                                 // продажа 
      }  
//====
   if(sell!=EMPTY_VALUE && OP(0)>0){ //если сигнал селл и есть ордера бай, то закрыть бай
   for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderMagicNumber()==magic && OrderSymbol()==Symbol()){
   if(OrderType()==0) CloseOrd(OrderTicket());}}
//----
   if(buy!=EMPTY_VALUE && OP(1)>0){ //если сигнал бай и есть ордера селл, то закрыть селл
   for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderMagicNumber()==magic && OrderSymbol()==Symbol()){
   if(OrderType()==1) CloseOrd(OrderTicket());}}
//====
 }
//+------------------------------------------------------------------+
//|  Счётчик ордеров по типу                                         |
//+------------------------------------------------------------------+
int OP(int type=-1){
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
   if(OrderType()==type || (OrderType()>=0 && type==-1)) count++;}
return(count);}      
//+-----------------------------------------------------+ 
//| Открытие, закрытие ордеров                          | 
//+-----------------------------------------------------+
void SendBuy(double lot, double sl){
   int SendOrdB;
   SendOrdB=OrderSend(Symbol(),OP_BUY,lot,Ask,10,sl,0,"OpBuy ",magic,0,Blue);
}
void SendSell(double lot, double sl){
   int SendOrdS;
   SendOrdS=OrderSend(Symbol(),OP_SELL,lot,Bid,10,sl,0,"OpSell ",magic,0,Red);
}
void CloseOrd(int ticket){
   color cls=Gray;
   for(int i=0; i<OrdersTotal(); i++)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderMagicNumber()==magic && OrderSymbol()==Symbol()){
   if(OrderType()==OP_BUY)  cls=DeepSkyBlue;
   if(OrderType()==OP_SELL) cls=Magenta;}
   if(!OrderSelect(ticket,SELECT_BY_TICKET)||OrderCloseTime()>0) return;
   bool close=OrderClose(ticket,OrderLots(),OrderClosePrice(),30,cls);}