Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 843

 
artmedia70:
Чтобы закрыть позицию по тикету, вам прежде всего необходимо точно знать номер тикета закрываемой позиции. Потом необходимо выбрать ордер функцией OrderSelect(ticket,SELECT_BY_TICKET) причём с проверкой успешности выбора. Далее необходимо проверить время закрытия успешно выбранного ордера. Зачем? А затем, что при выборе по тикету параметр pool функции OrderSelect(..., ..., pool) игнорируется (он нужен только при выборе по индексу). А значит, даже если мы и выбрали успешно ордер, нам ещё нужно знать в каком списке мы его выбрали - в списке закрытых или открытых позиций. Именно проверка времени закрытия позволит нам узнать "а в рынке ли ещё ордерочек". Если время закрытия равно нулю, то ордер ещё в рынке. Если время отлично от нуля - ордер уже закрыт ранее. И вот после всей этой процедуры мы можем отсылать приказ на закрытие этого ордера.

Передо мной график. я вижу, что на нем открыт ордер. я принимаю решение его закрыть. всё. БОЛЬШЕ ничего не нужно.

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

 
evillive:

int  OrdersTotal();  - возвращает количество, а не истину-ложь, вот что не так. Нет ордеров, значит 0, а если есть ордера, то это не только 1.

А закрытых нет только на свежеоткрытом счёте, на котором ещё не торговали. И опять неправильное применение функции.

А зачем RefreshRates(); ПОСЛЕ отсылки приказа на сервер? Это как сначала заплатить за что-то и уже потом спросить "а сколько это стоит?"...

Спасибо, все понял. 
 
evillive:

int  OrdersTotal();  - возвращает количество, а не истину-ложь, вот что не так. Нет ордеров, значит 0, а если есть ордера, то это не только 1.

А закрытых нет только на свежеоткрытом счёте, на котором ещё не торговали. И опять неправильное применение функции.

А зачем RefreshRates(); ПОСЛЕ отсылки приказа на сервер? Это как сначала заплатить за что-то и уже потом спросить "а сколько это стоит?"...

Однажды я услышал выражение "В названии столицы России делает две ошибки", аж в ступор вошёл. Где-же их там можно найти??? Потом понял, да можно и две сделать.

Так это к тому, что в обсуждаемой строке кода тоже не одна ошибка.

if (!OrdersTotal()==true)

если(отрицание -> выражение == истина) Конечно можно понять, типа как Артём объясняет, если 0 то false всё остальное true Тогда получается если отрицаем что открытые ордера есть тогда... ой... проще написать Москва с двумя ошибками.

 
Escapee:

Передо мной график. я вижу, что на нем открыт ордер. я принимаю решение его закрыть. всё. БОЛЬШЕ ничего не нужно.

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

Вот я вам и рассказываю как программно это правильно сделать.

1. Перед вами график с одним ордером. Вы можете увидеть номер его тикета, а программа? Программе нужно знать этот номер.

2. Вы хотите его закрыть. Значит вы видите что ордер с таким-то тикетом открыт. А программа? Программа этого не знает. Значит программе нужно узнать открыт ли ордер с таким-то тикетом.

3. Вы можете нажать крестик, и точка... А программе нужно дать команду.

Отсюда вывод:

1. Узнаём есть ли открытые позиции

2. Если есть, то ищем тикет нужного нам ордера

3. Выбираем ордер по найденному тикету. Если выбрали его успешно, то...

4. Проверяем время закрытия этого выбранного по тикету ордера. Если время закрытия равно нулю, то...

5. Закрываем.

 

Я бы поправил твой ответ так.

artmedia70:


1. Перед вами график с одним ордером. Вы можете увидеть номер его тикета

2. Вы хотите его закрыть.

3. Вы можете нажать крестик, и точка...

5. Закры ваем то.

 
AlexeyVik:

Я бы поправил твой ответ так.

Всё шутишь?
 
artmedia70:
Всё шутишь?

Ага. Сегодня-же выходной.


 
artmedia70:


т.е. сделать скрипт закрытия ордера по аналогии со скриптом открытия ордера нельзя? А то там так просто..ordersend...я и думал..
 
Escapee:
т.е. сделать скрипт закрытия ордера по аналогии со скриптом открытия ордера нельзя? А то там так просто..ordersend...я и думал..

Открытие ордера тоже не так просто - не одной командой отсылки торгового приказа. Все эти команды необходимо "завернуть" в полноценную функцию с проверкой кодов возврата торгового сервера и с реакцией на эти ответы. Проверку на допустимые уровни, пересчёт их если в приказе задан неверный расчитываемый уровень и т.д., и т.п.

Ну а закрытие - тоже самое: отдельная функция поиска нужного ордера, которая вызывает полноценную функцию закрытия, а не просто строчка кода с отсылкой приказа на сервер.

 
artmedia70:

Открытие ордера тоже не так просто - не одной командой отсылки торгового приказа. Все эти команды необходимо "завернуть" в полноценную функцию с проверкой кодов возврата торгового сервера и с реакцией на эти ответы. Проверку на допустимые уровни, пересчёт их если в приказе задан неверный расчитываемый уровень и т.д., и т.п.

Погодите... поймите, наконец, что мне надо...

Вот открытие ордера, которое мне было нужно - OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); . И этот скрипт работает.

Теперь мне нужно закрытие......

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