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

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

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 { // восстанавливаем объект, т.к. он не должен исчезать с курсора мыши } } Все равно открывается масса ордеров ...

Scriptong: Вы можете привести полный код? По обрывкам кода тяжело понять, что именно у вас не получается.

voldemar227: extern double Lot = 0.01; extern int Correlyciya = 50 ; extern int Profit=300; extern int PeriodMA=13; extern int Sdvig=0; extern int Tip=1; extern int Price=0; extern int Slip = 5; int magic1=0; int magic2=123456; int dist = 500; bool flag ; double fer=0; int ob1 ; int os1 ; int obl1; int osl1; int obs1; int oss1; int ca1 ; int da1 ; int ob ; int os ; int obl; int osl; int obs; int oss; int ca; int da; //#include <DataExchange.mqh> int start() { //----------------------------------------------------------------------------------------------------- ObjectCreate ("op_buy", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("op_buy", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("op_buy", OBJPROP_XDISTANCE, 100); //Двигать в право ObjectSet ("op_buy", OBJPROP_YDISTANCE, 60); //Двигать в низ GetLastError(); ObjectSetText("op_buy", "OP_BUY",10, "Times New Roman", Blue); //----------------------------------------------------------------------------------------------------- ObjectCreate ("op_sell", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("op_sell", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("op_sell", OBJPROP_XDISTANCE, 97); //Двигать в право ObjectSet ("op_sell", OBJPROP_YDISTANCE, 80); //Двигать в низ GetLastError(); ObjectSetText("op_sell", "OP_SELL",10, "Times New Roman", Red); //----------------------------------------------------------------------------------------------------- ObjectCreate ("OP_BUYLIMIT", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("OP_BUYLIMIT", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("OP_BUYLIMIT", OBJPROP_XDISTANCE, 65); //Двигать в право ObjectSet ("OP_BUYLIMIT", OBJPROP_YDISTANCE, 100); //Двигать в низ GetLastError(); ObjectSetText("OP_BUYLIMIT", "OP_BUYLIMIT",10, "Times New Roman", Blue); //----------------------------------------------------------------------------------------------------- ObjectCreate ("OP_SELLLIMIT", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("OP_SELLLIMIT", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("OP_SELLLIMIT", OBJPROP_XDISTANCE, 62); //Двигать в право ObjectSet ("OP_SELLLIMIT", OBJPROP_YDISTANCE, 120); //Двигать в низ GetLastError(); ObjectSetText("OP_SELLLIMIT", "OP_SELLLIMIT",10, "Times New Roman", Red); //----------------------------------------------------------------------------------------------------- ObjectCreate ("OP_BUYSTOP", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("OP_BUYSTOP", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("OP_BUYSTOP", OBJPROP_XDISTANCE, 68); //Двигать в право ObjectSet ("OP_BUYSTOP", OBJPROP_YDISTANCE, 140); //Двигать в низ GetLastError(); ObjectSetText("OP_BUYSTOP", "OP_BUYSTOP",10, "Times New Roman", Blue); //----------------------------------------------------------------------------------------------------- ObjectCreate ("OP_SELLSTOP", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("OP_SELLSTOP", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("OP_SELLSTOP", OBJPROP_XDISTANCE, 65); //Двигать в право ObjectSet ("OP_SELLSTOP", OBJPROP_YDISTANCE, 160); //Двигать в низ GetLastError(); ObjectSetText("OP_SELLSTOP", "OP_SELLSTOP",10, "Times New Roman", Red); //----------------------------------------------------------------------------------------------------- ObjectCreate ("CloseALL", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("CloseALL", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("CloseALL", OBJPROP_XDISTANCE, 78); //Двигать в право ObjectSet ("CloseALL", OBJPROP_YDISTANCE, 180); //Двигать в низ GetLastError(); ObjectSetText("CloseALL", "CLOSE_ALL",10, "Times New Roman", LimeGreen); //----------------------------------------------------------------------------------------------------- ObjectCreate ("--------", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("--------", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("--------", OBJPROP_XDISTANCE, 65); //Двигать в право ObjectSet ("--------", OBJPROP_YDISTANCE, 40); //Двигать в низ GetLastError(); ObjectSetText("--------", "-----------------------",10, "Times New Roman", LimeGreen); //----------------------------------------------------------------------------------------------------- ObjectCreate ("DeleteALL", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("DeleteALL", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("DeleteALL", OBJPROP_XDISTANCE, 70); //Двигать в право ObjectSet ("DeleteALL", OBJPROP_YDISTANCE, 200); //Двигать в низ GetLastError(); ObjectSetText("DeleteALL", "DELETE_ALL",10, "Times New Roman", LimeGreen); //----------------------------------------------------------------------------------------------------- ObjectCreate ("1--------", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("1--------", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("1--------", OBJPROP_XDISTANCE, 63); //Двигать в право ObjectSet ("1--------", OBJPROP_YDISTANCE, 220); //Двигать в низ GetLastError(); ObjectSetText("1--------", "-----------------------",10, "Times New Roman", LimeGreen); //----------------------------------------------------------------------------------------------------- // Сравниваем метки //----------------------------------------------------------------------------------------------------- if (fer==0) { ob = ObjectGet("op_buy", OBJPROP_XDISTANCE); os = ObjectGet("op_sell", OBJPROP_XDISTANCE); obl= ObjectGet("OP_BUYLIMIT" ,OBJPROP_XDISTANCE); osl= ObjectGet("OP_SELLLIMIT",OBJPROP_XDISTANCE); obs= ObjectGet("OP_BUYSTOP", OBJPROP_XDISTANCE); oss= ObjectGet("OP_SELLSTOP", OBJPROP_XDISTANCE); ca = ObjectGet("CloseALL", OBJPROP_XDISTANCE); da = ObjectGet("DeleteALL", OBJPROP_XDISTANCE); } if (ob!=0&&os!=0&&obl!=0&&osl!=0){fer=1;} ob1 = ObjectGet("op_buy", OBJPROP_XDISTANCE); os1 = ObjectGet("op_sell", OBJPROP_XDISTANCE); obl1= ObjectGet("OP_BUYLIMIT" ,OBJPROP_XDISTANCE); osl1= ObjectGet("OP_SELLLIMIT",OBJPROP_XDISTANCE); obs1= ObjectGet("OP_BUYSTOP", OBJPROP_XDISTANCE); oss1= ObjectGet("OP_SELLSTOP", OBJPROP_XDISTANCE); ca1 = ObjectGet("CloseALL", OBJPROP_XDISTANCE); da1 = ObjectGet("DeleteALL", OBJPROP_XDISTANCE); //----------------------------------------------------------------------------------------------------- double Ma=iMA(NULL,0,PeriodMA,Sdvig,Tip,Price,1); double profitb = NormalizeDouble(Profit*Point,Digits); double profits = NormalizeDouble(Profit*Point,Digits); double CORR = NormalizeDouble(Correlyciya*Point ,Digits); double didibs = NormalizeDouble(Ask+dist*Point,Digits); double didibl = NormalizeDouble(Ask-dist*Point,Digits); double didiss = NormalizeDouble(Bid-dist*Point,Digits); double didisl = NormalizeDouble(Bid+dist*Point,Digits); //----------------------------------------------------------------------------------------------------- // Считаем все ордера //----------------------------------------------------------------------------------------------------- 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 (OrderType()==OP_SELL&& OrderMagicNumber()==magic1){s++ ;} if (OrderType()==OP_BUY && OrderMagicNumber()==magic2){b2++ ;} if (OrderType()==OP_SELL&& OrderMagicNumber()==magic2){s2++ ;} if (OrderType()==OP_BUYLIMIT&& OrderMagicNumber()==magic1){bl++;} if (OrderType()==OP_SELLLIMIT&&OrderMagicNumber()==magic1){sl++;} if (OrderType()==OP_BUYSTOP &&OrderMagicNumber()==magic1){bs++; ObjectCreate("Line111",OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSet("Line111",OBJPROP_COLOR,Blue); ObjectSet("Line111",OBJPROP_STYLE,0); ObjectSet("Line111",OBJPROP_WIDTH,1); } if (OrderType()==OP_SELLSTOP &&OrderMagicNumber()==magic1){ss++; ObjectCreate("Line122",OBJ_HLINE,0,0,OrderOpenPrice()); ObjectSet("Line122",OBJPROP_COLOR,Red); ObjectSet("Line122",OBJPROP_STYLE,0); ObjectSet("Line122",OBJPROP_WIDTH,1); }}}} //----------------------------------------------------------------------------------------------------- // Открываем ордера //----------------------------------------------------------------------------------------------------- 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); //Открываем ордер ТУТ Я ИЗМЕНИЛ КАК ВЫ СКАЗАЛИ НО ОРДЕРА ПЕРЕСТАЛИ ВЫСТАВЛЯТЬСЯ } }

voldemar227: Ок ! Я добился того что на тестере заработало иммено так как вы говорите ! Но пчемуто работает через раз а на демо не работает ... В чем может быть проблема ??? Меня посетила мысль может это сделать с помощью двух флагов ???? Первый флаг говорит что значек смещен и активирует второй флаг когда значек уже на своем родном месте при выставлении ордера второй флаг приходит в исходное состояние ???????

voldemar227: Вот что я сделал !!!! if (ob !=ob1 ) // Сравниваем координаты обьекта с его родными координатами { flag1=true; //Если координаты не равны флаг делаем труе } if (flag1==true&&ob==ob1)// если флаг1 равен труе (то есть значек дергали) и флаг1 вернулся на место { flag2=1; // Сделать флаг2 равным 1 } if (flag2==1) //если флаг2 равен 1 { OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер flag2=0; // возвращаем флаги в исходное состояние flag1=false; // возвращаем флаги в исходное состояние } Подозреваю что такое можно сделать с помощью одного флага

voldemar227: Вот я привел код в порядок !!!! Стабильно работает и в тестере и на демо ! Переменная flag1 инициализируется пустой до start () { if (ob !=ob1 ) { flag1=1; } // Если наш значок сдвинут if (flag1==1&&ob==ob1) { flag1=2; } // Если наш значок вернулся на своё место if (flag1==2) { OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер flag1=0; // Приводим флаг в начальное положение } Насколько этот код правилен и есть ли варианты лучше проще и стабильнее ?????

SK: Вот прообраз того, что Вам нужно. extern int Slip = 125; extern double Lot = 0.1; int magic1 = 777; int Ord_X = 100; int Buy_Y = 60; int Sell_Y = 80; int Buy = 0; int Sell = 0; int BuyStop = 0; int SellStop = 0; int BuyLimit = 0; int SellLimit = 0; int Ticket = 0; int Error = 0; double Price = 0; //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx int start() { while(!IsStopped()) // До тех пор, пока не получена команда на завершение работы { RefreshRates(); //======================================================================================================= if (ObjectFind("op_buy")==-1 && Buy==0) { ObjectCreate ("op_buy", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("op_buy", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("op_buy", OBJPROP_XDISTANCE, Ord_X); //Двигать в право ObjectSet ("op_buy", OBJPROP_YDISTANCE, Buy_Y); //Двигать в низ GetLastError(); ObjectSetText("op_buy", "OP_BUY ",10, "Courier New", DodgerBlue); WindowRedraw(); } //----------------------------------------------------------------------------------------------------- if (ObjectFind("op_sell")==-1 && Sell==0) { ObjectCreate ("op_sell", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("op_sell", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("op_sell", OBJPROP_XDISTANCE, Ord_X); //Двигать в право ObjectSet ("op_sell", OBJPROP_YDISTANCE, Sell_Y); //Двигать в низ GetLastError(); ObjectSetText("op_sell", "OP_SELL",10, "Courier New", Red); WindowRedraw(); } //======================================================================================================= if (ObjectGet("op_buy", OBJPROP_XDISTANCE)!=Ord_X || ObjectGet("op_buy", OBJPROP_YDISTANCE)!=Buy_Y) { ObjectDelete("op_buy"); if (ObjectFind("op_buy")==-1) Buy=1; } //----------------------------------------------------------------------------------------------------- if (ObjectGet("op_sell", OBJPROP_XDISTANCE)!=Ord_X || ObjectGet("op_sell", OBJPROP_YDISTANCE)!=Sell_Y) { ObjectDelete("op_sell"); if (ObjectFind("op_sell")==-1) Sell=1; } //======================================================================================================= if (Buy==1) { Price = NormalizeDouble(Ask, Digits); Ticket = OrderSend(Symbol(),OP_BUY,Lot,Price,Slip,0,0,"Order BUY #",magic1,0,Green); if (Ticket > 0) Buy = 0; } //----------------------------------------------------------------------------------------------------- if (Sell==1) { Price = NormalizeDouble(Bid, Digits); Ticket = OrderSend(Symbol(),OP_SELL ,Lot,Price,Slip,0,0,"Order Sell #",magic1,0,Green); if (Ticket > 0) Sell = 0; } //======================================================================================================= Sleep(50); // Обязательно } } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx int deinit() { if (UninitializeReason()==1) { ObjectDelete("op_buy"); ObjectDelete("op_sell"); } } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Если что-то не понятно, спросите. В любом случе для решения задачи не требуется считать уже открытые ордера.

voldemar227: Я понял что считать ордера не нужно ! И к сожалению в данном коде мне много чего не понятно прокоментируйте пожалучта эти куски кода if (ObjectFind("op_sell")==-1 && Sell==0) { ObjectCreate ("op_sell", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку ObjectSet ("op_sell", OBJPROP_CORNER, 1 ); //Задаёт угол ObjectSet ("op_sell", OBJPROP_XDISTANCE, Ord_X); //Двигать в право ObjectSet ("op_sell", OBJPROP_YDISTANCE, Sell_Y); //Двигать в низ GetLastError(); ObjectSetText("op_sell", "OP_SELL",10, "Courier New", Red); WindowRedraw(); int deinit() { if (UninitializeReason()==1) { ObjectDelete("op_buy"); ObjectDelete("op_sell"); } } int start() { while(!IsStopped()) // До тех пор, пока не получена команда на завершение работы { RefreshRates(); и зачем Sleep(50); // Обязательно

SK: В данном коде представлен зацикленный эксперт. Это значит, что в нём организован бесконечный цикл. Это сделано с целью обеспечить мгоновенную реакцию на управл. воздействие с момента, когда пользователь отпутил перетаскиваемый значок. Поскольку start() получает котировки Bid и Ask один раз, как бы на входе, то в процессе бесконечного цикла котировки обновляться не будут. Чтобы получать на каждой итерации цикла новые котировки, нужно обновляться с помощью RefreshRates(); Sleep(50); нужно для того, чтобы не было большой нагрузки на процессор. Т.е. между итерациями большого цикла выдерживается пауза 50 мс. Учитывая, что время расчётов прибл = 1 мс, т.е. при соотношении работы и паузы 1:50 процессор нагрузится прибл. на 2%. Если время паузы уменьшать, реакция будет быстрее, но будет возрастать нагрузка на процессор. Если совсем убрать, то одноядерный комп будет сильно тормозить все программы. if (ObjectFind("op_sell")==-1 && Sell==0) Это самоочевидно (посматривайте в справку МЕ). Если Объекта с названием op_sell нету (-1) И флаг на открытие Sell не поднят (=0, открывать Sell не нужно), то: создать объект (ObjectCreate) с такими-то данными (ObjectSet ) и перерисовать экран (WindowRedraw) для моментального отображения этого объекта. В deinit() тоже всё очевидно. Если причина деинициализации (UninitializeReason, смотрите справку) в том, что программа удалена с графика (=1), то перед уходом нужно почистить за собой свои объекты (удалить, ObjectDelete)

voldemar227: Вопрос обычно в конце советника в конце функции старт пишется return(0); } в вашем коде я этого не увидел почему ????? А насчет того что цикл грузит процессор это да !!! Причем жостко ! У меня феном х6 1100 при перетаскивании обьектов загрузка одного ядра почти на 80 % идет....

Scriptong: voldemar227 пишет: Вопрос обычно в конце советника в конце функции старт пишется return(0); } в вашем коде я этого не увидел почему ????? В принципе нужно. Но компилятор по умолчанию подставляет его, если не находит в конце функции. Также можно обойтись без return, если функция имеет тип void.

voldemar227: Сделал все в цыкле как вы рекомендовали !!! Теперь проблема в том что на тестере не идут котировки ... Как исправить ????

SK: Нужно анализировать режим работы: http://docs.mql4.com/ru/check Если на демо или реале - оставить цикл. Если тест в режиме визуализации - цикл убрать.

voldemar227: А как отключить цикл если весь советник внутри данного цикла ???

Scriptong: voldemar227 пишет: А как отключить цикл если весь советник внутри данного цикла ??? У каждого цикла должно быть условие его окончания. В данном случае этим условием выступает действие пользователя - удалить скрипт (функция IsStopped() в коде). Если же имеете в виду "цикл убрать", то просто убрать конструкцию while с фигурными скобками, вызов IsStopped и Sleep, переделать скрипт в советник. Функция start будет запускаться в тестере от каждого тика. Поэтому зацикленность там не нужна. Если же нужно, чтобы такой советник работал и в реале, и в тесте, то анализировать режим запуска при помощи функций IsOptimization, IsTesting, IsVisualMode, и работать в цикле, если советник запущен онлайн, или не работать в цикле, если советник запущен в тестере.



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