Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+------------------------------------------------------------------+ //| ClosePositions.mq4 | //| http://www.metaquotes.net | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "http://www.metaquotes.net" #property link "http://www.metaquotes.net" extern double Lots = 0.1; extern int TakeProfit = 500; extern int StopLoss = 500; static int magicNumber = 23456; bool AllowTrade,ClosePositions,flag; datetime LastTrade,PrevTime; int CountBars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { AllowTrade=true; ClosePositions=false; flag=true; LastTrade=CurTime(); PrevTime=Time[0]; CountBars=0; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if ((Year()<2005) || (Month()<6)) return (0); bool OpenSell=false,OpenBuy=false,NewBar=false; double TP =0,SL=0,price=0; //+------------------------------------------------------------------------------------------------+ //| Модуль счетчика баров //+------------------------------------------------------------------------------------------------+ //Отфильтрововаем бары от ценовых тиков if (Time[0]>PrevTime) { CountBars=CountBars+1; NewBar=True; PrevTime=Time[0]; } //+------------------------------------------------------------------------------------------------+ //| Конец модуля счетчика баров //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Если счетчик сосчитал до 10, прекращаем открытие поций и даём команду на закрытие всех поций //+------------------------------------------------------------------------------------------------+ if (CountBars>10) { AllowTrade=false; ClosePositions=true; } //+------------------------------------------------------------------------------------------------+ //| //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Закрытие всех позиций //+------------------------------------------------------------------------------------------------+ if (ClosePositions) { int total,cnt; bool result; total=OrdersTotal(); cnt=0; for (cnt=total-1;cnt>=0;cnt--) { if ((CurTime()-LastTrade)<10) Sleep(10000); result=false; Print(" TotalCnt: ",cnt); if (OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES)) { Alert(" Удалось выбрать ордер: ",OrderType()," № ",OrderTicket()); if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY) && (OrderMagicNumber()== magicNumber)) { Print(" cnt: ",cnt); Print(" OrderTicket: ",OrderTicket()); RefreshRates(); result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5,Yellow); if (result) { LastTrade=CurTime();break; } else { Alert("Ордер ",OrderType()," № ",OrderTicket()," не удалось закрыть. Ошибка: " , GetLastError() ); } } } else { cnt=total; Alert(" Не удалось выбрать ордер: ",OrderType()," № ",cnt," Ошибка: ",GetLastError()); } } } //+------------------------------------------------------------------------------------------------+ //| Конец закрытия всех позиций //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Открытие позиции в начале каждого нового бара //+------------------------------------------------------------------------------------------------+ if (NewBar) { if (flag) { OpenBuy=true;flag=false; } else { OpenSell=true;flag=true; } } //+------------------------------------------------------------------------------------------------+ //| Конец открытия позиции в начале каждого нового бара //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Открытие позиций //+------------------------------------------------------------------------------------------------+ if (OpenSell && AllowTrade) { if ((CurTime()-LastTrade)<10) return (0); RefreshRates(); // Откроем отложенный ордер. /* price = NormalizeDouble(Ask+500*Point,Digits); SL = price - StopLoss * Point; TP = price + TakeProfit * Point; ticket=OrderSend(Symbol(), OP_BUYSTOP, Lots, price, 3, SL, TP, "OP_BUYSTOP", magicNumber, 0, Pink); LastTrade=CurTime(); Sleep(10000); RefreshRates(); */ // Откроем основной ордер. SL = NormalizeDouble(Bid,Digits) + StopLoss * Point; TP = NormalizeDouble(Bid,Digits) - TakeProfit * Point; // OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3,SL,TP,"OP_SELL",magicNumber,0,Blue); LastTrade=CurTime(); OpenSell=false; } if (OpenBuy && AllowTrade) { if ((CurTime()-LastTrade)<10) return (0); RefreshRates(); /* price = NormalizeDouble(Bid-500*Point,Digits); SL = price + StopLoss * Point; TP = price - TakeProfit * Point; OrderSend(Symbol(), OP_SELLSTOP, Lots, price, 3, SL, TP, "OP_SELLSTOP", magicNumber, 0, SkyBlue); LastTrade=CurTime(); Sleep(10000); RefreshRates(); */ SL = NormalizeDouble(Ask,Digits) - StopLoss * Point; TP = NormalizeDouble(Ask,Digits) + TakeProfit * Point; OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,SL,TP,"OP_BUY",magicNumber,0,Yellow); LastTrade=CurTime(); OpenBuy=false; } //+------------------------------------------------------------------------------------------------+ //| Конец открытия позиций //+------------------------------------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+Вот выдержка из протокола:
10:10:08 ClosePositions: loaded successfully
10:10:08 ClosePositions inputs: Lots=0.1; TakeProfit=500; StopLoss=500;
10:10:15 2005.06.01 00:00 ClosePositions: open #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 ok
10:10:15 2005.06.01 02:00 ClosePositions: open #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 ok
10:10:15 2005.06.01 04:00 ClosePositions: open #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
10:10:15 2005.06.01 06:00 ClosePositions: open #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 ok
10:10:15 2005.06.01 08:00 ClosePositions: open #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 5
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 5 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 4
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 5
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 4
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 5
10:10:15 2005.06.01 10:00 ClosePositions: close #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2306
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 4
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 4 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 3
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 3
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 3
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 3 не удалось закрыть. Ошибка: 2
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 2
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 4
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 2
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 4
10:10:15 2005.06.01 10:00 ClosePositions: close #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 at price 1.2306
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 3
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 3 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 2
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 2
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 2
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 2 не удалось закрыть. Ошибка: 2
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 3
10:10:15 2005.06.01 10:00 ClosePositions: close #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2307
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 2
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 2 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 1 не удалось закрыть. Ошибка: 2
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 2
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 2 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
10:10:15 2005.06.01 10:00 ClosePositions: cnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: OrderTicket: 2
10:10:15 2005.06.01 10:00 ClosePositions: close #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 at price 1.2304
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 1 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 1 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 1 Ошибка: 4105
10:10:15 2005.06.01 10:00 ClosePositions: TotalCnt: 1
10:10:15 2005.06.01 10:00 ClosePositions: Alert: Не удалось выбрать ордер: 0 № 1 Ошибка: 4105
Что не так я делаю? Все как по христоматии. Неужели ни у кого такого не было? Попробуйте у себя в конце концов. Очевидно, что глючит функция OrderSelect(), причем начинается это, когда ордеров остается меньше 10. Млин, в MQLII всё было просто, CloseOrder() и всё. А тут, запарила уже все мозги эта ваша MQL4. Облазил я весь ваш форум, но ничего подобного не нашёл. Похоже никто с такой проблемой не сталкивался.
13:00:32 ClosePositions: loaded successfully
13:00:32 ClosePositions inputs: Lots=0.1; TakeProfit=500; StopLoss=500;
13:00:40 2005.06.01 00:00 ClosePositions: open #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 ok
13:00:40 2005.06.01 02:00 ClosePositions: open #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 ok
13:00:40 2005.06.01 04:00 ClosePositions: open #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:00:40 2005.06.01 06:00 ClosePositions: open #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 ok
13:00:40 2005.06.01 08:00 ClosePositions: open #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 4
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 5
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 4
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 5
13:00:40 2005.06.01 10:00 ClosePositions: close #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2306
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 3
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 3
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 3 не удалось закрыть. Ошибка: 2
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 4
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 4
13:00:40 2005.06.01 10:00 ClosePositions: close #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 at price 1.2306
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 2
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 2 не удалось закрыть. Ошибка: 2
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 3
13:00:40 2005.06.01 10:00 ClosePositions: close #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2307
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 1
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 1 не удалось закрыть. Ошибка: 2
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 2
13:00:40 2005.06.01 10:00 ClosePositions: close #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 at price 1.2306
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 1
13:00:40 2005.06.01 10:00 ClosePositions: close #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 at price 1.2304
13:00:48 ClosePositions: removed
Что-то странно она как-то выберает - почему за OrderTicket: 5 идёт OrderTicket: 3 ? Мда, проблему удалось решить путём добавления: if (OrderTicket()!=cnt+1) break; Вообшем-то тему можно считать закрытой, однако имхо, функция OrderSelect работает не правильно:
//+------------------------------------------------------------------+ //| ClosePositions.mq4 | //| http://www.metaquotes.net | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "http://www.metaquotes.net" #property link "http://www.metaquotes.net" extern double Lots = 0.1; extern int TakeProfit = 500; extern int StopLoss = 500; static int magicNumber = 23456; bool AllowTrade,ClosePositions,flag; datetime LastTrade,PrevTime; int CountBars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { AllowTrade=true; ClosePositions=false; flag=true; LastTrade=CurTime(); PrevTime=Time[0]; CountBars=0; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if ((Year()<2005) || (Month()<6)) return (0); bool OpenSell=false,OpenBuy=false,NewBar=false; double TP =0,SL=0,price=0; //+------------------------------------------------------------------------------------------------+ //| Модуль счетчика баров //+------------------------------------------------------------------------------------------------+ //Отфильтрововаем бары от ценовых тиков if (Time[0]>PrevTime) { CountBars=CountBars+1; NewBar=True; PrevTime=Time[0]; } //+------------------------------------------------------------------------------------------------+ //| Конец модуля счетчика баров //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Если счетчик сосчитал до 10, прекращаем открытие поций и даём команду на закрытие всех поций //+------------------------------------------------------------------------------------------------+ if (CountBars>10) { AllowTrade=false; ClosePositions=true; } //+------------------------------------------------------------------------------------------------+ //| //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Закрытие всех позиций //+------------------------------------------------------------------------------------------------+ if (ClosePositions) { int total,cnt; bool result; total=OrdersTotal();cnt=0; for (cnt=total-1;cnt>=0;cnt--) { if ((CurTime()-LastTrade)<10) Sleep(10000); result=false; Print(" TotalCnt: ",cnt); if (OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES)) { if (OrderTicket()!=cnt+1) break; Alert(" Удалось выбрать ордер: ",OrderType()," № ",OrderTicket()); if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY) && (OrderMagicNumber()== magicNumber)) { Print(" cnt: ",cnt); Print(" OrderTicket: ",OrderTicket()); RefreshRates(); result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5,Yellow); if (result) { LastTrade=CurTime();break; } else { Alert("Ордер ",OrderType()," № ",OrderTicket()," не удалось закрыть. Ошибка: " , GetLastError() ); } } } else { cnt=total; Alert(" Не удалось выбрать ордер: ",OrderType()," № ",cnt," Ошибка: ",GetLastError()); } } } //+------------------------------------------------------------------------------------------------+ //| Конец закрытия всех позиций //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Открытие позиции в начале каждого нового бара //+------------------------------------------------------------------------------------------------+ if (NewBar) { if (flag) { OpenBuy=true;flag=false; } else { OpenSell=true;flag=true; } } //+------------------------------------------------------------------------------------------------+ //| Конец открытия позиции в начале каждого нового бара //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Открытие позиций //+------------------------------------------------------------------------------------------------+ if (OpenSell && AllowTrade) { if ((CurTime()-LastTrade)<10) return (0); RefreshRates(); // Откроем отложенный ордер. /* price = NormalizeDouble(Ask+500*Point,Digits); SL = price - StopLoss * Point; TP = price + TakeProfit * Point; ticket=OrderSend(Symbol(), OP_BUYSTOP, Lots, price, 3, SL, TP, "OP_BUYSTOP", magicNumber, 0, Pink); LastTrade=CurTime(); Sleep(10000); RefreshRates(); */ // Откроем основной ордер. SL = NormalizeDouble(Bid,Digits) + StopLoss * Point; TP = NormalizeDouble(Bid,Digits) - TakeProfit * Point; // OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3,SL,TP,"OP_SELL",magicNumber,0,Blue); LastTrade=CurTime(); OpenSell=false; } if (OpenBuy && AllowTrade) { if ((CurTime()-LastTrade)<10) return (0); RefreshRates(); /* price = NormalizeDouble(Bid-500*Point,Digits); SL = price + StopLoss * Point; TP = price - TakeProfit * Point; OrderSend(Symbol(), OP_SELLSTOP, Lots, price, 3, SL, TP, "OP_SELLSTOP", magicNumber, 0, SkyBlue); LastTrade=CurTime(); Sleep(10000); RefreshRates(); */ SL = NormalizeDouble(Ask,Digits) - StopLoss * Point; TP = NormalizeDouble(Ask,Digits) + TakeProfit * Point; OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,SL,TP,"OP_BUY",magicNumber,0,Yellow); LastTrade=CurTime(); OpenBuy=false; } //+------------------------------------------------------------------------------------------------+ //| Конец открытия позиций //+------------------------------------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+13:22:36 ClosePositions: loaded successfully
13:22:36 ClosePositions inputs: Lots=0.1; TakeProfit=500; StopLoss=500;
13:22:43 2005.06.01 00:00 ClosePositions: open #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 ok
13:22:43 2005.06.01 02:00 ClosePositions: open #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 ok
13:22:43 2005.06.01 04:00 ClosePositions: open #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:22:43 2005.06.01 06:00 ClosePositions: open #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 ok
13:22:43 2005.06.01 08:00 ClosePositions: open #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 4
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 5
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 4
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 5
13:22:43 2005.06.01 10:00 ClosePositions: close #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2306
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 4
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 4
13:22:43 2005.06.01 10:00 ClosePositions: close #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 at price 1.2304
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 2
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 2
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 3
13:22:43 2005.06.01 10:00 ClosePositions: close #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2303
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 1
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 1
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 2
13:22:43 2005.06.01 10:00 ClosePositions: close #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 at price 1.2301
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 0
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 0
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 1
13:22:43 2005.06.01 10:00 ClosePositions: close #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 at price 1.2302
13:24:57 ClosePositions: removed
Если будут ещё замечания или предложения по этой теме, буду рад услышать... Да, и вся байда появляется когда OrderTicket<10.
13:00:32 ClosePositions: loaded successfully
13:00:32 ClosePositions inputs: Lots=0.1; TakeProfit=500; StopLoss=500;
13:00:40 2005.06.01 00:00 ClosePositions: open #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 ok
13:00:40 2005.06.01 02:00 ClosePositions: open #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 ok
13:00:40 2005.06.01 04:00 ClosePositions: open #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:00:40 2005.06.01 06:00 ClosePositions: open #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 ok
13:00:40 2005.06.01 08:00 ClosePositions: open #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 4
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 5
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 4
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 5
13:00:40 2005.06.01 10:00 ClosePositions: close #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2306
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 3
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 3
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 3 не удалось закрыть. Ошибка: 2
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 4
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 4
13:00:40 2005.06.01 10:00 ClosePositions: close #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 at price 1.2306
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 2
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 2
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 2 не удалось закрыть. Ошибка: 2
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 3
13:00:40 2005.06.01 10:00 ClosePositions: close #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2307
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 1
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 1
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Ордер 0 № 1 не удалось закрыть. Ошибка: 2
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 2
13:00:40 2005.06.01 10:00 ClosePositions: close #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 at price 1.2306
13:00:40 2005.06.01 10:00 ClosePositions: TotalCnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
13:00:40 2005.06.01 10:00 ClosePositions: cnt: 0
13:00:40 2005.06.01 10:00 ClosePositions: OrderTicket: 1
13:00:40 2005.06.01 10:00 ClosePositions: close #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 at price 1.2304
13:00:48 ClosePositions: removed
Что-то странно она как-то выберает - почему за OrderTicket: 5 идёт OrderTicket: 3 ? Мда, проблему удалось решить путём добавления: if (OrderTicket()!=cnt+1) break; Вообшем-то тему можно считать закрытой, однако имхо, функция OrderSelect работает не правильно:
13:22:36 ClosePositions: loaded successfully
13:22:36 ClosePositions inputs: Lots=0.1; TakeProfit=500; StopLoss=500;
13:22:43 2005.06.01 00:00 ClosePositions: open #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 ok
13:22:43 2005.06.01 02:00 ClosePositions: open #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 ok
13:22:43 2005.06.01 04:00 ClosePositions: open #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:22:43 2005.06.01 06:00 ClosePositions: open #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 ok
13:22:43 2005.06.01 08:00 ClosePositions: open #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 ok
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 4
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 5
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 4
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 5
13:22:43 2005.06.01 10:00 ClosePositions: close #5 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2306
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 4
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 3
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 4
13:22:43 2005.06.01 10:00 ClosePositions: close #4 buy 0.10 EURUSD at 1.2318 sl: 1.1818 tp: 1.2818 at price 1.2304
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 2
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 3
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 2
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 3
13:22:43 2005.06.01 10:00 ClosePositions: close #3 buy 0.10 EURUSD at 1.2330 sl: 1.1830 tp: 1.2830 at price 1.2303
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 1
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 2
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 1
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 2
13:22:43 2005.06.01 10:00 ClosePositions: close #2 buy 0.10 EURUSD at 1.2305 sl: 1.1805 tp: 1.2805 at price 1.2301
13:22:43 2005.06.01 10:00 ClosePositions: TotalCnt: 0
13:22:43 2005.06.01 10:00 ClosePositions: Alert: Удалось выбрать ордер: 0 № 1
13:22:43 2005.06.01 10:00 ClosePositions: cnt: 0
13:22:43 2005.06.01 10:00 ClosePositions: OrderTicket: 1
13:22:43 2005.06.01 10:00 ClosePositions: close #1 buy 0.10 EURUSD at 1.2311 sl: 1.1811 tp: 1.2811 at price 1.2302
13:24:57 ClosePositions: removed
Если будут ещё замечания или предложения по этой теме, буду рад услышать... Да, и вся байда появляется когда OrderTicket<10.
Mda.. eto ze staryj fokus metaquotes: posle vypolnenija ordera ekspert dolzen zavershyt' rabotu. :-)
Krome tavo, posle poslednevo ordera dalzno proiti vremia bez orderov kak minimum minuta,- lu4e delat' 5 minut+.
Pri4iom zakryt/otkryt odnovremenno vsie ordera logi4no, no opiat' ze.. ni tak ustrojenna logika samoj kampaniji nas4iot neskol'ko orderov odnovremeno.
Vse iz za etavo delajut 1 order + exit + pauza 5 minut dlia drugovo ordera.
Так делают далеко не все. И зависимости, о кот. ты говоришь, не существует.
Не надо вводить юзеров в заблуждение.
и ты думаешь что эта конструкция будет работать в реале?
в тестере номера тикетов начинаются с 1, но реально это не так. да и в тестере твой код только для первых ордеров работает.
а для решения проблем с операциями по ордерам нужно использовать IsTradeAllowed()
Это я по-прежнему не понимаю:
if (result) { LastTrade=CurTime();//break; } else { Alert("Ордер ",OrderType()," № ",OrderTicket()," не удалось закрыть. Ошибка: " , GetLastError() ); }breake используют для изменения логики, у тебя он ни на что не влияет.
И тестер как-то странно работает, для каждого нового прогона на новом тайм-фреме требуется перезагрузка МТ4. Не получилось прогнать на часовке, на получасовке, на дневке, а потом и на 4-хчасовке тоже не смог. Попробовал тоже самое на моем первом попавшемся советнике - мой работает на любом таймфрейме и перезагрузки не требует.
Так что, разработчики могут у себя проверить.
На всякий случай выкладываю код (на случай, если ты свой изменишь)
//+------------------------------------------------------------------+ //| ClosePositions.mq4 | //| Registr | //| http://www.metaquotes.ru/forum/6405/ | //+------------------------------------------------------------------+ #property copyright "Registr" #property link "http://www.metaquotes.ru/forum/6405/" extern double Lots = 0.1; extern int TakeProfit = 500; extern int StopLoss = 500; static int magicNumber = 23456; bool AllowTrade,ClosePositions,flag; datetime LastTrade,PrevTime; int CountBars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { AllowTrade=true; ClosePositions=false; flag=true; LastTrade=CurTime(); PrevTime=Time[0]; CountBars=0; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if ((Year()<2005) || (Month()<6)) return (0); bool OpenSell=false,OpenBuy=false,NewBar=false; double TP =0,SL=0,price=0; //+------------------------------------------------------------------------------------------------+ //| Модуль счетчика баров //+------------------------------------------------------------------------------------------------+ //Отфильтрововаем бары от ценовых тиков if (Time[0]>PrevTime) { CountBars=CountBars+1; NewBar=True; PrevTime=Time[0]; } //+------------------------------------------------------------------------------------------------+ //| Конец модуля счетчика баров //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Если счетчик сосчитал до 10, прекращаем открытие поций и даём команду на закрытие всех поций //+------------------------------------------------------------------------------------------------+ if (CountBars>10) { AllowTrade=false; ClosePositions=true; } //+------------------------------------------------------------------------------------------------+ //| //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Закрытие всех позиций //+------------------------------------------------------------------------------------------------+ if (ClosePositions) { int total,cnt; bool result; total=OrdersTotal(); cnt=0; for (cnt=total-1;cnt>=0;cnt--) { if ((CurTime()-LastTrade)<10) Sleep(10000); result=false; Print(" TotalCnt: ",cnt); if (OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES)) { Alert(" Удалось выбрать ордер: ",OrderType()," № ",OrderTicket()); if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY) && (OrderMagicNumber()== magicNumber)) { Print(" cnt: ",cnt); Print(" OrderTicket: ",OrderTicket()); RefreshRates(); result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5,Yellow); if (result) { LastTrade=CurTime();//break; } else { Alert("Ордер ",OrderType()," № ",OrderTicket()," не удалось закрыть. Ошибка: " , GetLastError() ); } } } else { cnt=total; Alert(" Не удалось выбрать ордер: ",OrderType()," № ",cnt," Ошибка: ",GetLastError()); } } } //+------------------------------------------------------------------------------------------------+ //| Конец закрытия всех позиций //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Открытие позиции в начале каждого нового бара //+------------------------------------------------------------------------------------------------+ if (NewBar) { if (flag) { OpenBuy=true;flag=false; } else { OpenSell=true;flag=true; } } //+------------------------------------------------------------------------------------------------+ //| Конец открытия позиции в начале каждого нового бара //+------------------------------------------------------------------------------------------------+ //+------------------------------------------------------------------------------------------------+ //| Открытие позиций //+------------------------------------------------------------------------------------------------+ if (OpenSell && AllowTrade) { if ((CurTime()-LastTrade)<10) return (0); RefreshRates(); // Откроем отложенный ордер. /* price = NormalizeDouble(Ask+500*Point,Digits); SL = price - StopLoss * Point; TP = price + TakeProfit * Point; ticket=OrderSend(Symbol(), OP_BUYSTOP, Lots, price, 3, SL, TP, "OP_BUYSTOP", magicNumber, 0, Pink); LastTrade=CurTime(); Sleep(10000); RefreshRates(); */ // Откроем основной ордер. SL = NormalizeDouble(Bid,Digits) + StopLoss * Point; TP = NormalizeDouble(Bid,Digits) - TakeProfit * Point; // OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),3,SL,TP,"OP_SELL",magicNumber,0,Blue); LastTrade=CurTime(); OpenSell=false; } if (OpenBuy && AllowTrade) { if ((CurTime()-LastTrade)<10) return (0); RefreshRates(); /* price = NormalizeDouble(Bid-500*Point,Digits); SL = price + StopLoss * Point; TP = price - TakeProfit * Point; OrderSend(Symbol(), OP_SELLSTOP, Lots, price, 3, SL, TP, "OP_SELLSTOP", magicNumber, 0, SkyBlue); LastTrade=CurTime(); Sleep(10000); RefreshRates(); */ SL = NormalizeDouble(Ask,Digits) - StopLoss * Point; TP = NormalizeDouble(Ask,Digits) + TakeProfit * Point; OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),3,SL,TP,"OP_BUY",magicNumber,0,Yellow); LastTrade=CurTime(); OpenBuy=false; } //+------------------------------------------------------------------------------------------------+ //| Конец открытия позиций //+------------------------------------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+Искал в коде глобальные или еще какие-то переменные, которые могут влиять на заморозку тестера - не нашел.
if (result) { LastTrade=CurTime();//break; } else { Alert("Ордер ",OrderType()," № ",OrderTicket()," не удалось закрыть. Ошибка: " , GetLastError() ); }как мне кажется, в случае удачного закрытия ордера break прерывает выполнение цикла
for (cnt=total-1;cnt>=0;cnt--) { if ((CurTime()-LastTrade)<10) Sleep(10000);он начинает со следующего тика выполняться заново, и там следует проверка на таймаут с момента последней торговой операции. Конечно, можно было
if (result) { Sleep(10000); }но я сделал так. Думаю логику это несколько не изменило... Хотя, может я ошибаюсь...