Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 5

 

Ордера размещаются слишком близко к текущей цене покупки/продажи. Ордера должны находиться на определенном расстоянии от текущей цены. Используйте функцию Marketinfo с параметром stop_level для извлечения этой информации и убедитесь, что ваши ордера находятся на таком расстоянии от ask/bid.

Надеюсь, это поможет.

 
Maji:
Ордера выставляются слишком близко к текущему бид/аск. Ордера должны находиться на определенном расстоянии от текущей цены. Используйте функцию Marketinfo с параметром stop_level для извлечения этой информации и убедитесь, что ваши ордера находятся на таком расстоянии от ask/bid. Надеюсь, это поможет.

ummm....

Извините, но вы меня потеряли...

Разве я не могу просто разместить ордер на "текущем" уровне? Большинство из того, что я делал до этого момента, было выполнением ордеров на закрытии периода. Можно ли это сделать?

Мне придется сначала узнать, что такое параметр stop_level и функции marketinfo.

спасибо за направление

Если интересно, вот обновление, которое я сделал для индикатора трендовых полос, это было довольно забавно.

вот оно...

Идентификаторрыночной информации, используется с функцией MarketInfo().

Это может быть любое из следующих значений:

MODE_STOPLEVEL 14 Уровень стопа в пунктах.

Так что я предполагаю, что это...

MarketInfo(14)

куда мне его вставить?

или это...

MarketInfo(NULL,MODE_STOPLEVEL);

или...

double bid =MarketInfo(NULL,MODE_BID);

double ask =MarketInfo(NULL,MODE_ASK);

double point =MarketInfo(NULL,MODE_POINT);

Наверное, я не очень понимаю, как это использовать... не могли бы вы показать мне пример?

Вот с чем я работаю в этом случае... Интересно, почему у этого советника раньше не было проблем с выставлением ордеров, а теперь есть? Он работал до того, как я добавил фильтр?

//----------channel filter

double upLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 0, 0);

double LowLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 2, 0);

// ENTRY

if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position

if(isCrossed == 1 && Ask < upLevel)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### ends here

return(0);

}

if(isCrossed == 2 && Ask > LowLevel)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

else

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

//###################################################################### the added code starts here

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

//###################################################################### ends here

return(0);

}

return(0);

}

return(0);

}

return(0);

}

}

//+------------------------------------------------------------------+
Файлы:
 

Вы должны использовать MarketInfo(NULL,MODE_STOPLEVEL), чтобы определить, как далеко от текущей цены должны располагаться ваши стоп-ордера. Помните, что он вернет свое значение в пунктах.

Однако вы можете конвертировать в пункты, используя что-то вроде этого:

double MinDist = NormalizeDouble(MarketInfo(NULL,MODE_STOPLEVEL)*Point, Digits);

Теперь убедитесь, что ваши стоп-приказы находятся как минимум на таком расстоянии от текущей рыночной цены. Кстати, используя NormalizeDouble и Digits, вы конвертируете значение пункта в соответствующие места после десятичной дроби (4 или 2). Это очень хорошая вещь в MT4.

Надеюсь, это поможет.

Maji

 
Maji:
Вы должны использовать MarketInfo(NULL,MODE_STOPLEVEL), чтобы определить, как далеко от текущей цены должны располагаться ваши стоп-ордера. Помните, что он возвращает значение в пунктах.

Однако вы можете конвертировать в пункты, используя что-то вроде этого:

double MinDist = NormalizeDouble(MarketInfo(NULL,MODE_STOPLEVEL)*Point, Digits);

Теперь убедитесь, что ваши стоп-приказы находятся как минимум на таком расстоянии от текущей рыночной цены. Кстати, используя NormalizeDouble и Digits, вы конвертируете значение пункта в соответствующие места после десятичной дроби (4 или 2). Это очень хорошая вещь в MT4.

Надеюсь, это поможет.

Maji

Я не понимаю, почему добавление индикатора в качестве фильтра испортило способ размещения ордеров или стопов. Насколько я могу судить, это ничего не изменило, так почему запрет сделок выше линии изменил способ размещения стоп-приказов?

 

Если вас не затруднит, пришлите мне по электронной почте текущий код. Я постараюсь взглянуть на него в выходные. Не могу обещать, что у меня все получится, но я честно посмотрю и попробую.

 

Вот ваша проблема, на которую вы должны обратить внимание в первую очередь

if(isCrossed == 1 && Ask < upLevel-longrange)[/PHP]

Ask and upLevel are in "price" (like 115.56 or 1.2678) while longrange is in pips (like 4,5,6) and u cannot mixed them. U have to normalize the pips to "price" and this is done by muliplying the pips with Points

the corrected code is like that

[PHP]if(isCrossed == 1 && Ask < upLevel-longrange*Point)
 

ну хоть раз это простое решение...

только...

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

сейчас это выглядит так...

//----------channel filter

double upLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 0, 0);

double LowLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 2, 0);

// ENTRY

if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position

if(isCrossed == 1 && Ask < upLevel)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

и ask и uplevel оба в цене, не так ли? это код, который все еще генерирует ошибку. должно быть что-то еще происходит...

 

Пока что я не вижу никаких проблем (ориентируясь на код).

Но с точки зрения логики, посмотрите на это

if(isCrossed == 1 && Ask < UpLevel)

Вы не проверяете, что они близки, просто цена ниже линии.

 

Я знал, что он у меня есть!!!

Я проверяю именно то, что вы хотели получить, а в своем предыдущем посте я просто поставил не того советника.

Этот советник может проверить до 4 ТФ, чтобы проверить, если все они получают край в то же время. Вы можете выбрать только один, если хотите.

Вы можете использовать его как пример того, как получить логику из индикатора, и как объединить несколько ТФ вместе.

с уважением,

Eli

Файлы:
tbs.mq4  7 kb
 
elihayun:
Я знал, что он у меня есть!!!

Я проверяю именно то, что вы хотели получить, а в своем предыдущем посте я просто указал не того советника.

Этот советник может проверить до 4 ТФ, чтобы проверить, все ли они получают преимущество в одно и то же время. Вы можете выбрать только один, если хотите.

Вы можете использовать его как пример того, как получить логику из индикатора, и как объединить несколько ТФ вместе.

с уважением

Eli

Это интригующе Я еще не исследовал мульти TF индикаторы, но я верю, что в них есть смысл.

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