Скачать MetaTrader 5

Алгоритм учета нескольких критериев для открытия ордера

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ilya Sidelnikov
166
Ilya Sidelnikov  

Добрый день, уважаемые господа программисты!

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

Мои критерии:

Для открытия Buy:

1. Отбой цены от EMA т.е. достижение (коснулась, сделала заброс) ценой EMA.

2. Заброс должен быть не более n пунктов.

3. Далее ожидается закрытие свечи выше EMA, которой цена достигла сверху.

4. Пересечение Stochastic.

После выполнения данных критериев даётся разрешение на открытие позиции. Если в течение 12 свечек после касания все четыре критерия не появляются всё начинается с первого пункта.

Заранее спасибо!

С уважением, Илья.

Artyom Trishkin
Модератор
81482
Artyom Trishkin  
Aerosoldat:

Добрый день, уважаемые господа программисты!

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

Мои критерии:

Для открытия Buy:

1. Отбой цены от EMA т.е. достижение (коснулась, сделала заброс) ценой EMA.

2. Заброс должен быть не более n пунктов.

3. Далее ожидается закрытие свечи выше EMA, которой цена достигла сверху.

4. Пересечение Stochastic.

После выполнения данных критериев даётся разрешение на открытие позиции. Если в течение 12 свечек после касания все четыре критерия не появляются всё начинается с первого пункта.

Заранее спасибо!

С уважением, Илья.

Цикл по 12 свечам вглубь истории после самого последнего критерия. Если в цикле будут обнаружены предыдущие критерии - сигнал действителен в течении бара, на котором зафиксирован последний критерий. Это не для тестера. Для тестера нужно начинать от первого критерия - поймали первый, поставили флаг, включили счётчик баров. Далее, если счётчик не более 12 и флаг первого критерия включен - ищем второй критерий, и т.д. ... Примерно так.
Ilya Sidelnikov
166
Ilya Sidelnikov  
artmedia70:
Цикл по 12 свечам вглубь истории после самого последнего критерия. Если в цикле будут обнаружены предыдущие критерии - сигнал действителен в течении бара, на котором зафиксирован последний критерий. Это не для тестера. Для тестера нужно начинать от первого критерия - поймали первый, поставили флаг, включили счётчик баров. Далее, если счётчик не более 12 и флаг первого критерия включен - ищем второй критерий, и т.д. ... Примерно так.


Я примерно по второму варианту пытаюсь сделать. Застопорился на том, как правильно считать бары после определения пробоя. Вот примерно что получается:

 if(Low(2)>MA_24_2)                                                // если low 2 свечи выше Ма24 то
      {                                                            
      if(Low(1)<=MA_24_1&&Low(1)>=MA_24_1-Rasst_2)               // если Лоу 1 свечи касается или ниже МА24 на Rasst_2 то
        {                                                          
        bool sig_1=true;
        while(sig_1)
            {
            for(int i=1; i<=12; i++)				// как правильно считать бары после определения пробоя
               {
               
               }
            }
        }                                                          
      }
Алексей Тарабанов
7325
Алексей Тарабанов  

имхенько, сначала лучше определиться с терминами и определениями, после сотворить алгоритм, после - ваять программу.

Определение: Критерий - необходимое и достаточное условие.

Следствие: Критерий всегда один, либо задача сформулирована нечетко (иногда четко не получается).

Вывод: Прежде, чем творить алгоритм, желательно свернуть четыре "критерия" в один.

Реализация: Первые два "критерия" агрегируются элементарно - "заброс" должен составлять строго от 0 до n пунктов.

Агрегация третьего тоже не проблема - ожидаем в течение 12 баров выполнения условия Close[i] >..., если это условие выполняется, то делаем что-то со стохастиком (четвертое условие).

Если хоть одно из перечисленных событий не состоялось - уходим на второй круг - необходимое и достаточное условие не выполнено.

Boris
3947
Boris  
tara:

имхенько, сначала лучше определиться с терминами и определениями, после сотворить алгоритм, после - ваять программу.

Определение: Критерий - необходимое и достаточное условие.

Следствие: Критерий всегда один, либо задача сформулирована нечетко (иногда четко не получается).

Вывод: Прежде, чем творить алгоритм, желательно свернуть четыре "критерия" в один.

Реализация: Первые два "критерия" агрегируются элементарно - "заброс" должен составлять строго от 0 до n пунктов.

Агрегация третьего тоже не проблема - ожидаем в течение 12 баров выполнения условия Close[i] >..., если это условие выполняется, то делаем что-то со стохастиком (четвертое условие).

Если хоть одно из перечисленных событий не состоялось - уходим на второй круг - необходимое и достаточное условие не выполнено.

"Надо чаще забрасывать и давать играть блесне, поддёргивая, тогда быстрее клюнет..." (Из воспоминаний спиннингиста, ещё ненаписанных) ;))

Ilya Sidelnikov
166
Ilya Sidelnikov  
artmedia70:
Цикл по 12 свечам вглубь истории после самого последнего критерия. Если в цикле будут обнаружены предыдущие критерии - сигнал действителен в течении бара, на котором зафиксирован последний критерий. Это не для тестера. Для тестера нужно начинать от первого критерия - поймали первый, поставили флаг, включили счётчик баров. Далее, если счётчик не более 12 и флаг первого критерия включен - ищем второй критерий, и т.д. ... Примерно так.

Попробовал создать алгоритм по рекомендациям. Посмотрите пожалуйста, будет ли он работать. Не будет ли зацикливания, не надо ли поменять чего нибудь местами.

   datetime data;
   int j;
   bool  sig_1=false,                                             // флаг пробоя "вниз"
         sig_2=false,                                             // флаг закрытия выше МА "вниз"
         sig_3=false;                                             // флаг пересечения "вниз"
   if(Low(3)>MA_24_2)                                             // если low 2 свечи выше Ма24 то
      {                                                            // начало if1
      if(Low(2)<=MA_24_1&&Low(1)>=MA_24_1-Rasst_2)               // если Лоу 1 свечи касается или ниже МА24 на Rasst_2 то
        {                                                         // начало if2
        sig_1=true;
        j=0;                                                      // счетчик баров                                                          
        while(sig_1==true||sig_2!=true&&sig_3!=true)
            {
             if(data!=iTime(Symbol(),0,0);)                       // если есть новый бар, то
                  {                                               // начало if3
                  if(Close(1)>MA_24_1)                           // если close ,больше MA144 то
                     {                                            
                     sig_2=true;                                  // флаг закрытия выше МА вверх
                     }
                  else
                     {
                     if(Close(1)<MA_24_1-Rasst_2)                  // если во время поиска критериев лоу уходит ниже расстояния R2 то
                        {
                        sig_1=false;                              // то сигналы отменяются 
                        sig_2=false;                              // то сигналы отменяются
                        sig_3=false;                              // то сигналы отменяются 
                        return(false);                            // выходим из функции со значением false
                        }
                     }                                            
                  if(Stm2<Sts2&&Stm1>=Sts1&&Stm2<=Level_Stochastic&&Sts2<=Level_Stochastic)// если есть пересечение стохастика снизу вверх то
                     {
                     sig_3=true;                                  // флаг стохастика вверх
                     }
                  data=iTime(Symbol(),0,0);                       // обновляем время появления бара
                  j++;                                            // счетчик баров
                  if(j>12) return(false);                         // если нет всех критериев а кол-во баров равно 12 то возвращаем false
                  if(sig_1==true&&sig_2==true&&sig_3==true)       // если есть все три сигнала то 
                  return(true);                                   // выходим со значением true   
                  }                                               // конец if3
             }                                                     // конец while 1
        }                                                          // конец if2
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий