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

 
Roman.:

А какой камп? Какое ОЗУ? Операционка? Чем так выгибаться... ещё не известно - на сколько всё это будет надёжно работать...

Не рассматривали вопрос, что, допустим, сделать не 58, а 29 терминалов, каждый со своим счётом, естественно, объединив при этом несколько валютных пар и экспов (например, по родственным парам объединять).

Если потянет камп, то и ничего ИЗОБРЕТАТЬ с планировщиком по этому вопросу будет не нужно...

Хотя... :-)

ЦИФРА, конечно, красивая: 58 экспов, 58 терминалов...

По крайней мере у меня идут дальше ассоциации с ...58 попугаев, 58 апельсинов,  58 миллионов (хоть и центов!)  :-)

НО, с другой стороны и 28 число не хилое...  У нас в городе есть сеть магазинов: 28 апельсинов! :-)

 

Они запущены в пределах проекта Зулу и мне самому интересно узнать, где, когда и как они споткнутся, какие рейтинги займут среди других советников, хотя заработки здесь минимальные - за 2 месяца заработал всего 3$. Центовый счет на 36 советниках работает на постоянной основе исправно - из вложенных 200$ сейчас в средствах имеются 150, хотя была просадка и до 40$. Думаю, на этой неделе восстановятся средства и, видимо, далее должна идти прибыль. Мы предполагаем, а рынок - располагает. 
 
yosuf:
Они запущены в пределах проекта Зулу и мне самому интересно узнать, где, когда и как они споткнутся, какие рейтинги займут среди других советников, хотя заработки здесь минимальные - за 2 месяца заработал всего 3$. Центовый счет на 36 советниках работает на постоянной основе исправно - из вложенных 200$ сейчас в средствах имеются 150, хотя была просадка и до 40$. Думаю, на этой неделе восстановятся средства и, видимо, далее должна идти прибыль. Мы предполагаем, а рынок - располагает. 

Я знаю, что на зулу. Т.е. проводить объединение двух схожих (например, по признаку ТИПА ТОРГОВЛИ: тренд/флет) экспов с выходом на 29 терминалов Вы не планируете?

 
Roman.:

Я знаю, что на зулу. Т.е. проводить объединение двух схожих (например, по признаку ТИПА ТОРГОВЛИ: тренд/флет) экспов с выходом на 29 терминалов Вы не планируете?



Пути назад нет, хотя это возможно, но нужно делать в пределах уже другого проекта. Неудобно останавливать уже работающие советники. Путем оптимизации их параметров нужно выводить все советники в плюс, разобраться в причинах временной убыточности некоторых из них. Короче, работы много. Противотренд опасен тем, что вмиг может испортить все показатели, включая рейтинг, хотя они и лидируют сейчас. 
 
yosuf:
Пути назад нет, хотя это возможно, но нужно делать в пределах уже другого проекта. Неудобно останавливать уже работающие советники. Путем оптимизации их параметров нужно выводить все советники в плюс, разобраться в причинах временной убыточности некоторых из них. Короче, работы много. Противотренд опасен тем, что вмиг может испортить все показатели, включая рейтинг, хотя они и лидируют сейчас. 
Ясно. Раз позиция принципиальна - разбирайтесь с планировщиком!
 
yosuf:
Там описывается опция, как остановить запуск задачи. Не знаю, приведет-ли это к выключению платформы, попробую.
Про платформу ничего не скажу (не знаю), а вот терминал закроется (теоритически). :)))
 
Подскажите, как рассчитать залог за фьючерсы?
 
Roman.:

" Это я хочу сделать, чтобы не получать те же данные в разных ф-циях. Ту же машки вычислятьв 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);   //..стохастика
   }

 

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

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

 По поводу цикла, так потому что я проверю пересечение параметров индикаторов. Тут всё элементарно. Читаю я и читал, всё написано так как я и думаю.

 В учебнике вообще https://book.mql4.com/ru/build/conditions всё скучковано. Там МАКД и стохастик в одной ф-ции, а мне так не нужно.

 Да и по сути, всё значения индикаторов по ссылке должны передаваться в соответствующие ф-ции. Почему нет? Это же логично.

 
TarasBY:
То, что Вы рассказываете, и то, что "рисуете" - ДВЕ БОЛЬШИЕ РАЗНИЦЫ!!! :)))

Чё та меня уже совсем запутали. Вот 3 функции, каждая из которых получает свой канкретный сигнал по конкретному индюку.

//+---------------------------------------------------------------------------------------+
//| Проверка пересечения скользящих средних                                               |
//+---------------------------------------------------------------------------------------+
int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)
{
      if ((i_maFast2<i_maSlow2) && (i_maFast1>i_maSlow1))             // Если быстрая скользящая пересекла медленную снизу вверх..
      return(CROSSINGTOUP);                                           //.. значит, - пересечение вверх
                                                 
      if ((i_maFast2>i_maSlow2) && (i_maFast1<i_maSlow1))             // Если быстрая скользящая средняя пересекла медленную сверху вниз..
      return(CROSSINGTODOWN);                                         //..значит, - пересечение вниз
 
   return(CROSSINGWAIT);                                              // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Стохастика                                                       |
//+---------------------------------------------------------------------------------------+
int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)
{
      if((stochD2<stochK2) && (stochD1>stochK1))                     // Если сигнальная линия пересекла главную снизу вверх..
      return(CROSSINGTOUP);                                          //..значит, - пересечение вверх
      if((stochD2>stochK2) && (stochD1<stochK1))                     // Если сигнальная линия пересекла главную сверху вниз..
      return(CROSSINGTODOWN);                                        // ..значит, - пересечение вниз
   return(CROSSINGWAIT);                                             // Ожидаем пересечения
}

//+---------------------------------------------------------------------------------------+
//| Получение сигнала от Моментума                                                        |
//+---------------------------------------------------------------------------------------+
void GetMomentumSignal()
{
   double momentum = iMomentum(Symbol(),i_TF,i_momPeriod,0,0);
}

 Это функция получает общий сигнал от всех индюков, и принимает решение КУПИТЬ или ПРОДАТЬ.

//+---------------------------------------------------------------------------------------+
//| Получение общего сигнала для входа в рынок                                            |
//+---------------------------------------------------------------------------------------+
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);   //..стохастика
   }
      if( GetCrossingMa(i_maFast1, i_maFast2, i_maSlow1, i_maSlow2)==CROSSINGTOUP || i_maFast1>i_maSlow1 )
      return(SIGNAL_BUY);
}

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

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() , в принципе тоже можно запихнуть туда же.

 Таким образом получается, что все рассчёты индюков будут в одной главной ф-ции получения сигнала. Тут же всё логично..

 

Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init() присоединенного к графику советника или пользовательского индикатора запускается также сразу после старта клиентского терминала и подгрузки (это касается только советников и не касается индикаторов) исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счёта.

Растолкуйте пожалуйста, как это работает? В фоне или это можно, как-то отследить? Или функция init в индикаторе при старте терминала после некоторого длительного простоя вообще не запустится?

 
fore-x:

Сразу же после присоединения к графику программа начинает работу с функции init(). Функция init() присоединенного к графику советника или пользовательского индикатора запускается также сразу после старта клиентского терминала и подгрузки (это касается только советников и не касается индикаторов) исторических данных, после смены финансового инструмента и/или периода графика, после перекомпиляции программы в редакторе MetaEditor, после смены входных параметров из окна настройки эксперта или пользовательского индикатора. Советник также инициализируется после смены счёта.

Растолкуйте пожалуйста, как это работает? В фоне или это можно, как-то отследить? Или функция init в индикаторе при старте терминала после некоторого длительного простоя вообще не запустится?

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

 А если значения переменных нужно пересчитывать, например, с приходом каждого нового бара, то в ф-ции init такие переменные объявлять не следует т.к. они там не будут пересчитываться.

 Что бы проще воспринялось, вот что можно и нужно объявить в init

   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                         // минимальный тик    
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                 // текущий спрэд
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // текущий уровень стопов
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);    // минимальный разрешенный объем сделки
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);   // максимальный разрешенный объем сделки
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);          // шаг приращения объема сделки

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