Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 572

 
PolarSeaman:

Извините, не пойму, почему нельзя.

можно, но это будет не совсем таймер

if (IsTesting()) OnTimer();
 
PolarSeaman:

ну вот... а если тик не пришел? нужно чтобы "заводился" без тика

первый тик - для синхронизации, и если стартовый тик не пришел значит рынок закрыт, нечего там делать

 

Добрый вечер!

Снова вынужден обратиться за помощью:

В определенный диапазон времени должен быть открыт один ордер, если с этим мэджиком уже был открыт ордер за последние 30 минут, то открывать не надо. Пишу так:

if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS,MODE_HISTORY))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_MINUTES) <= TimeToStr(D'00:30',TIME_MINUTES))
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Если оставить только первую часть, то проблема заключается в том, что если за эти полчаса закрывается позиция по стопу/по тэйку, открывается еще один. Поэтому добавил 2ую часть, чтобы влезть в историю ордеров, и если с этим мэджиком был уже ордер за последние 30 минут, то не открывать. Но что-то не так со второй частью - все равно открывает.

Подскажите пожалуйста!

 

тут надо считать в секундах 

if ( TimeCurrent()-OrderOpenTime() <= 30*60 )
 
Taras Slobodyanik:

тут надо считать в секундах 

К сожалению не помогло.

Вот так еще попробовал, тоже нет:

  if ( TimeToStr(TimeCurrent()-OrderOpenTime(),TIME_SECONDS) <= TimeToStr(30*60,TIME_SECONDS))
 
YanSay:

К сожалению не помогло.

Вот так еще попробовал, тоже нет:

Что же Вы все строки то сравниваете? Тарас же правильно сказал - считайте в секундах. Его вариант не подошел, потому что в историю счета Вы так и не попали:

//2ая часть
for (int i = OrdersTotal() - 1; i >= 0; i--)

Это цикл по рабочим ордерам. По истории цикл будет таким:

//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)

Далее в цикле нужно брать не время открытия, а время закрытия ордера.

 
Ihor Herasko:

Что же Вы все строки то сравниваете? Тарас же правильно сказал - считайте в секундах. Его вариант не подошел, потому что в историю счета Вы так и не попали:

Это цикл по рабочим ордерам. По истории цикл будет таким:

Далее в цикле нужно брать не время открытия, а время закрытия ордера


if (TimeCurrent()>StrToTime("00:01") && TimeCurrent()<StrToTime("00:30"))
{

//1я часть
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if (TimeDayOfWeek(OrderOpenTime()) != TimeDayOfWeek (TimeCurrent()))
     continue;   
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }
//2ая часть
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber1)
     continue;
  if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
     continue;
  ++nCnt1;
  {
   if (nCnt1>0)
      return;
  }
 }

//Открытие ордера
}

Про строки если правильно понял, Вы про TimeToStr - то есть в текст переводил?

Поправил, но все равно:

Тестер

Извините, если совсем туплю.

 
YanSay:

Про строки если правильно понял, Вы про TimeToStr - то есть в текст переводил?

Поправил, но все равно:

Извините, если совсем туплю.

Произнесите вслух ваше условие и поймёте в чём дело)

if ( TimeCurrent() -OrderCloseTime() <= 30*60 )
 

Если по условию одному из предыдущих значений буфера индикатора присвоить пустое значение, удалится ли он с графика?

или в буфере будет пустое значение. а на графике останется отрисовка?

 
YanSay:

Про строки если правильно понял, Вы про TimeToStr - то есть в текст переводил?

Да. Нет никакого смысла переводить время в строку, т. к. время - это число секунд. С этим числом работать гораздо проще, чем со строками, и быстрее.

Поправил, но все равно:

Извините, если совсем туплю.

Вы одно поправили, а другое испортили))

Во второй части вместо:

if (!OrderSelect(i, SELECT_BY_POS))
     continue;

верните:

if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     continue;

В предыдущей попытке эта строка у Вас была правильной.

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