Иметь цену открытия свечи в определенный час.

 

Привет, ребята,

У меня новый вопрос, простой, я думаю.

Когда, например, наступает 15:00, я хочу узнать цену открытия свечи, которая была в 9:00.

if (TC >= 15:00)
{
    if (Openprice < iclose(symbol(), period_H1, 1)
    {
       Action
    }
}
Как написать код для получения цены открытия свечи в заданный час?
 

Вычислите время как переменную времени и используйте его в iBarshift() для получения номера бара, когда у вас есть номер бара, используйте его в Open[] или iOpen().

 
RaptorUK:

Вычислите время как переменную времени и используйте его в iBarshift() для получения номера бара, когда у вас есть номер бара, используйте его в Open[] или iOpen().


да, неплохая идея :)

Спасибо, я воспользуюсь этим!

 

И это возможно сделать:

   int Bar;
   double OpenPrice;
   
   int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);


HeureSH - это массив с четырьмя часами.

Потому что если это определенные часы, то столбик должен быть разным, хотя создайте переключатель, чтобы иметь только одну строку, а не четыре разных строки.

Правильно ли это? Правильно ли написан код?

 
Kane59:

И это возможно сделать:


HeureSH - это массив с четырьмя часами.

Потому что если это определенные часы, то столбик должен быть разным, хотя создайте переключатель, чтобы иметь только одну строку, а не четыре разных строки.

Все правильно? Код написан правильно?

Я предполагаю, что у вас есть ошибка копирования/вставки, так как у вас есть случай 1 дважды ... поэтому я предполагаю, что второй случай 1 должен быть случаем 2.

Чтобы это работало, значения, хранящиеся в массиве HeureSH[], должны быть 1, 2, 3 или 4, это правильно? Это могут быть только значения типа int. никаких строк или двоек. . .

В вашем вызове iOpen() я предполагаю, что B должно быть Bar? Или вы имели в виду B(int)? Если вы хотите использовать функцию в этом вызове, вы должны сделать так, чтобы функция возвращала правильное значение.


Вы окажете большую услугу себе и всем остальным, если будете использовать осмысленные имена переменных и функций. ... B, k и Bar не очень описательны.

 

Это ошибка от меня, я скопировал свой код, но я не знаю, что я написал........ Я решил эту проблему.

В моем iopen я написал B, который является "Bar", потому что время отличается, поэтому Bar тоже отличается.


Ах да, значения строк будут делать некоторые проблемы, я думаю, что это проблема, так что я попытаюсь изменить.

 
  int B(k);
   {
      switch(HeureSH[k])
      {
         case 0: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("23:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("09:00"));
         break;
            
         case 1: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("15:00"));
         break;
            
         case 3: Bar= iBarShift(Symbol(), PERIOD_H1, StrToTime("19:00"));
         break;
      }
   }
   OpenPrice= iOpen(Symbol(), PERIOD_H1, B);
Это не сработает. 1) iBarShift присвоен Bar , но iOpen использует B. 2) StrToTime("23:00") вернет сегодняшнюю дату в 23:00, которая всегда будет в будущем (или текущем баре H1).
#define HR2400      86400           // 24 * 3600
datetime TimeOfDay(datetime when){  return( when % HR2400          );       }
datetime DateOfDay(datetime when){  return( when - TimeOfDay(when) );       }
  int B(k);
   {
    #define HR0900 23400    // 9*3600
    #define HR1500 54000
    #define HR1900 68400
    #define HR2300 59800
    int times[]={ HR2300, HR0900, HR1500, HR1900 };
    datetime    now = TimeCurrent(),
                Bod = DateOfDay(now),
                want= Bod + times[HeureSH[k]];
    if (want > now){    // Yesterdays?
        datetime prevTradingDate = iTime(Symbol(), PERIOD_D1, 1);
        want = prevTradingDate + times[HeureSH[k]];
    }
   int iBar= iBarShift(Symbol(), PERIOD_H1, want);
   OpenPrice= iOpen(Symbol(), PERIOD_H1, iBar);
   }
 

Привет WHRoeder,

Я думаю, что ваш код более эффективен, чем мой, и получает, если значение времени вчера или сегодня. Я согласен: 23:00, с моим кодом, это всегда futur или current, когда уже слишком поздно...


Большое спасибо! Это именно то, что я искал.

 

Здравствуйте,

для информации:

Вы сказали, что ibarshift был назначен на Bar, iOpen на B. Хорошо.

Но функция B(k), что это за функция? Почему она здесь?

В моем коде, я поместил ее потому, что хотел получить связь между массивом размеров строк времени (HeuresSH) и дифференциалами StrToTime. Это было ложно.


Вы снова его использовали, зачем?

С уважением :)

 

Да, я забыл сказать, HeureSH[] - это массив, состоящий из четырех различных часов в строковых значениях.

 

Хорошо, я вставил ваш код в мой советник, и он отлично работает! Я улыбнулся, когда увидел, что советник работает так, как я хотел!!!

Большое спасибо ......

Это на бэктесте, потому что рынок закрыт...

Но есть проблема:

Советник правильно открывает позиции, но покупки никогда не закрываются, а продажи сразу же закрываются при открытии.

Моя стратегия такова:

В одно и то же время, советник должен открыть продажу или покупку, если параметры верны. Не существует SL или TP.

И в то же время, он должен зациклиться и закрыть все сделки, если следующие функции истинны:

if(OrdersTotal()>0)
            { 
               for(int i=OrdersTotal()-1; i>=0; i--)
               {
                  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  {
                     if(OrderMagicNumber() == MagicSH && OrderOpenTime() > iTime(Symbol(), PERIOD_H1, 1))
                     {
                        if(OrderType() == OP_BUY)
                        {
                           OrderClose(OrderTicket(),LotsSH, bid, 300, CLR_NONE);
                        }
                        if(OrderType() == OP_SELL)
                        {
                           OrderClose(OrderTicket(),LotsSH, ask, 300, CLR_NONE);
Я должен добавить фильтр прибыли, но я буду работать над этим. Без этого он должен закрывать Buy, но никогда не закрывается, и он должен позволить sell работать, но sell закрываются немедленно. Есть ли ошибка в последнем коде?
Причина обращения: