Форум » Синтаксис языка » Открытие ордеров.??? » Ответить

Открытие ордеров.???

voldemar227: Вопрос состоит в следующем : для обнаружения ордеров я использую цикл типа: int total=OrdersTotal(); int b=0,s=0, n=0, bl=0,sl=0, bs=0,ss=0,b2=0,s2=0; for (int i=total; i>=0; i--) {if(OrderSelect(i, SELECT_BY_POS)) {if(OrderSymbol()==Symbol() ) {n++; //----------------------------------------------------------------------------------------------------- if (OrderType()==OP_BUY && OrderMagicNumber()==magic1){b++ ;} }}} и если нет ордеров заданного типа , то есть if ( b==0&&(дополнительное условие)) советник открывает ордер, Вопрос : если b становится равным 1 то советник уже ордер не откроет. Как сделать что бы при каждом появлении условия открывался всего один ордер ????????

Ответов - 24, стр: 1 2 3 All

Scriptong: voldemar227 пишет: Вопрос : если b становится равным 1 то советник уже ордер не откроет. Как сделать что бы при каждом появлении условия открывался всего один ордер ???????? В вашем вопросе ответ уже содержится. Если советник откроет ордер заданного типа, то количество ордеров станет равно 1. То есть ордера такого типа больше открыты не будут.

voldemar227: Хорошо ! Я это понимаю ! Допустим я не буду использовать цикл. Как сделать что бы открывался только один ордер ??? Как задать условие ????

Scriptong: voldemar227 пишет: Допустим я не буду использовать цикл. Как сделать что бы открывался только один ордер ??? Как задать условие ???? Если вы не станете использовать цикл, в котором будут посчитаны все позиции, то вы просто не будете располагать информацией о имеющихся позициях. Цикл в данном случае является обязательным. Чтобы понять, как правильнее написать программу, отделите мух от котлет, т.е. торговые критерии (сигналы открытия, модификации или закрытия) от торговых приказов. Торговый критерий определите отдельно, независимо от состояния депозита. Это одна функция. Другая функция - это определение состояния счета (подсчет имеющихся ордеров, вычисление допустимого объема будущего ордера и т.п.). И только в третьей функции соединяете воедино полученные показатели. К примеру, у вас есть сигнал открытия рыночного ордера Buy. Значит, необходимо проверить, есть ли уже Buy нужного объема. Если есть, то пропустить сигнал. Если есть ордер, но объем мал, то добавить еще один Buy. Если Buy нет, а есть Sell, то закрыть Sell и открыть Buy. Это - "к примеру", т.к. в вашей стратегии может быть предусмотрен другой алгоритм.


SK: voldemar227 пишет: Вопрос : если b становится равным 1 то советник уже ордер не откроет. Как сделать что бы при каждом появлении условия открывался всего один ордер ???????? Не очень понятен вопрос. Если допустить, что один ордер всё же будет открываться при каждом появлении условия, то .. ордера будут открываться ровно столько раз, сколько раз сработает условие. Если условие таково, что оно будет срабатывать на каждом тике, то на каждом тике будет открываться ордер. Тогда непонятно зачем вообще считать ордера (b++). И.. сколько же ордеров откроется? Неужели столько, что в сумме на весь депозит? Если условие таково, что предполагается всего один однонаправленный ордер, то ордера не следует открывать, если ордер уже есть. Одним словом, пока не понятна задача. Опишите подробнее.

voldemar227: Здравствуйте! Я сделал графический объект при перемещении которого открывается только один ордер . Ордер открывается только один так как я использую цикл для подсчета ордеров и соответственно если b становится = 1 то второй ордер при перемещении объекта я уже открыть не могу. Если же я из условия убираю b==0 то при перетягивании графического объекта открывается 100 ордеров сразу... Я видел что в афтографе 4 можно открывать много ордеров . Подскажите как сделать что бы при перетягивании значка каждый раз открывался только один ордер ???????

Scriptong: voldemar227 пишет: Подскажите как сделать что бы при перетягивании значка каждый раз открывался только один ордер ??????? Теперь задача стала более понятной. Но от этого суть предыдущего моего высказывания не меняется. В данном случае торговым критерием у вас является факт перемещения значка. Количество открытых позиций, действительно, можно выбросить. Множество позиций у вас открывается, видимо, по той причине, что вы реагируете на перемещение значка еще тогда, когда пользователь не отпустил его (значок еще на мышке). Для этого необходимо удостовериться в том, что значок более не перемещается. Критерием того, что пользователь отпустил значок, является возможность программного удаления значка. Значит, вы должны пытаться удалять значок во время его перемещения до тех пор, пока не сможете его удалить. Как только удаление значка стало возможным, открывайте позицию и возвращайте значок на его изначальное место. Таким образом, торговый критерий пропадет до нового перемещения значка.

SK: voldemar227 пишет: Ордер открывается только один так как я использую цикл для подсчета ордеров и соответственно если b становится = 1 то второй ордер при перемещении объекта я уже открыть не могу. Если же я из условия убираю b==0 то при перетягивании графического объекта открывается 100 ордеров сразу... Написанное понятно. Непонятно другое. Зачем считать открытые ордера? Ведь в цикле Вы делает именно это? Считаете уже открытые ордера? Для того, чтобы открыть один ордер после некоторого внешнего воздействия (в Вашем случае смещения значка) не нужно считать уже открытые рыночные ордера. Нужно следить за состоянием управляющего значка: 1 - если значок в исходной позиции, ничего не делать; 2 - если значок сдвинут, нужно: 2.1 - запомнить, что значок был сдвинут 2.2 - вернуть значок на исходную позицию 2.3 - открыть один ордер 2.3.1 - как только ордер открыт, перестать пытаться открывать ордера 2.3.2.1 - если это не получилось, перейти к пункту 2.3 (вообще тут нужен и анализ ошибки) 2.3.2 - забыть, что значок был сдвинут В предыдущем посте Scriptong описал порядок отслеживания факта сдвига управляющего значка (пункта 2).

voldemar227: Scriptong пишет: Для этого необходимо удостовериться в том, что значок более не перемещается. Критерием того, что пользователь отпустил значок, является возможность программного удаления значка. Значит, вы должны пытаться удалять значок во время его перемещения до тех пор, пока не сможете его удалить. Как только удаление значка стало возможным, открывайте позицию и возвращайте значок на его изначальное место. Таким образом, торговый критерий пропадет до нового перемещения значка. Что то не получается не могу понять в чем проблема if (ob !=ob1 ) // Сравниваем координаты обьекта с его родными координатами { if (ObjectDelete("op_buy")==true) //если обьект удален { OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер } } Всеравно продолжает открывать по 20-50 ордеров при перемещении значка....

Scriptong: Не совсем так. ObjectDelete всегда вернет true, если объект существует. Но это не означает, что объект успешно удален. После удаления объекта необходимо проверить, находится ли он на графике: if (ob !=ob1 ) // Сравниваем координаты обьекта с его родными координатами { if (ObjectDelete("op_buy")==true && ObjectFind("op_buy") < 0) //если обьект удален { OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер } else { // восстанавливаем объект, т.к. он не должен исчезать с курсора мыши } }

voldemar227: Scriptong пишет: Не совсем так. ObjectDelete всегда вернет true, если объект существует. Но это не означает, что объект успешно удален. После удаления объекта необходимо проверить, находится ли он на графике: if (ob !=ob1 ) // Сравниваем координаты обьекта с его родными координатами { if (ObjectDelete("op_buy")==true && ObjectFind("op_buy") < 0) //если обьект удален { OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер } else { // восстанавливаем объект, т.к. он не должен исчезать с курсора мыши } } Все равно открывается масса ордеров ...



полная версия страницы