Скачать MetaTrader 5

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

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

Собираю простой советник на индикаторе 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();
     }
     
    }
    
   } 

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

NightTrader
157
NightTrader  
Наверное где то хромает логика, запрет на открытие после профита эта одна функция. Запрет на открытие более одного ордера это другая функция.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий