Нужно написать советник. Есть идея. - страница 4

 
dimasik >>:
lascu.roman, ты можешь сделать чтобы ордера открывались не с рынка, а отложенниками??? Это важно, потому что брокер с рынка не принимает сразу установку SL и TP. Вот.

Делается это в 2 этапа.

1) Открываемся по рынку TP = 0, SL = 0

2) Модифицируем SL, TP

или я не так понял?

 
meta-trader2007 >>:

Вообщето на таймах Н1 и выше эта ТС прибыльна (но не всегда, а иногда - во время безоткатного тренда).

Главное ТП не использовать и трал должен быть в 3 и более раз больше стопа.

наверное я не тем местом тестил =)

 
GarF1eld >>:

Делается это в 2 этапа.

...

или я не так понял?

Лучше поменять ДЦ на нормальное.

наверное я не тем местом тестил =)

Тестить надо на некачественной истории)

А вот как на контрольных точках:


 
Заморочился видать)
 
meta-trader2007 >>:

Лучше поменять ДЦ на нормальное.

Тестить надо на некачественной истории)

А вот как на контрольных точках:


А не могли бы в эксперта на отложниках добавить удаление предыдущих ордеров, когда открывается следующая пара ордеров?

Было бы очень хорошо..да и торговый поток не засорялся бы..а то ошибки 418 вылазят

 
И удалять, когда сработает один из уже открытых)
 
extern bool Limits = TRUE; // TRUE - LIMIT orders; FALSE - STOP orders
extern double Distance = 10; // Probably less than zero
extern double TP = 144;
extern double SL = 55;
extern double TralSL = 34;
extern double Lots = 0.1;

double Spread;

void init()
{
  Distance *= Point;
  TP *= Point;
  SL *= Point;
  TralSL *= Point;
  
  Spread = Point * MarketInfo(Symbol(), MODE_SPREAD);
  
  return;
}

void TrailingOrders()
{
  int i, Total = OrdersTotal();
  double Difference, tp, sl;
  
  for (i = 0; i < Total; i++)
  {
    OrderSelect(i, SELECT_BY_POS);
   
    if (OrderType() == OP_BUY)
    {
      sl = Bid - TralSL;
      Difference = NormalizeDouble(sl - OrderStopLoss(), Digits);
        
      if (Difference > 0)
      {
        sl = NormalizeDouble(sl, Digits);
        
        OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);
      }
    }
    else if (OrderType() == OP_SELL)
    {
      sl = Ask + TralSL;
      Difference = NormalizeDouble(sl - OrderStopLoss(), Digits);
        
      if (Difference < 0)
      {
        sl = NormalizeDouble(sl, Digits);
       
        OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);
      }
    }
  }
  
  return;
}

bool OrderScan( int TypeOrder )
{
  int i, Total = OrdersTotal();
  
  for (i = 0; i < Total; i++)
  {
    OrderSelect(i, SELECT_BY_POS);
    
    if (OrderType() == TypeOrder)
      return(TRUE);
  }
  
  return(FALSE);
} 

void MyOrderSend( int TypeOrder, double open, double sl, double tp )
{
  if (OrderScan(TypeOrder))
    OrderModify(OrderTicket(), open, sl, tp, 0);
  else
    OrderSend(Symbol(), TypeOrder, Lots, open, 0, sl, tp);
      
  return;
}

void OpenOrders( double H, double L )
{
  double open, tp, sl;
  
  if (Limits)
  {
    if (!OrderScan(OP_BUY))
    {
      open = NormalizeDouble(L - Distance + Spread, Digits);
      tp = NormalizeDouble(open + TP, Digits);
      sl = NormalizeDouble(open - SL, Digits);
  
      MyOrderSend(OP_BUYLIMIT, open, sl, tp);
    }
  
    if (!OrderScan(OP_SELL))
    {
      open = NormalizeDouble(H + Distance, Digits);
      tp = NormalizeDouble(open - TP, Digits);
      sl = NormalizeDouble(open + SL, Digits);
  
      MyOrderSend(OP_SELLLIMIT, open, sl, tp);
    }
  }
  else
  {
    if (!OrderScan(OP_BUY))
    {
      open = NormalizeDouble(H + Distance + Spread, Digits);
      tp = NormalizeDouble(open + TP, Digits);
      sl = NormalizeDouble(open - SL, Digits);
  
      MyOrderSend(OP_BUYSTOP, open, sl, tp);
    }

    if (!OrderScan(OP_SELL))
    {
      open = NormalizeDouble(L - Distance, Digits);
      tp = NormalizeDouble(open - TP, Digits);
      sl = NormalizeDouble(open + SL, Digits);
  
      MyOrderSend(OP_SELLSTOP, open, sl, tp);
    }
  }
  
  return;
}

void start()
{
  static int PrevTime = 0;

  TrailingOrders();
  
  if (PrevTime == Time[0])
    return;
    
  PrevTime = Time[0];
  
  OpenOrders(High[1], Low[1]);
  
  return;
}


mpeugep, напишите о результатах тестирования здесь.

 

запустил эти советники на демке, ордера не выставляются.... в чем причина?

 
dimasik >>:

запустил эти советники на демке, ордера не выставляются.... в чем причина?

Отложенники выставляются в начале формирования нового бара при условии отсутствия соответствующих открытых поз.

Напишите здесь о положительных результатах тестера с прикрепленным стэйтом.

 

Тестировал эксперта exp_Higt-Low.mq4 реалтайм на демо  на DAX'е (часов так 5), первое время показывал прибыль, далее начал сливать..стейты выложить уже не смогу, так как после 6 часов переустанавливал винду.

Скажу одно, в этом направлении можно поработать. Единственная проблема - эксперт грузит торговый поток отложенными ордерами, поэтому стоит задача закрывать отложенники, например, при срабатывании одной из позиций, или при открытии новой пары отложенников..а если это не делать, по истечении некоторого времени появляется ошитбка  418.

 to mql4com

могли бы дописать эксперта exp_Higt-Low.mq4, который выкладывал meta-trader2007 ранее, как я описал выше?

Завтра продолжу тестирование..

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