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

 
Aaragorn:
Я свел все к этому... но подождите...

если это просто использование простой скользящей средней этого одного бара, умноженной на 3,5, чтобы найти высокую точку. Как это возможно, что точка может когда-либо достичь этого? Разве значение линии не рассчитывается из того же бара, который должен коснуться ее, чтобы подать сигнал? По мере того, как бар растет, растет и линия границы?

Скользящая средняя, если она рассчитывается на основе более чем 1 бара , поэтому линия может иметь одно значение, а цена другое.

 
elihayun:
Если вы хотите узнать, близка ли верхняя линия к цене, один из способов узнать это - если разница между ними мала (скажем, 2 пункта).

Меня не волнует (что не очень хорошая идея), находится ли цена под линией или над линией. Для меня расстояние в 2 пункта - это все, что нужно. Итак, разница в цене следующая

upper - High даст вам разницу, но не в пунктах (что-то вроде 0.0004 или -0.0004). Чтобы убедиться, что разница положительна, мы используем функцию MathAbs, которая возвращает абсолютное (положительное) значение. Теперь нам нужно проверить, меньше ли это 2 пунктов. Зарезервированное слово Point вернет значение, когда цена поднимется на 1 пункт. Для каждой пары это значение разное.

Сложим все вместе

if (MathAbs(upper - High) < 2*Point) означает, что разница меньше 2 пунктов, а для нас это достаточно близко.

На самом деле использовать High не очень хорошо, потому что High может быть выше, а текущая цена далеко. Мы должны использовать Ask вместо High (в индикаторе мы должны использовать Close[x]).

Чтобы убедиться, что цена находится выше линии, мы можем сделать следующее

if ((Ask > upper) && (Ask - upper < 2 * Point))

.....(alert or open a trade)

[/PHP]

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

Я понимаю, что такое абсолютная величина. Интересно, что изменится, если использовать ask вместо close? Не лучше ли использовать close? Или это будет иметь большое значение? Единственное, что все еще смущает меня, это 2 * точка во втором условии. Разве точка не умножается на 2? Я неправильно интерпретирую символ "*" или это символ умножения?

Я понимаю, что ask-upper дает разницу между верхней линией и текущим значением ask. но умножать точку на 2? Я не уверен, что это даст результат, который можно использовать для сравнения.

Могу ли я сделать так, чтобы разрешать покупки только тогда, когда сигнал возникает ниже моего отфильтрованного допуска на покупку?

[php]

extern double longrange = 25; //--дальность приближения к верхней линии диапазона перед запретом покупок

extern double shortrange = 20; //-- приближение к нижней линии диапазона перед запретом продаж

// ВХОД

if(total < 2 || isNewSumbol(Symbol())) //Я тоже изменил условие if: оно было total<1 (orBanAway aka cucurucu)

{

double HedgeLots = (HedgePercent/100)*Lots; //вычисляет лоты для хеджированной позиции

if(isCrossed == 1 && Ask < upper-longrange)

{

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 : ",OrderOpenPrice());

}

else Print("Ошибка при открытии ордера BUY : ",GetLastError());
 

Вы упускаете одну вещь. Чтобы понять, что такое Point, представьте следующее

в USDJPY цена составляет 114.95, а в EURUSD цена составляет 1.2773

Таким образом, в USDJPY Ask - Upper будет выглядеть следующим образом: 114.95 - 114.93 = 0.02

а в EURUSD цена будет 1.2773 - 1.2771 = 0.0002.

Обе точки равны 2, но с разной точностью, поэтому в USDJPY мы должны умножить 2 на 0.01, а в EURUSD - на 0.0001, и в каждой паре это именно то, чему равна точка.

 
elihayun:
Скользящая средняя, если она рассчитывается на основе более чем 1 бара , поэтому линия может быть одним значением, а цена - другим.

точно! как это может быть среднее значение только одного бара?

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

int x = 0;

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

double avg;

avg = findAvg(back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg); [/PHP]

I don't see how this works....also the compiler say, 'findAvg' - function is not defined

it's looking for the shift value x which is zero so that is only going to be the current bar right? So what is it averaging?

ok let me see what might be...if i'm telling it to go 'back' 300 periods that is what it's averaging is 300 periods. ok i get it now i think....

now about the undefined function error? what do I do about that? just get rid of it as unnecessary?

[PHP]//----------channel filter

int x = 0;

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

double avg;

avg = (back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);
 
elihayun:
Вы упускаете одну вещь. Чтобы понять, что такое Point, представьте следующее

в USDJPY цена составляет 114.95, а в EURUSD цена составляет 1.2773

поэтому в USDJPY Ask - Upper будет выглядеть следующим образом: 114.95 - 114.93 = 0.02

а в EURUSD цена будет 1.2773 - 1.2771 = 0.0002.

Обе пары - это 2 точки, но разной точности, поэтому в USDJPY мы должны умножить 2 на 0.01, а в EURUSD - на 0.0001, и в каждой паре это именно то, чему равен Point.

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

-Поэтому сначала я получаю текущее значение линии.

-потом я добавляю или вычитаю расстояние, которое я хочу определить как недопустимое для торговли, как целое число, которое я рассматриваю как 1=1 пункт движения.

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

поэтому эта строка должна быть чем-то другим, кроме 'price_Typical'.

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

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

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

 

PRICE_TYPICAL не имеет к этому никакого отношения. вы можете прочитать об этом в справке MQL4

Все, что нужно сделать, чтобы узнать разницу между ценой и линией, это вычесть одно из другого. Как я уже сказал, проблема в том, что иногда вы получаете 0.0006, а иногда 0.06, и это решает Point.

(Мне пора закрывать. Мы можем продолжить завтра)

 
elihayun:
Вы упускаете одну вещь. Чтобы понять, что такое поинт, представьте следующее

в USDJPY цена составляет 114.95, а в EURUSD цена составляет 1.2773

поэтому в USDJPY Ask - Upper будет выглядеть следующим образом: 114.95 - 114.93 = 0.02

а в EURUSD цена будет 1.2773 - 1.2771 = 0.0002

Оба пункта - это 2 пункта, но с разной точностью, поэтому в USDJPY мы должны умножить 2 на 0.01, а в EURUSD - на 0.0001, и в каждой паре это именно то, чему равен Point.

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

 
elihayun:
PRICE_TYPICAL не имеет к этому никакого отношения. Вы можете прочитать об этом в справке MQL4.

Чтобы узнать разницу между ценой и линией, достаточно вычесть одно из другого. Как я уже сказал, проблема в том, что иногда вы получаете 0.0006, а иногда 0.06, и это решает Point.

(Я должен закрыть тему. Мы можем продолжить завтра)

Большое спасибо за ваше терпение и поддержку.

 

Вот что я сделал....

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

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

double LowLevel = iCustom(NULL,TF, "Trend Bands v2", back, 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-longrange)

{

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 + shortrange)

{

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);

}

}

//+------------------------------------------------------------------+[/PHP]

this is what I got from the tester....

[PHP]2006.06.30 11:18:09 2006.06.06 14:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.06 12:14 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.06 10:26 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.05 22:47 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:09 2006.06.05 09:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 08:41 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 07:30 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:09 2006.06.05 07:29 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:08 2006.06.02 19:55 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 11:18:08 2006.06.01 11:27 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 06:45 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 04:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 02:44 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:08 2006.06.01 00:37 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge

2006.06.30 11:18:00 2006.05.31 04:00 Trend Bands v2 EURUSD,M30: loaded successfully

2006.06.30 11:18:00 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------

TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False

----------------------------------------

immediate_trade=True | reversal=False

----------------------------------------

Lots=1 | MM=True | Risk=10%

----------------------------------------

2006.06.30 11:18:00 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; longrange=1; shortrange=1; back=30; TF=30;

2006.06.30 11:17:35 EMA_CROSSv5: loaded successfully

отчет показывает, что он получил настройки, но пустой....

очевидно, что он запрещает сделки, но ВСЕ? Мне трудно в это поверить, когда я установил длинный и короткий диапазоны только на 1 !!! Наверняка были какие-то торговые сигналы внутри этого диапазона? Я не думаю, что это делает то, что я задумал.

Файлы:
mac5.htm  5 kb
 

Я изменил индикатор трендовых полос, чтобы он был более гибким.

extern int period = 34;

extern int factor = 8;

avg = findAvg(period, x);

upper[x] = middle2 + (factor*avg);

lower[x] = middle2 - (factor*avg);[/PHP]

then i did this to the EA

//---- Trend Bands v2 and Filter Parameters

extern double back = 300; //--how many periods back for the custom indicator to average

extern double bandwidth = 6; //--how wide the trend bands are

extern double TF = 30; //--which bar period for the custom indicator to use

//----------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);

I got this from the tester...(slightly abbreviated report)..

[PHP]2006.06.30 12:10:38 2006.06.29 23:59 Trend Bands v3 EURUSD,M30: removed

2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 20:00 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 18:35 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge

2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131

2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131

2006.06.30 12:10:37 2006.06.29 00:00 Trend Bands v3 EURUSD,M30: loaded successfully

2006.06.30 12:10:37 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------

TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False

----------------------------------------

immediate_trade=True | reversal=False

----------------------------------------

Lots=1 | MM=True | Risk=10%

----------------------------------------

2006.06.30 12:10:37 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; back=300; bandwidth=6; TF=30;

После этого я уменьшил ширину полосы до 20, чтобы она никогда не касалась полос... она все еще выдает мне "ошибку открытия 131"

ERR_INVALID_TRADE_VOLUME 131 Недопустимый торговый объем.

в чем дело?