Если Вас удовлетворит только указание на ошибки, то я объясню.
Во-первых, открытие или закрытие ордеров у Вас происходит, если тик поступил только в ту секунду, которая указана у Вас (в первую секунду начала минуты). Если пропустил - условие не выполнится.
Во вторых, Вы не проверяете, а открыт ли у Вас вообще какой-нибудь ордер или нет, а сразу идете на закрытие, отсюда и ошибка 4108.
//+------------------------------------------------------------------+ //| Проба01.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "" extern string TimeTrade1 = "00:01"; extern string TimeTrade2 = "00:07"; extern string CloseTime1 = "13:00"; extern string CloseTime2 = "13:07"; int ticket, total, bb=0,ss=0; //---- input parameters int start() { total=OrdersTotal(); if (TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+CloseTime1)&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+CloseTime2) ) { for (int i=total;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) {OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); bb=0;}} for (i=total;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) {OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);ss=0;}} } if (TimeCurrent()>=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade1)&& TimeCurrent()<StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeTrade2)) { if(iStochastic(NULL,15,5,3,3,MODE_SMA,0,MODE_MAIN,0)>=50 && bb==0) { ticket=OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",0,0,Blue); bb=1; } if(iStochastic(NULL,15,5,3,3,MODE_SMA,0,MODE_MAIN,0)<50 && ss==0 ) { ticket=OrderSend("GBPUSD",OP_SELL,0.1,Bid,3,Ask+100*Point,Bid-130*Point,"Order Open",0,0,Red); ss=1; } } return; }
Исправил, ошибку уже не выбивает но сделок все равно сколько нужно не открывает!!!!
Вероятно, прежде, чем менять значение переменных (bb, ss), нужно проверять значение ticket, чтобы убедиться, что ордер открылся. Например, так
ticket=OrderSend("GBPUSD",OP_BUY,0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",0,0,Blue);
if (ticket >= 0) bb=1;
То же, с ss
добавлю - лучше использовать более общую конструкцию:
goodopen=OrderSend(Symbol(), OP_BUY, 0.1,Ask,3,Bid-100*Point,Ask+130*Point,"Order Open",0,0,Blue);
if (goodopen < 0) {
Print("Ошибка открытия Buy: ", GetLastError());
// другие действия при ошибке по вкусу - типа Алерта
}
else {
bb=1;
Sleep(777);
// удачное открытие - что ещё добавить хотите, например Print("Bay открылся, поздравляю!");
}
RefreshRates();
аналогично конструкцию на закрытие ордера - тоже не всегда может закрываться (тот же реквот), а вв присвоится в 0 и новый откроется.
и вообще совет - ВСЕ действия с ордерами проверяете выполнение. иначе тестер не покажет, а реал - сольет.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Советник из 100% сделок открывает примерно только 10%
Пишет:
ERR_INVALID_TICKET
Неверный номер тикета