Поищите, пожалуйста, обсуждения по форуму.
//+------------------------------------------------------------------+
//| 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?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
//+------------------------------------------------------------------+ //| 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); { 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); } //+------------------------------------------------------------------+