Ваши вопросы по языку MQL4

qqmber

Почетный гражданин
С глобальными чёт не клеитса то не запишется то не вызовется, а через статистические пробовал делать но тож чет в тупик зашел всегда 0 возвращает почему не понял
PHP:
int SIGNAL()
  {
   static int CurrentSignal ;
   static int LastSignal ;
   if(sign1()==1)  CurrentSignal = 1; 
   if(sign1()==2)  CurrentSignal = 2; 
   if(sign1()==0&&LastSignal==1)CurrentSignal = 1;
   if(sign1()==0&&LastSignal==2)CurrentSignal = 2;
   if(LastSignal != CurrentSignal) LastSignal = CurrentSignal;
      return(LastSignal);
   }

попробую через циклы мож получится

Всегда 0 будет возвращать если sign1() возвращает всегда 0.
 

hoz

Активный участник
Требуется совет. Пишу функцию, которую попутно додумываю. Ситуация такая:
Нужно чтоб функция считала бары соответствуют канкретным условиях и идущие в подряд друг за другом, (не через один, через 2, или через сколько-н. , а друг за другом..).
Рассмотрим вариант когда тренд предполагаемый вниз. Нужно, если идёт коррекция, допустим, 5 баров в подряд бычьих, и размер которых не меньше некоторого значения, то выйти с функции. Я сделал вот так:

PHP:
int LastCandlesType()
{
   bool up,                            // Свеча направлена вверх
        dn;                            // Свеча направлена вниз
   int cnt,                            // Счётчик идущих друг за другом бычьих свечей
       i_AnyBarsToHistory = 30;        // Количество используемых баров  из истории для рассчёта сигнала
   double i_sizeOfCurrBar = 10;        // Размер текущего бара
   
   for (int i=Bars-1; i>=Bars-AnyBarsToHistory; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром
          continue;
      
      if (Close[i] > Open[i])                               // Если условие соблюдается, значит текущий бар направлен вверх
          up = true;

      if (up)                                               // Если бар направлен вверх, значит к счётчик увеличивается
          cnt++;
   }
   if (cnt == 5)                                            // Если 5 баров вподряд бычьи..
       return (BULL_CANDLES);                               //..Выходим из функции
}


Может есть какой-то ещё способ большее гибкий? И всё ли у меня верно? Интересно мнение программистов с большим опытом чем у меня.
 
Последнее редактирование модератором:

alexshell

Элитный участник
Требуется совет. Пишу функцию, которую попутно додумываю. Ситуация такая:
Нужно чтоб функция считала бары соответствуют канкретным условиях и идущие в подряд друг за другом, (не через один, через 2, или через сколько-н. , а друг за другом..).
Рассмотрим вариант когда тренд предполагаемый вниз. Нужно, если идёт коррекция, допустим, 5 баров в подряд бычьих, и размер которых не меньше некоторого значения, то выйти с функции. Я сделал вот так:

PHP:
int LastCandlesType()
{
   bool up,                            // Свеча направлена вверх
        dn;                            // Свеча направлена вниз
   int cnt,                            // Счётчик идущих друг за другом бычьих свечей
       i_AnyBarsToHistory = 30;        // Количество используемых баров  из истории для рассчёта сигнала
   double i_sizeOfCurrBar = 10;        // Размер текущего бара
   
   for (int i=Bars-1; i>=Bars-AnyBarsToHistory; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром
          continue;
      
      if (Close[i] > Open[i])                               // Если условие соблюдается, значит текущий бар направлен вверх
          up = true;

      if (up)                                               // Если бар направлен вверх, значит к счётчик увеличивается
          cnt++;
   }
   if (cnt == 5)                                            // Если 5 баров вподряд бычьи..
       return (BULL_CANDLES);                               //..Выходим из функции
}


Может есть какой-то ещё способ большее гибкий? И всё ли у меня верно? Интересно мнение программистов с большим опытом чем у меня.
Зачем используется кол-во баров для подсчета=30. Если нужно 5 баров подряд бычьих то и используй для расчёта 5 баров. Как только они появятся выходим из функции. А в твоем варианте насчитает просто 5 баров бычьих из 30. И не факт что они будут подряд.
 
Последнее редактирование модератором:

hoz

Активный участник
Зачем используется кол-во баров для подсчета=30. Если нужно 5 баров подряд бычьих то и используй для расчёта 5 баров. Как только они появятся выходим из функции. А в твоем варианте насчитает просто 5 баров бычьих из 30. И не факт что они будут подряд.


alexshell, прочитай по внимательнее условия. Мне нужно не 5 любых баров, а 5 баров с требуемым признаком. Признаки в перспективе будут разные.
На данный момент должны быть 5 баров с признаками:
1. Все бары одного типа. В данном случает бычьи.
2. Длинна каждого бара большей внешней переменной некоторой.
Если я буду просчитывать только 5 баров, не факт, что там будут 5 последовательных именно таких баров...
 

alexshell

Элитный участник
alexshell, прочитай по внимательнее условия. Мне нужно не 5 любых баров, а 5 баров с требуемым признаком. Признаки в перспективе будут разные.
На данный момент должны быть 5 баров с признаками:
1. Все бары одного типа. В данном случает бычьи.
2. Длинна каждого бара большей внешней переменной некоторой.
Если я буду просчитывать только 5 баров, не факт, что там будут 5 последовательных именно таких баров...
Да вроде внимательно прочитал. Ключевое слово подряд.Бары же появляются по очереди.Как только появиться заданное кол-во барав с задаными признаками, условие выполниться.А в твоем варианте допустим появилось 3 бара бычьих, затем два медвежьих, потом опять 2 бычьих .У тебя сработало условие выхода из ф-ии.Но ведь они не подряд.
 

hoz

Активный участник
Да вроде внимательно прочитал. Ключевое слово подряд.Бары же появляются по очереди.Как только появиться заданное кол-во барав с задаными признаками, условие выполниться.А в твоем варианте допустим появилось 3 бара бычьих, затем два медвежьих, потом опять 2 бычьих .У тебя сработало условие выхода из ф-ии.Но ведь они не подряд.


А мне разницы нет. Если 2 бара допустим размеров по 10пп., потом бар размером 1пп., другой 0.3пп., потом 4 бара по 0.1. - 0.5пп., а дальше 4 больше 10пп. То Значится будет 6 баров просчитано вподряд идущих с заданным размеров и заданный типом. Вся шелуха, отсеится данным фильтром.
 

alexshell

Элитный участник
А мне разницы нет. Если 2 бара допустим размеров по 10пп., потом бар размером 1пп., другой 0.3пп., потом 4 бара по 0.1. - 0.5пп., а дальше 4 больше 10пп. То Значится будет 6 баров просчитано вподряд идущих с заданным размеров и заданный типом. Вся шелуха, отсеится данным фильтром.

Ну ясно. Подряд я понял по другому;)
 

hoz

Активный участник
Ну ясно. Подряд я понял по другому;)

Мыслить "как все" я не нанимался. У меня свой взгляд на мир. :)
В общем, суть такая. Вставил в эксперт эту функцию. Вот принт:

PHP:
2013.04.24 13:47:25	2012.04.20 00:52  Scalper_M1 EURUSD,M1: cnt = 2
2013.04.24 13:47:24	2012.04.20 00:51  Scalper_M1 EURUSD,M1: cnt = 2
2013.04.24 13:47:21	2012.04.20 00:50  Scalper_M1 EURUSD,M1: cnt = 2
2013.04.24 13:47:19	2012.04.20 00:49  Scalper_M1 EURUSD,M1: cnt = 2
2013.04.24 13:47:18	2012.04.20 00:48  Scalper_M1 EURUSD,M1: cnt = 2
2013.04.24 13:47:15	2012.04.20 00:47  Scalper_M1 EURUSD,M1: cnt = 2


Как такое может быть? Переменная cnt всегда одинаковая.
 

hoz

Активный участник
Вот так сейчас функция выглядит:

PHP:
int LastCandlesType()
{
   bool up,                            // Свеча направлена вверх
        dn;                            // Свеча направлена вниз
   int cnt,                            // Счётчик идущих друг за другом бычьих свечей
       i_AnyBarsToHistory = 30;        // Количество используемых баров  из истории для рассчёта сигнала
   double i_sizeOfCurrBar = 10;        // Размер текущего бара
   
   for (int i=Bars-1; i>=Bars-AnyBarsToHistory; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром
          continue;
      
      if (Close[i] > Open[i])                               // Если условие соблюдается, значит текущий бар направлен вверх
          up = true;

      if (up)                                               // Если бар направлен вверх, значит к счётчик увеличивается
          cnt++;
   }
   if (cnt == 5)                                            // Если 5 баров вподряд бычьи..
       return (BULL_CANDLES);                               //..Выходим из функции
}


Принт:

PHP:
2013.04.24 14:22:43	2012.04.20 00:05  Scalper_M1 EURUSD,M1: i = 990; up = 2; cnt = 2
2013.04.24 14:22:43	2012.04.20 00:05  Scalper_M1 EURUSD,M1: i = 1005; up = 1; cnt = 1
2013.04.24 14:22:42	2012.04.20 00:04  Scalper_M1 EURUSD,M1: i = 989; up = 2; cnt = 2
2013.04.24 14:22:42	2012.04.20 00:04  Scalper_M1 EURUSD,M1: i = 1004; up = 1; cnt = 1
2013.04.24 14:22:40	2012.04.20 00:03  Scalper_M1 EURUSD,M1: i = 988; up = 2; cnt = 2
2013.04.24 14:22:40	2012.04.20 00:03  Scalper_M1 EURUSD,M1: i = 1003; up = 1; cnt = 1
2013.04.24 14:22:31	2012.04.20 00:02  Scalper_M1 EURUSD,M1: i = 987; up = 2; cnt = 2
2013.04.24 14:22:31	2012.04.20 00:02  Scalper_M1 EURUSD,M1: i = 1002; up = 1; cnt = 1
2013.04.24 14:22:23	2012.04.20 00:01  Scalper_M1 EURUSD,M1: i = 986; up = 2; cnt = 2
2013.04.24 14:22:23	2012.04.20 00:01  Scalper_M1 EURUSD,M1: i = 1001; up = 1; cnt = 1
2013.04.24 14:22:04	2012.04.20 00:00  Scalper_M1 EURUSD,M1: i = 985; up = 2; cnt = 2
2013.04.24 14:22:04	2012.04.20 00:00  Scalper_M1 EURUSD,M1: i = 1000; up = 1; cnt = 1

Получается какая-то чушь. up - булева переменная. Значит она принимает значения только 0 (т.е. false) или 1 (true).
В принте у неё значение 1 и 2... Что тут вообще за хрень?
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Получается какая-то чушь. up - булева переменная. Значит она принимает значения только 0 (т.е. false) или 1 (true).
В принте у неё значение 1 и 2... Что тут вообще за хрень?
Покажите код вместе с оператором Print.
 

alexshell

Элитный участник
Вот так сейчас функция выглядит:

int LastCandlesType()
{
bool up, // Свеча направлена вверх
dn; // Свеча направлена вниз
int cnt, // Счётчик идущих друг за другом бычьих свечей
i_AnyBarsToHistory = 30; // Количество используемых баров из истории для рассчёта сигнала
double i_sizeOfCurrBar = 10; // Размер текущего бара

for (int i=Bars-1; i>=Bars-AnyBarsToHistory; i--)
{
if ((Close - Open) <= i_sizeOfCurrBar * Point) // Пропускаем все бары, размера меньше заданного внешним параметром
continue;

if (Close > Open) // Если условие соблюдается, значит текущий бар направлен вверх
up = true;

if (up) // Если бар направлен вверх, значит к счётчик увеличивается
cnt++;
}
if (cnt == 5) // Если 5 баров вподряд бычьи..
return (BULL_CANDLES); //..Выходим из функции
}





Получается какая-то чушь. up - булева переменная. Значит она принимает значения только 0 (т.е. false) или 1 (true).
В принте у неё значение 1 и 2... Что тут вообще за хрень?

1: выделил красным.
2: У тебя цикл в расчёте идет по всем свечам истории кроме последних 30.
Если нужны последние30 то я б сделал так:
PHP:
 for (int i=1; i<=i_AnyBarsToHistory; i++)
3:булевая переменная в цикле не обнуляется т.есть появился бар с нужными параметрами стала труе и всё. И дальше по идее все бары будут считаться как удовлетворяющие условию.И зачем вообще использовать булевую переменную.
Вот сов который считает бары по твоему условию
PHP:
int start ()                       
             {                     // Свеча направлена вниз 
   int cnt;int i_AnyBarsToHistory = 30;                            // Счётчик идущих друг за другом бычьих свечей 
       // Количество используемых баров  из истории для рассчёта сигнала 
   double i_sizeOfCurrBar = 1;        // Размер текущего бара 
    
   for (int i=1; i<=i_AnyBarsToHistory; i++) 
   { 
      if (Close[i] - Open[i]>= i_sizeOfCurrBar * Point)   
         
       {
      if (Close[i] > Open[i])                             
                                                
          cnt++; 
      }     
   } 
    Comment("снт=",cnt)  ;   
   
       
    return (0);                                   //..Выходим из функции 
}
Повесил на график,считает.Но опять же он считает просто кол-во баров с заданными параметрами. Про подряд здесь условий нет.
4: про принт я вообще хрен знает что у тебя пишет Так как не вижу откуда принтуется и что там прописано.
 

hoz

Активный участник
Покажите код вместе с оператором Print.


PHP:
//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
int LastCandlesType()
{
   bool up,                            // Свеча направлена вверх
        dn;                            // Свеча направлена вниз
   int cnt;                            // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-i_AnyBarsToHistory; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром
          continue;
     
      if (Close[i] > Open[i])                               // Если условие соблюдается, значит текущий бар направлен вверх
          cnt++;
      Print("i = ", i, "; up = ", cnt, "; cnt = ", cnt);
   }
 //  Print("cnt = ", cnt);
   if (cnt == 5)                                            // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_BEAR_CANDLE);           //..Выходим из функции
}
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Ну так у вас в принте ошибка, разве не заметно?
 

hoz

Активный участник
Ну так у вас в принте ошибка, разве не заметно?


Заметно. Исправил.

PHP:
int LastCandlesType()
{
   bool up,                            // Свеча направлена вверх
        dn;                            // Свеча направлена вниз
   int cnt;                            // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-i_AnyBarsToHistory; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром
          continue;
     
      if (Close[i] > Open[i])                               // Если условие соблюдается, значит текущий бар направлен вверх
          cnt++;
      Print("i = ", i, "; up = ", up, "; cnt = ", cnt);
   }
 //  Print("cnt = ", cnt);
   if (cnt == 5)                                            // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_BEAR_CANDLE);           //..Выходим из функции
}


Но почему-то всё-равно не так как требуется функция работает.

PHP:
2013.04.24 16:29:45	2012.04.20 00:03  Scalper_M1 EURUSD,M1: i = 988; up = 0; cnt = 2
2013.04.24 16:29:45	2012.04.20 00:03  Scalper_M1 EURUSD,M1: i = 1003; up = 0; cnt = 1
2013.04.24 16:29:41	2012.04.20 00:02  Scalper_M1 EURUSD,M1: i = 987; up = 0; cnt = 2
2013.04.24 16:29:41	2012.04.20 00:02  Scalper_M1 EURUSD,M1: i = 1002; up = 0; cnt = 1
2013.04.24 16:29:38	2012.04.20 00:01  Scalper_M1 EURUSD,M1: i = 986; up = 0; cnt = 2
2013.04.24 16:29:38	2012.04.20 00:01  Scalper_M1 EURUSD,M1: i = 1001; up = 0; cnt = 1
2013.04.24 16:29:29	2012.04.20 00:00  Scalper_M1 EURUSD,M1: i = 985; up = 0; cnt = 2
2013.04.24 16:29:29	2012.04.20 00:00  Scalper_M1 EURUSD,M1: i = 1000; up = 0; cnt = 1


Но переменная cnt почему-то постоянно 1 и 2. Даже когда свечи вообще медвежьи, и условие:

PHP:
if (Close[i] > Open[i])


Не соблюдается.
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Заметно. Исправил.

PHP:
int LastCandlesType()
{
   bool up,                            // Свеча направлена вверх
        dn;                            // Свеча направлена вниз
   int cnt;                            // Счётчик идущих друг за другом бычьих свечей
   
   for (int i=Bars-1; i>=Bars-i_AnyBarsToHistory; i--)
   {
      if ((Close[i] - Open[i]) <= i_sizeOfCurrBar * Point)    // Пропускаем все бары, размера меньше заданного внешним параметром
          continue;
     
      if (Close[i] > Open[i])                               // Если условие соблюдается, значит текущий бар направлен вверх
          cnt++;
      Print("i = ", i, "; up = ", up, "; cnt = ", cnt);
   }
 //  Print("cnt = ", cnt);
   if (cnt == 5)                                            // Если 5 баров вподряд бычьи..
    return (REQUIRED_SEQUENTIAL_BEAR_CANDLE);           //..Выходим из функции
}
Но почему-то всё-равно не так как требуется функция работает.

PHP:
2013.04.24 16:29:45    2012.04.20 00:03  Scalper_M1 EURUSD,M1: i = 988; up = 0; cnt = 2
2013.04.24 16:29:45    2012.04.20 00:03  Scalper_M1 EURUSD,M1: i = 1003; up = 0; cnt = 1
2013.04.24 16:29:41    2012.04.20 00:02  Scalper_M1 EURUSD,M1: i = 987; up = 0; cnt = 2
2013.04.24 16:29:41    2012.04.20 00:02  Scalper_M1 EURUSD,M1: i = 1002; up = 0; cnt = 1
2013.04.24 16:29:38    2012.04.20 00:01  Scalper_M1 EURUSD,M1: i = 986; up = 0; cnt = 2
2013.04.24 16:29:38    2012.04.20 00:01  Scalper_M1 EURUSD,M1: i = 1001; up = 0; cnt = 1
2013.04.24 16:29:29    2012.04.20 00:00  Scalper_M1 EURUSD,M1: i = 985; up = 0; cnt = 2
2013.04.24 16:29:29    2012.04.20 00:00  Scalper_M1 EURUSD,M1: i = 1000; up = 0; cnt = 1
Но переменная cnt почему-то постоянно 1 и 2. Даже когда свечи вообще медвежьи, и условие:

PHP:
if (Close[i] > Open[i])
Не соблюдается.
Та ошибка ничего не значит.

А мне интересно что такое "Bars" и "REQUIRED_SEQUENTIAL_BEAR_CANDLE)"
От какого значения ты начинаешь проверять высоту баров и что выводишь из функции?
 
Последнее редактирование модератором:

qqmber

Почетный гражданин
Но переменная cnt почему-то постоянно 1 и 2. Даже когда свечи вообще медвежьи, и условие:

PHP:
if (Close[i] > Open[i])


Не соблюдается.

Если до этой проверки дело дошло, то она всегда даст true, поскольку предыдущее условие с continue более жесткое.
Я готов поверить, что на рассматриваемом отрезке в 1000-Х минутных баров действительно только две бычьих свечки больше порога.
 
Последнее редактирование:

hoz

Активный участник
А мне интересно что такое "Bars"


_http://docs.mql4.com/ru/predefined/variables/bars

А мне интересно что такое "REQUIRED_SEQUENTIAL_BEAR_CANDLE"

Тока тут нужно было REQUIRED_SEQUENTIAL_BULL_CANDLE
С английского необходимое количество последовательных бычьих баров


Та ошибка ничего не значит.
PHP:
if (Close[i] > Open[i])

Где ошибка??? Как это ниего не значит?


От какого значения ты начинаешь проверять высоту баров и что выводишь из функции?

Проверяется высота каждого бара.. Я ж в цикле это дела, что тут не понятного то?
 
Последнее редактирование модератором:

hoz

Активный участник
Если до этой проверки дело дошло, то она всегда даст true, поскольку предыдущее условие с continue более жесткое.
Я готов поверить, что на рассматриваемом отрезке в 1000-Х минутных баров действительно только две бычьих свечки больше порога.


Там не 1000 минутные свечек, а всего 29! Значение i_AnyBarsToHistory= 30

Так жёсткое или не жёсткое, но условие есть условие. Как можно проверяя цену закрытия и открытия бара, получить значение, что цена закрытия ниже, в то время, когда оно выше на самом деле?

Как тогда верно написать?
 

AlexeyVik

Программист mql4 mql5
Bars - Документация на MQL4



Тока тут нужно было REQUIRED_SEQUENTIAL_BULL_CANDLE
С английского необходимое количество последовательных бычьих баров




Где ошибка??? Как это ниего не значит?




Проверяется высота каждого бара.. Я ж в цикле это дела, что тут не понятного то?
Зачем ты мене даёшь ссылку на документацию? Это у тебя индикатор?
Ну ты сам рассуди. Если ты считаешь от количества баров на графике, а смотришь, наверняка, на последние... Какое совпадение ты можешь увидеть...
Дословный перевод с аглицкого твоей переменной тоже ни о чём не говорит. Это всего-лишь набор символов, а что в ней должно быть это только тебе известно. Но я не вижу чтобы этой переменной присваивалось какое-либо значение перед выводом её из функции.
А что касается ошибки, так я цитировал твой ответ об ошибке в принте. Вот эта ошибка и не имеет никакого критического значения.

Так-что получается ты на мои вопросы не ответил.
Если сможешь ответить, может и поймёшь свою ошибку.
 

qqmber

Почетный гражданин
Там не 1000 минутные свечек, а всего 29! Значение i_AnyBarsToHistory= 30

Так жёсткое или не жёсткое, но условие есть условие. Как можно проверяя цену закрытия и открытия бара, получить значение, что цена закрытия ниже, в то время, когда оно выше на самом деле?

Как тогда верно написать?

Приблизительно понятно :)
Вы желаете анализировать 30 последних баров, но вместо этого берете 30 самых дальних в истории. Нужно
for (int i=i_AnyBarsToHistory; i>=0; i--)
Кроме того, первое условие в цикле отсеивает все медвежьи свечки и все бычьи свечки недостаточного размера. Второе условие просто не нужно.
 
Верх