Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
mitanq
15
mitanq  
А как сделать чтобы на каждом тике торговал?
mitanq
15
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
5
Egor_krs  
fergios:


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

Получилось сделать? я тоже попробовал все функции, но все равно покупает сколько хочет(
Artem Kolosov
194
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
4099
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
194
Artem Kolosov  
paukas:
Вот так приерно определяется время последнего ордера

 

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

Vladimir Paukas
4099
Vladimir Paukas  
varyar84:

 

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

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

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

...

if ( iTime(Symbol(),PERIOD_H1,Delay)< LastorderTime  ) return(0);
Artem Kolosov
194
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));
  }
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий