как я решаю проблему однозначной покупки каждый бар.

 

//+------------------------------------------------------------------+
//| www.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
int trad=0; //флаг торговли установим в "нет торговле"
double ob1, ob2;
//+------------------------------------------------------------------+
int init(){return(0);}
int deinit(){return(0);}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
  {
if (trad==0) //проверяем на возможность торговли (1 - торгуем, 0 - нет)
  {
  trad=1; //если нет, устанавливаем флаг в "торговля разрешена"
  ob1=(iHigh(NULL,0,1)-iLow(NULL,0,1)); //вычисляем разность между макс и мин 
  } //предыдущего бара и сохраняем до флага
ob2=(iHigh(NULL,0,1)-iLow(NULL,0,1)); //вычисляем разность между макс и мин 
  //предыдущего бара
if (ob1!=ob2) //постоянно сравниваем макс предыдущего
{ //с тем что в памяти при "trad=1"
if (trad==1) //если появилась разность и можно торговать
  { //тут расположить торговая операция по входу в рынок
  trad=0; //возвращает 0 и снова ждет разницы между барами
  }
}
  }
//+------------------------------------------------------------------+


была у меня проблема с тем, что открывалось по 400 сделок в 1 бар, долго мучался, может кому-то пригодится, то что находил здесь больно замудрено, да и поздно нашел) свое нагляднее вроде

 

а я так делаю:

void start()
{
  static bool     isTrade=False;       // Флаг торгов на текущем баре
  static datetime prevTimeBar=0;       // Время открытия предыдущего бара
  if (prevTimeBar<Time[0]) isTrade=False;
  if (!isTrade)
  {
    // торговая операция
    isTrade=True;
  }
  prevTimeBar=Time[0];
}
 
красиво)
 

Или так))))

int Pbars;


int start()
  {
if (Pbars == Bars) return(0);  
Pbars = Bars;

// текст программы))))



   return(0);
  }
 

to KimIV

Прокомментируйте, пожалуйста, вариант vladevgeniy.

 
Bump писал(а) >>как я решаю проблему однозначной покупки каждый бар

Да вообщем-то это и не проблема) Да не блещет ваша метода надегой, а коли пару одинаковых баров подряд?

granit77 писал(а) >>

to KimIV

Прокомментируйте, пожалуйста, вариант vladevgeniy.

Не знаю что думает Игорь, но у меня этот вариант вызывает некоторые сомнения, а ну как ДЦ подкорректирует историю, или при запуске еще не вся история прогрузилась, или запущенный тестер историю подзапросит? Вариант с проверкой времени нулевого бара таких недостатков лишен.

 
Да нормально работает, можно и с временем конечно. Да и еще, эту переменную надо обнулять в ините, на случай смены таймфреймов.
 
KimIV >>:

а я так делаю:

и как это использовать ?

по логике кода должно работать каждый тик.. объясните, чего я не понимаю..

 
granit77 писал(а) >>

to KimIV

Прокомментируйте, пожалуйста, вариант vladevgeniy.

Нормальный вариант. Только я бы сделал так:

void start()
{
  static int Pbars=0;

  if (Pbars == Bars) return(0);  
  Pbars = Bars;

  // текст программы))))
}
И тут ещё нужно добавить, что предопределённую переменную можно использовать только с некоторыми оговорками, суть которых я уже не помню. Кому интересно, поищите сами. Здесь на форуме обсуждались разные варианты идентификации момента формирования нового бара. Вроде бы даже статья была и был сделан вывод, что самый надёжный метод - это Time[0].
 
keekkenen писал(а) >>
по логике кода должно работать каждый тик.. объясните, чего я не понимаю..

Фишка в статических переменных. Они сохраняют значения даже при завершении работы функции. При повторном вызове функции эти значения можно использовать. Но в то же время это не глобальные переменные, то есть их область видимости ограничена функцией. За пределами функции эти переменные недоступны.

 
Насколько я понимаю, данная конструкция обеспечивает работу по ценам открытия. А если нужно обеспечить работу по тикам и обеспечить открытие только одного ордера за время одного бара, то данная конструкция не подходит?