Нужна помощь в познании, сея кодинга.Не могу продумать функцию

 

Собираю простой советник на индикаторе MACD и столкнулся с проблемой.Он работает, при сигнале под линией открыл, при другом сигнале закрыл и открыл другую сделку. Хочу сделать, что при наступлении профита,закрывалась сделка, к примеру на продаже и следующая открывалась при другом сигнале о покупке.После добавления блока с профитом, он стал стрелять сделками, как с пулемёта.

Не говорю, что гуру программирования, я только учусь

 if (Profit>0 && AccountEquity() - StartBalance >= Profit)
    {
        Print("Закрываем все позиции" + DoubleToStr(Profit,2) + "$");
        CloseAllOrders();
             

} 

Попытался сделать нечто эдакое, т.е запретить открывать сделку пока не придет другой сигнал(я думаю, что неплохо придумал, но на деле - нет)И остальная часть кода прилагается.Я разрешаю советнику торговать написав "True", так почему же я не могу ему запретить торговать, написав фальш?)

if (Profit>0 && AccountEquity() - StartBalance >= Profit)
    {
        Print("Закрываем все позиции" + DoubleToStr(Profit,2) + "$");
        CloseAllOrders();
         
      while((macdHIST > 0 && macdSign > 0 && macdHIST < macdSign) || 
  (macdHIST < 0 && macdSign < 0 && macdHIST < macdSign ))
      {
      permOpenSell = false;
      break;
      }

} 

}
#include <stdlib.mqh>
#include <WinUser32.mqh>

extern int               Slippage=10;  
input string             expSettings  = "";            // Настройки советника
input int                expMagic     = 123;           // Магик
input double             posVolume    = 0.1;           // Объем
input int                posProfit    = 50;            // Прибыль
input int                posLoss      = 50;            // Убыток
input string             indSettings  = "";            // Настройки индикатора MACD
input int                fastPeriod   = 12;            // Быстрое EMA
input int                slowPeriod   = 26;            // Медленное EMA
input int                signalPeriod = 9;             // MACD SMA
extern double            Profit = 100;                 // Наш профит 
input ENUM_APPLIED_PRICE priceType    = PRICE_CLOSE;   // Тип цены

int Stopped = 0;
datetime newCandle;           // новая свеча
int      posTicket;           // тикет позиции
bool     permOpenBuy;         // true - разрешено открыть позицию на покупку
bool     permOpenSell;        // true - разрешено открыть позицию на продажу
bool     permSetOrdersStop;   // true - разрешено установить стоп ордера
double   StartBalance;
double   StartPrice;

//+-------------------------------------------------------------------------------------------------------------------+
int OnInit(void)
{
   StartBalance = AccountBalance(); 
   Stopped = 0;
   StartPrice = 0;
   return INIT_SUCCEEDED;

}
//+-------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-------------------------------------------------------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Возвращает общее количество ордеров, открытых советником         |
//+------------------------------------------------------------------+
int TotalOrders()
  {        
    int n=0;
    for (int i=0; i<OrdersTotal(); i++)
      if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==expMagic && OrderSymbol()==Symbol()) n++;
    return(n);  
  }  
//+-------------------------------------------------------------------------------------+
//| Закроем ордера, открытые этим советником                                            |
//+-------------------------------------------------------------------------------------+
void CloseAllOrders()
  {        
    int Aa=0;
    while (TotalOrders()>0)
    {
      for (int i=0; i<=OrdersTotal(); i++)
        if (OrderSelect(i,SELECT_BY_POS) && OrderMagicNumber()==expMagic && OrderSymbol()==Symbol())
        {                 
          RefreshRates();
          if (OrderType()==OP_BUY)  if (OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,Blue)==false) Aa++;
          if (OrderType()==OP_SELL) if (OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage,Red)==true) Aa++;
          if (OrderType()>1) if (OrderDelete(OrderTicket())==true) Aa++;
            
        }        
     }     
}

void OnTick(void)
{

   //--- проверим наличие сигнала на новой свече
   if(newCandle != Time[0]) CheckSignalExist();
   newCandle = Time[0];
   //--- откроем позицию
   if(permOpenBuy)  OpenPosition(OP_BUY,  posVolume, Ask);
   if(permOpenSell) OpenPosition(OP_SELL, posVolume, Bid);
   //--- установим стоп ордера
   if(permSetOrdersStop) SetOrdersStop();
        
//+-------------------------------------------------------------------------------------+
//| Закроем ордера посде профита                                                        |
//+-------------------------------------------------------------------------------------+
double macdHIST = iCustom(Symbol(),PERIOD_CURRENT,"New\\MACD",fastPeriod, slowPeriod, signalPeriod,0,1); 
double macdSign = iCustom(Symbol(),PERIOD_CURRENT,"New\\MACD",fastPeriod, slowPeriod, signalPeriod,1,1);
     
     if (Profit>0 && AccountEquity() - StartBalance >= Profit)
    {
        Print("Закрываем все позиции" + DoubleToStr(Profit,2) + "$");
        CloseAllOrders();
         
      while((macdHIST > 0 && macdSign > 0 && macdHIST < macdSign) || 
  (macdHIST < 0 && macdSign < 0 && macdHIST < macdSign ))
      {
      permOpenSell = false;
      break;
      }

} 

}

//+-------------------------------------------------------------------------------------+
//| Посчитаем ордера продажи, открытые этим советником                                  |
//+-------------------------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
      {
           if (OrderSymbol() == Symbol() && OrderMagicNumber() == expMagic && OrderType()  == OP_SELL)
           count++;
      }
   
   }
   return(count);
   
}

//+-------------------------------------------------------------------------------------+
//| Посчитаем ордера покупки, открытые этим советником                                  |
//+-------------------------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
      {
           if (OrderSymbol() == Symbol() && OrderMagicNumber() == expMagic && OrderType()  == OP_BUY)
           count++;
      }
   
   }
   return(count);
   
}

//+-------------------------------------------------------------------------------------------------------------------+
//| Функция устанавливает стоп ордера                                                                                 |
//+-------------------------------------------------------------------------------------------------------------------+
void SetOrdersStop(void)
{
   double oop = 0;
   double sl  = 0;
   double tp  = 0;
   //--- выберем позицию по тикету
   if(OrderSelect(posTicket, SELECT_BY_TICKET))
   {
      oop = OrderOpenPrice();
      //--- расчитаем цены установки стоп ордеров
      if(OrderType() == OP_BUY)
      {
         tp = oop + posProfit * _Point;
         sl = oop - posLoss   * _Point;
      }
      if(OrderType() == OP_SELL)
      {
         tp = oop - posProfit * _Point;
         sl = oop + posLoss   * _Point;
      }
      //--- модифицируем позицию
      if(OrderModify(posTicket, oop, sl, tp, 0)) permSetOrdersStop = false;   // запретим устанавливать стоп ордера
      else PrintFormat("Стоп ордера не установлены, тикет: %i, ошибка: %i", posTicket, GetLastError());
   }
   else PrintFormat("Позиция не выбрана, тикет: %i, ошибка: %i", posTicket, GetLastError());
}
//+-------------------------------------------------------------------------------------------------------------------+
//| Функция открывает позицию                                                                                         |
//+-------------------------------------------------------------------------------------------------------------------+
void OpenPosition(int type, double volume, double price)
{
   posTicket = OrderSend(_Symbol, type, volume, price, 0, 0, 0, "", expMagic, 0);
   
   if(posTicket > 0)
   {
      permSetOrdersStop = true;   // разрешим устанавливать стоп ордера
      
      if(type == OP_BUY)  permOpenBuy  = false;   // запретим открывать позицию на покупку
      if(type == OP_SELL) permOpenSell = false;   // запретим открывать позицию на продажу
   }
   if(posTicket < 0) PrintFormat("Позиция не открылась, ошибка: %i", GetLastError());
}
//+-------------------------------------------------------------------------------------------------------------------+
//| Функция проверяет наличие сигнала                                                                                 |
//+-------------------------------------------------------------------------------------------------------------------+
void CheckSignalExist(void)
{
   //--- получим значения индикатора

     double macdHIST = iCustom(Symbol(),PERIOD_CURRENT,"New\\MACD",fastPeriod, slowPeriod, signalPeriod,0,1); 
     double macdSign = iCustom(Symbol(),PERIOD_CURRENT,"New\\MACD",fastPeriod, slowPeriod, signalPeriod,1,1);
 
        
   if((CountSell()==0 && macdHIST > 0 && macdSign > 0 && macdHIST < macdSign) || 
  (CountSell()==0 && macdHIST < 0 && macdSign < 0 && macdHIST < macdSign ))
    {
     permOpenSell = true;
      if(CountBuy()>=1)
     {
     CloseAllOrders();
     }
     
    }
    
 
    if((CountBuy()==0 && macdHIST > 0 && macdSign > 0 && macdHIST > macdSign) ||  
  (CountBuy()==0 && macdHIST < 0 && macdSign < 0 && macdHIST > macdSign ))
    {
     permOpenBuy = true;
     if(CountSell()>=1)
     {
     CloseAllOrders();
     }
     
    }
    
   } 

Заранее спасибо.

 
Наверное где то хромает логика, запрет на открытие после профита эта одна функция. Запрет на открытие более одного ордера это другая функция.
Причина обращения: