Скачать MetaTrader 5

как исправить код, чтобы следующий ордер открывался позже предыдущего на одну минуту

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
На MQL5.community есть возможность хранить исходные коды в MQL5 Storage. Попробуй сам!
pako
3309
pako 2011.10.24 15:55 
//--------------------------------------------------------------------
// Open_Ord.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция открытия одного рыночного ордера указанного типа
// Глобальные переменные:
// int Mas_Tip                Массив типов ордеров
// int StopLoss               Значение StopLoss   (количество пунктов)
// int TakeProfit             Значение TakeProfit (количество пунктов)
//--------------------------------------------------------------- 2 --
int Open_Ord(int Tip)
  {
   int    Ticket,                        // Номер ордера
          MN;                            // MagicNumber
   double SL,                            // StopLoss (относит.знач.цены)
          TP;                            // TakeProf (относит.знач.цены)
//--------------------------------------------------------------- 3 --
   while(Mas_Tip[Tip]<2)                // До тех пор, пока  ..
     {                                   //.. не достигнут успех
      if (StopLoss<Level_new)            // Если меньше допустимого..
         StopLoss=Level_new;             // .. то допустимый
      if (TakeProfit<Level_new)          // Если меньше допустимого..
         TakeProfit=Level_new;           // ..то допустимый
      MN=TimeCurrent();                  // Простой MagicNumber
      Inform(13,Tip);                    // Сообщение о попытке откр
      if (Tip==0)                        // Будем открывать Buy
        {
         SL=Bid - StopLoss*  Point;      // StopLoss   (цена)
         TP=Bid + TakeProfit*Point;      // TakeProfit (цена)
         Ticket=OrderSend(Symbol(),0,Lots_New,Ask,2,SL,TP,"",MN);
        }
      if (Tip==1)                        // Будем открывать Sell
        {
         SL=Ask + StopLoss*  Point;      // StopLoss   (цена)
         TP=Ask - TakeProfit*Point;      // TakeProfit (цена)
         Ticket=OrderSend(Symbol(),1,Lots_New,Bid,2,SL,TP,"",MN);
        }
      //--------------------------------------------------------- 4 --
      if (Ticket<0)                       // Не получилось :( 
        {                                 // Поинтересуемся ошибками:
         if(Errors(GetLastError())==false)// Если ошибка непреодолимая
            return;                       // .. то уходим.
        }
      Terminal();                         // Функция учёта ордеров 
      Events();                           // Отслеживание событий
     }
//--------------------------------------------------------------- 5 --
   return;                                // Выход из пользов. функции
  }
//--------------------------------------------------------------- 6 --
Igor Chemodanov
782
Igor Chemodanov 2011.10.24 18:08  
charony:


Вот фукция для коротких позиций:

//---- Проверка времени закрытия последнего ордера Sell
bool CheckTimeClosedOrdersSell(int i)
 {
  int t=0;
  for (int j=0; j<OrdersHistoryTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_HISTORY);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() == OP_SELL)
       {
        int r=OrderCloseTime();
        if (r>t)
         {
          t=r;
         }
       }
     }
   }
  if (t>=iTime(Symbol(),0,i)) return(true);
  return(false);
 }
//----
для длинных позиций:

//---- Проверка времени закрытия последнего ордера Buy
bool CheckTimeClosedOrdersBuy(int i)
 {
  int t=0;
  for (int j=0; j<OrdersHistoryTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_HISTORY);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() == OP_BUY)
       {
        int r=OrderCloseTime();
        if (r>t)
         {
          t=r;
         }
       }
     }
   }
  if (t>=iTime(Symbol(),0,i)) return(true);
  return(false);
 }
//----

i - номер бара, для текущего - i=0, Вам нужно заменить " if (t>=iTime(Symbol(),0,i)) return(true)" на " if (t>=TimeCurrent()+60) return(true) "

pako
3309
pako 2011.10.24 18:45  


это только для закрытых ордеров, могут быть и открытые, можно поменять OrdersHistoryTotal на OrdersTotal

и OrderCloseTime на OrderOpenTime

это будет для открытых ордеров

как правильно вставить эту функцию в код?

Igor Chemodanov
782
Igor Chemodanov 2011.10.24 18:50  
charony:

это только для закрытых ордеров, могут быть и открытые, можно поменять OrdersHistoryTotal на OrdersTotal это будет для открытых ордеров.

как правильно вставить эту функцию в код?


Поажалуйста, уточните задачу: какие события Вам нужны?
pako
3309
pako 2011.10.24 18:55  

по коду могут открыться 2 ордера sell и 2 ордера buy,

мне нужно чтобы после открытия 1 буй, 2 буй мог открыться только после

определенного промежутка времени, например 60 секунд

pako
3309
pako 2011.10.24 19:01  

там по коду MN=TimeCurrent();

т.е. время открытия ордера равно магик

тогда

If (( TimeCurrent()-MN)>60)

Igor Chemodanov
782
Igor Chemodanov 2011.10.24 19:15  
charony:

по коду могут открыться 2 ордера sell и 2 ордера buy,

мне нужно чтобы после открытия 1 буй, 2 буй мог открыться только после

определенного промежутка времени, например 60 секунд


Т.е. нужно "доливаться" через минуту?
pako
3309
pako 2011.10.24 19:43  
можно и так сказать,
BBC
1627
BBC 2011.10.24 19:50  

Вставьте перед операцией открытия ордера:

    static datetime LastOpenTime;
    if(TimeCurrent()- LastOpenTime<60)return(0);

а следом за {OrderSend(.....); LastOpenTime=TimeCurrent();}

pako
3309
pako 2011.10.24 20:21  

//--------------------------------------------------------------- 2 --
int Open_Ord(int Tip)
{
int Ticket,
MN;
double SL,
TP;
//--------------------------------------------------------------- 3 -
while(Mas_Tip[Tip]<2)
{
if (StopLoss<Level_new)
StopLoss=Level_new;
if (TakeProfit<Level_new)
TakeProfit=Level_new;
MN=TimeCurrent();
Inform(13,Tip);
static datetime LastOpenTime;
if(TimeCurrent()- LastOpenTime<360)return(0);
if (Tip==0 )
{
SL=Bid - StopLoss* Point;
TP=Bid + TakeProfit*Point;
Ticket=OrderSend(Symbol(),0,Lots_New,Ask,2,SL,TP,"",MN);
LastOpenTime=TimeCurrent();
}
static datetime LastOpenTime;
if(TimeCurrent()- LastOpenTime<360)return(0);
if (Tip==1 )
{
SL=Ask + StopLoss* Point;
TP=Ask - TakeProfit*Point;
Ticket=OrderSend(Symbol(),1,Lots_New,Bid,2,SL,TP,"",MN);
LastOpenTime=TimeCurrent();
}
//--------------------------------------------------------- 4 --
if (Ticket<0)
{
if(Errors(GetLastError())==false)
return;
}
Terminal();
Events();
}
//--------------------------------------------------------------- 5 --
return;
}
//--------------------------------------------------------------- 6 --
pako
3309
pako 2011.10.24 20:26  

если вставляю только на буй или селл, то все равно открывает 2 ордера одновременно,

поставил время 360 сек, все равно открывает 2 ордера одновременно,

если вставляю на буй и селл,то компилятор ругается

'LastOpenTime' - variable already defined C:\Program Files\Ava MetaTrader\experts\include\Open_Ord.mqh (35, 23)

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