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

 
Mikhail Tkachev #:

Спасибо, отличная конструкция, я не додумался)

это неправильная конструкция.

 
PapaYozh #:

при каждом запуске будет повторяться результат

Три раза запускал скрипт, не повторяется...

 
PapaYozh #:

при каждом запуске будет повторяться результат

А проверить кто запретил?

Теоретически:

При первом запуске без разницы какое псевдослучайное число будет получено.

Затем на его основании установлено начальное состояние генератора случайных чисел.

На следующей итерации цикла получено уже другое псевдослучайное число и оно используется для установки начального состояния генератора…

Откуда могут быть повторения?

 
Tretyakov Rostyslav #:

Кнопку "Все" нажимал?

Теперь другая проблема. дату создания линии показывает 1970г. В комменте нормально Comment(GetObjectTime1("V_Line"), "   ", time[100], "   ", iTime(_Symbol,PERIOD_CURRENT,100));


int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
     {
      //---
      //---
      if(ObjectFind(0, "V_Line") != 0)
        {
         ObjectCreate(0, "V_Line", OBJ_VLINE, 0, iTime(_Symbol,PERIOD_CURRENT,100), 0);
         ObjectSetInteger(0, "V_Line", OBJPROP_COLOR, clrAntiqueWhite);
         ObjectSetInteger(0, "V_Line", OBJPROP_BACK, 1);
         ObjectSetInteger(0, "V_Line", OBJPROP_STYLE, STYLE_DASH);
         ObjectSetInteger(0, "V_Line", OBJPROP_WIDTH, 0);
         ObjectSetInteger(0, "V_Line", OBJPROP_SELECTED, 1);
         ObjectSetInteger(0, "V_Line", OBJPROP_HIDDEN, 0);
        }
      //---
      int UP = 0;
      int Down = 0;
      t = GetObjectTime1("V_Line");
      Comment(GetObjectTime1("V_Line"), "   ", time[100], "   ", iTime(_Symbol,PERIOD_CURRENT,100));
 
Александр #:

Теперь другая проблема. дату создания линии показывает 1970г. В комменте нормально Comment(GetObjectTime1("V_Line"), "   ", time[100], "   ", iTime(_Symbol,PERIOD_CURRENT,100));


datetime t;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,"V_Line");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(ObjectFind(0,"V_Line")!=0)
     {
      ObjectCreate(0, "V_Line", OBJ_VLINE, 0, iTime(_Symbol,PERIOD_CURRENT,100), 0);
      ObjectSetInteger(0, "V_Line", OBJPROP_COLOR, clrAntiqueWhite);
      ObjectSetInteger(0, "V_Line", OBJPROP_BACK, 0);
      ObjectSetInteger(0, "V_Line", OBJPROP_STYLE, STYLE_DASH);
      ObjectSetInteger(0, "V_Line", OBJPROP_WIDTH, 0);
      ObjectSetInteger(0, "V_Line", OBJPROP_SELECTED, 1);
      ObjectSetInteger(0, "V_Line", OBJPROP_HIDDEN, 0);
     }   
   t=GetObjectTime1("V_Line");
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
datetime GetObjectTime1(const string name)
  {
   datetime time=0;
   if(ObjectFind(0,name)==0)
      time=(datetime)ObjectGetInteger(0,name,OBJPROP_TIME);
   return(time);
  }
//+------------------------------------------------------------------+
 
Alexey Viktorov #:

А проверить кто запретил?

Теоретически:

При первом запуске без разницы какое псевдослучайное число будет получено.

Затем на его основании установлено начальное состояние генератора случайных чисел.

На следующей итерации цикла получено уже другое псевдослучайное число и оно используется для установки начального состояния генератора…

Откуда могут быть повторения?

Проверил.

В таком случае надобность в вызове MathSrand() отпадает.

 
PapaYozh #:

Проверил.

В таком случае надобность в вызове MathSrand() отпадает.

Почему отпадает?

 
Alexey Viktorov #:

Почему отпадает?


Я предполагал, что вызов MathRand() без MathSrand() будет давать одну и ту же последовательность псевдослучайных чисел. Оказалось, что это не так.

 

Доброго времени суток. Господа профессионалы может кто подскажет почему при написанни пользовательской функции, при добавлении еще однго параметра для копирования в буфер, выдает ошибку  too many parameters (слишком много параметров). Есть какие-то ограничения?

Я ввел 29 пераметров, а на 30-м у меня выдает ошибку

 
PapaYozh #:


Я предполагал, что вызов MathRand() без MathSrand() будет давать одну и ту же последовательность псевдослучайных чисел. Оказалось, что это не так.

Именно так и есть. Только при повторной установке начального состояния генератора случайных чисел происходит уже с другим случайным числом. Внимательно прочтите что написано тут

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Alexey Viktorov, 2022.07.08 10:34

А проверить кто запретил?

Теоретически:

При первом запуске без разницы какое псевдослучайное число будет получено.

Затем на его основании установлено начальное состояние генератора случайных чисел.

На следующей итерации цикла получено уже другое псевдослучайное число и оно используется для установки начального состояния генератора…

Откуда могут быть повторения?

Вот я чуток добавил в скрипт

/********************Script program start function*******************/
void OnStart()
 {
  string   str1;
  int      val1;

  Print(__FILE__+":"+IntegerToString(__LINE__)+" "+__FUNCTION__+" : Начало");
  for(int i=1; i<=5; i++)
   {
    int startRand = rand();
    StringConcatenate(str1, startRand, " Цикл : ",i);
    MathSrand(startRand); // Инициализация неповторяющимся числом

    for(int j=1; j<=5; j++)
     {
      val1=MathRand();
      StringConcatenate(str1, str1, " ; ", IntegerToString(val1)) ;
     }
    Print(str1);
   }
  Print(__FILE__+":"+IntegerToString(__LINE__)+" "+__FUNCTION__+" : Конец");
 }/******************************************************************/

и вот результат двух запусков

2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) !!0.mq5:25 OnStart : Начало
2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) 14017 Цикл : 1 ; 13044 ; 867 ; 10273 ; 16881 ; 15828
2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) 2529 Цикл : 2 ; 8297 ; 25767 ; 12655 ; 8381 ; 11085
2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) 13793 Цикл : 3 ; 12312 ; 18056 ; 6395 ; 651 ; 31892
2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) 7678 Цикл : 4 ; 25111 ; 24159 ; 15498 ; 14575 ; 3901
2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) 14669 Цикл : 5 ; 15173 ; 29244 ; 25073 ; 10290 ; 23491
2022.07.08 14:24:26.792 !!0 (GBPUSD,M1) !!0.mq5:39 OnStart : Конец
2022.07.08 14:24:41.480 !!0 (GBPUSD,M1) !!0.mq5:25 OnStart : Начало
2022.07.08 14:24:41.480 !!0 (GBPUSD,M1) 12552 Цикл : 1 ; 8260 ; 15860 ; 20894 ; 22495 ; 11025
2022.07.08 14:24:41.480 !!0 (GBPUSD,M1) 17038 Цикл : 2 ; 22909 ; 31483 ; 9039 ; 32728 ; 13790
2022.07.08 14:24:41.481 !!0 (GBPUSD,M1) 3164 Цикл : 3 ; 10370 ; 2493 ; 18676 ; 18697 ; 7240
2022.07.08 14:24:41.481 !!0 (GBPUSD,M1) 16898 Цикл : 4 ; 22452 ; 1266 ; 31191 ; 6200 ; 11541
2022.07.08 14:24:41.481 !!0 (GBPUSD,M1) 10478 Цикл : 5 ; 1487 ; 5905 ; 31210 ; 20846 ; 16102
2022.07.08 14:24:41.481 !!0 (GBPUSD,M1) !!0.mq5:39 OnStart : Конец
Причина обращения: