Советник открывает множество ордеров почему?

 

Не могу понять почему данный советник открывает множество ордеров при сигнале индикаторов, я не программист но что-то пытался написать, так и не пойму в чем дело, как можно управлять количеством открываемых ордеров, помогите? И еще вопросс: TrailingStep это шаг перемещения безубыточности правильно ли он размещен в коде?




//+------------------------------------------------------------------+
//| Мой советник2.mq4 |
//| Александр |
//| |
//+------------------------------------------------------------------+
#property copyright "Александр"
#property link ""


extern double Lots = 0.01;
extern double MaximumRisk = 0.3;
extern double TakeProfit = 30;
extern double StopLoss = 350;
extern double TrailingStop = 15;
extern double TrailingStep = 20;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+

int start()
{
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0);
}
double S1,S2,St1,St2,fast1,fast2,slow1,slow2;
int i, ticket;

S2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_MAIN,0);
St2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_SIGNAL,0);
fast2=iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
slow2=iMA(NULL,0,500,0,MODE_EMA,PRICE_OPEN,0);

int total=OrdersTotal();
if(total<1)
// Никакие открытые заказы(распоряжения) не выделили
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
//---- покупаем -----------------------

if (fast2>slow2&&S2>St2)
{
ticket= OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid - StopLoss*Point,
Ask + TakeProfit*Point,"ОК",0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие BUY order : ",OrderOpenPrice());
}
return(0);
}
//---- продаем ------------------------
if (fast2<slow2&&S2<St2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + StopLoss*Point,
Bid - TakeProfit*Point,"ОК",0,Red);
if(ticket>0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("произошло открытие SELL order : ", OrderOpenPrice());
}
return(0);
}

//------------Закрытие позиций----------------------------------------

for(i=0; i<total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened

if(TrailingStop>0)
if (Bid-OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL)
{
if (OrderOpenPrice()-Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
return(0);
}
return(0);
}

//+-----------------------------------------------+
 
alexdolar писал(а) >>
Не могу понять почему данный советник открывает множество ордеров при сигнале индикаторов, я не программист но что-то пытался написать, так и не пойму в чем дело, погодите?

индюк может несколько раз давать сигналы на одном и том же месте взависимости от движения цены,

определяй время и не позволяй в одно и тоже время открывать ордера или ещё что придумай!

 
int total=OrdersTotal();
if(total<1) 
// Никакие открытые заказы(распоряжения) не выделили
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0); 
}
//---- покупаем -----------------------
Возможно ошибка вот в этом месте.

После условия 

if(total<1) 
попробуйте поставить фиг. скобку. " { "

И также дабавьте обратную скобку " }" перед строкой 

//------------Закрытие позиций----------------------------------------

И сообщите сюда результат этих деяний.

 
vvavva >>:

годю!)

индюк может несколько раз давать сигналы на одном и том же месте взависимости от движения цены,

определяй время и не позволяй в одно и тоже время открывать ордера или ещё что придумай!

Логически я понимаю, что при сигналах двух индикаторов и есть условия открытия позиции, и это условие может сохраняться втечении некоторого временни, и врезультате изменения цены на один пункт или может бар, происходит открытие ордера и так далее пока сигнал не измениться, я не знаю как отрегулировать количество открываемых ордеров в начале сигнала, нужно чтото добавить или изменить.

 

2, поиск на верху в правом углу. 

3. если так будете код выкладывать, мало кто будет смотреть... ( я не глядя дам ссыль, хз пойдёт нет) ссыль, ткнуть сюда

 
rid >>:
Возможно ошибка вот в этом месте:

не понял в каком именно?

 
Добавил в свое сообщ. выше описание предполагаемой ошибки.
 
BARS >>:

2, поиск на верху в правом углу.

3. если так будете код выкладывать, мало кто будет смотреть... ( я не глядя дам ссыль, хз пойдёт нет) ссыль, ткнуть сюда

 
BARS >>:

2, поиск на верху в правом углу.

3. если так будете код выкладывать, мало кто будет смотреть... ( я не глядя дам ссыль, хз пойдёт нет) ссыль, ткнуть сюда

//+------------------------------------------------------------------+
//|                                                Мой советник2.mq4 |
//|                                                        Александр |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Александр"
#property link      ""


extern double Lots               = 0.01;
extern double MaximumRisk        = 0.3;
extern double TakeProfit         = 30;
extern double StopLoss           = 350;
extern double TrailingStop       = 15;
extern double TrailingStep       = 20;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0); 
     }
 double S1,S2,St1,St2,fast1,fast2,slow1,slow2;
  int i,  ticket;
  
   S2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_MAIN,0);
   St2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_SIGNAL,0);
    fast2=iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
    slow2=iMA(NULL,0,500,0,MODE_EMA,PRICE_OPEN,0); 
   
 int total=OrdersTotal();
   if(total<1) 
// Никакие открытые заказы(распоряжения) не выделили
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
//---- покупаем -----------------------
    
  if (fast2>slow2&&S2>St2) 
     {
      ticket= OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid - StopLoss*Point, 
                               Ask + TakeProfit*Point,"ОК",0,Blue);
   if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие BUY order  : ",OrderOpenPrice());
           }      
      return(0); 
     }
//---- продаем ------------------------
  if (fast2<slow2&&S2<St2)  
     {
       ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + StopLoss*Point, 
                               Bid - TakeProfit*Point,"ОК",0,Red);
     if(ticket>0)
           {
           if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("произошло открытие SELL order : ", OrderOpenPrice());
           }
            return(0); 
          }
                   
 //------------Закрытие позиций----------------------------------------

 for(i=0; i<total; i++) 
     {
    OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
    if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
         
      if(TrailingStop>0)
      if (Bid-OrderOpenPrice() > TrailingStop*Point) 
      {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) 
        {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
   if (OrderType() == OP_SELL)
    {
     if (OrderOpenPrice()-Ask > TrailingStop*Point) 
     {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) 
        {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
 }
    }
     }
   return(0);
  }
    return(0);
  }
  
//+-----------------------------------------------+
 
rid >>:
Добавил в свое сообщ. выше описание предполагаемой ошибки.
Да уже лучше,спасибо, но вот еще что, открытие следующей позиции происходит в случае закрытия предыдущей, а это как изменить? Нухно чтобы позиция открывалась при каждом сигнале и не важно есть открытая или нет.
 

Самый простой способ такой.

В самый конец кода (вне функции СТАРТ)  поставьте вот такую функцию.

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/             |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)               |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}
  return(kp);
}
После чего, убираете из кода выражение 
int total=OrdersTotal();
if(total<1) 
вместе с двумя фигурными скобками, кот. вы добавили.

Ну а далее просто. Используя эту функцию реализуете отдельно покупку и продажу.

if ( NumberOfPositions(NULL,OP_BUY, 0)<1) {//если нет открытых бай-позиций
//---- покупаем -----------------------
..... .... .... ....
                                        }

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж

if( NumberOfPositions(NULL,OP_SELL, 0)<1){//если нет открытых селл-позиций
//---- продаем ------------------------
.... .... .............. ..........
                                         }