Помогите пожалуйста исправить советника!

 

Здоровте! Совсем недавно начал изучать MQL и многое мне не понятно. Вот одна из сложностей - советник открывает три заданные сделки, и если одна из них закрылась(в данном случае это будет бай), советник должен открыть по параметрам сделку сэл, но этого не происходит. Где же проверка, что бай осталась одна сделка. Помогите исправить ошибку.

Причем если b==1 заменить на b==2, он с самого начала открывает 4 ордера, а потом молчит пока не закроются все сделки.

int start()
{
int total = OrdersTotal();
int numOrders = 0;
for (int i = 0; i < total; i++)
{ OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){ numOrders++;}
}
if(numOrders == 0)
{ int ticket;
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-1000*Point,Ask+100*Point,"Expert",MagicNumber,0,Green);
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-1000*Point,Ask+1000*Point,"Expert",MagicNumber,0,Green);
OrderSend("EURUSD",OP_SELL,1,Bid,3,Bid+1000*Point,Bid-100*Point,"Expert",MagicNumber,0,Green);
}
{int s;
int b;
for (int a=0; a<OrdersTotal(); a++)
{
if (!OrderSelect(a,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_SELL) s=s+1;
if (OrderType()==OP_BUY) b=b+1;
}
if(b==1 && s==1)
{OrderSend("EURUSD",OP_SELL,1,Bid,3,Bid+1000*Point,Bid-100*Point,"Expert",MagicNumber,0,Green);}
return(0);
}
return(0);
}


 

Здоровса!

.

int start()
{
int total = OrdersTotal();
int numOrders = 0;
for (int i = 0; i < total; i++)
{ OrderSelect(i, SELECT_BY_POS, MODE_TRADES); <--- почему нет проверки на true ??
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){ numOrders++;}
}
if(numOrders == 0)
{ int ticket; <--- зачем объявлена переменная? инициализировать!
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-1000*Point,Ask+100*Point,"Expert",MagicNumber,0,Green); <-- нет проверки на результат
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-1000*Point,Ask+1000*Point,"Expert",MagicNumber,0,Green);
OrderSend("EURUSD",OP_SELL,1,Bid,3,Bid+1000*Point,Bid-100*Point,"Expert",MagicNumber,0,Green);
}
{int s; <-- почему нет инициализации??
int b; <-- почему нет инициализации??
for (int a=0; a<OrdersTotal(); a++)
{
if (!OrderSelect(a,SELECT_BY_POS,MODE_TRADES)) break; <-- почему здесь break а не continue ??
if (OrderSymbol()!=Symbol()) continue; <-- почему нет проверки на Magic ??
if (OrderType()==OP_SELL) s=s+1;
if (OrderType()==OP_BUY) b=b+1;
}
if(b==1 && s==1)
{OrderSend("EURUSD",OP_SELL,1,Bid,3,Bid+1000*Point,Bid-100*Point,"Expert",MagicNumber,0,Green);}
return(0);
}
return(0);
}

 

очень благодарен!!! буду пробовать исправленный вариант. если не пройдет отпишусь. как понять <-- нет проверки на результат??? как же мне проверить

 
Работает!!! Респект огромный!
 
:-)
 
VOVANA >>:

как понять <-- нет проверки на результат??? как же мне проверить

У каждой функции есть спецификация.

В спецификации обычно пишут, как данная конкретная функция может испортить нам жизнь.

----------

int OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)
Основная функция, используемая для открытия позиции или установки отложенного ордера.
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

----------

Даже если Вы не знаете, что с ошибкой делать, то стоит ее хотя бы вывести в лог Print'ом.

Еще есть всякие функции типа IsTradeAllowed(), IsConnected(), IsTradeContextBusy()

(подсмотрено у профи ;-) )
----------

Конечно, возможно это все еще рано.

 
jartmailru писал(а) >>

...

{int s; <-- почему нет инициализации??
int b; <-- почему нет инициализации??
...

В MQL4 переменная если явно не проинициализирована при обЪявлении, инициализируется нулём. Вот в MQL5 так писать будет уже нельзя.

 
Valmars >>:

В MQL4 переменная если явно не проинициализирована при обЪявлении, инициализируется нулём. Вот в MQL5 так писать будет уже нельзя.

Ничего подобного, неинициализированные переменные на самом деле ничем не инициализируются. Ее значением может оказаться как 0, так и что-то близкое к EMPTY_VALUE. Причем результат зависит исключительно от состояния памяти ПК в данный момент - проверено десятки раз на практике.

 
всем спасибо многое стало ясно - но до совсем многого еще изучать и изучать.
Причина обращения: