Помогите новичку !!! Пож...ста !

 

У меня в Эксперте есть вот такой КОД трала (подпрограмма):

int TrailAllOrders()
{
  int a, tot;
   
  tot = CreateTicketArray(OP_BUY, Magic);
  for(a = 0; a < tot; a++)
  TrailingStop(Ticket[a]);

  tot = CreateTicketArray(OP_SELL, Magic);
  for(a = 0; a < tot; a++)
  TrailingStop(Ticket[a]);
}

void TrailingStop(int ticket)
{
  int res;
  OrderSelect(ticket, SELECT_BY_TICKET);
   
  if(OrderType() == OP_BUY)
  if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail) //не тралим, пока не можем достичь безубытка первым переносом стопа  
  if(Bid - OrderStopLoss() > Trail*Point)
  {
  res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
  if(res<0)
  Alert("Ошибка модификации Трала: ", Error(GetLastError()));
  }
   
  if(OrderType() == OP_SELL)
  if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail) //не тралим, пока не можем достичь безубытка первым переносом стопа
  if(OrderStopLoss() - Ask > Trail*Point)
  {
  res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);  
  if(res<0)
  Alert("Ошибка модификации Трала: ", Error(GetLastError()));
  }
}

int CreateTicketArray(int dir, int SysID)
{
  int totall = OrdersTotal(), x, c=0;
  if (totall <= 0) return (0);
  for(x = 0;x < totall; x++)
  {
  OrderSelect(x, SELECT_BY_POS);
  if ((OrderType()==dir) && (OrderMagicNumber()==SysID))
  {
  Ticket[c] = OrderTicket();
  c++;
  }
  }
 return (c);
}

Как сделать чтобы при срабатывании Стопа Трала закрывались все позиции находящиеся в рынке.

Я что то сам пока не понимаю как это можно реализовать ?


 

 
jonrus >>:

Как сделать чтобы при срабатывании Стопа Трала закрывались все позиции находящиеся в рынке.

Я что то сам пока не понимаю как это можно реализовать ?


Скрипт "Закрыть все ордера"
 
jonrus >>:

У меня в Эксперте есть вот такой КОД трала (подпрограмма):

int TrailAllOrders()
{
int a, tot;

tot = CreateTicketArray(OP_BUY, Magic);
for(a = 0; a < tot; a++)
TrailingStop(Ticket[a]);

tot = CreateTicketArray(OP_SELL, Magic);
for(a = 0; a < tot; a++)
TrailingStop(Ticket[a]);
}

void TrailingStop(int ticket)
{
int res;
OrderSelect(ticket, SELECT_BY_TICKET);

if(OrderType() == OP_BUY)
if(TrailWhileMinus == true || Bid-OrderOpenPrice()>Point*Trail) //не тралим, пока не можем достичь безубытка первым переносом стопа
if(Bid - OrderStopLoss() > Trail*Point)
{
res = OrderModify(OrderTicket(), 0, Bid - Trail*Point, OrderTakeProfit(), 0);
if(res<0)
Alert("Ошибка модификации Трала: ", Error(GetLastError()));
}

if(OrderType() == OP_SELL)
if(TrailWhileMinus == true || OrderOpenPrice()-Ask>Point*Trail) //не тралим, пока не можем достичь безубытка первым переносом стопа
if(OrderStopLoss() - Ask > Trail*Point)
{
res = OrderModify(OrderTicket(), 0, Ask + Trail*Point, OrderTakeProfit(), 0);
if(res<0)
Alert("Ошибка модификации Трала: ", Error(GetLastError()));
}
}

int CreateTicketArray(int dir, int SysID)
{
int totall = OrdersTotal(), x, c=0;
if (totall <= 0) return (0);
for(x = 0;x < totall; x++)
{
OrderSelect(x, SELECT_BY_POS);
if ((OrderType()==dir) && (OrderMagicNumber()==SysID))
{
Ticket[c] = OrderTicket();
c++;
}
}
return (c);
}

Как сделать чтобы при срабатывании Стопа Трала закрывались все позиции находящиеся в рынке.

Я что то сам пока не понимаю как это можно реализовать ?


код с точки зрения оптимизации не оптимальный!


логично оббегать в цикле открытые ордера один раз !

накладные расходы на двойной пробег по селам потом по баям

затем снова 2 пробега по обоим направлениям итого 4 цикла!

хотя все можно заюзать в одном

тут над логикой бы поработать

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