Отслеживание закрывшихся ордеров на рынке, чтобы вновь его открыть.

 

Коллеги, сижу и думаю как написать простой цикл на отслеживание закрывшегося ордера.

Задача: В рынке 10 ордеров(отложенный или рыночный пофиг), их тиккеты уже записаны в глобальных переменных. Вдруг два закрывается (по tp или sl). Требуется их идентифицировать какие ордера закрылись и допустим выставить их вновь.   

Были попытки написать цикл через OrderSelekt  и последовательно искать по тейку ордера и выискивать закрывшийся, но не получилось.... Помогите. Голова пухнет.

Т.е. мне просто нужно идентифицировать закрывшийся ордер в списке по любым параметрам и далее совершить действия.   


Буду кланяться прям если еще напишите) 

 
Ищите по ticket в истории, но ищите не 2 ордера, а один. Они по очереди закрываются. 
 

Написал обращаясь к истории.

   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(); // Определяем цену ордера +/-");  
 
Vladimir Karputov:
OnTradeTransaction и ENUM_DEAL_REASON

Мне нужно обратится к закрывшемуся ордеру, найти методом исключения среди рыночных не ссылаясь на историю - в истории ордеров пруд пруди, нужно искать среди рыночных. Ускоряем робот. О свойствах ордера речи не идет.

 
Руслан:

Мне нужно обратится к закрывшемуся ордеру, найти методом исключения среди рыночных не ссылаясь на историю - в истории ордеров пруд пруди, нужно искать среди рыночных. Ускоряем робот. О свойствах ордера речи не идет.

     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("");
}/*******************************************************************/
 

Константин, Алексей благодарен.

Буду искать по тиккету. 

Алексей, вы заинтересовали) Сразу захотелось понять, что хотел разработчик. Но глобальные переменные путают все карты...поди разбери, что было вашей целью. Тем более каждый художник по разному смешивает  краски - я так не пишу. 

Поделитесь опытом, какие индикаторы наиболее привлекательны? Я пока свои взор обратил на АО. 

Причина обращения: