Нужна помощь в решении нестандартного условия советника

 

Добрый день!

Прошу помощи в таком моменте:

имеется написанный советник с основными фильтрами входа: если дистанция между МА 20 и МА 50 в диапазоне от 20 до 200 пунктов (как вариант) и, если цена открытия лежит на удалении от быстрой МА и в определенном диапазоне (который считается в пропорции от дистанции между двумя МА),  например, от 0,5 до 1,0 (те цена открытия находится на дистанции от половины до целого значения дистанции между МА20 и МА50), то осуществляется вход.

Хочу реализовать сл. момент: включить запрет на открытие позиций, если цена ушла от МА 20 на определенную переменную, допустим 3 (параметр 3H), которая равна трем дистанциям между МА. И самое основное, что не могу реализовать: запрет должен распространяться от момента наступления события - цена ушла за 3H - и до наступления следующего участка тренда либо нового тренда. Те, если цена после нахождения в зоне 3H вернулась в подходящие параметры для открытия - позиции  не открывается, пока заново не сформируются условия: дистанция между МА 20 и МА 50 в диапазоне от 20 до 200 пунктов (как вариант) и если цена открытия лежит на удалении от быстрой МА и в определенном диапазоне (который считается в пропорции от дистанции между двумя МА) . Ждём завершения тренда (который должен начинаться с нового расхождения МА на дистанцию от 20 до 200 и если цена открытия лежит на удалении от быстрой МА и в определенном диапазоне) и входим только в следующий, а приближения к МА после рывка цены и вхождения в зону подходящих параметров  игнорируется.

Участок кода, отвечающий за условия открытия:

double fast_ma_0=iMA(Symbol(),0,Fast_Ma_Period,Fast_Ma_Shift,Fast_Ma_Method,Fast_Ma_Price,0); 
double slow_ma_0=iMA(Symbol(),0,Slow_Ma_Period,Slow_Ma_Shift,Slow_Ma_Method,Slow_Ma_Price,0);

 double Delta1=(fast_ma_0 - slow_ma_0)/ Point();
 double Delta1С=(iOpen (Symbol(),0,0) - fast_ma_0)/ Point();
 double Delta2=(slow_ma_0 - fast_ma_0)/ Point();
 double Delta2С=(fast_ma_0 - iOpen (Symbol(),0,0))/ Point();  

if(CountBuy () == 0 && fast_ma_1>slow_ma_1 && Delta1С/Delta1>=DeltaRun1 && Delta1С/Delta1<=DeltaRun2 && Delta1>=DeltaStop && Delta1<=DeltaStop1 && filter_fast_ma_buy==true && filter_slow_ma_buy==true)

if(CountSell () == 0 && fast_ma_1<slow_ma_1 && Delta2С/Delta2>= DeltaRun1 && Delta2С/Delta2<= DeltaRun2 && Delta2>=DeltaStop && Delta2<=DeltaStop1 && filter_fast_ma_sell==true && filter_slow_ma_sell==true)

DeltaRun1 и DeltaRun2  - диапазон открытия,который считается в пропорции от дистанции между двумя МА
DeltaStop и DeltaStop 1 - мин и макс расхождение МА в пунктах.

Не могу понять с какой стороны реализовать указанный выше запрет...

Заранее - большое спасибо за помощь!

Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 ( MQL5 ), среда разработки MetaEditor и...
 
Пока не научитесь писать индикаторы, замучаетесь с реализацией таких условий. 
 
Dmitry Fedoseev #:
Пока не научитесь писать индикаторы, замучаетесь с реализацией таких условий. 

Понял, спасибо!

Подскажите, пожалуйста, а вообще эта задача реализуема? 

 
rex1818 #:

Понял, спасибо!

Подскажите, пожалуйста, а вообще эта задача реализуема? 

Да

 
Dmitry Fedoseev #:

Да

Дмитрий, подскажите, пожалуйста, в каком направлении примерно идти для решения этой задачи?

Начинать изучать создание индикаторов?

Или может есть какой то пример  кода на подобные случаи.... 

Зареннее спасибо за ответ!

 
rex1818 #:

Дмитрий, подскажите, пожалуйста, в каком направлении примерно идти для решения этой задачи?

Начинать изучать создание индикаторов?

Или может есть какой то пример  кода на подобные случаи.... 

Зареннее спасибо за ответ!

Да, не знаю, вдруг посоветую, а вы забуритесь слишком глубоко. Хотя индикаторы вообще не помешало бы уметь писать.

Смысл написанию индикатора в этом случае вот в чем: когда сложились условия, отменяющие торговлю, элементу дополнительного индикаторного буфера присваиваем, например -1 - это означает, что условия открытия после этого будут считаются недействительными. А вот когда исполнились условия, после которых можно будет открывать позицию, то присваиваем буферу 1 - это значит, что теперь можно будет открывать позицию. Когда условия открытия будут выполнены, а в дополнительном буфере 1 - открываемся. Примерно так. Значение в этом дополнительном буфере на каждой итерации перемещаем из предыдущего элемента в текущий. Что-то типа триггера, переключающегося при выполнении условия запрета на исполнение и выполнении условия на разрешение исполнения условий входа.

Если в индикаторы не хочется забурятся, то начать с написания двух функций с параметром i - индексом бара. Одна функция - запрет, вторая - разрешение. Если есть сигнал на вход, смотреть на истории, что было позже, запрет или разрешение.

 
rex1818:
Не могу понять с какой стороны реализовать указанный выше запрет...

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

if(CountBuy () == 0 && fast_ma_1>slow_ma_1 && Delta1С/Delta1>=DeltaRun1 && Delta1С/Delta1<=DeltaRun2 && Delta1>=DeltaStop && Delta1<=DeltaStop1 && filter_fast_ma_buy==true && filter_slow_ma_buy==true)

Могла бы быть заменена вот таким красивым обращением:

if(ConditionBuy())
{
        // buy action
}

А в стороне где-то описание функции/метода:

bool ConditionBuy()
{
        if(CountBuy () != 0) return false;
        if(fast_ma_1 <= slow_ma_1) return false;
        if(Delta1С/Delta1 < DeltaRun1) return false;
        if(Delta1С/Delta1 > DeltaRun2) return false;
        if(Delta1 < DeltaStop) return false;
        if(Delta1 > DeltaStop1) return false;
        if(filter_fast_ma_buy != true) return false;
        if(filter_slow_ma_buy != true) return false;

        return true;
}

Аналогично для условий продаж. Так хотя бы наглядно всё видно, легко править и наращивать условия. А дальше, собственно, добавлять необходимые условия вашей логики и тестировать.

 

Большое спасибо!

Буду пробовать.

 
РеализуетсЯ с помощью флагов. 
на глобальном уровне пишем 
flag_new_trend  = false;

если посчитался новый тренд флаг открываем.: 
flag_new_trend  = true;

Дальше если условия для входа совпали и flag = true; 
входим.
если цена вышла за диапазон флаг опускаем 
flag_new_trend  = false;

За всю свою жизнь написал 1 индикатор. И дос их пор не умею их писать по сути. Это не мешает мне реализовать любые задуманные условия.
 
Dmitiry Ananiev #:
РеализуетсЯ с помощью флагов. 
на глобальном уровне пишем 
flag_new_trend  = false;

если посчитался новый тренд флаг открываем.: 
flag_new_trend  = true;

Дальше если условия для входа совпали и flag = true; 
входим.
если цена вышла за диапазон флаг опускаем 
flag_new_trend  = false;

За всю свою жизнь написал 1 индикатор. И дос их пор не умею их писать по сути. Это не мешает мне реализовать любые задуманные условия.

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

 
Dmitry Fedoseev #:

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

вы же опытный программист ! 
В OnInit пишем функцию прогона ну к прмиеру 100 баров и вычисляем какой сейчас флаг. и вызывать эту функцию на каждом новом баре.
Да и открытие / закрытие флага не зависит в этом случае от открытия сделок где может быть реквот или что-то подобное. 
В 99% случаев можно обойтись без индикаторов. Именно поэтому никогда не писал индикаторы.