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

 
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); . И этот скрипт работает.

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

 
Escapee:

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

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

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

Это не скрипт. Это всего лишь команда открыть ордер. Функция OrderSend возвращает тикет ордера если открытие произошло успешно. Но перед закрытием надо сначала определить тикет ордера. А чтобы его определить надо сначала выбрать ордер из списка ордеров по его индексу. Если ордеров открыто всего 1 то его индекс в списке будет 0. Соответственно если только один открытый ордер, можно написать без цикла и проверки соответствия символа и соответствия магика так. Не грамотно, но всё-же. Исключительно для примера.

if(OrderSelect(0, SELECT_BY_POS))
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 30, clrNONE))
Print("Ордер закрыт");
Такая не документированная примочка в mql4 можно использовать для закрытия ордера OrderClosePrice() вместо Ask или Bid и в этом случае не надо разделять по типу ордера. Закроет в любом случае.
 
AlexeyVik:

Это не скрипт. Это всего лишь команда открыть ордер. Функция OrderSend возвращает тикет ордера если открытие произошло успешно. Но перед закрытием надо сначала определить тикет ордера. А чтобы его определить надо сначала выбрать ордер из списка ордеров по его индексу. Если ордеров открыто всего 1 то его индекс в списке будет 0. Соответственно если только один открытый ордер, можно написать без цикла и проверки соответствия символа и соответствия магика так. Не грамотно, но всё-же. Исключительно для примера.

Такая не документированная примочка в mql4 можно использовать для закрытия ордера OrderClosePrice() вместо Ask или Bid и в этом случае не надо разделять по типу ордера. Закроет в любом случае.

Ну вот смотри, написал, а отвечать потом за "неполадки" кто будет? :))))

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

Я пытался вразумить человека как правильно делать, а не абы-как ... Эхххх...