Вот такой код

 
Доброе время суток.

Советник открывает 1 ордер по рынку и выставляет 1 отложенный ордер. Заминка в том что он должен удалять отложенный ордер при срабатывании профита, а он этого не делает.
Подскажите, пожалуста, если кто знает, в чем может быть проблема?

//1. Открываем по рынку ордер, при условии отсутствия открытых ордеров
extern double Lot = 0.1; // Размер позы
extern int SL = 50; // Размер лося
extern int TP = 100; // Размер профита
extern int LimLvl=50; // Уровень выставления Limit-ордера


int Magic=100,ticket;

int start() // Функция старта вычислений
{

// Если есть открытый ордер то выходим через return
int total=OrdersTotal();
for (int q=total-1; q>=0; q--)
{
if (OrderSelect (q,SELECT_BY_POS))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(0);
}
}
//--

//1.1 Запрос информации для открытия ордера
double bid =MarketInfo(Symbol(),MODE_BID); // Запрос значения Bid
double ask =MarketInfo(Symbol(),MODE_ASK); // Запрос значения Ask
double point =MarketInfo(Symbol(),MODE_POINT);//Запрос Point

//1.2 Открытие ордера BUY по цене запрошенной
ticket=OrderSend(Symbol(),OP_BUY,Lot,ask,3,ask-SL*Point,ask+TP*Point,"",Magic,0);
if (ticket<0)
{
Alert (GetLastError()); // Сообщение об ошибке
return(0);
}


// Обновление цены
if (OrderSelect(ticket,SELECT_BY_TICKET))
{
double op=OrderOpenPrice()-LimLvl*Point;
if (OrderSend(Symbol(),OP_SELLSTOP,Lot,op,0,op+SL*Point, op-TP*Point,"",Magic,0)<0)
Alert (GetLastError()); // Сообщение об ошибке
}
{
bool Yes;
if (!Yes) {
for (int i = OrdersTotal() - 1; i >= 0 ; i--) {
if (OrderSelect(i, SELECT_BY_POS)) OrderDelete(OrderTicket());
}
}

return(0);
}
{
Yes = false;
for (i = 0; i < OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS)) {
if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {
if (OrderMagicNumber()==Magic){
Yes = true;
break;
}
}
}
}
}
return(0);
}
 
 
бедняга компилятор.

п.с. судя по условию задачи в коде должно быть слово close. а его там (суда по показаниям поисковика) не встречается. поэтому и не работает.
 

Ошибок несколько. По порядку, первый же перебор ордеров (// Если есть открытый ордер то выходим через return) при наличие отложника (они тоже попадают в перебор) "непускает" выполнение дальше, соответственно удаляться ничего не будет.

Дальше, пояcните смысл конструкции:

bool Yes;
if (!Yes) {
for (int i = OrdersTotal() - 1; i >= 0 ; i--) {
if (OrderSelect(i, SELECT_BY_POS)) OrderDelete(OrderTicket());
}

????


Это основное, дальше пока не вникал, но несуразности есть. Судя по всему, навыки програмирования у Вас есть, но из другой области/языка. Думается Вам надо просто детально разобрать какой-нибудь советник, может пролистать учебник и Вы сами легко исправите все ошибки.

 
Figar0:

Дальше, пояcните смысл конструкции:

Именно Эта штучка легко снесет все несработавшие отложки, только волю ей дай :)
 
magiXpert:
Figar0:

Дальше, пояcните смысл конструкции:

Именно Эта штучка легко снесет все несработавшие отложки, только волю ей дай :)


До нее дело даже не доходит...) Просто интересно, что человек хотел сделать
 
Figar0:
magiXpert:

Figar0:

Дальше, пояcните смысл конструкции:

Именно Эта штучка легко снесет все несработавшие отложки, только волю ей дай :)
До нее дело даже не доходит...) Просто интересно, что человек хотел сделать
Человеку было интересно, каким значением инициализируется дефолтом булевый вар, если его обозвать Yes.
 
Figar0:

Ошибок несколько. По порядку, первый же перебор ордеров (// Если есть открытый ордер то выходим через return) при наличие отложника (они тоже попадают в перебор) "непускает" выполнение дальше, соответственно удаляться ничего не будет.


Дальше, пояcните смысл конструкции:

bool Yes;
if (!Yes) {
for (int i = OrdersTotal() - 1; i >= 0 ; i--) {
if (OrderSelect(i, SELECT_BY_POS)) OrderDelete(OrderTicket());
}

????

Это основное, дальше пока не вникал, но несуразности есть. Судя по всему, навыки програмирования у Вас есть, но из другой области/языка. Думается Вам надо просто детально разобрать какой-нибудь советник, может пролистать учебник и Вы сами легко исправите все ошибки.

Здравствуйте, спасибо всем за ответы!:-)
представленная выше конструкция, вызывает пользовательскую функцию Yes, которая в свою очередь ищет открытые рыночные ордера. Если она их не находит, то следующим шагом являеться поиск отложенного ордера и удаление его. Это так должно быть:-) но так не происходит...
Хотя если вместо этой функции просто написать следующий код:
for (q = OrdersTotal() - 1; q >= 0 ; q--) {
if (OrderSelect(q, SELECT_BY_POS))
if (OrderMagicNumber()==Magic)
OrderDelete(OrderTicket());
}
}
return(0);
 то отложенный ордер удаляеться сразу же, после того как установился, то есть управление все же доходит до этих функций...
и если честно, то навыков программирования у меня нет....это результат чтения учебника.
Наведите на путь истинный!!!
 
magiXpert:
бедняга компилятор.



п.с. судя по условию задачи в коде должно быть слово close. а его там (суда по показаниям поисковика) не встречается. поэтому и не работает.

а где оно (слово close)должно быть?
 
yokme:
magiXpert:
бедняга компилятор.



п.с. судя по условию задачи в коде должно быть слово close. а его там (суда по показаниям поисковика) не встречается. поэтому и не работает.

а где оно (слово close)должно быть?

Не надо Close, надо Delete, а он там есть... только не работает) Почему?- писал выше.

 
yokme:
magiXpert:

бедняга компилятор.
п.с. судя по условию задачи в коде должно быть слово close. а его там (суда по показаниям поисковика) не встречается. поэтому и не работает.

а где оно (слово close)должно быть?
В операторе OrderClose.
Причина обращения: