У тебя проверка времени выполняется в непрерывном цикле и грузит систему на 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 для полученного значения.
Упс... В скриптах Hour() и Minute() не меняются. Поэтому у тебя в примере было правильно: надо вызывать TimeCurrent, а потом TimeHour и TimeMinute для полученного значения.
C TimeCurrent() также будет. Надо RefreshRates() вызывать в самом начале цикла, и будет все нормально, если не считать что времени 18:42 может не быть вообще в какой-нибудь день.
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)); } }Ещё, кстати, автору темы нужна проверка на наличие уже открытых ордеров: иначе они будут открываться пачками пока не закончится минута.
А чтобы советник срабатывал 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);
}
Всем спасибо. Дело действительно было в мелочах - нужно было делать RefreshRates, а в случае с советником - просто разрешить его работу (разобрали пол машины - выяснилли что кончился бензин :-)
А чтобы советник срабатывал 1 раз после открытий ордеров я думаю достаточно вызвать бункцию deinit()
Я все же остановился на скрипте...
Андрей, и как, работает ваш скрипт?
Скрипт работает как часы.
Однако возникла необходимость сочинить советника. Пытаюсь нацчится выгружать советника :-)
А у меня не работает посмотрите здесь 'Скрипт не открывает ордер по заданному времени' .
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Пршу дать рабочий код для скрипта или советника, который бы в заданное время открывал по рыночной цене ордер на продажу и ордер на покупку.
Пытался справится своими силами, но не получается - чтото не учел. В виде советника не работает вообще, а в виде скриипта грузит систему и произвольно появляются ошибки 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);
}