Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1569

 
Dz Mak #:
Что скрипты все с роботами отключаются,что-ли,что нельзя?

некоторое время назад развелось тьма жуликов. С "100500 торговых сигналов", фермами, облаками и прочим.

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

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

 
sportoman #:

MaxH = High[iHighest(NULL,0,MODE_CLOSE,period,i)];                       

MinL = Low[iLowest(NULL,0,MODE_CLOSE,period,i)]; 

MaxH = high[iHighest(NULL,0,MODE_CLOSE,period,i)];                       

MinL = low[iLowest(NULL,0,MODE_CLOSE,period,i)]; 

 
Vitaly Muzichenko #:

MaxH = high[iHighest(NULL,0,MODE_CLOSE,period,i)];                       

MinL = low[iLowest(NULL,0,MODE_CLOSE,period,i)]; 

спасибо, но работает совсем не так, как в mql4

 
sportoman #:

спасибо, но работает совсем не так, как в mql4

там ещё ArraySetSeries(high,true) нужен..индексация массивов по умолчанию отличается в mt5 

 
sportoman #:

MaxH = high[iHighest(NULL,0,MODE_CLOSE,period,i)];                       

MinL = low[iLowest(NULL,0,MODE_CLOSE,period,i)];

ArraySetSeries(high,true);
ArraySetSeries(low,true);

MaxH = high[iHighest(NULL,0,MODE_CLOSE,period,i)];                       
MinL = low[iLowest(NULL,0,MODE_CLOSE,period,i)];
 

Вопрос о мультивалютности:

Есть несколько символов, нужно получить данные индикатора

Так как новая свеча открывается на некоторых символах позже, чем на основном - актуальные данные по тому символу не получим

Добавлена проверка на совпадение времени, и если на всех символах время открытия совпадает - продолжаем

Код работает и выполняет свои функции до тех пор, пока не добавим символ с ограниченной сессией, к примеру Индекс

тогда выполнение всего кода останавливается

void OnTick()
{
  bool flag=true;
  static datetime pTime;
  datetime cTime=iTime(NULL,0,1);
//--
  if(pTime!=iTime(NULL,0,1)) {
    for(int i=0; i<Sym_count; i++) {
      if(cTime!=iTime(Sym_arr[i],0,1)) { // если не прошли проверку
        flag=false; // ставим флаг
        break;
      }
      if(CopyBuffer(hRSI[i],0,1,1,buf)==-1) return;
      Ind_arr[i]=buf[0];
    }
    MinInd=ArrayMinimum(Ind_arr);
    MaxInd=ArrayMaximum(Ind_arr);
    Comment("\n",EnumToString(SelectInd)," : ",TimeCurrent(),
            "\nMaximum: ",Sym_arr[MaxInd]," = ",DoubleToString(Ind_arr[MaxInd],6),
            "\nMinimum: ",Sym_arr[MinInd]," = ",DoubleToString(Ind_arr[MinInd],6));
  }
  if(flag) { // Если всё хорошо - идём дальше
    pTime=iTime(NULL,0,1);
    Print("On = ",TimeCurrent());
  } else Print("Off = ",TimeCurrent());
}

--

Собственно вопрос:

Как сделать выполнение кода для тех символов, у которых открыта сессия, и не использовать с закрытой сессией.

Спасибо!

 
Vitaly Muzichenko время открытия совпадает на всех символах - продолжаем

Код работает и выполняет свои функции, пока мы не добавим символ с ограниченной сессией, например, Index

тогда все выполнение кода прекращается

--

Вопрос в следующем:

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

Спасибо!

Проверьте информацию о рынке для каждого символа, если он не является сессионным, то исключите его.

https://www.mql5.com/en/docs/marketinformation

Documentation on MQL5: Market Info
Documentation on MQL5: Market Info
  • www.mql5.com
These are functions intended for receiving information about the market state...
 
Vitaly Muzichenko #:

Собственно вопрос:

Как сделать выполнение кода для тех символов, у которых открыта сессия, и не использовать с закрытой сессией.

Спасибо!

Если сессии в спецификации не проставлены или проставлены, но не корректно, что бывает частенько.

То найти время последнего минутного вчерашнего бара и сравнить его с временем последнего сегодняшнего минутного бара.

Если ничего не напутал(что вряд ли), то типа так

if(pTime != iTime(NULL, 0, 1))
  {
   for(int i = 0; i < Sym_count; i++)
     {
      if(cTime != iTime(Sym_arr[i], 0, 1))
        {
         if(iTime(Sym_arr[i], PERIOD_M1, 0) >= iTime(Sym_arr[i], PERIOD_M1, iTime(Sym_arr[i], PERIOD_D1, 0), 1))
            continue;
         flag = false;
         break;
        }


ЗЫ. Конечно напута))) Нужно найденное время отправить в структуру  и уже потом сравнивать часы и минуты.


вот так возможно

if(pTime != iTime(NULL, 0, 1))
  {
   for(int i = 0; i < Sym_count; i++)
     {
      if(cTime != iTime(Sym_arr[i], 0, 1))
        {
         MqlDateTime dtLast, dtCurr;
         TimeToStruct(iTime(Sym_arr[i], PERIOD_M1, iTime(Sym_arr[i], PERIOD_D1, 0), 1), dtLast);
         TimeCurrent(dtCurr);
         if(dtCurr.hour + dtCurr.min * 60 >= dtLast.hour + dtLast.min * 60)
            continue;
         flag = false;
         break;
        }
     }
  }
Монструозно получилось и наверняка долго, но на скорую руку ничего лучше на ум не приходит.
 
Aleksandr Slavskii #:

Если сессии в спецификации не проставлены или проставлены, но не корректно, что бывает частенько.

То найти время последнего минутного вчерашнего бара и сравнить его с временем последнего сегодняшнего минутного бара.

Если ничего не напутал(что вряд ли), то типа так


ЗЫ. Конечно напута))) Нужно найденное время отправить в структуру  и уже потом сравнивать часы и минуты.


вот так возможно

Монструозно получилось и наверняка долго, но на скорую руку ничего лучше на ум не приходит.

Спасибо за внимание!

Есть некоторая проблема: что-то лишнее

if(cTime != iTime(Sym_arr[i], 0, 1)) {
        MqlDateTime dtLast, dtCurr;
        TimeToStruct(iTime(Sym_arr[i], PERIOD_M1, iTime(Sym_arr[i], PERIOD_D1, 0), 1), dtLast);
        TimeCurrent(dtCurr);
        if(dtCurr.hour + dtCurr.min * 60 >= dtLast.hour + dtLast.min * 60)
          continue;
 
Vitaly Muzichenko #:

Спасибо за внимание!

Есть некоторая проблема: что-то лишнее

Ну да, всё как всегда. Ничего лишнего, просто всё не правильно.

//+------------------------------------------------------------------+
void OnTick(void)
  {
   MqlDateTime dtLast, dtCurr;
   datetime TimeCurr = TimeCurrent(dtCurr);
   datetime TimeDay = iTime(_Symbol, PERIOD_D1, 0);
   int Shift = iBarShift(_Symbol, PERIOD_M1, TimeDay);
   datetime TimeLast = iTime(_Symbol, PERIOD_M1, Shift);
   TimeToStruct(TimeLast, dtLast);

   if(dtCurr.hour * 60 + dtCurr.min >= dtLast.hour * 60 + dtLast.min)
      Print("TimeCurrent ", TimeCurrent(), "; TimeLast ", TimeLast);
  }
//+------------------------------------------------------------------+
TimeCurrent 2024.10.01 23:49:00; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:02; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:04; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:06; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:08; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:11; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:13; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:15; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:17; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:20; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:22; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:24; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:26; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:28; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:31; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:33; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:35; TimeLast 2024.09.30 23:49:00
TimeCurrent 2024.10.01 23:49:37; TimeLast 2024.09.30 23:49:00