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

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

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: 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.



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