- Время закрытия позиции, фукнции пользователя
- Закрытие позиций
- MT3 API CloseOrder error
Поищите, пожалуйста, обсуждения по форуму.
//+------------------------------------------------------------------+ //| ShadowTrader | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //| v1.2 | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double Lots = 0.1; extern int TakeProfit = 200; extern int StopLoss = 200; extern int hour = 12; // Время, по истечении которого ордер будет закрыт extern int limit = 5; // Уровень установки отложенного ордера extern int ProfitLevel = 20; // Общий профит для всех позиций при котором они закрываются static int magicNumber = 23456; bool AllowTorg,NewBar; datetime LastTrade,PrevTime; int ticket,CountBars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { AllowTorg=True; LastTrade=CurTime();PrevTime=Time[0]; ticket=0;CountBars=0; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int cnt=0,total=0,i=0,totalcountpos=0; NewBar=false; //+------------------------------------------------------------------------------------------------+ //| Модуль счетчика баров //+------------------------------------------------------------------------------------------------+ //Отфильтрововаем бары от ценовых тиков if (Time[0]>PrevTime) { CountBars=CountBars+1; NewBar=True; PrevTime=Time[0]; } //+------------------------------------------------------------------------------------------------+ //| Конец модуля счетчика баров //+------------------------------------------------------------------------------------------------+ if (CountBars>531) { bool result=false; AllowTorg=false; total=OrdersTotal(); if (total>0) { for (cnt=total-1;cnt>=0;cnt--) { if ((CurTime()-LastTrade)<10) return (0); result=false; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); RefreshRates(); { if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY)&& (OrderMagicNumber()== magicNumber)) { result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow); if (result) LastTrade=CurTime(); break; } if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELL)&& (OrderMagicNumber()== magicNumber)) { result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue ); if (result) LastTrade=CurTime(); break; } if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUYSTOP) && (OrderMagicNumber()== magicNumber)) { result=OrderDelete(OrderTicket()); if (result) LastTrade=CurTime(); break; } if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELLSTOP) && (OrderMagicNumber()== magicNumber)) { result=OrderDelete(OrderTicket()); if (result) LastTrade=CurTime(); break; } } } if(result==false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } } } //Открытие позиций if (CountBars==503 && NewBar) { OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue); } if (CountBars==505 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); } if (CountBars==507 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); } if (CountBars==509 && NewBar) { OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow); } if (CountBars==511 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); } if (CountBars==513 && NewBar) { OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue); } if (CountBars==515 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); } if (CountBars==519 && NewBar) { OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow); } return(0); } //+------------------------------------------------------------------+
Ошибка №2 #define ERR_COMMON_ERROR 2. Млин, нельзя ли своей рукой поправить код, чтобы он работал?
И зачем тогда в OrderClose() проскальзование используется? Очевидно, что когда в цикле по тикетам перебераются все ордера и после ордера BUY или SELL встречаются ордера BUYSTOP или SELLSTOP, или наоборот - вылазит эта ошибка. Имхо, это явно глюк MQL4.
1) подсчитайте количество мест, где есть задержки и устаревание цен
2) проверьте, есть ли защита от устаревания везде где нужно?
3) поищите, пожалуйста, темы, в которых я детально объяснял аналогичные вопросы
Представленный код очень плох.
Настолько плох, что речи об каких-либо ошибках в MQL4 даже не может идти речи.
//+------------------------------------------------------------------+ //| ShadowTrader | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //| v1.2 | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double Lots = 0.1; extern int TakeProfit = 200; extern int StopLoss = 200; extern int hour = 12; // Время, по истечении которого ордер будет закрыт extern int limit = 5; // Уровень установки отложенного ордера extern int ProfitLevel = 20; // Общий профит для всех позиций при котором они закрываются static int magicNumber = 23456; bool AllowTorg,NewBar; datetime LastTrade,PrevTime; int ticket,CountBars; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { AllowTorg=True; LastTrade=CurTime();PrevTime=Time[0]; ticket=0;CountBars=0; return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int cnt=0,total=0,i=0,totalcountpos=0; NewBar=false; //+------------------------------------------------------------------------------------------------+ //| Модуль счетчика баров //+------------------------------------------------------------------------------------------------+ //Отфильтрововаем бары от ценовых тиков if (Time[0]>PrevTime) { CountBars=CountBars+1; NewBar=True; PrevTime=Time[0]; } //+------------------------------------------------------------------------------------------------+ //| Конец модуля счетчика баров //+------------------------------------------------------------------------------------------------+ if (CountBars>571) { bool result=false; AllowTorg=false; total=OrdersTotal(); if (total>0) { for (cnt=total-1;cnt>=0;cnt--) { // Print(LastTrade); if (((CurTime()-LastTrade)<10) || (LastTrade==0)) return (0); result=false; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); RefreshRates(); { if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY)) { result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Yellow); if (result){ LastTrade=CurTime();break; } } if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELL)) { result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue ); if (result){ LastTrade=CurTime();break; } } if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUYSTOP) && (OrderMagicNumber()== magicNumber)) { result=OrderDelete(OrderTicket()); if (result){ LastTrade=CurTime();break; } } if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELLSTOP) && (OrderMagicNumber()== magicNumber)) { result=OrderDelete(OrderTicket()); if (result){ LastTrade=CurTime();break; } } } } if(result==false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } } } //Открытие позиций if (CountBars==503 && NewBar) { OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue); LastTrade=CurTime(); } if (CountBars==505 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); LastTrade=CurTime(); } if (CountBars==507 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==509 && NewBar) { OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow); LastTrade=CurTime(); } if (CountBars==511 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); LastTrade=CurTime(); } if (CountBars==513 && NewBar) { OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue); LastTrade=CurTime(); } if (CountBars==515 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); LastTrade=CurTime(); } if (CountBars==517 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); LastTrade=CurTime(); } if (CountBars==519 && NewBar) { OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue); LastTrade=CurTime(); } if (CountBars==521 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==523 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==525 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==527 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==529 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==531 && NewBar) { OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink); LastTrade=CurTime(); } if (CountBars==533 && NewBar) { OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow); LastTrade=CurTime(); } return(0); } //+------------------------------------------------------------------+
Хотя иногда ордера закрываются не в том порядке, котором открывались... И это смущает. Предусмотрел ситуацию, если вдруг LastTrade будет равен 0.
Представленный код очень плох.
А я и не претендую на звание супер-пупер программиста MQL4 и Ваш форум, как мне показалось, для того и существует, чтобы помочь разобраться, а не отсылать к проотцам учиться. Хотя бы ссылку дали...
if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY) && (OrderMagicNumber()== magicNumber)) { while (result==false) { RefreshRates(); result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5,Yellow); Print(" Тикет: ",OrderTicket()," Результат: ",result); attempt++; if (attempt==10) break; Sleep(1000); } if (result) LastTrade=CurTime(); break; }
Тесер закрывает все ордера Buy, кроме последнего, в протколе пишеться вот, что:
04:46:04 2005.06.03 21:00 NemoX-0002: open #46 buy 0.10 EURUSD at 1.2225 sl: 1.1225 tp: 1.3225 ok
04:46:04 2005.06.06 00:00 NemoX-0002: close #46 buy 0.10 EURUSD at 1.2225 sl: 1.1225 tp: 1.3225 at price 1.2227
04:46:04 2005.06.06 00:00 NemoX-0002: Тикет: 46 Результат: 1
04:46:04 2005.06.06 00:00 NemoX-0002: close #44 buy 0.10 EURUSD at 1.2287 sl: 1.1287 tp: 1.3287 at price 1.2229
04:46:04 2005.06.06 00:00 NemoX-0002: Тикет: 44 Результат: 1
04:46:04 2005.06.06 00:00 NemoX-0002: close #40 buy 0.10 EURUSD at 1.2274 sl: 1.1274 tp: 1.3274 at price 1.2224
04:46:04 2005.06.06 00:00 NemoX-0002: Тикет: 40 Результат: 1
04:46:04 2005.06.06 00:01 NemoX-0002: close #32 buy 0.10 EURUSD at 1.2290 sl: 1.1290 tp: 1.3290 at price 1.2225
04:46:04 2005.06.06 00:01 NemoX-0002: Тикет: 32 Результат: 1
04:46:04 2005.06.06 00:02 NemoX-0002: close #26 buy 0.10 EURUSD at 1.2288 sl: 1.1288 tp: 1.3288 at price 1.2229
04:46:04 2005.06.06 00:02 NemoX-0002: Тикет: 26 Результат: 1
04:46:04 2005.06.06 00:02 NemoX-0002: close #22 buy 0.10 EURUSD at 1.2216 sl: 1.1216 tp: 1.3216 at price 1.2223
04:46:04 2005.06.06 00:02 NemoX-0002: Тикет: 22 Результат: 1
04:46:04 2005.06.06 00:02 NemoX-0002: close #18 buy 0.10 EURUSD at 1.2206 sl: 1.1206 tp: 1.3206 at price 1.2225
04:46:04 2005.06.06 00:02 NemoX-0002: Тикет: 18 Результат: 1
04:46:04 2005.06.06 00:03 NemoX-0002: close #16 buy 0.10 EURUSD at 1.2237 sl: 1.1237 tp: 1.3237 at price 1.2224
04:46:04 2005.06.06 00:03 NemoX-0002: Тикет: 16 Результат: 1
04:46:04 2005.06.06 00:03 NemoX-0002: close #12 buy 0.10 EURUSD at 1.2257 sl: 1.1257 tp: 1.3257 at price 1.2229
04:46:04 2005.06.06 00:03 NemoX-0002: Тикет: 12 Результат: 1
04:46:04 2005.06.06 00:03 NemoX-0002: close #10 buy 0.10 EURUSD at 1.2251 sl: 1.1251 tp: 1.3251 at price 1.2227
04:46:04 2005.06.06 00:03 NemoX-0002: Тикет: 10 Результат: 1
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Alert: Order 2 failed to close. Error:2
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
И ошибка №2 будет выплывать до тех пор, пока не закроются все ордера BuyStop. И Вы мне ещё говорите, что это не глюк МТ4?... Так у кого из нас код ужастный :-) ?
for (cnt=OrdersTotal()-1;cnt>=0;cnt--) { if ((CurTime()-LastTrade)<5) Sleep(5000);
где отрабатывается задержка, если ордер закрылся удачно. Можно конечно и тут Sleep(5000), но мне кажется, что лучше, чтобы сначала закрылись все Buy, а потом уж все Sell, можно и на оборот, но деньги вперед :-)
if (attempt==10)
Что такое 10? У Ивана-Царевича было всего 3 попытки:)
Sleep(1000);
Почему 1 сек? А не 1,5? Или не 0,5?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования