Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Добавили поддержку испанского языка. Заходи и изучай!
ivania
29
ivania 2014.01.18 18:00 
Я только начинаю изучать MQL4 и столкнулся с такой проблемой, в советнике не могу выбрать открытый ордер.

Вот код:

void close()
{
Print(" Открыто ордеров = ",OrdersTotal());
if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES)==false) // Если не получилось выбрать ордер..
{
int aa=GetLastError();
Print(" Ордер не выбран ошибка ",aa); // .. то сообщим об этом
return; // Выход по ошибке
}
int tiket=OrderTicket(); // Узнаем тикет ордера
if (OrderType()==OP_BUY) // Если открытый ордер BUY
OrderClose(tiket,1,Bid,2,Blue); // Закрываем BUY
if (OrderType()==OP_SELL) // Если открытый ордер SELL
OrderClose(tiket,1,Ask,2,Red); // Закрываем SELL
return; // Выход
}

Вот лог в тестере:

15:01:30 Торговля_в_тестере: loaded successfully
15:01:30 TestGenerator: current spread 2 used
15:01:30 TestGenerator: unmatched data error (volume limit 15 at 2014.01.17 22:55 exceeded)
15:01:30 Торговля_в_тестере test started
15:02:15 2014.01.17 00:23 Торговля_в_тестере EURUSD,M5: open #1 sell 1.00 EURUSD at 1.3617 ok
15:02:51 2014.01.17 01:08 Торговля_в_тестере EURUSD,M5: Открыто ордеров = 1
15:02:51 2014.01.17 01:08 Торговля_в_тестере EURUSD,M5: Ордер не выбран ошибка 0

Не могу понять почему ордер не выбирается и при этом ошибка 0. Думал если ошибка 0 может ордер все таки выбирается, исключил проверку выбора ордера, все равно не получается

Второй вариант кода:

void close()
{
Print(" Открыто ордеров = ",OrdersTotal());
OrderSelect(1,SELECT_BY_POS,MODE_TRADES); // Выбираем ордер
int tiket=OrderTicket(); // Узнаем тикет ордера
Print(" Тикет ордера = ",tiket);
if (OrderType()==OP_BUY) // Если открытый ордер BUY
OrderClose(tiket,1,Bid,2,Blue); // Закрываем BUY
if (OrderType()==OP_SELL) // Если открытый ордер SELL
OrderClose(tiket,1,Ask,2,Red); // Закрываем SELL
return; // Выход
}

Вот лог в тестере:

15:41:08 Торговля_в_тестере EURUSD,M5: loaded successfully
15:41:08 TestGenerator: current spread 2 used
15:41:08 TestGenerator: unmatched data error (volume limit 15 at 2014.01.17 22:55 exceeded)
15:41:08 Торговля_в_тестере test started
15:41:16 2014.01.17 00:06 Торговля_в_тестере EURUSD,M5: open #1 sell 1.00 EURUSD at 1.3617 ok
15:41:40 2014.01.17 01:01 Торговля_в_тестере EURUSD,M5: Открыто ордеров = 1
15:41:40 2014.01.17 01:01 Торговля_в_тестере EURUSD,M5: Тикет ордера = 0
15:41:40 2014.01.17 01:01 Торговля_в_тестере EURUSD,M5: invalid ticket for OrderClose function
15:41:40 2014.01.17 01:01 Торговля_в_тестере EURUSD,M5: OrderClose error 4051

Подскажи где ошибка?
Sergey Dzyublik
4788
Sergey Dzyublik 2014.01.18 18:08  

OrderSelect(1,SELECT_BY_POS,MODE_TRADES);

счет начинается с 0.

ivania
29
ivania 2014.01.18 18:14  
Спасибо огромное! Помогло, два дня мучался.
Sergey Dzyublik
4788
Sergey Dzyublik 2014.01.18 18:14  

код вставляется через SRC на панели инструментов.

зачем заморочки с:

int tiket=OrderTicket();                    // Узнаем тикет ордера
if (OrderType()==OP_BUY)                    // Если открытый ордер BUY
   OrderClose(tiket,1,Bid,2,Blue);          // Закрываем BUY
if (OrderType()==OP_SELL)                   // Если открытый ордер SELL
   OrderClose(tiket,1,Ask,2,Red);           // Закрываем SELL

если можно одной сточкой сделать:

if (OrderType()<2) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),2,Red); // Закрываем SELL или buy
ivania
29
ivania 2014.01.18 18:18  
Я только начинаю осваивать азы, программирую как сам понимаю. Спасибо за совет, и за вставку кода
Victor Nikolaev
Модератор
14363
Victor Nikolaev 2014.01.19 02:44  
ALXIMIKS:


если можно одной сточкой сделать:


Это недокументированная возможность. И в обновленном языке может не работать
Vitalie Postolache
11954
Vitalie Postolache 2014.01.19 13:14  
Vinin:

Это недокументированная возможность. И в обновленном языке может не работать

То есть в действительности OrderClosePrice() должен работать только для закрытых позиций? Или речь о чём-то другом?
Victor Nikolaev
Модератор
14363
Victor Nikolaev 2014.01.19 13:53  
evillive:

То есть в действительности OrderClosePrice() должен работать только для закрытых позиций? Или речь о чём-то другом?

Об этом самом
ivania
29
ivania 2014.01.19 17:51  

Я раньше так и думал что OrderClosePrice() только для закрытых позиций, а оказывается что не только. И про OrderSelect() нигде не написано, что начинает отсчет с 0. Получается что документация как-то не корректно написана.

Vitalie Postolache
11954
Vitalie Postolache 2014.01.19 18:47  
ivania:

Я раньше так и думал что OrderClosePrice() только для закрытых позиций, а оказывается что не только. И про OrderSelect() нигде не написано, что начинает отсчет с 0. Получается что документация как-то не корректно написана.


Вы о чём это? OrderSelect() нкаких отсчётов не делал и не будет.
ivania
29
ivania 2014.01.20 19:39  
evillive:

Вы о чём это? OrderSelect() нкаких отсчётов не делал и не будет.
Я не правильно выразился, отсчет ордеров в OrderSelect(). Если открыто два ордера, то первый выбирается OrderSelect(0,.....) а второй OrderSelect(1,.....)
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий