Советник меня не слушается (

 

Здрасте. Цель такая: нужно купить, когда цена с верху касается МА и продать, когда цена с низу косается МА.

Реализовал следующим образом:


ma=iMA(NULL,0,ma_period,0,MODE_SMA,PRICE_CLOSE,0);

if(Open[1]>ma && Ask==ma) //Позиция на покупку
{
stop=Ask-SL*Point;
take=Ask+TP*Point;
Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,stop,t ake);
return;
}
if(Open[1]<ma && Bid==ma) //Позиция на продажу
{
stop=Bid+SL*Point;
take=Bid-TP*Point;
Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,stop, take);
return;
}


к сожалению не работает.

Здесь я хотел приказать советнику, когда Bid станет идентичной MA продавать, с Ask покупать. Не понимаю почему данная команда не срабатывает. Разве нет такого момента, когда эти цены одинаковы?



если делаю так


Сообщение от :
ma=iMA(NULL,0,ma_period,0,MODE_SMA,PRICE_CLOSE,0);

if(Open[1]>ma && Ask<=ma) //Позиция на покупку
{
stop=Ask-SL*Point;
take=Ask+TP*Point;
Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,stop,t ake);
return;
}
if(Open[1]<ma && Bid>=ma) //Позиция на продажу
{
stop=Bid+SL*Point;
take=Bid-TP*Point;
Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,stop, take);
return;
}


тогда ордера открываются, но при срабатывание стопа или тейка, сразу же открывается новая позиция, тк цена Bid или Ask по прежнему выше/ниже МА. Это не допустимо, ведь одна позиция на отскок уже была открыта. Пока цена не коснулась МА, советник не должен работать.

Как решить задачу, ума не приложу. Жду советов от мастеров MQL4.

 

Как Вы думаете, как у меня так получилось (оформление) и какого черта зачем это нужно?

ma=iMA(NULL,0,ma_period,0,MODE_SMA,PRICE_CLOSE,0);

if(Open[1]>ma && Ask==ma) //Позиция на покупку
{
stop=Ask-SL*Point;
take=Ask+TP*Point;
Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,stop,t ake);
return;
}
if(Open[1]<ma && Bid==ma) //Позиция на продажу
{
stop=Bid+SL*Point;
take=Bid-TP*Point;
Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,stop, take);
return;
}

Подсказка:


 

У тебя 3 вещи сделаны не правильно

1) тик может и перескочить цену на которой стоит МА что по сути тоже является касанием, так как прошлый Bid был выше а текущий уже ниже

2) Некорректно искать касание ценой Ask несмотря на то что бай открывается по цене Ask, так как мы видим Bid'овый график и МА построена по нему

3) "Разве нет такого момента, когда эти цены одинаковы?" именно его нет, так как допустим 1.1230 и 1.123 два разных числа. При сравнении переменных типа double обязательно нужно округление до определенной точности. Так как мы работаем с ценовым графиком, переменная Digits нам как нельзя кстати для этого подойдет.

Итак готовое решение:

double bid[2]; // массив в котором 0 - текущий bid, 1 - прошлый
void init() {
   bid[0]=bid;   
   }

void start() {
   bid[1]=bid[0]; bid[0]=Bid;
   ma=iMA(NULL,0,ma_period,0,MODE_SMA,PRICE_CLOSE,0);
   if(NormalizeDouble(Open[1],Digits)>NormalizeDouble(ma,Digits) && NormalizeDouble(bid[1],Digits)>NormalizeDouble(ma,Digits) && NormalizeDouble(bid[0],Digits)<=NormalizeDouble(ma,Digits)) // покупаем
   if(NormalizeDouble(Open[1],Digits)<NormalizeDouble(ma,Digits) && NormalizeDouble(bid[1],Digits)<NormalizeDouble(ma,Digits) && NormalizeDouble(bid[0],Digits)>=NormalizeDouble(ma,Digits)) // продаем
   }
 

Была у меня подобная проблема... (типа Ask==ma)

Добрый человек, Mislaid помог, подсказал https://www.mql5.com/ru/forum/137085

решение такое, вместо Ask==ma сделать так (Ask-ma)<Point

 
renoshnik:

Была у меня подобная проблема... (типа Ask==ma)

Добрый человек, Mislaid помог, подсказал https://www.mql5.com/ru/forum/137085

решение такое, вместо Ask==ma сделать так (Ask-ma)<Point

Интересное решение, но не подходит, еще и MathAbs забыл, это очень важно.

MathAbs(Ask-ma)<Point

не подходит по тому что если Ask перескочит ma больше чем на point, а такое реально, сигнала не будет.

 
Mathemat:

Как Вы думаете, как у меня так получилось (оформление) и какого черта зачем это нужно?

Подсказка:




спасибо. искал эту функцию но не нашел. ))) молодой еще. на будущее буду знать

keep87:

У тебя 3 вещи сделаны не правильно

1) тик может и перескочить цену на которой стоит МА что по сути тоже является касанием, так как прошлый Bid был выше а текущий уже ниже

2) Некорректно искать касание ценой Ask несмотря на то что бай открывается по цене Ask, так как мы видим Bid'овый график и МА построена по нему

3) "Разве нет такого момента, когда эти цены одинаковы?" именно его нет, так как допустим 1.1230 и 1.123 два разных числа. При сравнении переменных типа double обязательно нужно округление до определенной точности. Так как мы работаем с ценовым графиком, переменная Digits нам как нельзя кстати для этого подойдет.

Итак готовое решение:


спасибо за ответ. сейчас буду пробывать.

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

 
keep87:

Интересное решение, но не подходит, еще и MathAbs забыл, это очень важно.

не подходит по тому что если Ask перескочит ma больше чем на point, а такое реально, сигнала не будет.

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

2
kilnart 21.04.2012 23:29 
Здрасте. Цель такая: нужно купить, когда цена с верху касается МА и продать, когда цена с низу косается МА.
 

такс..... сделал как описали выше. проблема решена только частично.

ордер открывается, все ОК. при закрытии по стопу или профиту, бывает что цена возвращается обратно к МА и опять подтверждает сигнал на продажу/покупку (все происходит на одной свече). по факту получается, по одному и тому же сигналу открывается несколько ордеров.

 
а можно как нибудь объяснить советнику, что если цена
High[0]<ma

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

получается нужно к максимальной цене прибавить некоторый разрешенный диапазон. правильно мыслю?

 
kilnart:
а можно как нибудь объяснить советнику, что если цена High[0]<ma

только тогда можно продавать.

У Вас есть машина времени ;) ? Если Вы достоверно знаете значение High[0], то зачем Вам какие-то ma ? Открываем ордер с тейком High[0] на открытии бара, всего-то. )))))))
 
kilnart:

спасибо за ответ. сейчас буду пробывать.

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

практика + логическое мышление ) пробуйте. Прокручивайте в голове различные события через код который вы написали и делайте выводы что нужно изменить. Т.. "пришол новый тик, ask = XX, ma = YY, проходим по коду и смотрим чему будет равна каждая переменная, какое действие будет соблюдено а какое нет. По поводу округления это просто нюанс который обычные люди не понимают сразу )

VladislavVG:

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

это уже дело ТС, ему будет понятно нужен ли ему сигнал на пробое или нет.

kilnart:

такс..... сделал как описали выше. проблема решена только частично.

ордер открывается, все ОК. при закрытии по стопу или профиту, бывает что цена возвращается обратно к МА и опять подтверждает сигнал на продажу/покупку (все происходит на одной свече). по факту получается, по одному и тому же сигналу открывается несколько ордеров.

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

Причина обращения: