Открытие ордера по заданому времени

 

Здравствуйте.

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

Пытался справится своими силами, но не получается - чтото не учел. В виде советника не работает вообще, а в виде скриипта грузит систему и произвольно появляются ошибки 129 и 130, хотя иногда это работает. Мой код:

int start()
{ int e,f;
f=0;
while (f<2)
{ f=0;
e=TimeCurrent( ) ;
if (TimeHour(e)==18) f=f+1;
if (TimeMinute (e)==42) f=f+1;
}
OrderSend("EURUSD",OP_BUY,0.1,Ask,10,Bid-75*Point,Bid+9*Point,NULL,0,0,Red);
Print (GetLastError());
OrderSend("EURUSD",OP_SELL,0.1,Bid,10,Bid+75*Point,Bid-9*Point,NULL,0,0,Red);
Print (GetLastError());
//----
return(0);
}



 

У тебя проверка времени выполняется в непрерывном цикле и грузит систему на 100%))

Ошибки 129-130 появляются, т.к. цены Ask/Bid c момента первого и единственного вызова start давно изменились.

Вариант для советника:

extern int OpenHH = 18;
extern int OpenMM = 42;
int start() {
  if (Hour() != OpenHH || Minute() != OpenMM) return(0);
    //время еще не пришло - выходим и ждем следующего вызова функции start
  OrderSend("EURUSD",OP_BUY,0.1,Ask,10,Bid-75*Point,Bid+9*Point,NULL,0,0,Red);
  Print (GetLastError());
  OrderSend("EURUSD",OP_SELL,0.1,Bid,10,Bid+75*Point,Bid-9*Point,NULL,0,0,Red);
  Print (GetLastError());
  return(0);
}

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

Добавим обновление котировок перед выставлением ордера и паузу между проверками времени:

int start() {
  while (!IsStopped()) { //выполняется пока скрипт не остановлен
    Sleep(1000); 
    if (Hour() != OpenHH || Minute() != OpenMM) continue;
      //время еще не пришло - переходим в начало цикла и ждем 1с.
    RefreshRates(); //обновляем котировки  
    OrderSend("EURUSD",OP_BUY,0.1,Ask,10,Bid-75*Point,Bid+9*Point,NULL,0,0,Red);
    Print (GetLastError());
    OrderSend("EURUSD",OP_SELL,0.1,Bid,10,Bid+75*Point,Bid-9*Point,NULL,0,0,Red);
    Print (GetLastError());
    return(0); //если оставить эту строку позиции откроются только 1 раз
  }  
}
 

Упс... В скриптах Hour() и Minute() не меняются. Поэтому у тебя в примере было правильно: надо вызывать TimeCurrent, а потом TimeHour и TimeMinute для полученного значения.

 
Для изучения e-OpenByTime
 
Ritter писал (а) >>

Упс... В скриптах Hour() и Minute() не меняются. Поэтому у тебя в примере было правильно: надо вызывать TimeCurrent, а потом TimeHour и TimeMinute для полученного значения.

C TimeCurrent() также будет. Надо RefreshRates() вызывать в самом начале цикла, и будет все нормально, если не считать что времени 18:42 может не быть вообще в какой-нибудь день.

 
Integer
писал (а)
>>
C TimeCurrent() также будет. Надо RefreshRates() вызывать в самом начале цикла, и будет все нормально, если не считать что времени 18:42 может не быть вообще в какой-нибудь день.

Неправда)) Вот такой скрипт работает и без RefreshRates:

int start() {
  int e;
  while (!IsStopped()) { 
    //RefreshRates(); 
    Sleep(1000); 
    e = TimeCurrent();
    Print("Time: ", TimeHour(e), ":", TimeMinute(e), ":", TimeSeconds(e));
  }  
}
Ещё, кстати, автору темы нужна проверка на наличие уже открытых ордеров: иначе они будут открываться пачками пока не закончится минута.
 
Точно. Работает!
 
Всем спасибо. Дело действительно было в мелочах - нужно было делать RefreshRates, а в случае с советником - просто разрешить его работу (разобрали пол машины - выяснилли что кончился бензин :-)
               А чтобы советник срабатывал 1 раз после открытий ордеров я думаю достаточно вызвать бункцию deinit()
Я все же остановился на скрипте...

int start()
{
int H=12, M=20;
while (!IsStopped()) { //выполняется пока скрипт не остановлен
Sleep(1000);
if (TimeHour(TimeCurrent( ) ) != H || TimeMinute(TimeCurrent( ) ) != M) continue;
//время еще не пришло - переходим в начало цикла и ждем 1с.
RefreshRates(); //обновляем котировки
OrderSend("EURUSD",OP_BUY,0.1,Ask,3,Bid-75*Point,Bid+9*Point,NULL,0,0,Red);
Print (GetLastError());
OrderSend("EURUSD",OP_SELL,0.1,Bid,3,Bid+75*Point,Bid-9*Point,NULL,0,0,Red);
Print (GetLastError());
return(0); //если оставить эту строку позиции откроются только 1 раз
}
return(0);
}
 
Andrey1771 писал (а) >>
Всем спасибо. Дело действительно было в мелочах - нужно было делать RefreshRates, а в случае с советником - просто разрешить его работу (разобрали пол машины - выяснилли что кончился бензин :-)
А чтобы советник срабатывал 1 раз после открытий ордеров я думаю достаточно вызвать бункцию deinit()
Я все же остановился на скрипте...

Андрей, и как, работает ваш скрипт?
 
Geronimo писал (а) >>

Скрипт работает как часы.

Однако возникла необходимость сочинить советника. Пытаюсь нацчится выгружать советника :-)

 
Andrey1771 писал (а) >>

Скрипт работает как часы.

Однако возникла необходимость сочинить советника. Пытаюсь нацчится выгружать советника :-)

А у меня не работает посмотрите здесь 'Скрипт не открывает ордер по заданному времени' .

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