Скачать MetaTrader 5

Время между закрытиями

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не нашел нужную программу? Закажи ее!
Forex Trader
114255
Forex Trader 2005.09.13 10:03 
Необходимо закрыть сделку с учетом предыдущего закрытия(например, открыто несколько покупок, нужно закрыть каждую по одинаковому условию, но между закрытиями должно пройти не менее 2 часов). Попробовала так, не работает(закрывает все сразу):
int LTZ=0;
{
OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
if (
OrderCloseTime()>LTZ && //находим последнее закрытие
Symbol()== OrderSymbol()) // по данной валютной паре
{
LTZ=OrderCloseTime();
}
}

if ( LTZ == 0 )//если нет закрытых ордеров

{
.............//условия для закрытия
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
}
}

else // есть закрытые ордера
{
.............//условия для закрытия
&& CurTime()-LTZ >= 7200 //разница во времени между закрытиями

{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
}
}
}
Подскажите, пожалуйста, что не так?
С уважением, Елена
Forex Trader
114255
Forex Trader 2005.09.13 12:34  
вставляем код в эксперт (уже давал ссылку там что-то не понятно?)
//-------------------------------------------------------------------+
// Функция возвращающая время последнего открытого(закрытого) ордера |
// если возвращено -1 (ошибка выполнения), 0-ордера не обнаружено,   |
// положительное значение = искомому времени ордера                  |
//-------------------------------------------------------------------+
int CheckLastOrderTime (string mSymbol, int select, int mode_price)
  //на входе три значения
  //1. наименование инструмента
  //2. смотреть в истории(закрытые) или действующие ордера (соответственно 0 и 1)
  //3. смотреть цену открытия или закрытия (соответственно 0 и 1)
  {
//---- 
   int oTotal=0; //хранит значение количества ордеров (истории или действующие)
   int co; //хранит значение номера текущего ордера
   datetime LastTime=0;
   //проверка корректности переданных функции значений
   if((select>1 || select<0) || (mode_price<0 || mode_price>1))
   {
      Print("Неверно переданные параметры (функция CheckLastOrderTime)");
      return(-1);
   }
   if(select!=1) //если нужно смотреть в истории закрытых ордеров
   {
      oTotal=HistoryTotal();
      for(co=0;co<oTotal;co++) // цикл по ордерам
      {
         if(m_OSelect(co,SELECT_BY_POS,MODE_HISTORY,100)!=-1) //делаем 100 попыток ордер селект
         {
            if(mSymbol==OrderSymbol())
            {
               if(LastTime==0) LastTime=1; //ордер в наличии
               if(mode_price!=1) //если нужно смотреть не время закрытия (открытия)
               {
                  if(LastTime<OrderOpenTime()) LastTime=OrderOpenTime();
               }
               else //иначе смотрим время закрытия
               {
                  if(LastTime<OrderCloseTime()) LastTime=OrderCloseTime();
               }
            }
         }
         else
         {
            Alert("Возникла ошибка , см. журнал!");
            return(-1);
         }
      }
   }
   else //иначе смотрим действующие ордера
   {
      oTotal=OrdersTotal();
      for(co=0;co<oTotal;co++) // цикл по ордерам
      {
         if(m_OSelect(co,SELECT_BY_POS,MODE_TRADES,100)!=-1) //делаем 100 попыток ордер селект
         {
            if(mSymbol==OrderSymbol())
            {
               if(LastTime==0) LastTime=1; //ордер в наличии
               if(mode_price!=1) //если нужно смотреть не время закрытия (открытия)
               {
                  if(LastTime<OrderOpenTime()) LastTime=OrderOpenTime();
               }
               else
               {
                  Alert("Неверно переданный параметр! Ордер еще в действии.");
               }
            }
         }
         else
         {
            Alert("Возникла ошибка , см. журнал!");
            return(-1);
         }
      }
   }
//----
   return(LastTime);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток ордер селект           |
//+------------------------------------------------------------------+
int m_OSelect(int ct, int sel, int pool, int Attempt)
  {
   int i;
//---- 
//ордер селект за Attempt попыток
   for(i=0;i<Attempt;i++)
   {
      if( OrderSelect(ct,sel,pool)==1 ) //если ордер выбран
      {
         Print( "Попытка ордер селект удачна "+OrderTicket() );
         return(1);//завершаем функцию
      }
   }
   Alert( "Код ошибки - "+GetLastError() );
   Alert("Невозможно ордер селект! Сделано "+Attempt+" попыток.");
//---- 
   return(-1);
  }
//-------------------------------------------------------------------------------------------------



в эксперте пишем

//если с последнего закрытия по текущему инструменто не прошло 2х часов
if( CurTime()-CheckLastOrderTime(NULL,0,1)<2*60*60 )
{
...... здесь можно уснуть, или просто выйти
}
//иначе
else
{
...... а здесь проверка на условия выхода из сделки (кроме условия по времени) и выход (если нужно)
}
Forex Trader
114255
Forex Trader 2005.09.13 13:09  
Спасибо большое! Я разобралась.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий