Запрет торговли в одном баре. - страница 5

mitanq  
Вот. Подскажите. Советник торгует на основе сигналов индикаторов на каждом баре. А как сделать чтобы условия проверялись на каждом тике. Вот условия в индикаторе :
int limit, i; 
int counted_bars=IndicatorCounted(); // Сколько баров уже было посчитано 
if (counted_bars<0) return(-1); // Проверка возможной ошибки 
if (counted_bars>0) counted_bars--; // Пересчитываем последний посчитанный бар 
limit=Bars-counted_bars; // Начинаем с последнего посчитанного бара 
// - 1 - ============================ Окончание блока =================================== 

// - 2 - ======================= Отображение индикатора на истории ====================== 
for(i = limit; i >= 0; i--) 

FastMA = iMA(NULL, 0, FastMAPeriod, FastMAShift, FastMAMethod, FastMAPrice, i); 
SlowMA = iMA(NULL, 0, SlowMAPeriod, SlowMAShift, SlowMAMethod, SlowMAPrice, i); 


// - 2 - ============================ Окончание блока =================================== 

// - 3 - ======================= Выдача сигналов ======================================== 
//if (LastBar != Time[0]) // Один раз за один бар 
//{ 
в этом дело все?
Egor_krs  
fergios:


Это всё равно не подействовало, он почему то при сигналах всё равно открывает столько, сколько было сигналов.

Получилось сделать? я тоже попробовал все функции, но все равно покупает сколько хочет(
Artem Kolosov  
KimIV:
Пример использования:

Не могу понять почему не работает данный код

 

В начале кода вставил. В коде ничего не менял, все как в исходнике.

int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) {
  datetime oot;
  int      i, k=OrdersTotal();
 
  if (sym=="") sym=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sym) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (oot<OrderOpenTime()) oot=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sym, tf, oot, True));
}

 

 В старте вставил:

 

void start()
  {
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;
   if(NumberOfBarOpenLastPos()>0) CheckForOpen();
   }

 

 Открытие ордеров:

void CheckForOpen()
  {
   double st0=iStochastic(NULL,PERIOD_CURRENT,14,3,3,MODE_SMA,1,MODE_MAIN,0); // Значение Stochastic на текущем баре
   double st1=iStochastic(NULL,PERIOD_CURRENT,14,3,3,MODE_SMA,1,MODE_MAIN,1); // Значение Stochastic на предыдущем баре
//---- buy 
   if(st1<=StochOversold)  // Stochastic2 ниже уровня перепроданности
     {
      res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss,Ask+TakeProfit,"",MAGICMA,0,Blue);
      return;
     }      
//---- sell   
   if(st1>=StochOverbought)  // Stochastic2 ниже уровня перекупрелености
     {
      res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss,Bid-TakeProfit,"",MAGICMA,0,Red);
      return;
     }     
   }  

 

 

 Не пойму что не так?

Vladimir Paukas  
varyar84:

Не могу понять почему не работает данный код

 

В начале кода вставил. В коде ничего не менял, все как в исходнике.

 

 В старте вставил:

 

 

 Открытие ордеров:

 

 

 Не пойму что не так?

for (int ii=0; ii<OrdersHistoryTotal();ii++)
  if (OrderSelect(ii,SELECT_BY_POS,MODE_HISTORY))
       
       if (OrderType()==OP_BUY || OrderType()==OP_SELL)
       if (OrderOpenTime()>LastorderTime && OrderMagicNumber()==112 && OrderSymbol()==Symbol())
            {LastorderTime =OrderOpenTime();}
 for (ii=0; ii<OrdersTotal();ii++)
  if (OrderSelect(ii,SELECT_BY_POS,MODE_TRADES))
       if (OrderOpenTime()>LastorderTime&& OrderMagicNumber()==112 && OrderSymbol()==Symbol())
         {LastorderTime =OrderOpenTime();}
}    
Вот так примерно определяется время последнего ордера с определенным  маджиком( в примере 112)
Artem Kolosov  
paukas:
Вот так приерно определяется время последнего ордера

 

 То есть у меня в NumberOfBarOpenLastPos не хватает какой то переменной?

Vladimir Paukas  
varyar84:

 

 То есть у меня в NumberOfBarOpenLastPos не хватает какой то переменной?

А чтобы ордер открывался не менее чем через Delay баров от предыдущего надо далее написать

В Delay  это через сколько баров можно открывать.  Ноль - на сл. баре. 1- через 1 и т. д.

...

if ( iTime(Symbol(),PERIOD_H1,Delay)< LastorderTime  ) return(0);
Artem Kolosov  
paukas:

А чтобы ордер открывался не менее чем через Delay баров от предыдущего надо далее написать

В Delay  это через сколько баров можно открывать.  Ноль - на сл. баре. 1- через 1 и т. д.

...

 

Что то не получается у меня разобраться....

Посмотрите пожалуйста, что не так? 

 

int iNumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) 
{
  int LastorderTime;
  int i, k=OrdersTotal();
  if (sym=="") sym=Symbol();
  for (i=0; i<OrdersTotal();i++)
  {
  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
     if (OrderOpenTime()>LastorderTime && OrderMagicNumber()==112 && OrderSymbol()==Symbol())
         {LastorderTime=OrderOpenTime();}
     }
  return(iBarShift(sym,tf,LastorderTime,True));
  }
}
Martingeil  
Artem Kolosov:

 

Что то не получается у меня разобраться....

Посмотрите пожалуйста, что не так? 

 

Я тоже пробовал те функции ничего не пашет, по ходу криво написаны, зачем так усложнять, вот простые примеры взяты с советника Илан, аж за 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);
}
Martingeil  
Lehfr:

Я тоже пробовал те функции ничего не пашет, по ходу криво написаны, зачем так усложнять, вот простые примеры взяты с советника Илан, аж за 2009 год. Первая упрощенная по барам. Вторая чуть ниже круче, написана классно, и универсальна как раз то что я искал по времени, можно выставить любую паузу в минутах, и переделать ее под себя.

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

Я не правильно исправил в коде, перестарался лишние скобки поставил.

Вот так будет правильно.

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);
}