Доброго времени!
Ломаю голову уже долгое время. Может кто поможет..? Как организовать в советнике проверку на последний закрытый ордер в истории по символу, маджику и типу ордера перед отправкой запроса на открытие рыночного ордера. Условие такое : если последний закрытый ордер бай, то далее открываемся только селл, а иначе ждем противоположного сигнала. Спасибо заранее.
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int openOrder(int cmd,double lots,int _stop_loss,int _take_profit)
{
double sl = 0;
double tp = 0;
int t=0;
int error=0;
int ordersTotal=OrdersTotal();
RefreshRates();
ResetLastError();
if (ordersTotal < MAXorders)
{
while(true)
{
if(cmd==OP_SELL)
{
//-------------проверяем в истории последний закрытый ордер BUY---------+
int i,accTotal=OrdersHistoryTotal();
for(i=0;i<accTotal;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_SELL)
{
Print("Уже поторговали этот сигнал, ждем противоположный...");
break;
}
}
//-----------------------------------------------------------------------+
if(_stop_loss==0) sl=0;
else sl=NormalizeDouble(Ask+_stop_loss*gPoint,Digits);
if(_take_profit==0) tp=0;
else tp=NormalizeDouble(Ask-_take_profit*gPoint,Digits);
t=OrderSend(Symbol(),OP_SELL,calculate_lot(),NormalizeDouble(Bid,Digits),gSlippage,sl,tp,NULL,magic,0,Red);
}
if(cmd==OP_BUY)
{
//-------------проверяем в истории последний закрытый ордер SELL---------+
int i,accTotal=OrdersHistoryTotal();
for(i=0;i<accTotal;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
break;
}
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderType()==OP_BUY)
{
Print("Уже поторговали этот сигнал, ждем противоположный...");
break;
}
}
//-----------------------------------------------------------------------+
if(_stop_loss==0) sl=0;
else sl=NormalizeDouble(Bid-_stop_loss*gPoint,Digits);
if(_take_profit==0) tp=0;
else tp=NormalizeDouble(Bid+_take_profit*gPoint,Digits);
t=OrderSend(Symbol(),OP_BUY,calculate_lot(),NormalizeDouble(Ask,Digits),gSlippage,sl,tp,NULL,magic,0,Blue);
}
//---
if(t>0) break;
error=GetLastError();
switch(error)
{
case 135: Print("Цена изменилась. Пробую ещё ...");
RefreshRates();
continue;
case 136: Print("Нет цен. Жду новый тик ...");
while(RefreshRates()==false)
Sleep(1);
continue;
case 146: Print("Подсистема торговли занята. Пробую ещё ...");
Sleep(500);
RefreshRates();
continue;
case 138: Print("Цена устарела. Пробую ещё ...");
Sleep(500);
RefreshRates();
continue;
case 129: Print("Неправильная цена при попытке открыть ордер. Пробую ещё ...");
Sleep(5000);
RefreshRates();
continue;
}
switch(error) // Критические ошибки
{
case 2 : Print("Общая ошибка.");
break;
case 5 : Print("Старая версия клиентского терминала.");
break;
case 64: Print("Счет заблокирован.");
break;
case 133
rint("Торговля запрещена");
break;
case 130
rint("Слишком маленький СЛ или ТП");
break;
case 134
rint("Не хватает средств");
break;
default: Print("Возникла ошибка: ",error);// Другие варианты
}
break; // Выход из цикла
}
}
return t;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
Пробовал сам что-то делать, но не работает. Поправьте пожалуйста.