Изучаем язык программирования MQL4

Ugar

Гуру форума
Проведем маленькое исследование.
Напишем скрипт, который будет находить возможные ошибки при сравнении цен на графике.
Будем сравнивать результаты сравнения с нормализацией цен, и без нормализации.
Конкретно в этой задаче, погрешность имеет значение только на барах без тела. Если тело есть, хотя бы 1 пункт, погрешность не будет влиять.
 

BorisSedov

Активный участник
Конкретно в этой задаче, погрешность имеет значение только на барах без тела. Если тело есть, хотя бы 1 пункт, погрешность не будет влиять.
Бары без верхней или нижней тени встречаются, и их достаточно много. На это и было нацелено данное исследование, чтобы понять, случаются ли ошибки при сравнении.
 

BorisSedov

Активный участник
Следующая задача.
Нужно написать скрипт который подсчитает количество баров на графике, у которых –
Open=Close
или
High=Close
или
Low=Close
или
High=Open
или
Low=Open
Если хотя бы одно из перечисленных условий для конкретного бара выполняется, то учитываем этот бар при подсчете.

(у меня таких баров нашлось 12 630 из 100 000).
 
Последнее редактирование:

gravity

Местный знаток
Следующая задача.
Я еще задачу с Up-Down не смог решить. Как сделал Домовенок не смотрел, а сам не додумался еще. Если только, уже готовое решение разбирать.
Помоему слишком быстро. Понятное дело, что для имеющих опыт, это фигня. Но для начинающих это просто п****ц.
 

gravity

Местный знаток
Да, а запостил, просмотрел пост, увидел и у себя поправил. Плюс вывел разницу большей переменной. Всегда ведь интересно кого на рынке больше :)

Код:
Expand Collapse Copy
void OnStart()
// Нужно написать скрипт который определяет каких баров на графике больше,
// с ценой закрытия которая больше чем цена открытия
// или
// с ценой закрытия которая меньше чем цена открытия.
// Результат вывести словом Up – если баров закрытых вверх больше, или Down – если баров закрытых вниз больше.
// Рассматриваем только закрытые бары.
// Какой получится результат, в случае, если баров закрытых вверх или вниз будет поровну?
// При сравнении цен учесть погрешности double.
{
int i, a=0;
int n=0.0, m=0.0;        // Объявлены переменные, i, a, n, m, переменной a, n и m сразу же присвоено значение 0.

for(i=Bars-1; i>0; i--) // Сразу присвоено значение Bars-1 переменной i. После этого проверено условие что i>0,
   {                    // если это так, то выполняется один раз все, что написано внутри тела цикла.
   if(Close[i]>Open[i]) // Это условие (Close[i]>Open[i]) расположено как раз в теле цикла, и оно выполняется только если выше будет соблюдаться условие i>0,
      {                
      n++;              // В теле условия суммируются все подходящие цены закрытия и подсчитывается количество подходящих баров.
      }                
 
   if(Close[i]<Open[i]) // Это условие (Close[i]<Open[i]) расположено как раз в теле цикла, и оно выполняется только если выше будет соблюдаться условие i>0,
      {                
      m++;              // В теле условия суммируются все подходящие цены закрытия и подсчитывается количество подходящих баров.
      }  
   }                  
if (n>m)               // если баров с условием (Close[i]>Open[i]) больше, чем баров с условием (Close[i]<Open[i]), то
      {
       a=n-m;
       Print("Up","-", a);  // Выводится результат.
      }              

if (n<m)               // если баров с условием (Close[i]>Open[i]) меньше, чем баров с условием (Close[i]<Open[i]), то
      {
       a=m-n;
       Print("Down","-", a);  // Выводится результат.
      }  

if (n==m)               // если баров с условием (Close[i]>Open[i]) равно  барам с условием (Close[i]<Open[i]), то
Print("Even","-",n,"-", m);  // Выводится результат.

}
int i, a=0;
int n=0.0, m=0.0;


Вроде это можно просто в одну строку
int i,a=0, n=0,m=0;
 

BorisSedov

Активный участник
int i, a=0;
int n=0.0, m=0.0;


Вроде это можно просто в одну строку
int i,a=0, n=0,m=0;
Да, это можно записать в одну строку.
Когда не получается решить задачу, нужно изучать готовое решение. Постепенно будет приходить понимание.
 

gravity

Местный знаток
Да, это можно записать в одну строку.
Когда не получается решить задачу, нужно изучать готовое решение. Постепенно будет приходить понимание.
PHP:
Expand Collapse Copy
void OnStart()
{
int i,down=0,up=0;

for(i=Bars-1; i>0; i--)
   {
   if(Close[i]>Open[i])

    {
      up++;   // при соблюдении условия считаем бычьи свечи
      down++; // если условие не соблюдено, то значит свеча медвежья. Считаем их.
     }
   }

   if(down>up)
      {
         Print("Down"); //при соблюдении условия выводим Down
         Print("Up");   //если не соблюдено Up
      }
   if (down==up) Print("Они равны черт возьми");
}
//+------------------------------------------------------------------+

//Нужно написать скрипт который определяет каких баров на графике больше,
//с ценой закрытия которая больше чем цена открытия
//или
//с ценой закрытия которая меньше чем цена открытия.
//Результат вывести словом Up – если баров закрытых вверх больше, или Down – если баров закрытых вниз больше.
//Рассматриваем только закрытые бары.
Посмотрел его решение, без учета последних добавлений. А где у меня тут ошибка?
 
Последнее редактирование:

BorisSedov

Активный участник
А где у меня тут ошибка?
Ошибок было несколько.

C++:
Expand Collapse Copy
#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
int i,down=0,up=0;

for(i=Bars-1; i>0; i--)
   {
   if(Close[i]>Open[i]) up++; // При соблюдении условия считаем бычьи свечи.
   else if(Close[i]<Open[i]) down++; // Если условие не соблюдено, то значит свеча медвежья. Считаем их.
   }

if(down>up) Print("Down"); // При соблюдении условия выводим Down.
else if(down<up) Print("Up"); // Если условие не соблюдено, то выводим Up.

if(down==up) Print("Они равны черт возьми");
}
//+------------------------------------------------------------------+

Условный оператор if-else​
if (выражение)
оператор1
else
оператор2

Если выражение истинно, то выполняется оператор1 и управление передается на оператор, следующий за оператором2 (т.е. оператор2 не выполняется). Если выражение ложно, то выполняется оператор2.
 
Последнее редактирование:

gravity

Местный знаток
if (выражение)
оператор1
else
оператор2
Если выражение истинно, то выполняется оператор1 и управление передается на оператор, следующий за оператором2 (т.е. оператор2 не выполняется). Если выражение ложно, то выполняется оператор2.
Так вроде же else можно опускать?
Ошибка получается была в расставлении фигурных скобок, так как else должен быть за скобками?

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

Походу, все таки else нельзя опускать, так как без него работает неправильно.
Наверно я неправильно понимаю значение слова опускаться.
 
Последнее редактирование:

BorisSedov

Активный участник
Так вроде же else можно опускать?
Ошибка получается была в расставлении фигурных скобок, так как else должен быть за скобками?
Нам нужно подсчитать количество баров закрытых вверх, и количество закрытых вниз.
Для закрытых вверх мы определили условие.
А при каком условии нужно подсчитывать закрытые вниз? Для этого и нужно использовать else с дополнительным условием.

Рассмотрим два примера:

C++:
Expand Collapse Copy
if(Close[i]>Open[i]) up++;
else if(Close[i]<Open[i]) down++;


C++:
Expand Collapse Copy
if(Close[i]>Open[i])
   {
   up++;
   }
else
   {
   if(Close[i]<Open[i])
      {
      down++;
      }
   }

Оба варианта идентичны, но первый занимает меньше места.

Опускать часть else оператора if нужно в других случаях, когда не нужно выполнять какое то действие для противоположной ситуации.

Пример когда часть else оператора if опущена:

C++:
Expand Collapse Copy
for(i=1; i<=1000; i++)
   {
   if(i%2==0 || i%10==1) Print(i);
   }
 

gravity

Местный знаток
Нам нужно подсчитать количество баров закрытых вверх, и количество закрытых вниз.
Для закрытых вверх мы определили условие.
А при каком условии нужно подсчитывать закрытые вниз? Для этого и нужно использовать else с дополнительным условием.
Я даже не заметил, что после else еще раз есть if.

Получается такая структура должна быть.
PHP:
Expand Collapse Copy
if
    if();
else
    if();

А я вот if после else не вписал, все равно работает.
 

BorisSedov

Активный участник
Получается такая структура должна быть.
Возможны разные варианты. Это зависит от конкретной задачи.

Примеры некоторых вариантов:
C++:
Expand Collapse Copy
if()
   {

   }
else
   {

   }

C++:
Expand Collapse Copy
if()
   {

   }
else
   {
   if()
      {
    
      }
   }

C++:
Expand Collapse Copy
if()
   {

   }
else
   {
   if()
      {
    
      }
   else
      {
    
      }
   }

C++:
Expand Collapse Copy
if()
   {

   }
else
   {
   if()
      {
    
      }
   else
      {
      if()
         {
      
         }
      }
   }

C++:
Expand Collapse Copy
if()
   {

   }
else
   {
   if()
      {
    
      }
   else
      {
      if()
         {
      
         }
      else
         {
      
         }
      }
   }
 

gravity

Местный знаток
А вот здесь
Код:
Expand Collapse Copy
if(Close[i]>Open[i])
      {                
      price+=Close[i];
      n++;            
      }

{Телов оператра If}, это как один оператор считается чтоли? И сколько их там может быть, бесконечно?
 

Ugar

Гуру форума
Бары без верхней или нижней тени встречаются, и их достаточно много. На это и было нацелено данное исследование, чтобы понять, случаются ли ошибки при сравнении.
Бары без тела, а не без тени. У которых цена открытия и закрытия равны.
 

Ugar

Гуру форума
А вот здесь
Код:
Expand Collapse Copy
if(Close[i]>Open[i])
      {              
      price+=Close[i];
      n++;          
      }

{Телов оператра If}, это как один оператор считается чтоли? И сколько их там может быть, бесконечно?
Если условие внутри if истинно, то выполняется всё что внутри фигурных скобок. внутри может быть сколько угодно операторов и функций. Если нужно сделать только одну операцию по условию if, то фигурные скобки можно не ставить.
if(a>b)c++;
То же самое что
if(a>b)
{
c++;
}
 

BorisSedov

Активный участник
А вот здесь
{Тело в оператра If}, это как один оператор считается чтоли? И сколько их там может быть, бесконечно?
В тело любого оператора, можно помещать очень много других операторов.

Пример:
C++:
Expand Collapse Copy
#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
int a=0,b=0,c=1,d,e,f,g,h,i=0,j=0;

while(!IsStopped())
   {
   if(a<c)
      {
      a++;
      b+=2;
      c*=2;
      d=a+b;
      e=c-a;
      f=c/a;
      g=f+c;
      h=c%2;
      i--;
      j+=a+b+c+d+e+f+g+h+i;
      
      Print(a);
      Print(b);
      Print(c);
      Print(d);
      Print(e);
      Print(f);
      Print(g);
      Print(h);
      Print(i);
      Print(j);
      
      if(j>100000000) break;
      }
   }
}
//+------------------------------------------------------------------+
 

BorisSedov

Активный участник
Бары без тела, а не без тени. У которых цена открытия и закрытия равны.
Эти бары также встречаются достаточно часто.
В исследовании принимали участие все возможные случаи – бары без тела и бары без верхней или нижней тени. Бары без обоих теней также попадают в расчет, по этому для них отдельного условия не прописано.
 

gravity

Местный знаток
Нам нужно подсчитать количество баров закрытых вверх, и количество закрытых вниз.
Для закрытых вверх мы определили условие.
А при каком условии нужно подсчитывать закрытые вниз? Для этого и нужно использовать else с дополнительным условием.
Я все таки не догоняю, почему там в else надо задавать условия?
Ведь в справочнике написано.

Если выражение ложно, то выполняется оператор2.

PHP:
Expand Collapse Copy
if(Close[i]>Open[i])
    up++;   // при соблюдении условия считаем бычьи свечи
else
    down++; // если условие не соблюдено, то значит свеча медвежья. Считаем их.
PHP:
Expand Collapse Copy
if(Close[i]>Open[i]) up++;
else if(Close[i]<Open[i]) down++;

Разве в первом случае не будет работать?
 
Последнее редактирование:

Ugar

Гуру форума
Эти бары также встречаются достаточно часто.
В исследовании принимали участие все возможные случаи – бары без тела и бары без верхней или нижней тени. Бары без обоих теней также попадают в расчет, по этому для них отдельного условия не прописано.
Не стану уговаривать. Пишите как считаете нужным.
 

BorisSedov

Активный участник
Я все таки не догоняю, почему там в else надо задавать условия?
Разве в первом случае не будет работать?
У нас же есть еще вариант когда цена закрытия равна цене открытия. Чтобы исключить эти случаи из расчетов, мы добавляем еще одно условие в часть else. Если этого не сделать, то получится, что мы в down будем учитывать не только бары закрытые вниз, но и бары с ценой закрытия равной цене открытия.
 
Верх