Вычислить конец недели - страница 2

 
Господа, у меня похожая проблема, тоже связаная со временем. Может кто нибудь помоч ? А то я вообще что то запутался, в индюшках не силён (
 
Может быть кто-то подскажет более конкретно по этой теме, так чтобы срабатывало по правилу: в пятницу в 19 часов закрываются все сделки и эксперт перестаёт торговать, а в понедельник в 6 часов возобновляет работу. И как встроить функцию CheckTradeTime() в код готового эксперта?
 
BARS >>:
Господа, у меня похожая проблема, тоже связаная со временем. Может кто нибудь помоч ? А то я вообще что то запутался, в индюшках не силён (

в чем суть пролемы ?

 
Kishar >>:
Может быть кто-то подскажет более конкретно по этой теме, так чтобы срабатывало по правилу: в пятницу в 19 часов закрываются все сделки и эксперт перестаёт торговать, а в понедельник в 6 часов возобновляет работу. И как встроить функцию CheckTradeTime() в код готового эксперта?
int start() {

  if (!CheckTradeTime() && OrdersTotal() > 0) ЗакрытьПозиции();
  if (!CheckTradeTime()) return(0);
...
...
}
 
Есть вот такой код. Принцип его работы заключается в том, что в пятницу в заданное время он закрывает ордера, удаляет отложенные ордера и прекращает торговать. Проверено, работает. Но в последующий понедельник он уже не торгует. Кто подскажет, что нужно сделать, чтобы советник снова начал торговать в понедельник в определенное время?
extern int       StopHour=21;
   extern int       StopMinute=00;
  
   #define Friday 5
   datetime LastTradeTime;
   //+------------------------------------------------------------------+
   //| expert initialization function                                   |
   //+------------------------------------------------------------------+
   int init()
     {
     LastTradeTime = CurTime()-24*60*60;    
     return(0);
     }
  //+------------------------------------------------------------------+
  //| expert start function                                            |
  //+------------------------------------------------------------------+
   int start()
     {
     // проверим, не закрывали ли мы все уже сегодня
     // если да - выходим
     if (TimeDayOfYear(CurTime())==TimeDayOfYear(LastTradeTime)) return(0);
     // если не пятница - выходим
     if (DayOfWeek()!=Friday) return(0);
     // проверим, не наступило ли время закрывать позиции
     if (((TimeHour(CurTime())==StopHour)&&(TimeMinute(CurTime())>=StopMinute))
         ||(TimeHour(CurTime())>StopHour))
     {
     // закроем все позиции и удалим ордера
     while (OrdersTotal()>0)
     {
     // выделим первую позицию или ордер в списке
     if (!OrderSelect(0, SELECT_BY_POS)) break; // в случае неудачи выйти из цикла
     // если отложенный ордер, то удалить
     if (OrderType()>OP_SELL)
      {
     if (!OrderDelete(OrderTicket())) 
      {
     Print("Ошибка ", GetLastError()," при удалении отложенного ордера ", 
     OrderTicket());
     break;
     }
     }
     // если открытая позиция, то закрыть
     else
     {
     double price;
     if (OrderType()==OP_SELL) 
     price = MarketInfo(OrderSymbol(), MODE_ASK);
     else
     price = MarketInfo(OrderSymbol(), MODE_BID);     
     if (!OrderClose(OrderTicket(), OrderLots(), price, 3))
     {
     Print("Ошибка ", GetLastError()," при закрытии позиции ", OrderTicket());
     break;
     }
     } 
    // пауза 10 секунд
     Sleep(10000);
     }
     if (OrdersTotal()==0) LastTradeTime = CurTime(); 
     }
      return(0);
     }
  
 

Kishar >>:
Есть вот такой код. Принцип его работы заключается в том, что в пятницу в заданное время он закрывает ордера, удаляет отложенные ордера и прекращает торговать. Проверено, работает. Но в последующий понедельник он уже не торгует. Кто подскажет, что нужно сделать, чтобы советник снова начал торговать в понедельник в определенное время?

Дмитрий, вот этот фрагмент

// если не пятница - выходим
if (DayOfWeek()!=Friday) return(0);

выполняется в теле функции start(), поэтому в любой день, кроме пятницы, работа советника на этом и остановится. Вам надо оформить код в виде отдельной функции, которая будет вызываться из start(), и тогда получите то, что хотели.

 
keekkenen >>:

как на счет этого ?

int start() {
  // если наступила пятница  и есть открытые ордера - закрыть их
  if (!CheckTradeTime() && OrdersTotal() > 0) ЗакрытьПозиции();
  
 // если наступила пятница - не работаем
  if (!CheckTradeTime()) return(0);


// получаем условия для трала - тралим
...
// получаем условия для закрытия позиций - закрываем
...
//получаем условия для открытия позиций - открываем ордера
...
}

 
Everlost >>:

Дмитрий, вот этот фрагмент

// если не пятница - выходим
if (DayOfWeek()!=Friday) return(0);

выполняется в теле функции start(), поэтому в любой день, кроме пятницы, работа советника на этом и остановится. Вам надо оформить код в виде отдельной функции, которая будет вызываться из start(), и тогда получите то, что хотели.

Чтоб все так просто. Этот советник предназначен для закрытия в пятницу, и все, ни для чего другого.

 

Привожу работающий код, когда эксперт в пятницу в 21-00 закрывает ордера, удаляет отложенные и прекращает работу, в понедельник в 00-00 снова начинает торговать. Время можно поменять, кому как нравится.

#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Friday 5
   datetime LastTradeTime;
   //+------------------------------------------------------------------+
   //| expert initialization function                                   |
   //+------------------------------------------------------------------+
   int init()
     {
     LastTradeTime = CurTime()-24*60*60;    
     return(0);
     }
  //+------------------------------------------------------------------+
  //| expert start function                                            |
  //+------------------------------------------------------------------+
   int start()
    
  {  
  total = OrdersTotal();
  
  
  if(total > 0)   ClosePosition();  
  if (TimeDayOfYear(CurTime())==TimeDayOfYear(LastTradeTime)) return(0);
  if (DayOfWeek()==5) 
  if (((TimeHour(CurTime())==19)&&(TimeMinute(CurTime())>=20))||(TimeHour(CurTime())>20))
  {
  while (OrdersTotal()>0)
  {
  if (!OrderSelect(0, SELECT_BY_POS)) break; 
  if (OrderType()>OP_SELL)
  {
  if (!OrderDelete(OrderTicket())) 
  {
  Print("Ошибка ", GetLastError()," при удалении отложенного ордера ", 
  OrderTicket());
  break;
  }
  }
  else
  {
  double price;
  if (OrderType()==OP_SELL) 
  price = MarketInfo(OrderSymbol(), MODE_ASK);
  else
  price = MarketInfo(OrderSymbol(), MODE_BID);     
  if (!OrderClose(OrderTicket(), OrderLots(), price, 3))
  {
  Print("Ошибка ", GetLastError()," при закрытии позиции ", OrderTicket());
  break;
  }
  } 
  Sleep(10000);
  }
  if (OrdersTotal()==0) LastTradeTime = CurTime(); 
  }
  
  
  if((total < 1) &&   (DayOfWeek()==5) ||(DayOfWeek()==3) || (DayOfWeek()==4) || (DayOfWeek()==2) || (DayOfWeek()==1) && (((TimeHour(CurTime())>00)&&(TimeMinute(CurTime())>00))
         ||(TimeHour(CurTime())>00)))     
    OpenPosition();
 

Извиняюсь! Сейчас время закрытия и отключения стоит 19-20 и 20. Надо исправить на

if (((TimeHour(CurTime())==21)&&(TimeMinute(CurTime())>=00))||(TimeHour(CurTime())>21))
Причина обращения: