Ответить
12.04.2013, 12:33
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Имея маловатый опыт, не торопитесь обвинять язык в кривости и баговости.
Вы продолжаете обращаться к несуществующему элементу массива, несмотря на совет Алексея. В массиве длиной i последний элемент имеет индекс i-1.

Так тут так и есть. Ведь в массиве 4 элемента. У нас есть цикл от 0 до 4 (не включительно). А значит переменная i примет значение от 0 до 3.

PHP код:
for (int i=0i<4i++)
   {
      
ArrayResize(crossDir,i);
      
double ema1;
      
double ema0 GetCurAndPrevMA(g_maPeriod[i], ema1);

      
crossDir[i] = CROSS_NO
12.04.2013, 12:45
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Так тут так и есть. Ведь в массиве 4 элемента. У нас есть цикл от 0 до 4 (не включительно). А значит переменная i примет значение от 0 до 3.
Цикл выполнится 4 раза, размер массива будет расти от 0 до 3. В нем ни разу не будет четырех элементов.
12.04.2013, 12:50
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Цикл выполнится 4 раза, размер массива будет расти от 0 до 3. В нем ни разу не будет четырех элементов.
0, 1, 2, 3 = 4 элемента... Что не так?
12.04.2013, 12:59
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Первый проход цикла. ArrayResize(crossDir,0); Массив получает нулевой размер, т.е. в нем вообще нет элементов. Тем не менее, вы присваиваете значение несуществующему элементу с индексом 0.
Аналогично и на последующих оборотах. Массив становится длиной i, в нем нет элемента с индексом i, присваивание за границу массива.
12.04.2013, 13:08
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Первый проход цикла. ArrayResize(crossDir,0); Массив получает нулевой размер, т.е. в нем вообще нет элементов. Тем не менее, вы присваиваете значение несуществующему элементу с индексом 0.
Аналогично и на последующих оборотах. Массив становится длиной i, в нем нет элемента с индексом i, присваивание за границу массива.

Хм. Я так понял, нужно вот так? Объявить размер за пределами цикла.


PHP код:
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(intcrossDir[])
{
   
double ema365_1;
   
double ema365_0 GetCurAndPrevMA(365ema365_1);
   
ArrayResize(crossDir,4);

   for (
int i=0i<4i++)
   {
      
double ema1;
      
double ema0 GetCurAndPrevMA(g_maPeriod[i], ema1);

      
crossDir[i] = CROSS_NO;
      
      Print(
"crossDir[i] = "i"___"crossDir[i]);
      Print(
"crossDir[i] = "i"___"crossDir[i]);

      if (
ema1 ema365_1 && ema0 ema365_0)
      {
         Print(
"ema1b < 365_1 ___ "ema1 ," < "ema365_1"___",i);
         Print(
"ema0b > 365_0 ___ "ema0 ," > "ema365_0"___",i);
         
crossDir[i] = CROSS_UP;
      }
      if (
ema1 ema365_1 && ema0 ema365_0)
      {
         Print(
"ema1s > 365_1 ___"ema1 ," > "ema365_1"___",i);
         Print(
"ema0s < 365_0 ___ "ema0 ," < "ema365_0"___",i);
         
crossDir[i] = CROSS_DN;
      }
   }


Последний раз редактировалось hoz; 12.04.2013 в 13:12.
12.04.2013, 13:44
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Хм. Я так понял, нужно вот так? Объявить размер за пределами цикла.
Да, так вполне разумно.
12.04.2013, 14:29
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Да, так вполне разумно.

И, тем не менее, всё-равно нечего не работает.
PHP код:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPerioddoubleprevMA)
{
   
prevMA iMA(NULLi_TFmaPeriod0MODE_EMAMODE_CLOSE1);
   return (
iMA(NULLi_TFmaPeriod0MODE_EMAMODE_CLOSE0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(intcrossDir[])
{
   
double ema365_1;
   
double ema365_0 GetCurAndPrevMA(365ema365_1);
//   ArrayResize(crossDir,4);

   
for (int i=0i<4i++)
   {
      
double ema1;
      
double ema0 GetCurAndPrevMA(g_maPeriod[i], ema1);

      
crossDir[i] = CROSS_NO;
      
      Print(
"ema0_1 = "i"___"ema1);
      Print(
"ema0_0 = "i"___"ema0);
      Print(
"ema365_1 = "i"___"ema365_1);
      Print(
"ema365_0 = "i"___"ema365_0);
      
      Print(
"crossDir[i] = "i"___"crossDir[i]);

      if (
ema1 ema365_1 && ema0 ema365_0)
      {
         Print(
"ema1b < 365_1 ___ "ema1 ," < "ema365_1"___",i);
         Print(
"ema0b > 365_0 ___ "ema0 ," > "ema365_0"___",i);
         
crossDir[i] = CROSS_UP;
      }
      if (
ema1 ema365_1 && ema0 ema365_0)
      {
         Print(
"ema1s > 365_1 ___"ema1 ," > "ema365_1"___",i);
         Print(
"ema0s < 365_0 ___ "ema0 ," < "ema365_0"___",i);
         
crossDir[i] = CROSS_DN;
      }
   }

В глобальных у нас:

PHP код:
extern string ___H0 " __________ Параметры МА __________ ";
extern int i_TF 0;
int g_maPeriod[4] = {625150250},             // Периоды обрабатываемых МА
    
g_singMa[4] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику
int crossDir[4];                                                // Положение каждого из набора средних друг относительно друга
bool returnSign[4];                                             // Признак возврата цены к соответствующей средней
int signal[4];                                                  // Массив общего сигналапо каждой из торговых систем
#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних 

В журнале:

PHP код:
2013.04.12 16:36:04    2009.01.05 00:03  Base150_New EURUSD,H1crossDir[i] = 3___-1
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_0 3___1.3799
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_1 3___1.3798
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_0 3___1.3915
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_1 3___1.3915
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1crossDir[i] = 2___-1
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_0 2___1.3799
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_1 2___1.3798
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_0 2___1.3981
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_1 2___1.3982
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1crossDir[i] = 1___-1
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_0 1___1.3799
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_1 1___1.3798
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_0 1___1.3895
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_1 1___1.3894
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1crossDir[i] = 0___-1
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_0 0___1.3799
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema365_1 0___1.3798
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_0 0___1.3869
2013.04.12 16
:36:04    2009.01.05 00:03  Base150_New EURUSD,H1ema0_1 0___1.3857 
Т.е. до выполнения условий не доходит вообще. Почему?

Последний раз редактировалось hoz; 12.04.2013 в 14:39.
12.04.2013, 15:07
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
А вы что хотели бы увидеть?
На мой взгляд все нормально, ведь нет пересечений на последнем баре.
eevviill , hoz 
12.04.2013, 15:07
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
hoz, ты узнал о возможности сохранять значения переменных таким способом (int& crossDir[]) и теперь пользуешься им абсолютно везде не задумываясь. А это не правильно. Надо думать.
Зачем тебе ArrayResize(crossDir, 4);? Ведь размер массива известен и не меняется. Объяви массив на глобальном уровне crossDir[4] и заполняй его даже не обнуляя перед заполнением. И будут значения массива доступны из любого места программы.
eevviill , hoz 
12.04.2013, 15:23
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
А вы что хотели бы увидеть?
На мой взгляд все нормально, ведь нет пересечений на последнем баре.

Да. Я это понимаю. А как сделать тогда так, чтобы если машки ранее пересеклись в каком-то направлении, и пересечение на текущий момент сохраняется?

hoz, ты узнал о возможности сохранять значения переменных таким способом (int& crossDir[]) и теперь пользуешься им абсолютно везде не задумываясь. А это не правильно. Надо думать.
Зачем тебе ArrayResize(crossDir, 4);? Ведь размер массива известен и не меняется. Объяви массив на глобальном уровне crossDir[4] и заполняй его даже не обнуляя перед заполнением. И будут значения массива доступны из любого места программы.

Я тоже об этом подумал. Уже исправил.
12.04.2013, 15:35
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Да. Я это понимаю. А как сделать тогда так, чтобы если машки ранее пересеклись в каком-то направлении, и пересечение на текущий момент сохраняется?
Убрать crossDir[i] = CROSS_NO;
Глобально
int crossDir[]={-1, -1, -1, -1}; //Инициализатор задает размер массива
Массив будет помнить последнее пересечение.
12.04.2013, 15:57
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Убрать crossDir[i] = CROSS_NO;
Глобально
int crossDir[]={-1, -1, -1, -1}; //Инициализатор задает размер массива
Массив будет помнить последнее пересечение.

А условия эти:

PHP код:
if (/*ema1 < ema365_1 && */ema0 ema365_0 
Я пока что закомментил. Если раскоментить, должно работать?
12.04.2013, 16:18
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Должно. Я не вижу ошибок в логике определения пересечения.
12.04.2013, 16:36
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Должно. Я не вижу ошибок в логике определения пересечения.
При входе в функцию я обнулял значения, т.к. у меня был печальный опыт, когда я несколько дней долбался с этим. Только там был в массиве сигнал. Сигнал сохранялся постоянно, т.к. массив статичен судя из документации.
Но в данном случае, вполне резонно сделать именно так как Вы выше написали.
12.04.2013, 17:11
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
А отскок от быстрой машки при пересечении медленной я верно получил?

PHP код:
//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
double GetMA(int indexint maPeriod)
{
   return (
iMA(NULLi_TFmaPeriod0MODE_EMAMODE_CLOSEindex));
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], boolreturnSign[])
{
   for (
int i 04i++)
   {
      if (
crossDir[i] == CROSS_NO)
         continue;

      
returnSign[i] = false;
      
double ema GetMA(1g_maPeriod[i]);

 
//     VrPr (ND(MathAbs(ema - Ask)));
   //   VrPr (i_thresholdFromMa * pt);
      
if (crossDir[i] == CROSS_UP)
      {
         if (
ND(MathAbs(ema Ask)) <= i_thresholdFromMa pt// ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         
{
         
//   VrPr (ND(MathAbs(ema - Ask)) <= i_thresholdFromMa * pt);
            
returnSign[i] = true;
     
//       VrPr (returnSign[i]);
     
Alert("CROSS_UP");
         }
      }
      if (
crossDir[i] == CROSS_DN)
      {
         if (
ND(MathAbs(ema Bid)) <= i_thresholdFromMa pt// ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         
{
            
returnSign[i] = true;
       
//     VrPr (returnSign[i]);
       
Alert("CROSS_DN");
         }
      }
   }

До алерта не доходит.. Почему-то.
13.04.2013, 04:25
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
А отскок от быстрой машки при пересечении медленной я верно получил?
До алерта не доходит.. Почему-то.
Алерты будут когда цена окажется рядом с быстрой машкой и если до этого было пересечение.
13.04.2013, 21:45
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Алерты будут когда цена окажется рядом с быстрой машкой и если до этого было пересечение.
Логично... Как обычно, косяк был в описке.. в сигнальной функции. Чаще ошибки там, где их не ищут...
15.04.2013, 18:37
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Как оказалось, есть какие-то неучтённые моменты, всё-таки. Вот что имеется сейчас:

PHP код:
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], boolreturnSign[])
{
   for (
int i 04i++)
   {
      if (
crossDir[i] == CROSS_NO)
         continue;

      
returnSign[i] = false;
      
double ema GetMA(1g_maPeriod[i]);

      if (
crossDir[i] == CROSS_UP)
      {
         if (
ND(Ask ema) <= i_thresholdFromMa pt// ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         
{
            
returnSign[i] = true;
            
VrPr (" returnSign["+0+"]"+" = "returnSign[0]);
            
VrPr (" returnSign["+1+"]"+" = "returnSign[1]);
            
VrPr (" returnSign["+2+"]"+" = "returnSign[2]);
            
VrPr (" returnSign["+3+"]"+" = "returnSign[3]);
         }
      }
      if (
crossDir[i] == CROSS_DN)
      {
         if (
ND(ema Bid) <= i_thresholdFromMa pt// ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
         
{
            
returnSign[i] = true;
            
VrPr (" returnSign["+0+"]"+" = "returnSign[0]);
            
VrPr (" returnSign["+1+"]"+" = "returnSign[1]);
            
VrPr (" returnSign["+2+"]"+" = "returnSign[2]);
            
VrPr (" returnSign["+3+"]"+" = "returnSign[3]);
         }
      }
   }


Сбоку у меня выводится на экран текущие данные каждого элемента анализируемого массива.




Значение массива returnSign почему-то то не принимает ложное значение, то наоборот не становится в истинное.

На графике видно, что цена застопорилась у 2 машек, которые в массиве будут находится в 0 и 1-м индексе. Что может быть не так?
15.04.2013, 19:32
Аватар для gold_traid
gold_traid gold_traid вне форума Новичок форума
Регистрация: 24.08.2012 / Сообщений: 108
Поблагодарили 27 раз(а) / Репутация: 28
  • Отправить сообщение для gold_traid с помощью ICQ

По умолчанию Вопрос

Добрый вечер всем!Господа может кто нибудь знает можно ли в советник встроить автосмену настроек по времени?Примерно так с тра и весь день советник торгует с настройками которые заданы мной а вот в ночное время скажем с 10 часов вечера мняются на другие?и обратно?считаю это необходимым так как сов работает на vps и у меня нет возможности менять ему настройки каждый раз.Кто нибудь может помочь?

Последний раз редактировалось gold_traid; 15.04.2013 в 19:52.
15.04.2013, 20:18
Аватар для hoz
hoz hoz вне форума Активный участник
Регистрация: 01.04.2011 / Сообщений: 532
Поблагодарили 112 раз(а) / Репутация: 111
  • Отправить сообщение для hoz с помощью ICQ
Добрый вечер всем!Господа может кто нибудь знает можно ли в советник встроить автосмену настроек по времени?Примерно так с тра и весь день советник торгует с настройками которые заданы мной а вот в ночное время скажем с 10 часов вечера мняются на другие?и обратно?считаю это необходимым так как сов работает на vps и у меня нет возможности менять ему настройки каждый раз.Кто нибудь может помочь?
В принципе можно, и, довольно-таки несложно. Проверяешь время, если время ночное., то настройки такие-то.., а если другое.. то другие. Что тут сложного-то?
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 06:23. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO