Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Совершил прорыв? Напиши статью об этом и получи 200 USD!
MegaHunter
15
MegaHunter 2014.10.30 06:16 

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

 

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
 
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt=0, ticket, total;
// первичные проверки данных
// важно удостовериться что эксперт работает на нормальном графике и
// пользователь правильно выставил внешние переменные (Lots, StopLoss,
// TakeProfit, TrailingStop)
// в нашем случае проверяем только TakeProfit
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // проверяем TakeProfit
     }
// ради упрощения и ускорения кода, сохраним необходимые
// данные индикаторов во временных переменных
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
 
   total=OrdersTotal();
   if(total<1) 
     {
      // нет ни одного открытого ордера
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // проверяем на возможность встать в длинную позицию (BUY)
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
                          "macd sample",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(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
                          "macd sample",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 &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 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(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               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);
  }
// конец.
Vitalie Postolache
11108
Vitalie Postolache 2014.10.30 09:20  
Добавить магик, заменить фиксированное значение магика на открытии на задаваемое в настройках пользователем и проверку на магик при тралинге и закрытии. Проверка на символ уже есть. А для доливок придётся ещё столько же кода написать, сколько тут уже есть, в кодобазе лень искать, но точно всё есть уже готовое  ;)
MegaHunter
15
MegaHunter 2014.10.30 09:46  

блин я ваще зелёный добавил магиг и добавил проверку при тралинге и закрытии вот так

 

   for(cnt=0;cnt<total;cnt++)
    if((OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true) && (OrderSymbol() == Symb))//Если есть следующ.  //.. и наша вал.пара
     {
      if(Magic != OrderMagicNumber()) continue;// если магическое число не совпадает с нашим Magic - возвращаемся в начало цикла
       Ticket = OrderTicket(); // запоминаем номер ордера

 

вроде ошибок не выводит только один фиг если по одной валюте есть открытый ордер он больше не открывает

 

evillive можешь помочь?  

Vitalie Postolache
11108
Vitalie Postolache 2014.10.30 09:49  

Вот тут собака зарыта

if(total<1) 
MegaHunter
15
MegaHunter 2014.10.30 10:08  

так тут if(total<1)  он увеличивает ордера по той же паре на которой был открыт ордер

Vitalie Postolache
11108
Vitalie Postolache 2014.10.30 11:59  
Не, в данном случае этот if(total<1) ограничивает работу на символе только одной позицией. Если total=1, советник больше позиций открывать не будет.
MegaHunter
15
MegaHunter 2014.10.30 12:23  

я только что тестировал ставлю if(total<2) количество ордеров увеличивается в два раза, может я не в ту сторону думаю не подскажите как снять это ограничение? и дать возможность советнику торговать на других валютных парах.

Vitalie Postolache
11108
Vitalie Postolache 2014.10.30 12:34  
Aqcher:

я только что тестировал ставлю if(total<2) количество ордеров увеличивается в два раза, может я не в ту сторону думаю не подскажите как снять это ограничение? и дать возможность советнике торговать на других валютных парах.

if(total<2) увеличивает количество ордеров не в 2 раза, а на +один. Просто уберите это условие (внимательно фигурные скобки убирайте, чтобы не осталось лишней), советник будет открывать позиции как только показания индикаторов будут отвечать условиям. Но в таком случае советник наоткрывает на всю маржу пачку позиций, так как ограничений не останется, и скорее всего обнулит депозит. Надо ограничивать или по цене (запрещать открытие, если уже есть позиция ближе заданного кол-ва пунктов), или по времени (запрещать открытие, если уже открыта позиция и с момента открытия времени прошло меньше заданного), или ещё как-то. Ройте кодобазу в общем, там много чего есть.

А для торговли на другой паре просто установите его на графике нужной пары.

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