Корректное открытие нескольких позиций

 

Здраствуйте!Как корректно открыть несколько позиций?

{
OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
_MagicNumber, 0, Green );

OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
_MagicNumber1, 0, Green ); 

OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
_MagicNumber2, 0, Green );

if(OrdersTotal()<3)
Print("Error opening BUY orders : ",_GetLastError);
return(0);
}


if(iSAR(NULL,0,step0,0.1,0)>Close[0])
{
{
//---- открываем СЕЛЛ позицию
OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
_MagicNumber, 0, Red );
OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
_MagicNumber1, 0, Red ); 
OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
_MagicNumber2, 0, Red ); 
} 
if(OrdersTotal()<3)
Print("Error opening BUY orders : ",_GetLastError);
return(0);
}
return(0);

}

Эксперт корректно работает только в режиме тестера .В демо режиме открываются не три а одна или две позиции в зависимости ситуации на рынке.

Помогите пожалуйста.

 

Если вы хотите, чтобы кто-нить вник в ваш код, то оформите его по человечески. Используя опцию "код" в меню ответа сообщения.

//+------------------------------------------------------------------+
//| eurjpy_m1_sar_fast_test.mq4 |
//| Copyright © 2007, Mirakhmedov Anvar |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Mirakhmedov Anvar"

extern int _MagicNumber = 5077;
extern int _MagicNumber1 = 5078;
extern int _MagicNumber2 = 5079;
extern double step0 = 0.045;

... .... ...
 

Может быть вам поможет такой прием. Задайте для каждой позиции свой ticket=OrderSend(Symbol() После открытия первой позиции перед открытием второй вставьте условие

if (ticket_1>0)

А потом перед открытием третьей позиции вставьте условие

if(ticket_2>0)

Ну и обязательно после каждой ф-и OrderSend( -

if(ticket_1<0){Print("Ошибка открытия ордера BUY #",GetLastError());return (0); }
 

if(iSAR(NULL,0,step0,0.1,0)<Close[0] )


{
OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
_MagicNumber, 0, Green );

OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
_MagicNumber1, 0, Green );

OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
_MagicNumber2, 0, Green );

if(OrdersTotal()<3)
Print("Error opening BUY orders : ",_GetLastError);
return(0);
}


if(iSAR(NULL,0,step0,0.1,0)>Close[0])
{
{
//---- открываем СЕЛЛ позицию
OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
_MagicNumber, 0, Red );
OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
_MagicNumber1, 0, Red );
OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
_MagicNumber2, 0, Red );
}
if(OrdersTotal()<3)
Print("Error opening BUY orders : ",_GetLastError);
return(0);
}
return(0);

}
 
..... } 
}

//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет|
//| проверяем, есть ли возможность открыть позицию |
//+------------------------------------------------------------------+
if(iSAR(NULL,0,step0,0.1,0)<Close[0] )
А с чего вы взяли, что нет ?
 
rid писал (а) >>

Может быть вам поможет такой прием. Задайте для каждой позиции свой ticket=OrderSend(Symbol() После открытия первой позиции перед открытием второй вставьте условие

А потом перед открытием третьей позиции вставьте условие

Ну и обязательно после каждой ф-и OrderSend( -

Спасибо большое за ответ .Подскажите пожалуйста как теперь корректно закрыть эти ордера?

if((Open[Ib]-Close[0])> _point1*Point  || 
     (((Low[iLowest(NULL,0,MODE_LOW,barend,1)])-_pointbreak)>Close[0] && iSAR(NULL,0,step0,0.1,0)>Close[0])) 
         
                      
                //---- закрываем позицию
                {
                if((OrderClose( OrderTicket(), OrderLots(), 
                    Bid, slippage, Green ) )!=false)
                  {  
                 Alert( "BuyOrderClose № ",OrderClosePrice() );
                 SendMail("Expert", "BuyOrderClose_CadJpy_m5" + DoubleToStr(Close[0],Digits));
                 PlaySound(NameSound);
                 }
                 
                else
                {
                Alert( "Ошибка BuyOrderClose № ",_GetLastError );
              return(-1);
                 }
                 }   
            return(0);
         
        }    
        
        //---- если открыта СЕЛЛ-позиция,
        if ( OrderType() == OP_SELL )
        {
        if((Close[0]-Open[Ib])> _point1*Point||
          (iSAR(NULL,0,step0,0.1,0)<Close[0]&& ((High[iHighest(NULL,0,MODE_HIGH,barend,1)])+_pointbreak)<Close[0]))
        
          {
                if((OrderClose( OrderTicket(), OrderLots(), 
                    Ask, slippage, Green ) )!=false)
                    {
                 Alert( "SellOrderClose № ",OrderClosePrice()  );
                 SendMail("Expert", "SellOrderClose_CadJpy_m5" + DoubleToStr(Close[0],Digits));
                 PlaySound(NameSound);
                 }
                else
                {
                Alert( "Ошибка SellOrderClose № ",_GetLastError);
                return(-1);
                 }
                 }   
            return(0);
         
        }    
     }
 
rid писал (а) >>
А с чего вы взяли, что нет ?

Не понял

 
rid писал (а) >>

Может быть вам поможет такой прием. Задайте для каждой позиции свой ticket=OrderSend(Symbol() После открытия первой позиции перед открытием второй вставьте условие

А потом перед открытием третьей позиции вставьте условие

Ну и обязательно после каждой ф-и OrderSend( -

Я переделал но после открытия первого ордера выдаёт 138 ошибку

         if(iSAR(NULL,0,step0,0.1,0)<Close[0] )
         
         
         {
      ticket = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              _MagicNumber, 0, Green ) );
          if(ticket<1)
          {Print("Ошибка открытия ордера BUY #",GetLastError());return (0); }    
                  
         ticket_1 = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              _MagicNumber, 0, Green ) ); 
          if(ticket_1<1)
          {Print("Ошибка открытия ордера BUY #",GetLastError());return (0); }    
               
       ticket_2 = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              _MagicNumber, 0, Green ) );
           if(ticket_2<1)
          {Print("Ошибка открытия ордера BUY #",GetLastError());return (0); }   
          
           
     }

            
      if(iSAR(NULL,0,step0,0.1,0)>Close[0])
    {
        
        //---- открываем СЕЛЛ позицию
      ticket = (OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
        Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
              _MagicNumber, 0, Red ));
              
           if(ticket<1)
          {Print("Ошибка открытия ордера BUY #",GetLastError());return (0); } 
             
      ticket_1 = (OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
        Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
              _MagicNumber1, 0, Red ));
              
            if(ticket_1<1)
          {Print("Ошибка открытия ордера BUY #",GetLastError());return (0); }       
      
      ticket_2 = (OrderSend( Symbol(), OP_SELL,GetSizeLot(), Bid, slippage,
        Ask+StopLoss*Point,Bid-TakeProfit*Point, NameExpert,
              _MagicNumber2, 0, Red ));               
           if(ticket_2<1)
          {Print("Ошибка открытия ордера BUY #",GetLastError());return (0); } 
   }
    return(0);
    
}
 
misterx писал (а) >>

Здраствуйте!Как корректно открыть несколько позиций?

Эксперт корректно работает только в режиме тестера .В демо режиме открываются не три а одна или две позиции в зависимости ситуации на рынке.

Помогите пожалуйста.

Проблема в том что необходимо корректно писать функции работы с ордерами!

Вы привели очень примитивный метод...

код работы с ордерами не должен быть такой простой

причина по которой не отрывается позиция будет понятна если вы обработаете ошибку

---


примерный алгоритм для открытия 3-х позиций


каждая позиция должна иметь свою классификацию т е номер или признак


1 - иметь 3 флага, по флагу для каждой позиции...

2 - пытаемся открыть n-ю позицию ( и так по всем трем )

не открыли - флаг (по той позиции которую открываем) не сбрасываем - т е на следующем тике будет возобновлена попытка отрыть именно эту позицию

3 в коде необходимо предусмотреть обработку ошибок - что бы не мучаться думая почему не открылась - а сразу по коду понимать почему

4 иметь счетчик попыток ( пока живет сигнал - счетчик не использовать )

5 если позиция открыта - не пытаться открывать ее вновь т е сигналы должны быть помечены признаком что они отработаны


1 сигнал может быть импульсным и жить в течении тика! - самый ненадежный вариант - тогда надо организовать флаг

2 сигнал может быть продолжительным т е жить существовать к примеру минуту, 10 минут,час или 2 часа, или день - два

тут тоже разумно делать флаг


флаг необходимо сбрасывать после некоторого количества ошибок во время открытия - к примеру 3-5 ошибок - ( при условии импульсного сигнала

а та же если сигнал был длительный но перестал существовать )

в обычных нормальных условиях проблем с открытием не возникает


ну и наконец то

открывать сразу три позиции разумно если ваши позиции имеют разные цели

или каждая позиция сопровождается по разному - трал к примеру у каждой разный

---

я так понимаю вы пишите советник к чемпионату!

удачи






---

 
misterx писал (а) >>

Я переделал но после открытия первого ордера выдаёт 138 ошибку

Вы сделали не так, как я писал. - ВЫ НЕ ПОСТАВИЛИ условие открытия очередной позиции в зависимость от наличия (открытия) предыдущей!

Лучше всего вам воспользоваться рекомендациями пред. сообщ. от YuraZ

В самом примитивном же случае я бы выполнил открытие так:

if(iSAR(NULL,0,step0,0.1,0)<Close[0] )
         
         
         {
      ticket = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              _MagicNumber1, 0, Green ) );
if(ticket<1) {Print("Ошибка открытия 1-го ордера BUY #",GetLastError());return (0); }  
if (ticket>0) //Sleep(10000);
          { //если 1-я позиция открылась, открываем вторую
                 
         ticket_1 = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              _MagicNumber2, 0, Green ) ); 
if(ticket_1<1) {Print("Ошибка открытия 2 ордера BUY #",GetLastError());return (0); }    
if (ticket_1>0) // Sleep(10000);
         { // если вторая позиция открылась, открываем третью 

      ticket_2 = (OrderSend( Symbol(), OP_BUY,GetSizeLot(), Ask, slippage,
       Bid-StopLoss*Point,Ask+TakeProfit*Point,NameExpert,
              _MagicNumber3, 0, Green ) );
           if(ticket_2<1)
          {Print("Ошибка открытия 3 ордера BUY #",GetLastError());return (0); }   
         } 
       }    
     }
 
misterx писал (а) >>

Спасибо большое за ответ .Подскажите пожалуйста как теперь корректно закрыть эти ордера?

Чтобы упростить закрытие можно воспользоваться уже готовой функцией закрытия.

'Полезные функции от KimIV'

Функция ClosePositions().

Эта функция выполняет закрытие позиций, параметры которых удовлетворяют заданным значениям:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
  • mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.

//---------------------------------------------------------------------------------------------------------------------------

Располагаете функцию вне функции int start(), - в вашем случае - "внизу", в самом конце кода.

А далее, просто подставляете в ClosePositions(...) параметры той позиции, которую вы хотите закрыть (т.е. тип, магик ...)

//закрытие 
if((Open[Ib]-Close[0])> _point1*Point  || 
     (((Low[iLowest(NULL,0,MODE_LOW,barend,1)])-_pointbreak)>Close[0] && iSAR(NULL,0,step0,0.1,0)>Close[0]))          
                      
                //---- закрываем позицию

ClosePositions( NULL ,OP_BUY, _MagicNumber1)
Причина обращения: