[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 501

 
borilunad:
Не люблю копаться в левых кодах, но сразу бросилось в глаза, зачем в функциях после double стоит & (!). Это и даёт ошибки!

 Ну так всё логично. Это значит передача параметров по ссылкам.

 Чтобы не расписывать код я объясню кратко.

 Есть 3 ф-ции:(int GetCrossingMa, int GetStochSignal и int GetSignal()

В ф-ции int GetSignal() получаются значения машек и других индикаторов, которые передаются по ссылкам неосновным ф-циями (int GetCrossingMa и int GetStochSignal) для получения в них соответствующих сигналов. Это я хочу сделать, чтобы не получать те же данные в разных ф-циях. Ту же машки вычислятьв 2 или более ф-циях по-моему не разумно. Проще раз просчитал и всё. Зачем тратить на это дополнительные ресурсы? 

 
hoz:

 Ну так всё логично. Это значит передача параметров по ссылкам.

 Чтобы не расписывать код я объясню кратко.

 Есть 3 ф-ции:(int GetCrossingMa, int GetStochSignal и int GetSignal()

В ф-ции int GetSignal() получаются значения машек и других индикаторов, которые передаются по ссылкам неосновным ф-циями (int GetCrossingMa и int GetStochSignal) для получения в них соответствующих сигналов. Это я хочу сделать, чтобы не получать те же данные в разных ф-циях. Ту же машки вычислятьв 2 или более ф-циях по-моему не разумно. Проще раз просчитал и всё. Зачем тратить на это дополнительные ресурсы? 

Вы программировали на отличном от мкл4 языка?

 
hoz:

 Вот мой тестовый учебный сырец-сова:

ф-ция int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2) получает сигнал пересечения. 

Ф-ция int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2) получает сигнал от стохастика.

Ф-ция void GetMomentumSignal() получает значение моментума.

Ф-ция int GetSignal() будет получать общий сигнал исходя из предыдущих 3 функций и не только их.. Вопрос такой. Поскольку ф-ция int GetSignal() самая главная так сказать и в ней получается основной синал я получаю все значения машек(i_maFast1,i_maFast2,i_maSlow1 и i_maSlow2) и значения значения стохастиков(stochD1,stochD2,stochK1,stochK2)

 Правильно ли я сделал с точки зрения оптимизации кода?

 Есс-но все параметры полученные в ф-ции  GetSignal() передаются по ссылкам в соответствующие ф-ции.

Но вот этом участке

 

при компиляции выскакивает ошибка:

  
Почему? 

 Таким может быть вариант поиска сигнала на нужном нам баре: 

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa (int fi_Bar = 1)
{
    double i_maFast1 = iMA (Symbol(), i_TF, i_maFastPeriod, i_maFastShift, i_maFastMethod, 0, fi_Bar),      // Вычисляем быстрые скользящие..
           i_maFast2 = iMA (Symbol(), i_TF, i_maFastPeriod, i_maFastShift, i_maFastMethod, 0, fi_Bar + 1),    //..средние
           i_maSlow1 = iMA (Symbol(), i_TF, i_maSlowPeriod, i_maSlowShift, i_maSlowMethod, 0, fi_Bar),      // Вычисляем медленные скользящие..
           i_maSlow2 = iMA (Symbol(), i_TF, i_maSlowPeriod, i_maSlowShift, i_maSlowMethod, 0, fi_Bar + 1);    //..средние
//----
    if (i_maFast2 < i_maSlow2) if (i_maFast1 > i_maSlow1)             // Если быстрая скользящая пересекла медленную снизу вверх..
    return (CROSSINGTOUP);                                           //.. значит, - пересечение вверх
    if (i_maFast2 > i_maSlow2) if (i_maFast1 < i_maSlow1)             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
    return (CROSSINGTODOWN);                                         //..значит, - пересечение вниз
//----
    return (CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal (int fi_Bar = 1)
{
    double stochD1 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 1, fi_Bar),     // Вычисляем значения сигнальной линии..
           stochD2 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 1, fi_Bar + 1),   //..стохастика
           stochK1 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 0, fi_Bar),     // Вычисляем значения главной линии..
           stochK2 = iStochastic (Symbol(), i_TF, i_stoch_D, i_stoch_K, i_stoch_slowing, 0, 0, 0, fi_Bar + 1);   //..стохастика
//----
      if (stochD2 < stochK2) if (stochD1 > stochK1)                     // Если сигнальная линия пересекла главную снизу вверх..
      return (CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if (stochD2 > stochK2) if (stochD1 < stochK1)                     // Если сигнальная линия пересекла главную сверху вниз..
      return (CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   }
//----
   return (CROSSINGWAIT);                                             // Ожидаем пересечения
}
//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
double GetMomentumSignal (int fi_Bar = 0)
{return (iMomentum (Symbol(), i_TF, i_momPeriod, 0, fi_Bar));}
//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
int GetSignal (int fi_Bar = 1)
{
    int li_Signal;
//----
      double ld_SignalMomentum = GetMomentumSignal (fi_Bar);
      int    li_SignalStoch = GetStochSignal (fi_Bar),
             li_CrossingMA = GetCrossingMa (fi_Bar);
//----
    return (li_Signal);
}

А в последней функции GetSignal() Вы производите "складывание" всех сигналов (самостоятельно).

P.S. В получении сигнала от индикатора есть "тонкий" момент. Например, можно фиксировать факт нахождения maSlow над\под maFast, а можно "ловить" момент их пересечения. Подход и код разный. 

 
Roman.:

Вы программировали на отличном от мкл4 языка?


 Чуток на перл и пхп  чуток. Но серьёзно не подходил к другим языкам т.к. не было необходимости. Это имеет значение?
 
hoz:

 Ну так всё логично. Это значит передача параметров по ссылкам.

 Чтобы не расписывать код я объясню кратко.

 Есть 3 ф-ции:(int GetCrossingMa, int GetStochSignal и int GetSignal()

В ф-ции int GetSignal() получаются значения машек и других индикаторов, которые передаются по ссылкам неосновным ф-циями (int GetCrossingMa и int GetStochSignal) для получения в них соответствующих сигналов. Это я хочу сделать, чтобы не получать те же данные в разных ф-циях. Ту же машки вычислятьв 2 или более ф-циях по-моему не разумно. Проще раз просчитал и всё. Зачем тратить на это дополнительные ресурсы? 

Объяснения понятны, а вот действия по ним нет.
Вот эти: "В ф-ции int GetSignal() получаются значения машек и других индикаторов" действия в Вашем варианте мягко говоря "сомнительны", потому, что лишены необходимости таких действий.

Этот код: 

   for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

 полный П.... Вы осознаёте, что здесь "происходит"??? - бесполезно перебирается ВЕСЬ "барный ряд", а по окончании цикла в переменных остаются значения... дальше догадайтесь сами.

 
Доброго времени суток друзья!Подскажите профану как начать пользоваться торг.платформой NZ MT4? не могу разобраться с интерфейсом платформы,с чего начать,я имею ввиду демо счет,как купить акции с последующей продажей?не могу разобраться в кнопочках..
 
hoz:
 Чуток на перл и пхп  чуток. Но серьёзно не подходил к другим языкам т.к. не было необходимости. Это имеет значение?

Да. Имеет. В таком случае убираете  все (т.е. никаких не должно быть)  "по-моему" и тем более  - "не разумно".

Делаете - как НАДО! Включая "трату  на это дополнительных ресурсов".

По мимо учебника и доки внимательно читайте БАЗУ и АЗБУКУ - там всё это разобрано по полочкам!

 
TarasBY:

Объяснения понятны, а вот действия по ним нет.
Вот эти: "В ф-ции int GetSignal() получаются значения машек и других индикаторов" действия в Вашем варианте мягко говоря "сомнительны", потому, что лишены необходимости таких действий.

Этот код: 

 полный П.... Вы осознаёте, что здесь "происходит"??? - бесполезно перебирается ВЕСЬ "барный ряд", а по окончании цикла в переменных остаются значения... дальше догадайтесь сами.

 Конечно, осознаю. Находятся значения машки быстрой и медленной и стохастика сигнальной линии в каждый момент времени на закрытии каждого бара на определённом ТФ. А потом высисляется место их пересечения. Что тут не логичного то?

 
Roman.:

Да. Имеет. В таком случае убираете  все (т.е. никаких не должно быть)  "по-моему" и тем более  - "не разумно".

Делаете - как НАДО! Включая "трату  на это дополнительных ресурсов".

По мимо учебника и доки внимательно читайте БАЗУ и АЗБУКУ - там всё это разобрано по полочкам!

 Так читаю же, и читал.

 А что ты имеешь ввиду под "В таком случае убираете  все (т.е. никаких не должно быть)" ? Что всё убирать?

 
hoz:

 Так читаю же, и читал.

 А что ты имеешь ввиду под "В таком случае убираете  все (т.е. никаких не должно быть)" ? Что всё убирать?

" Это я хочу сделать, чтобы не получать те же данные в разных ф-циях. Ту же машки вычислятьв 2 или более ф-циях по-моему не разумно. Проще раз просчитал и всё. Зачем тратить на это дополнительные ресурсы?"

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

Причём здесь вообще этот цикл???: 

 for(int i=1;i<=Bars;i++)
   {
      double i_maFast1 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i);      // Вычисляем быстрые скользящие..
      double i_maFast2 = iMA(Symbol(),i_TF,i_maFastPeriod,i_maFastShift,i_maFastMethod,0,i+1);    //..средние
      double i_maSlow1 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i);      // Вычисляем медленные скользящие..
      double i_maSlow2 = iMA(Symbol(),i_TF,i_maSlowPeriod,i_maSlowShift,i_maSlowMethod,0,i+1);    //..средние
      double stochD1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i);     // Вычисляем значения сигнальной линии..
      double stochD2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,1,i+1);   //..стохастика
      double stochK1 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i);     // Вычисляем значения главной линии..
      double stochK2 = iStochastic(Symbol(),i_TF,i_stoch_D,i_stoch_K,i_stoch_slowing,0,0,0,i+1);   //..стохастика
   }

пройди сам по шагам, что будет в итоге по выходе из него и что ты с этим делаешь дальше?  Бред полный.

Делай, как в учебнике - все торговые сигналы в этой ф-ии определения сработки торговых критериев  -  последовательно  (можешь завернуть разные сигналы в разные ф-ии и уже потом с ними работать при проверке сработки этих торговых критериев), потом уже условия на их сработку.

Здесь читай:

"ПРОГРАММНЫЕ РЕШЕНИЯ

С чего начать новичку?
КАК найти цену последнего фрактала?
КАК получить сигнал пересечения двух МА?
КАК проверить пересечение МА с учетом требуемого расхождения?"
Причина обращения: