Написал обращаясь к истории.
hcount=OrdersHistoryTotal(); for(i=0;i<hcount;i++) { istor=OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); if(OrderTicket()==ticket)break; } b=OrderProfit(); // Определяем цену ордера +/-"); Alert("значения цены ордера ордер профит = "+b," ticket= "+ticket,"istor=1 ="+istor," i ="+i);
Нужно подобие для торговых ордеров. MODE_TRADES у меня не пашет. Где-то ошибка:
hcount=OrdersTotal(); for(i=0;i<hcount;i++) { ist=OrderSelect(i,SELECT_BY_POS,MODE_TRADES); if(OrderTicket()==ticket)break; } b=OrderProfit(); // Определяем цену ордера +/-");
Мне нужно обратится к закрывшемуся ордеру, найти методом исключения среди рыночных не ссылаясь на историю - в истории ордеров пруд пруди, нужно искать среди рыночных. Ускоряем робот. О свойствах ордера речи не идет.
Мне нужно обратится к закрывшемуся ордеру, найти методом исключения среди рыночных не ссылаясь на историю - в истории ордеров пруд пруди, нужно искать среди рыночных. Ускоряем робот. О свойствах ордера речи не идет.
for(i=0;i<OrdersHistoryTotal();i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue; if(OrderTicket() !=ticket ) continue; Alert ("значения цены ордера ордер профит = " +OrderProfit(), " ticket= "+ticket, "istor=1 i ="+ i); break; } for(i=0;i<OrdersTotal();i++) { if(!OrderSelect(i,SELECT_BY_POS)) continue; if(OrderType() != OP_BUY && OrderType() != OP_SELL) continue; if(OrderTicket() !=ticket ) continue; Alert ("значения цены ордера ордер профит = " +OrderProfit(), " ticket= "+ticket, "istor=1 i ="+ i); break; }
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { Alert ("значения цены ордера ордер профит = " +OrderProfit(), " ticket= "+ticket); } else if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISTORY)) { Alert ("значения цены ордера ордер профит = " +OrderProfit(), " ticket= "+ticket); }
Коллеги, сижу и думаю как написать простой цикл на отслеживание закрывшегося ордера.
Задача: В рынке 10 ордеров(отложенный или рыночный пофиг), их тиккеты уже записаны в глобальных переменных. Вдруг два закрывается (по tp или sl). Требуется их идентифицировать какие ордера закрылись и допустим выставить их вновь.
Были попытки написать цикл через OrderSelekt и последовательно искать по тейку ордера и выискивать закрывшийся, но не получилось.... Помогите. Голова пухнет.
Т.е. мне просто нужно идентифицировать закрывшийся ордер в списке по любым параметрам и далее совершить действия.
Буду кланяться прям если еще напишите)
Когда-то, давным давно писал хорошему человеку такой советник.
Хотел сейчас вытащить главное из него, но что-то ... голова другим забита. В общем если есть желание и способности, вот полный код того советника
/********************************************************************\ | ReopeningOrders.mq4 | | Viktorov Alexey | Восстанавливает закрытые ордера. Проверка если нет открытых (и установленных отложек) - открываем Sell если true или Buy если true, могут оба открыться, если оба true, если false Sell то только Buy если он true.. как только открылась сделка, например бай от нее ставим селлстоп на Х расстояние, если селл то от неё байстоп на Х расстояние дополнение... от сработавших отложек уже ничего ставить не нужно, максимум получается по полной может быть только 4 ордера. 2 сразу открытые и 2 отложки... вот они и будут воскрешаться при закрытии... \********************************************************************/ #property copyright "Viktorov Alexey" #property link "" #property version "1.00" #property strict input int Magic = 0; // Magic number input bool allMagic = true; // Reopening all Magic number? input bool opBuy = true; // Open Buy or no input bool opSell = true; // Open Sell or no input double lot = 0.1; // Lot for new order input int stopLoss = 200; // Stop Loss input int stopLossP = 200; // Stop Loss for pending input int takeProfit = 200; // Take Profit input int takeProfitP = 200; // Take Profit for pending input bool reOP = true; // Reopening Pending? input int distance = 200; // distance from the order /* если allMagic = true то сов будет работать со всеми магиками если Magic = 0 и allMagic = false то сов будет работать только с ордерами открытыми вручную. */ int JustOrders[]; int orderTicket, TotalOrders = 0, JustMarketOrders = 0; double stop // stopLoss*_Point , take // takeProfit*_Point , stopP // topLossP*_Point , takeP // takeProfitP*_Point , dist; // distance*_Point //long STOPLEVEL; string prefix = "XXX"; /******************Expert initialization function*******************/ int OnInit() { stop = stopLoss*_Point; take = takeProfit*_Point; stopP = stopLossP*_Point; takeP = takeProfitP*_Point; dist = distance*_Point; TotalMarketOrders(); PutEdit(prefix+"ticket", 290, 25, "ticket"); PutButton(prefix+"close", 200, 25, "Закрыть или удалить"); return(INIT_SUCCEEDED); }/*******************************************************************/ /*************************Expert tick function***********************/ void OnTick() { bool co = false; double PR; int i, ordType = -1, total = ArraySize(JustOrders); for(i = 0; i < total; i++) { if(OrderSelect(JustOrders[i], SELECT_BY_TICKET) && OrderCloseTime() > 0) { PR = OrderOpenPrice(); if(OrderType() == OP_BUY) { ordType = OP_BUYSTOP; if(PR < Bid) ordType = OP_BUYLIMIT; } if(OrderType() == OP_SELL) { ordType = OP_SELLSTOP; if(PR > Bid) ordType = OP_SELLLIMIT; } if(ordType >= 0) OpenOrders(ordType, OrderLots(), PR, OrderStopLoss(), OrderTakeProfit(), OrderMagicNumber()); co = true; } } if(co) TotalMarketOrders(); // Если было переоткрытие ордеров, массив будет перезаписан. if(OrdersTotal() == 0) { if(opBuy) { double sl = stop > 0 ? Ask-stop : 0.0; double tp = take > 0 ? Ask+take : 0.0; int tic = OpenOrders(OP_BUY, lot, Ask, sl, tp, Magic); double price = (OrderSelect(tic, SELECT_BY_TICKET) ? OrderOpenPrice() : Ask)-dist; sl = stop > 0 ? price+stopP : 0.0; tp = take > 0 ? price-takeP : 0.0; OpenOrders(OP_SELLSTOP, lot, NormalizeDouble(price, _Digits), sl, tp, Magic); } if(opSell) { double sl = stop > 0 ? Bid+stop : 0.0; double tp = take > 0 ? Bid-take : 0.0; int tic = OpenOrders(OP_SELL, lot, Bid, sl, tp, Magic); double price = NormalizeDouble((OrderSelect(tic, SELECT_BY_TICKET) ? OrderOpenPrice() : Bid)+dist, _Digits); sl = stop > 0 ? price-stopP : 0.0; tp = take > 0 ? price+takeP : 0.0; OpenOrders(OP_BUYSTOP, lot, price, sl, tp, Magic); } } if((TotalOrders != OrdersTotal() && reOP) || TotalOrders < OrdersTotal()) TotalMarketOrders(); // Если открыл ордер по рынку, он будет внесён в массив. if(ObjectGetInteger(ChartID(), prefix+"close", OBJPROP_STATE) == true) { orderTicket = (int)ObjectGetString(ChartID(), prefix+"ticket", OBJPROP_TEXT, 0); if(OrderSelect(orderTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0) { if(OrderType() < OP_BUYLIMIT) { if(!OrderClose(orderTicket, OrderLots(), OrderClosePrice(), 100)) printf(""); } else { if(!OrderDelete(orderTicket)) printf(""); } } ObjectSetString(0, prefix+"ticket", OBJPROP_TEXT, "ticket"); ObjectSetInteger(0, prefix+"close", OBJPROP_STATE, false); } }/*******************************************************************/ void OnChartEvent(const int id, // идентификатор события const long& lparam, // параметр события типа long const double& dparam, // параметр события типа double const string& sparam // параметр события типа string ) { if(id == CHARTEVENT_OBJECT_ENDEDIT) { //Print("id ", EnumToString(CHARTEVENT_OBJECT_ENDEDIT), " dparam ", dparam, " sparam ", sparam); orderTicket = (int)StringToInteger(ObjectGetString(ChartID(), prefix+"ticket", OBJPROP_TEXT)); if(orderTicket <= 0) { ObjectSetString(0, prefix+"ticket", OBJPROP_TEXT, "ticket"); ObjectSetInteger(0, prefix+"ticket", OBJPROP_COLOR, clrGray); } else ObjectSetInteger(0, prefix+"ticket", OBJPROP_COLOR, clrGreen); } }/*******************************************************************/ /***************************Создать кнопку***************************/ void PutButton(string name, int x, int y, string text) { ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, name, OBJPROP_XSIZE, 200); ObjectSetInteger(0, name, OBJPROP_YSIZE, 25); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_LOWER); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetString(0, name, OBJPROP_FONT, "Arial"); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10); ObjectSetInteger(0, name, OBJPROP_COLOR, Red); ObjectSetInteger(0, name, OBJPROP_BGCOLOR, White); ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, Blue); ObjectSetInteger(0, name, OBJPROP_HIDDEN, false); ObjectSetInteger(0, name, OBJPROP_ZORDER, 0); } /*************************Создать поле ввода*************************/ void PutEdit(string name,int x,int y,string text) { ObjectCreate(0, name, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, name, OBJPROP_XSIZE, 90); ObjectSetInteger(0, name, OBJPROP_YSIZE, 25); ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_RIGHT_LOWER); ObjectSetString(0, name, OBJPROP_TEXT, text); ObjectSetString(0, name, OBJPROP_FONT, "Arial"); ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 10); ObjectSetInteger(0, name, OBJPROP_ALIGN, ALIGN_CENTER); ObjectSetInteger(0, name, OBJPROP_READONLY, false); ObjectSetInteger(0, name, OBJPROP_COLOR, clrGray); ObjectSetInteger(0, name, OBJPROP_BGCOLOR, clrWhite); ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, clrBlue); }/*******************************************************************/ int OpenOrders(int type, double lots, double price, double sl, double tp, int magic) { int tick = -1; tick = OrderSend(_Symbol, type, lots, price, 50, sl, tp, NULL, magic); if(tick < 0) Print("Чё за херня?... Ордер не открылся... ", GetLastError()); return(tick); }/*******************************************************************/ void TotalMarketOrders() { int i, total = OrdersTotal(); ArrayFree(JustOrders); for(i = 0; i < total; i++) { if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == _Symbol && OrderType() <= OP_SELLSTOP && (allMagic || OrderMagicNumber() == Magic)) { ArrayResize(JustOrders, ArraySize(JustOrders)+1); JustOrders[i] = OrderTicket(); JustMarketOrders++; } } TotalOrders = OrdersTotal(); }/*******************************************************************/ /******************Expert deinitialization function******************/ void OnDeinit(const int reason) { ObjectsDeleteAll(ChartID(), prefix); //Comment(""); }/*******************************************************************/
Константин, Алексей благодарен.
Буду искать по тиккету.
Алексей, вы заинтересовали) Сразу захотелось понять, что хотел разработчик. Но глобальные переменные путают все карты...поди разбери, что было вашей целью. Тем более каждый художник по разному смешивает краски - я так не пишу.
Поделитесь опытом, какие индикаторы наиболее привлекательны? Я пока свои взор обратил на АО.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Коллеги, сижу и думаю как написать простой цикл на отслеживание закрывшегося ордера.
Задача: В рынке 10 ордеров(отложенный или рыночный пофиг), их тиккеты уже записаны в глобальных переменных. Вдруг два закрывается (по tp или sl). Требуется их идентифицировать какие ордера закрылись и допустим выставить их вновь.
Были попытки написать цикл через OrderSelekt и последовательно искать по тейку ордера и выискивать закрывшийся, но не получилось.... Помогите. Голова пухнет.
Т.е. мне просто нужно идентифицировать закрывшийся ордер в списке по любым параметрам и далее совершить действия.
Буду кланяться прям если еще напишите)