Обсуждение статьи "Защита от ложных срабатываний торгового робота" - страница 7

 

Олег и Андрей, вы действительно зациклены на желании не видеть очевидного.

Поэтому ваша критика - это действительно муть и ахинея.

Всё прекрасно работает на реальной торговой системе.

 
Да простит меня автор, эта статья ни о чем. И жутко сложный алгоритм для оч простой вещи.
 
Igor Gerasimets:
Да простит меня автор, эта статья ни о чем. И жутко сложный алгоритм для оч простой вещи.
Я с вами согласен. Процесс открытия ордера максимум 1 раз в пределах одного бара очень просто реализовать в очень коротком коде.
 
Статья полезная как раз для такого новичка как я.  Более опытным коллегам она уже покажется сухой и скучной
 

Прочитал статью и обсуждение, ничего толкового так и не прочитал.

Вырвал код из залежавшегося советника, проверил работает как ни странно подогнал перменные под нынешний билд, а то ругался компилятор, написан аж в далеком 2009 году... 

static int prevtime=0;

void OnTick()
  {
   if(iTime(NULL,PERIOD_M1,0) == prevtime) return;
   prevtime=iTime(NULL,PERIOD_M1,0);//если появился новый бар , включаемся

  }

Второй вариант, мне очень понравился универсальная штука (можно выставить любое время) от времени открытия ордера, или закрытия ордера (тейкпрофит, стоплосс, или клозе). Эта функция работает только по закрывшимся ордерам. 

input int  MinutStep = 7; //пауза в минутах от ордера(закрытого или открытого)


void OnTick()
  {   
   if( TimeCurrent()-StaticPrevtimeOrders(1,Magic1) < MinutStep*PeriodSeconds(PERIOD_M1) ) return;

    .........
    
    .........

  }

//+------------------------------------------------------------------+
//| StaticPrevtimeOrders   2009 год автор: Martingeil                |
//| op_cl = 1; время закрытия ордера (тейкпрофит, стоплосс, клозе).  |
//| op_cl = 2; время открытого ордера                                |
//| Mag - Маджик номер ордера                                        |
//+------------------------------------------------------------------+    
datetime StaticPrevtimeOrders(int op_cl,int Mag) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==Symbol()) && (OrderMagicNumber()==Mag)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op_cl==1 && t<OrderCloseTime()) {
            t=OrderCloseTime();
            if (op_cl==2 && t<OrderOpenTime()) {
            t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(t);
}
В статье вариант вообще туфта полная, по сравнению с этой последней функцией, она универсальна, я искал такую штуку перерыл всю коде базу, нашел эту функцию в советнике Илан.  
 
Lehfr:

Прочитал статью и обсуждение, ничего толкового так и не прочитал.

Вырвал код из залежавшегося советника, проверил работает как ни странно подогнал перменные под нынешний билд, а то ругался компилятор, написан аж в далеком 2009 году... 

Второй вариант, мне очень понравился универсальная штука (можно выставить любое время) от времени открытия ордера, или закрытия ордера (тейкпрофит, стоплосс, или клозе). Эта функция работает только по закрывшимся ордерам. 

В статье вариант вообще туфта полная, по сравнению с этой последней функцией, она универсальна, я искал такую штуку перерыл всю коде базу, нашел эту функцию в советнике Илан.  

Слету видно одну ошибку.

datetime StaticPrevtimeOrders(int op_cl,int Mag) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==Symbol()) && (OrderMagicNumber()==Mag)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op_cl==1 && t<OrderCloseTime())
            t=OrderCloseTime();
          if (op_cl==2 && t<OrderOpenTime())
            t=OrderOpenTime();
        }
      }
    }
  }
  return(t);
}

Будет наверно правильней. Иначе будет срабатывать только op_cl==1

 
Konstantin Nikitin:

Слету видно одну ошибку.

Будет наверно правильней. Иначе будет срабатывать только op_cl==1

Да, я не много перемудрил с исправлением, вставил скобки лишние подумал почему их там нет, вот и вставил. 

Исправил.

input int  MinutStep = 7; //пауза в минутах от ордера(закрытого или открытого)


void OnTick()
  {   
   if( TimeCurrent()-StaticPrevtimeOrders(1,Magic1) < MinutStep*PeriodSeconds(PERIOD_M1) ) return;

    .........
    
    .........

  }

//+------------------------------------------------------------------+
//| StaticPrevtimeOrders   2009 год автор: Martingeil                |
//| op_cl = 1; время закрытия ордера (тейкпрофит, стоплосс, клозе).  |
//| op_cl = 2; время открытого ордера                                |
//| Mag - Маджик номер ордера                                        |
//+------------------------------------------------------------------+    
datetime StaticPrevtimeOrders(int op_cl,int Mag) {
  datetime t;
  int      i, k=OrdersHistoryTotal();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==Symbol()) && (OrderMagicNumber()==Mag)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op_cl==1 && t<OrderCloseTime())
            t=OrderCloseTime();
          if (op_cl==2 && t<OrderOpenTime())
            t=OrderOpenTime();
        }
      }
    }
  }
  return(t);
}
Причина обращения: