Скачать MetaTrader 5

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

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

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


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


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

Удачи и попутных трендов.
Forex Trader
114314
Forex Trader  
И ещё (возможно этим уже интересовались, но я так и не нашёл ответа): упомянутые выше 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. Я тут слышал, что должен быть какой-то таймаут между их выставлением... В режиме тестера стратегий это тоже должно учитываться?
Forex Trader
114314
Forex Trader  
А что говорит GetLastError()?
Forex Trader
114314
Forex Trader  
Ничего не говорит!
я проверял так:

if (t_buy==-1)
{
Print ("Order buy rejected", GetLastError());
}
Forex Trader
114314
Forex Trader  
Пардон, вру: еррор или 130, или 0!
Forex Trader
114314
Forex Trader  
Если GetLastError возвращает 0, то номер тикета должен быть больше 0. Совершенно определённо.
Поставьте эту проверку сразу после выставления соответствующего ордера. А не после всех команд.
Forex Trader
114314
Forex Trader  
Если 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 (ноу еррор)"
Закономерности не нашёл, ситуацию детально не разбирал...

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий