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

 
Galim_V:

 Вот так  будет модифицировать 

там в коде ошибок много, в 

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

нужно цены нормализовать то будет работать то будет ошибку сервера выдавать "неправильные цены", желательно выше нормализовать StopLoss_SELL

и скорее всего нужно еще стоплосс проверить не равен ли он нулю, да и не желательно вещественные числа сравнивать на равенство, нужно стараться вещественные числа сравнивать на > или  <

 
Jessy111:

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

вот набросал индикатор, в Вашем коде не понравилось работа со строками, я бы проще написал, вот пример. Хотя если задача у Вас еще и смещение времени сервера учитывать, тогда по другому нужно

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int i,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

мой пример тоже не образец, писал быстро, думаю нужно было не от конца истории рассчитывать к началу при первом запуске, а от нулевого бара к истории, код был бы короче и можно было бы текущий день быстрее рассчитывать - цикл был бы меньше,

но в тестере проверил вроде без проблем работает, пусть так будет, поздно уже, спать охота... плохой пример сделал (((

 
Igor Makanu:

там в коде ошибок много, в 

нужно цены нормализовать то будет работать то будет ошибку сервера выдавать "неправильные цены", желательно выше нормализовать StopLoss_SELL

и скорее всего нужно еще стоплосс проверить не равен ли он нулю, да и не желательно вещественные числа сравнивать на равенство, нужно стараться вещественные числа сравнивать на > или  <

Все верно. Я лишь показал место в коде, почему не модифицирует рыночные ордера: запрос стопа с рынка выдаст 0.

 
Igor Makanu:

вот набросал индикатор, в Вашем коде не понравилось работа со строками, я бы проще написал, вот пример. Хотя если задача у Вас еще и смещение времени сервера учитывать, тогда по другому нужно

мой пример тоже не образец, писал быстро, думаю нужно было не от конца истории рассчитывать к началу при первом запуске, а от нулевого бара к истории, код был бы короче и можно было бы текущий день быстрее рассчитывать - цикл был бы меньше,

но в тестере проверил вроде без проблем работает, пусть так будет, поздно уже, спать охота... плохой пример сделал (((

Это не мой код в индикаторе был, это я в интернете нашла, я не умею индикаторы писать. :)

Почему плохой пример сделали, мне очень понравился Ваш индикатор, работает и в тестере, и на реальных графиках все правильно показывает.

Огромная благодарность Вам за быструю помощь!

Можно еще Вас попросить убрать линии которые канал рисуют? я на скрине их красными стрелками пометила.

И если совсем не затруднит, пожалуйста добавь функцию отключать/ включать формирование линий на текущем дне. На скрине я их синими стрелками пометила. https://prnt.sc/kuuj3e

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

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

Здравствуйте Уважаемые!

Подскажите как выполнить процедуру OnInit();

после изменения переменных эксперта !?

При помещении эксперта на график есть OnInit(); а при изменении переменных его нет!?

Как вычленить событие изменения переменных эксперта!?

Помогите советом точнее кодом как это сделать !?

 
Игорь:

Здравствуйте Уважаемые!

Подскажите как выполнить процедуру OnInit();

после изменения переменных эксперта !?

При помещении эксперта на график есть OnInit(); а при изменении переменных его нет!?

Как вычленить событие изменения переменных эксперта!?

Помогите советом точнее кодом как это сделать !?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

поэкспериментируйте с таким кодом, в журнале эксперта читайте сообщение (переключайте ТФ, вводите переменную, перезагрузите терминал не закрывая эксперта...)

и второй вариант описать на глобальном уровне видимости переменную с модификатором static

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

поэкспериментируйте с таким кодом, в журнале эксперта читайте сообщение (переключайте ТФ, вводите переменную, перезагрузите терминал не закрывая эксперта...)

и второй вариант описать на глобальном уровне видимости переменную с модификатором static

На глобальном уровне с модификатором static????? Это извращение какое-то.

 
Alexey Viktorov:

На глобальном уровне с модификатором static????? Это извращение какое-то.

да ладно, я в курсе, что на глобальном уровне и без static работать будет, но из опыта, когда раньше часто билды МТ4 обновлялись, лучше писать по классике С++, чем потом при общении с разработчиками слушать в ответ "пишите код правильно"



ЗЫ: вспомнил почему стал писать модификатор static на глобальном уровне, если нужно гарантированно не "потерять значение" переменной в ходе выполнения MQL-программы, раньше (лет 5 назад) не было директивы прекомпилятора #property strict и при включении файлов (#include или library - не помню уже) я один раз "потерял свою переменную" т.к. имена переменных совпадали с подключаемым файлом, как водится - я ругал MQL, потом случайно нашел это недоразумение, а вот если писать модификатор static , то и тогда компилятор выдавал ошибку при компиляции

Сейчас компилятор МТ4, довольно удобный и надежный, и с директивой #property strict, может и не нужно такие предосторожности, но пишу по привычке static  когда не хочу "потерять значение" переменной

ЗЫЗЫ: на скорость выполнения MQL-программы этот модификатор не влияет, да и мне удобно потом свой код через не которое время открыть и увидев static я буду точно знать, что в этой переменной значение которое важно "не потерять" во время выполнения программы

 
Igor Makanu:

да ладно, я в курсе, что на глобальном уровне и без static работать будет, но из опыта, когда раньше часто билды МТ4 обновлялись, лучше писать по классике С++, чем потом при общении с разработчиками слушать в ответ "пишите код правильно"



ЗЫ: вспомнил почему стал писать модификатор static на глобальном уровне, если нужно гарантированно не "потерять значение" переменной в ходе выполнения MQL-программы, раньше (лет 5 назад) не было директивы прекомпилятора #property strict и при включении файлов (#include или library - не помню уже) я один раз "потерял свою переменную" т.к. имена переменных совпадали с подключаемым файлом, как водится - я ругал MQL, потом случайно нашел это недоразумение, а вот если писать модификатор static , то и тогда компилятор выдавал ошибку при компиляции

Сейчас компилятор МТ4, довольно удобный и надежный, и с директивой #property strict, может и не нужно такие предосторожности, но пишу по привычке static  когда не хочу "потерять значение" переменной

ЗЫЗЫ: на скорость выполнения MQL-программы этот модификатор не влияет, да и мне удобно потом свой код через не которое время открыть и увидев static я буду точно знать, что в этой переменной значение которое важно "не потерять" во время выполнения программы

Если имена переменных совпадают с именами в подключаемом файле, то компилятор выдаёт предупреждение. Для меня предупреждение равно ошибке и на них я реагирую одинаково. А переменные глобального уровня с модификатором static равно маслу масляному.

Но... если вам нравится писать так, то никто вам этого запретить не может.

 
Alexey Viktorov:

Но... если вам нравится писать так, то никто вам этого запретить не может.

закрались сомнения в моей уникальности в этом вопросе... фух, я  не один, поиском по папке MQL5, встречаются такие обьявления с модификатором static на глобальном уровне у нескольких исходников из поставки МТ5

даже в статье "RANDOM DECISION FOREST В ОБУЧЕНИИ С ПОДКРЕПЛЕНИЕМ" в исходнике нашел обьявление на глобальном уровне: static datetime last_time=0;

значит как писал так, что считаю нужным выделить так и буду, я же не 100% переменных на глобальном уровне описываю как static

береженого Бог бережет, сказала монашка...  ))))

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