Помогите с ордерами!

 
Суть проблемы:
У меня по неким сигналам выставляются 2 отлож. ордера - байстоп и селлстоп, с тейкпрофитом 30 пунктов и стоплоссом на уровне противоположного ордера. То есть получается, что когда закрывается, например, бай с убытком, открыватся селл. Если бай закрылся по тейкпрофиту, ордер на селл удаляется (ну и, соответственно, наоборот).
Как вызывать номера ордера при тестировании стратегии для последующего их исправления и удаления? Ничё не получается... Заранее благодарен.
 
А зачам номера? Пользуйся флагами. Первое, что приходит в голову- проверяй после каждой операции количество денег на счёте и количество открытых ордеров. Если ордеров открытых нет и денег стало больше- удаляй противоположный(то есть все оставшиеся). Наверняка есть куча более изящных решений.
 
Суть проблемы:
У меня по неким сигналам выставляются 2 отлож. ордера - байстоп и селлстоп, с тейкпрофитом 30 пунктов и стоплоссом на уровне противоположного ордера. То есть получается, что когда закрывается, например, бай с убытком, открыватся селл. Если бай закрылся по тейкпрофиту, ордер на селл удаляется (ну и, соответственно, наоборот).
Как вызывать номера ордера при тестировании стратегии для последующего их исправления и удаления? Ничё не получается... Заранее благодарен.


Если под номером ордера понимается его тикет, а не порядковый номер, то можно, например, так для открытых ордеров:
total=OrdersTotal();
for(cnt=0;cnt<total;cnt++) {
     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
     if( (OrderSymbol()==Symbol())  && (OrderMagicNumber()== exp_mg_numb) ) 
           order_id = OrderTicket();//cnt;
.....................................................................................
     }



и так для уже закрытых:

total = HistoryTotal();
for(cnt=0;cnt<total;cnt++) {
    OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
    if( (OrderSymbol()==Symbol())  && (OrderMagicNumber()== exp_mg_numb) ) 
        order_id = OrderTicket();//cnt;
.....................................................................................
    }



если же порядковый номер, то он получается как счетчик - в переменной cnt.

Удачи и попутных трендов.


 
Спасибо!
Я это организовал несколько другим способом... Теперь у меня возник другой вопрос: где и когда надо использовать return(0) при закрытии конструкции if? Я посмотрел несколько экспертов (в том числе и расписаный пример), но общего правила мне вычленить так и не удалось...
 
Спасибо!
Я это организовал несколько другим способом... Теперь у меня возник другой вопрос: где и когда надо использовать return(0) при закрытии конструкции if? Я посмотрел несколько экспертов (в том числе и расписаный пример), но общего правила мне вычленить так и не удалось...


Не понятен вопрос. Если Вам нужно прекратить цикл, то используется break; При вызове return(0) произойдет выход из процедуры, из которой это ретурн вызван. Если это в процедуре старт, то произойдет остановка советника и по следующему тику его перезапуск. Многие примеры были перенесены из МТ3 - там ретурн был обязательным после выполнения торговых функций и эти функции не возвращали коды ошибок. В МТ4 это не обязательно. То есть в каждом конкретном случае рекомендации могут различаться.

Удачи и попутных трендов.
 
И ещё (возможно этим уже интересовались, но я так и не нашёл ответа): упомянутые выше 2 ордера должны выставляться одновременно, то есть

t_buy=OrderSend(Symbol(),OP_BUYSTOP,0.1,h,0,l,h+50*Point,"qqq",16384,0,Green);
t_sell=OrderSend(Symbol(),OP_SELLSTOP,0.1,l,0,h,l-50*Point,"qqq",16385,0,Blue);

но выставляется только 1. Я тут слышал, что должен быть какой-то таймаут между их выставлением... В режиме тестера стратегий это тоже должно учитываться?
 
А что говорит GetLastError()?
 
Ничего не говорит!
я проверял так:

if (t_buy==-1)
{
Print ("Order buy rejected", GetLastError());
}
 
Пардон, вру: еррор или 130, или 0!
 
Если GetLastError возвращает 0, то номер тикета должен быть больше 0. Совершенно определённо.
Поставьте эту проверку сразу после выставления соответствующего ордера. А не после всех команд.
 
Если GetLastError возвращает 0, то номер тикета должен быть больше 0. Совершенно определённо.
Поставьте эту проверку сразу после выставления соответствующего ордера. А не после всех команд.
Не знаю, как "должно быть", но я когда-то несколько раз нарывался на отрицательный тикет и 0-й GetLastError.
У меня на всех торговых операциях идёт примерно такая проверка:
//---- Собственно, открываемся
	Send_Result = OrderSend ( Send_Symbol, Send_OrderType, Send_Volume, Send_OpenPrice, Send_Slippage, Send_StopLoss, Send_TakeProfit, Send_Comment, Send_MagicNumber, Send_Expiration, Send_Color );
	Send_GetLastError = GetLastError();

//---- Если есть ошибка,
	if ( Send_Result < 0 || Send_GetLastError > 0 )
	{


Неоднократно встречал сообщения типа "ордерсенд накрылся, гетластеррор = 0 (ноу еррор)"
Закономерности не нашёл, ситуацию детально не разбирал...

Причина обращения: