Добрый день, уважаемые господа программисты!
Подскажите пожалуйста, какой алгоритм учета нескольких критериев для открытия ордера можно применить в моём случае. Пишу советник и никак не могу написать данную функцию.
Мои критерии:
Для открытия Buy:
1. Отбой цены от EMA т.е. достижение (коснулась, сделала заброс) ценой EMA.
2. Заброс должен быть не более n пунктов.
3. Далее ожидается закрытие свечи выше EMA, которой цена достигла сверху.
4. Пересечение Stochastic.
После выполнения данных критериев даётся разрешение на открытие позиции. Если в течение 12 свечек после касания все четыре критерия не появляются всё начинается с первого пункта.
Заранее спасибо!
С уважением, Илья.
Цикл по 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] >..., если это условие выполняется, то делаем что-то со стохастиком (четвертое условие).
Если хоть одно из перечисленных событий не состоялось - уходим на второй круг - необходимое и достаточное условие не выполнено.
имхенько, сначала лучше определиться с терминами и определениями, после сотворить алгоритм, после - ваять программу.
Определение: Критерий - необходимое и достаточное условие.
Следствие: Критерий всегда один, либо задача сформулирована нечетко (иногда четко не получается).
Вывод: Прежде, чем творить алгоритм, желательно свернуть четыре "критерия" в один.
Реализация: Первые два "критерия" агрегируются элементарно - "заброс" должен составлять строго от 0 до n пунктов.
Агрегация третьего тоже не проблема - ожидаем в течение 12 баров выполнения условия Close[i] >..., если это условие выполняется, то делаем что-то со стохастиком (четвертое условие).
Если хоть одно из перечисленных событий не состоялось - уходим на второй круг - необходимое и достаточное условие не выполнено.
"Надо чаще забрасывать и давать играть блесне, поддёргивая, тогда быстрее клюнет..." (Из воспоминаний спиннингиста, ещё ненаписанных) ;))
Цикл по 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
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый день, уважаемые господа программисты!
Подскажите пожалуйста, какой алгоритм учета нескольких критериев для открытия ордера можно применить в моём случае. Пишу советник и никак не могу написать данную функцию.
Мои критерии:
Для открытия Buy:
1. Отбой цены от EMA т.е. достижение (коснулась, сделала заброс) ценой EMA.
2. Заброс должен быть не более n пунктов.
3. Далее ожидается закрытие свечи выше EMA, которой цена достигла сверху.
4. Пересечение Stochastic.
После выполнения данных критериев даётся разрешение на открытие позиции. Если в течение 12 свечек после касания все четыре критерия не появляются всё начинается с первого пункта.
Заранее спасибо!
С уважением, Илья.