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

 
Corwin_Volot:
и в чем опасность? последствия?
в чем преимущество варианта KimIV?

Bars может меняться. При подкачке истории, при "обрезании" истории, может, еще в каких-то ситуациях (не знаю).
А у Kim-а однозначный и бесперебойный вариант. И не требует сохранения переменных перед перезапуском.
 
Maxor:
Если кто знает, подскажите.

Мне нужно сделать так, что-бы после открытия одной сделки советник
больше не открывал сделки в этом баре.

Посмотрел тут варианты ответа на твой вопрос,но мне кажется доходнее и наджнее примерно так:

//+------------------------------------------------------------------+

bool ProverkaTimeBuy(){
for(int bz=OrdersTotal()-1;bz>=0;bz--){
if(OrderSelect(bz,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()){
if(OrderType()==OP_BUY &&
OrderMagicNumber()==1 &&
OrderOpenTime()>=Time[0]){return(false);}
else{return(true);}
}
}
}
return(true);
}
bool ProverkaTimeSell(){
for(int sz=OrdersTotal()-1;sz>=0;sz--){
if(OrderSelect(sz,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol()){
if(OrderType()==OP_SELL &&
OrderMagicNumber()==2 &&
OrderOpenTime()>=Time[0]){return(false);}
else{return(true);}
}
}
}
return(true);
}
//+------------------------------------------------------------------+

кстати, из продвинутых кто что посоветует мне. обмен опытом приветствуется. ))))))))
 

Я пользовался обычно вот таким вариантом

//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (isNewBar()) EveryBar();
 
//----
   return(0);
  }
//+------------------------------------------------------------------+
Код не мой, помойму Rosh где то его рекомендовал. komposter и KimIV где здесь (в этом коде) могут быть подводные камни ?
 
Только при неожиданном изменении значения Bars (например, после подкачки истории).
 
Rosh:
Только при неожиданном изменении значения Bars (например, после подкачки истории).

А у кода KimIV этого камня (камней) нет ? Каким из этих двух кодов Вы рекомендуете пользоваться ? Спасибо.
 
Не могу сказать, мой вариант меня не подводил. Может не замечал просто?
 
Prival:
А у кода KimIV этого камня (камней) нет ? Каким из этих двух кодов Вы рекомендуете пользоваться ? Спасибо.
Код, использующий Time[], сработает при изменении последнего бара.
А код, использующий Bars, сработает при изменении любого бара.

Думаю, первый вариант все-таки надежнее.
 
Кстати, я бы еще посоветовал производить поиск в истории закрытых сделок. Иногда бывает (при сильных движениях или малых профитах), что поза открылась по сигналу и закрылась на том же баре. В открытых позах советник ничего не найдет и откроет очередную сделку. Поэтому я еще проверяю историю:

bool CheckExists(int Type)
 {
  bool Result = True;
  for(int i = 0; i < OrdersTotal(); i++)
   if(OrderSelect(i, SELECT_BY_POS))
    if(OrderType() == Type && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
     if(OrderOpenTime() >= Time[0])
      Result = False;
  for(i = 0; i < OrdersHistoryTotal(); i++)
   {
    if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if(OrderType() == Type && OrderOpenTime() >= Time[0] 
        && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
      Result = False;
    }    
      
  return(Result);    
  }

Использование:

if(CheckExists(OP_BUY))   {    // Открытие Buy    }

Если функция фозвращает True, то открывать позу можно. В противном случае курим.
 

extern double lot=0.1;
extern int  tp=50;
extern int  sl=50;
extern int MagicNumber=777;
int timeoldopen;
 
//********************************************************************************************
void ОткрытиеОрдеров(int type)
   {
         double pr_open,TP,SL;
         int ticket=0;
         int CountErrorOpenOrder=0;
         while(ticket==0 || CountErrorOpenOrder<=5)
            {
               if (timeoldopen!=Time[0])
                  {
                     if (IsTradeContextBusy()){continue;}
                     RefreshRates();
                     if (type==0){pr_open=Ask;TP=pr_open+tp*Point;SL=pr_open-sl*Point;}
                     if (type==1){pr_open=Bid;TP=pr_open-tp*Point;SL=pr_open+sl*Point;}
                     ticket=OrderSend(Symbol(),type,lot,pr_open,2,SL,TP,"comment",MagicNumber,0,DarkOrange);
                     if (ticket<0){Print("Ошибка открытия ордера",  GetLastError());CountErrorOpenOrder++;}
                        else {timeoldopen=Time[0];}                   
                  }
              else {break;}    
            }
            
      return(0);   
   }
//********************************************************************************************
Использование

открытие бай

ОткрытиеОрдеров(0);

Открытие селл

ОткрытиеОрдеров(1);

 
Maxor писал (а) >>
Если кто знает, подскажите.
Мне нужно сделать так, что-бы после открытия одной сделки советник больше не открывал сделки в этом баре.

Если речь идет о контроле баров в целом:


Для тестера подойдет такой вариант:

int start()
{
   if (Volume[0] != 1) return(0);
   // code
}

Я пользуюсь таким:

datetime LastTime = 0;
 
int start()
{
   if (LastTime >= Time[0]) return(0);
   LastTime = Time[0];
   // code
}

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

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