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

 

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

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

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

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

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

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

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

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

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

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

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

 
Aerosoldat:

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

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

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

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

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

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

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

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

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

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

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

Цикл по 12 свечам вглубь истории после самого последнего критерия. Если в цикле будут обнаружены предыдущие критерии - сигнал действителен в течении бара, на котором зафиксирован последний критерий. Это не для тестера. Для тестера нужно начинать от первого критерия - поймали первый, поставили флаг, включили счётчик баров. Далее, если счётчик не более 12 и флаг первого критерия включен - ищем второй критерий, и т.д. ... Примерно так.
 
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++)				// как правильно считать бары после определения пробоя
               {
               
               }
            }
        }                                                          
      }
 

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

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

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

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

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

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

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

 
tara:

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

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

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

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

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

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

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

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

 
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
Причина обращения: