double TicketHighLow[90][4]; // declare a two dimensional global array int init() { for(int i=ArrayRange(TicketHighLow,0)-1; i >= 0; --i){ TicketHighLow[i][2]=1000; TicketHighLow[i][3]=0; } // initialize array by stamping a high value for LowestLow and low value for HighestHigh } // Expert start int start() { OnEveryTick(); return (0); } void OnEveryTick() { VirtualTrailingStop(); } void VirtualTrailingStop() { int orderstotal = OrdersTotal(); int orders = 0; int ordticket[90][2]; for (int i = 0; i < orderstotal; i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderSymbol() != Symbol() || OrderMagicNumber() != 1) // OrderMagicNumber filter { continue; } ordticket[orders][0] = OrderOpenTime(); ordticket[orders][1] = OrderTicket(); TicketHighLow[orders][0] = OrderOpenTime(); TicketHighLow[orders][1] = OrderTicket(); // I think this is where the problem lays!!! orders++; } if (orders > 1) { ArrayResize(ordticket,orders); ArraySort(ordticket); ArrayResize(TicketHighLow,orders); ArraySort(TicketHighLow); } for (i = 0; i < orders; i++) { if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1) { if (TicketHighLow[i][1] == OrderTicket()) { if (Ask > TicketHighLow[i][3]) { TicketHighLow[i][3] = Ask; // stamping new HighestHigh } if (Bid < TicketHighLow[i][2]) { TicketHighLow[i][2] = Bid; // stamping new LowestLow } if ((OrderType() == OP_BUY && TicketHighLow[i][3] - OrderOpenPrice() > TrailingStartGap*PipValue*Point) || (OrderType() == OP_SELL && OrderOpenPrice() - TicketHighLow[i][2] > TrailingStartGap*PipValue*Point)) // TrailingStartGap reached { if ((OrderType() == OP_BUY && TicketHighLow[i][3] - Ask > TrailingStop*PipValue*Point) || (OrderType() == OP_SELL && Bid - TicketHighLow[i][2] > TrailingStop*PipValue*Point)) // Stop loss reached { bool ret = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 4, Blue); if (ret == true) { int error = GetLastError(); if (ret == false && error > 0) Print("OrderClose() error - ", ErrorDescription(error)); } } } } } } }