Вопросы от "чайника" - страница 200

 

Итак, есть функция определения времени открытия бара(в том числе если бар находится в будущем)

 

//+---------------------------------------------------------------------------+
//| Получение точного времени открытия                                        |
//|Input:                                                                     |
//|1) Время, которое необходимо округлить до ближайшего времени открытия бара |
//|2) Переменная для вывода результата                                        |
//|3) Период ТФ                                                               |
//|4) Отклонение влево-вправо                                                 |
//|Возврат: количество элементов(1), 0 если не скопировано, (-1) если ошибка  |
//+---------------------------------------------------------------------------+
int GetSingleBarOpenTime(datetime Time,datetime &Output,ENUM_TIMEFRAMES nPeriod,int Shift=0) export
  {
   datetime OpenTime[1];
   int Count=0;
// если бар существует то используем стандартную процедуру поиска времени открытия
   if(Time<=TimeCurrent() && Shift==0)
     {
      Count=CopyTime(Symbol(),nPeriod,Time,1,OpenTime);
      if(Count==0)
        {
         Print("GetCorrectOpenTime CopyTime elements=0");
         return(0);
        }
      else if(Count<0)
        {
         Print("GetCorrectOpenTime error "+(string)GetLastError());
         return(Count);
        }
      else
        {
         Output=OpenTime[0];
         return(Count);
        }
     }
//если бар находится в будущем то используем следующую процедуру
   else
     {
      MqlDateTime sTime;
      // NumOfUnits - количество стандартных единиц
      int NumOfUnits=0; 
      int ToRnd;
      TimeToStruct(Time,sTime);
      //Единица измерения(1-минута, 2 - час, 3 - день, 4 - неделя(но используются дни), 5 - месяц)
      short Unit=0;
      //в зависимости от ТФ инициализируются параметры
      switch(nPeriod)
        {
         case PERIOD_M1:   {Unit=1;NumOfUnits=1;break;}
         case PERIOD_M2:   {Unit=1;NumOfUnits=2;break;}
         case PERIOD_M3:   {Unit=1;NumOfUnits=3;break;}
         case PERIOD_M4:   {Unit=1;NumOfUnits=4;break;}
         case PERIOD_M5:   {Unit=1;NumOfUnits=5;break;}
         case PERIOD_M6:   {Unit=1;NumOfUnits=6;break;}
         case PERIOD_M10:  {Unit=1;NumOfUnits=10;break;}
         case PERIOD_M12:  {Unit=1;NumOfUnits=12;break;}
         case PERIOD_M15:  {Unit=1;NumOfUnits=15;break;}
         case PERIOD_M20:  {Unit=1;NumOfUnits=20;break;}
         case PERIOD_M30:  {Unit=1;NumOfUnits=30;break;}
         case PERIOD_H1:   {Unit=2;NumOfUnits=1;break;}
         case PERIOD_H2:   {Unit=2;NumOfUnits=2;break;}
         case PERIOD_H3:   {Unit=2;NumOfUnits=3;break;}
         case PERIOD_H4:   {Unit=2;NumOfUnits=4;break;}
         case PERIOD_H6:   {Unit=2;NumOfUnits=6;break;}
         case PERIOD_H8:   {Unit=2;NumOfUnits=8;break;}
         case PERIOD_H12:  {Unit=2;NumOfUnits=12;break;}
         case PERIOD_D1:   {Unit=3;NumOfUnits=1;break;}
         case PERIOD_W1:   {Unit=4;NumOfUnits=7;break;}
         case PERIOD_MN1:  {Unit=5;NumOfUnits=1;break;}
         default:         {Print("Period is unknown"); break;}
        }
      // Если ТФ - минуты, то
      if(Unit==1)
        {
         sTime.sec=0;
         //Остаток от деления
         ToRnd=(int)fmod(sTime.min,NumOfUnits);
         Time=StructToTime(sTime);
         // Округление до ближайшего времени открытия(пример: если сейчас 14:25, и тф 2min, то ближайщее время открытия бара - 14:24)
         Time-=(ToRnd*60);
         Time+=(NumOfUnits*Shift*60);

        }
      else if(Unit==2)
        {
         sTime.sec=0;
         sTime.min=0;
         ToRnd=(int)fmod(sTime.hour,NumOfUnits);
         Time=StructToTime(sTime);
         Time-=(ToRnd*60*60);
         Time+=(NumOfUnits*Shift*60*60);
        }
      else if(Unit==3)
        {
         sTime.hour=0;
         sTime.min=0;
         sTime.sec=0;
         ToRnd=(int)fmod(sTime.day,NumOfUnits);
         Time=StructToTime(sTime);
         int hds;
         hds=sTime.day_of_week;
         if (hds==0) hds=7;
         hds=floor((hds+Shift)/7)*2;
         int ti=Shift+hds;
         while (hds>7)
         {
            hds=(floor(hds/7))*2;
            ti+=hds;
         }
         Print(ti);
         Time-=(ToRnd*60*60*24);
         Time+=(NumOfUnits*Shift*60*60*24);
        }
      else if(Unit==4)
        {
         sTime.hour=0;
         sTime.min=0;
         sTime.sec=0;
         ToRnd=(int)fmod(sTime.day,NumOfUnits);
         Time=StructToTime(sTime);
         Time-=(ToRnd*60*60*24);
         Time+=(NumOfUnits*Shift*60*60*24);
        }
      else if(Unit==5)
        {
         sTime.sec=0;
         sTime.min=0;
         sTime.hour=0;
         sTime.day=1;
         sTime.mon=sTime.mon-(int)fmod(sTime.mon,NumOfUnits)+(NumOfUnits*Shift);
         while(sTime.mon<1)
           {
            sTime.year--;
            sTime.mon=12+sTime.mon;
           }
         while(sTime.mon>12)
           {
            sTime.year++;
            sTime.mon=sTime.mon-12;
           }
         if(sTime.sec<0)
            Print("GetSingleBarOpenTime seconds error");
         if(sTime.min<0)
            Print("GetSingleBarOpenTime minutes error");
         if(sTime.hour<0)
            Print("GetSingleBarOpenTime hours error");
         if(sTime.day<1)
            Print("GetSingleBarOpenTime days error");
         if(sTime.mon<0)
            Print("GetSingleBarOpenTime months error");
         if(sTime.year<1970)
            Print("Year < 1970");
         Time=StructToTime(sTime);
        }
      Output=Time;
      return(1);
     }
  }

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

Примечание: в Unit=3 проба сделать это(пока неудачно) 

Помогите пожалуйста. 

 
victorva: торговый  запрос выдает ошибку 10016 ("неправильные стопы"). В чем они неправильные?

1. Вставляйте код правильно (Ctrl+Alt+M).

void OnTick()
  {
   MqlTick last_tick={0};                       // предопределенная структура для получения текущих данных рынка
   SymbolInfoTick("EURUSD",last_tick);          // инструмент: указывать обязательно
   double Bid = last_tick.bid;                         // Текущая цена Bid
   MqlTradeRequest request={0};                 
   MqlTradeResult result={0};                 
   request.action=TRADE_ACTION_DEAL;           
   request.magic=555;                          
   request.symbol="EURUSD";
   request.volume=1.0;                  
   request.deviation=0;                 
   request.type=ORDER_TYPE_BUY;                        
   request.sl=Bid-300*_Point;                         // Уровень Stop Loss ордера
   request.tp=Bid+1000*_Point;                    // Уровень Take Profit ордера
   OrderSend(request,result);
   Comment("retcode = ",result.retcode);
  }
2. Давайте начнём с того, что в Вашем запросе не указано обязательное поле request.price (отсутствие такого поля допустимо только для режима Market Execution). Поэтому получается, что пока request.price==0. 
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • 2010.02.23
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
 
victorva:

 торговый запрос выдает ошибку 10016 ("неправильные стопы"). В чем они неправильные?

 

   request.sl=Bid-300*_Point;                         // Уровень Stop Loss ордера
   request.tp=Bid+1000*_Point;                    // Уровень Take Profit ордера
   

В том что они не нормализованы. (используйте кнопку SRC для вставки кода).

  request.sl=NormalizeDouble(Bid-300*_Point,_Digits);   // Уровень Stop Loss ордера
  request.tp=NormalizeDouble(Bid+1000*_Point,_Digits);  // Уровень Take Profit ордера
 

Проверка функционала автоматической вставки ссылки

1. Вставляйте код правильно (Ctrl+Alt+M).

 
Yedelkin:

1. Вставляйте код правильно (Ctrl+Alt+M).

2. Давайте начнём с того, что в Вашем запросе не указано обязательное поле request.price (отсутствие такого поля допустимо только для режима Market Execution). Поэтому получается, что пока request.price==0. 

Спасибо. Поставил цену, все получилось.

 

Помогите пожалуйста что то не могу вкурить одну вещь.

|9|8|7|6|5|4|3|2|1|0| <--таймсерия Rates 

CopyRates(Symbol(),Period(),Time,2,Result);

вот например я указал время свечи №3. В таком случае мне вернет Rates свечей №3 и №4. А как получить свечи №3 и №2 имея время открытия свечи №3. отрицательное количество не переваривает

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

Заранее спасибо 

 

Добрый день!

Подскажите, пожалуйста, в каких единицах измеряется трафик в закладке "Службы" программы MetaTrader 5 Strategy Tester (MetaTester 5 Agents Managers build 712)? В килоБАЙТах|мегаБАЙТах или килоБИТах|мегаБИТах?

Спасибо.

 

Ребята подскажите есть ли в базе индюк, который позволяет выводить на основной чарт чарты других валют в виде индикатора или объектов?

п.с. для мт4 написал свой, а тут может уже готовый есть.. 

 
storm:

Ребята подскажите есть ли в базе индюк, который позволяет выводить на основной чарт чарты других валют в виде индикатора или объектов?

п.с. для мт4 написал свой, а тут может уже готовый есть.. 

Нашел, написали уже, з**** , не надо самому хоть писать. https://www.mql5.com/ru/code/1055
MultiCurrency
MultiCurrency
  • голосов: 9
  • 2012.09.14
  • Nikolay Kositsin
  • www.mql5.com
Индикатор MultiCurrency позволяет анализировать одновременно до восьми графиков валют.
 
storm:
Нашел, написали уже, з**** , не надо самому хоть писать. https://www.mql5.com/ru/code/1055
Инверсия в нем задумывалась автором, но не была реализована, пришлось подкрутить, а так зачот автору!