Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
все... немогу... пошел следующим путем... но опять что-то не так:
я что-то не понимаю????? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Здесь мне кажется написано неправильно условие цикла for. ОрдерсТотал дает общее количество ордеров (допустим их 10). А просматриваете вы их начиная с индекса 0. Следовательно вы хотите просмотреть не 10 а 11 ордеров. Тут нужно сделать
for (int cnt=0;cnt<ot;cnt++). И еще после алерта оператор return добавить нужно.
Попробуйте так. Знаете, я тоже чайник, поэтому тоже могу что-то неправильно понимать. Но всегда все приходится понимать методом тыка.
Сейчас перечитаю ваше предыдущее сообщение и отвечу.
Как чайник - чайнику. Попробуйте пойти моим путем :). Ищу прогу, а в ней кусок кода, в котором есть нужные мне действия, а не изобретаю код сам.
Результат: (похоже на Ваши вопросы) посмотрите в КодеБазе->Скрипты мои КлозеАллБайСелл, Оверкиль и Локер. Там есть перебор и поиск определенных ордеров, и действия с найденными. Кстати, если вам нужен номер конкретной позы, то отслеживают магик.
Здесь мне кажется написано неправильно условие цикла for. ОрдерсТотал дает общее количество ордеров (допустим их 10). А просматриваете вы их начиная с индекса 0. Следовательно вы хотите просмотреть не 10 а 11 ордеров. Тут нужно сделать
for (int cnt=0;cnt<ot;cnt++). И еще после алерта оператор return добавить нужно.
Попробуйте так. Знаете, я тоже чайник, поэтому тоже могу что-то неправильно понимать. Но всегда все приходится понимать методом тыка.
Сейчас перечитаю ваше предыдущее сообщение и отвечу.
Константа OP_BUY, из приведенного вашего списка в первом сообщении темы, имеет значение '0'.
Это же значение возвращает OrderType() если не выбран ордер функцией ОрдерСелект.
Итог, ТипОрдера нельзя узнать.
Как чайник - чайнику. Попробуйте пойти моим путем :). Ищу прогу, а в ней кусок кода, в котором есть нужные мне действия, а не изобретаю код сам.
Результат: (похоже на Ваши вопросы) посмотрите в КодеБазе->Скрипты мои КлозеАллБайСелл, Оверкиль и Локер. Там есть перебор и поиск определенных ордеров, и действия с найденными. Кстати, если вам нужен номер конкретной позы, то отслеживают магик.
Что значит "конкретной позы"? - нужны все позиции...
А что из разработчиков никто не подскажет как организовать подобную выборку ордера? Вообще, уже столько конкретных вопросов и ни одного конкретного ответа, наталкивает на мысль что сами разработчики не знают, а MQL4 - это на самом деле не язык программирован, а попытка чего-то автоматизировать логическими операциями. .. еще с Сями сравнили. ..
'Управление ордерами – это просто'
http://www.alpari-idc.ru/ru/experts/articles/8.html
Если скажете, что там всё очень сложно и непонятно описано, то просто берите любой готовый работающий код из CodeBase и разбирайтесь с каждой строкой. Ведь всё равно за вас это никто не сделает! Вспомните как сами например учили английский язык. Пока все упражнения не разберёшь - всё равно ничего из объяснения преподавателя будет непонятно.
Издеваетесь?... извиняюсь, но OrderTicket() - "Возвращает номер тикета. .." и OrderSend() - "Возвращает номер тикета...", в чем разница, зачем использовать один вместо другого?...
Вообще про OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE) сказано: "ticket - Уникальный порядковый номер ордера.", т. е. НЕ номер тикета! Но опять смотрим в MACD Sample.mq4:................
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); - видим противоречие...
Может кто-нибудь тогда точно ответить, первая переменная в функции ОредерКлозе - это номер тикета возвращаемый сервером или номер позиции ордера в списке терминала???
Если для OrderClose написано: "ticket - Уникальный порядковый номер ордера.", то само слово УНИКАЛЬНЫЙ уже означает что это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.
пробуем:
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,Ask-TakeProfit,"Candles", 123,0,Red);
OrderSelect(ticket[nt],SELECT_BY_TICKET,);
OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE);
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET);
if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ", ticket[nt]); //Alert: Selected order: 1
другими словами, по номеру тикета (тому что возвращает сервер) невозможно определить открытый он или уже закрытый?Если вам нужно выбрать только открытые ордера, как я уже отвечала вам на вопрос о том как выбрать только открытые позиции:
То есть использовать SELECT_BY_POS, и указать что ордер из открытых и отложенных- MODE_TRADES. И потом ставить условие "отсечения" отложенных - (OrderType()<=OP_SELL), чтоб выбранные ордера были ТОЛЬКО открытыми
В этом случае ваш ОрдерСелект (если его так оформить), который стоит после закрытия позы будет равен false (потому что он не сможет выбрать ни одной позиции среди открытых - так как их нет. И алерт не должен сработать вообще.
grotesque писал (а):
Вот еще косяк в справке (или MACD Sample.mq4?) обнаружил: bool OrderSelect (int index, int select, int pool=MODE_TRADES): pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Смотрим MACD Sample.mq4: OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES) - Спрашивается нафиг?
Для того чтобы понять вашу ошибку, я попыталась сама протестить этот кусочек кода. ВСЕ НОРМАЛЬНО ТЕСТИРУЕТ!!!
Тестирование проводилось на котировках Daily за 5 дней с 3 по 7 января 2005 года по валюте EURGBP (модель ПО ЦЕНАМ ОТКРЫТИЯ!). То есть функция Start() запускалась раз в день, следовательно опза открывалась раз в день. Смотрите что получилось:
Код1: Здесь для ОрдерСелект я указала выбирать по тикетам среди ВСЕХ позиций : открытых, закрытых и отложенных
Результат теста: видим что все нормально работает. так как поза выбирается по тикетам: выбирались и закрытые позиции тоже, то срабатывал алерт.
Результат теста: так как поза выбирается по не по тикетам, а среди открытых позиций (среди баев и селлов), закрытые позиции не были выбраны, следовательно алерт не работалКод2: Здесь для ОрдерСелект я указала выбирать по номерам позиций в списке СРЕДИ ОТКРЫТЫХ И ОТЛОЖЕННЫХ, и с помощью этого кусочка OrderType()<=OP_SELL мы ограничили рассмотрение только ОТКРЫТЫМИ ордерами
ИТАК, видим, что все работает, следовательно в предложенном вами коде ошибок небыло!
Ошибка была вот в чем.....
Попробуем тестануть код 1 так: поставим модель ВСЕ ТИКИ
Видим, что 386 сделок открылось и закрылось как полагается. Дальше сделка открыться не смогла. Потому что небыло свободной маржи, то есть нехватило денег. Следовательно, нетоткрытый OrderSend вернул переменной ticket - нуль. И поэтому функция ОrderClose обозвала этот параметр неправильным.
Вся ваша ошибка в том, что ваша позиция открывается с каждым тиком, который может меняться ежесекундно. И нет никаких ограничений.
Удачи вам! Будьте внимательны!
Да просто напросто никому неинтересно каждому вновь прибывшему рассказывать в 100-ый раз про одно и то же в то время как всё уже подробно разжёвано в статьях на сайте!
'Управление ордерами – это просто'
http://www.alpari-idc.ru/ru/experts/articles/8.html
Если скажете, что там всё очень сложно и непонятно описано, то просто берите любой готовый работающий код из CodeBase и разбирайтесь с каждой строкой. Ведь всё равно за вас это никто не сделает! Вспомните как сами например учили английский язык. Пока все упражнения не разберёшь - всё равно ничего из объяснения преподавателя будет непонятно.
Нет, я и не думала издеваться. Еще раз повторюсь, что я тоже чайник, и тоже чтото могу не так понимать, хотя пытаюсь разобраться :) Действительно, по логике скорее всего вы правы насчет OrderTicket() и OrderSend(), так что ругается программа не изза этого.
Если для OrderClose написано: "ticket - Уникальный порядковый номер ордера.", то само слово УНИКАЛЬНЫЙ уже означает что это номер тикета, который назначается сервером, а НЕ номер позиции в списке терминала.
Уникальный - означает всего лишь 'неповторяющийся', т.е. не может быть несколько тикетов, например, с номером 2... тоже самое с позициями, они тоже уникальны на данный момент времени.