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

 
А как сделать чтобы на каждом тике торговал?
 
Вот. Подскажите. Советник торгует на основе сигналов индикаторов на каждом баре. А как сделать чтобы условия проверялись на каждом тике. Вот условия в индикаторе :
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]) // Один раз за один бар 
//{ 
в этом дело все?
 
fergios:


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

Получилось сделать? я тоже попробовал все функции, но все равно покупает сколько хочет(
 
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;
     }     
   }  

 

 

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

 
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)
 
paukas:
Вот так приерно определяется время последнего ордера

 

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

 
varyar84:

 

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

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

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

...

if ( iTime(Symbol(),PERIOD_H1,Delay)< LastorderTime  ) return(0);
 
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));
  }
}
 
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);
}
 
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);
}
Причина обращения: