Как сделать чтобы выставлялись ордера только один buy stop и один sell stop по заданной паре?

 

Есть простой эксперт, выставляет ордера buy stop и sell stop в заданное время, но повторяет ордера по заданной паре пока не истекло время.

Подскажите что дописать, чтобы выставлялись ордера только один buy stop и один sell stop по заданной паре, и по другим инструментам была возможность выставлять аналогичные ордера?

Спасибо

extern double TakeProfit = 150;
extern double StopLoss = 100;
extern double lev= 100;
extern double TR= 20;
double Lots = 0.01;
extern double HouerOpen = 18;
extern double MinutesOpen = 45;

extern double SecondsOpen = 35;
bool UseCurrSymbol = False; // Использовать только один инструмент
int Slippage = 5; // Проскальзывание цены
color clCloseBuy = Blue; // Цвет закрытия покупки
color clCloseSell = Red; // Цвет закрытия продажи
int start()
{
double pBid, pAsk;
double Vcp1, MyInd, ts, MySL;
int Os, total, OI, ticket, ho, mo, OP, cnt, sred, so ;
ts=1;
mo=Minute();
so=Seconds();
ho=Hour();
//--------------------------------------------------------------------------------------------------
// Блок выставления ордеров
//
//--------------------------------------------------------------------------------------------------
if ( mo== MinutesOpen && so>= SecondsOpen ) //
{
//total=OrdersTotal();
// if(total<1 )
{

if (ho==HouerOpen ) //
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+lev*Point,3,(Ask+lev*Point)-StopLoss*Point, Ask+(TakeProfit+lev)*Point, "Покупка",111,0,Green);

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) SendMail("BUYSTOP order установлен : ", OrderOpenPrice());
}
else Print("Error opening Buy order : ", GetLastError());

ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-lev*Point, 3, (Bid-lev*Point)+StopLoss*Point, Bid-(TakeProfit+lev)*Point, "Продажа",111,0,Green);


if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) SendMail("SELLSTOP order установлен : ", OrderOpenPrice());
}
else Print("Error opening Sell order : ", GetLastError());

return(0);
}
}
}

 
if(OrdersTotal()>2){return(0);}
Вставь в начало кода: эксперт не выполняется если 2 ордера!
 

Нужно взять из какого-нибудь стандартного эксперта стандартный же цикл по ордерам и вставить подсчёт ордеров для данного символа. Если больше двух - return(0).

Здесь внизу страницы можно найти панель инструментов, там есть кнопка MQL. Крайне желательно использовать её для вставки кода, в таком виде мало кто будет его смотреть.

 
//+------------------------------------------------------------------+
//|                                                         кккк.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
 
extern double TakeProfit = 150;            
extern double StopLoss = 100;              
extern double lev= 100;  
extern double TR= 20;
extern double Lots = 0.01;                       
extern double HouerOpen = 18;       
extern double MinutesOpen = 45;
extern double SecondsOpen = 35;
 
bool  UseCurrSymbol = False;        // Использовать только один инструмент
int   Slippage      = 5;            // Проскальзывание цены
color clCloseBuy    = Blue;         // Цвет закрытия покупки
color clCloseSell   = Red;          // Цвет закрытия продажи
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double pBid, pAsk;
double Vcp1, MyInd, MySL;
int Os, total, OI, ticket, ho, mo, OP, cnt, sred, so ;  
mo=Minute(); 
so=Seconds(); 
ho=Hour(); 
//--------------------------------------------------------------------------------------------------   
//                      Блок выставления ордеров
//
//--------------------------------------------------------------------------------------------------   
  if(mo==MinutesOpen && so>=SecondsOpen )
   {
   if(ho==HouerOpen )
     {
   //----   
     if(OrderTotal(OP_BUYSTOP)==0)
       {
       OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+lev*Point,3,(Ask+lev*Point)-StopLoss*Point,Ask+(TakeProfit+lev)*Point,"Покупка",111,0,Green);
       }
   //----
     if(OrderTotal(OP_SELLSTOP)==0)
       {
       OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-lev*Point,3,(Bid-lev*Point)+StopLoss*Point,Bid-(TakeProfit+lev)*Point,"Продажа",111,0,Green);
       }
   //----
     }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+ 
int OrderTotal(int type)
  {
  int order=0;
  for(int pos=OrdersTotal()-1; pos>=0; pos--)
    {
    if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES) == true)
      {
      if(OrderSymbol()==Symbol() && OrderType()==type)
        {
        order++;             
        }
      }
    else
      Print("Ошибка ", GetLastError());
    }
  return(order);
  }
Так вот пойдёт?
 
conys:
Так вот пойдёт?

Да, спасибо. Работает.

 
maxtor писал (а):



Только уберите лишние обьявленные переменные, если они не нужны. Я не стал удолять, потому что не знаю нужны они вам или нет.
 
conys:
maxtor писал (а):



Только уберите лишние обьявленные переменные, если они не нужны. Я не стал удолять, потому что не знаю нужны они вам или нет.


Спасибо, conys

Еще просьба есть

а не могли бы дописать блок закрытия ордеров в заданное время?

Заранее благодарю

Причина обращения: