Для решения вопроса достаточно отлавливать факт открытия нового бара.
Если же принципиальна, то можно перед соответствующей торг. операцией поставить задержку Sleep(60000) или запомнить время открытия нового бара и анализировать текущее время, и по прошествии минуты осуществлять решение.
//----------------------------------------------------------------------------- Новый бар ---- New_Bar = 0; // Для начала обнулимся if (Time_0 != Time[0]) // Если уже другое время начала бара { New_Bar = 1; // А вот и новый бар Time_0 = Time[0]; // Запомним время начала нового бара } //-------------------------------------------------------------------------------------------- if(New_Bar == 1) { ... // Торговые операци } //--------------------------------------------------------------------------------------------Насколько я понимаю, минута паузы здесь не принципиальна.
Если же принципиальна, то можно перед соответствующей торг. операцией поставить задержку Sleep(60000) или запомнить время открытия нового бара и анализировать текущее время, и по прошествии минуты осуществлять решение.
Почему не получается?
//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| https://www.metaquotes.net// | //+------------------------------------------------------------------+ extern double TakeProfit = 400; extern double Lots = 0.1; extern double TrailingStop = 100; extern double KPeriod=5; extern double DPeriod=3; extern double Slowing=3; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double STOCHDO, STOCHnow, New_Bar, Time_0; int cnt=0, ticket, total; // первичные проверки данных // важно удостовериться что эксперт работает на нормальном графике и // пользователь правильно выставил внешние переменные (Lots, StopLoss, // TakeProfit, TrailingStop) // в нашем случае проверяем только TakeProfit if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // проверяем TakeProfit } // ради упрощения и ускорения кода, сохраним необходимые // данные индикаторов во временных переменных STOCHDO=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1); STOCHnow=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0); New_Bar = 0; // Для начала обнулимся total=OrdersTotal(); if(total<1) { // нет ни одного открытого ордера if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // проверяем на возможность встать в длинную позицию (BUY) if(Time_0 != Time[0])//STOCHDO<STOCHnow) { New_Bar = 1; // А вот и новый бар Time_0 = Time[0]; // Запомним время начала нового бара } if(New_Bar == 1) Sleep(60000); { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ADX sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // проверяем на возможность встать в короткую позицию (SELL) if(Time_0 != Time[0])//STOCHDO<STOCHnow) { New_Bar = 1; // А вот и новый бар Time_0 = Time[0]; // Запомним время начала нового бара } if(New_Bar == 1) Sleep(60000); { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "ADX sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } // переходим к важной части эксперта - контролю открытых позиций // 'важно правильно войти в рынок, но выйти - еще важнее...' for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL OrderSymbol()==Symbol()) // инструмент совпадает? { if(OrderType()==OP_BUY) // открыта длинная позиция { // проверим, может уже пора закрываться? if(Close[0]) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию return(0); // выходим } // проверим - может можно/нужно уже трейлинг стоп ставить? if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green); return(0); } } } } else // иначе это короткая позиция { // проверим, может уже пора закрываться? if(Close[0]) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию return(0); // выходим } // проверим - может можно/нужно уже трейлинг стоп ставить? if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // конец.
if(New_Bar == 1) Sleep(60000); {На новом баре только то и делается, что выдерживается минутная пауза.
Небрежное и неаккуратное программирование часто приводит к алгоритмическим ошибкам.
Выровняйте код, разделите его на логческие фрагменты, напишите комментарии.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Результат таков:
Buy 1числа в 00:00
Close 2числа в 00:00
Buy 3числа в 00:00
Close 4числа в 00:00
Как сделать
Buy 1числа в 00:01
Close 2числа в 00:00
Buy 2числа в 00:01
Close 3числа в 00:00
Buy 3числа в 00:01
Close 4числа в 00:00