Я хочу найти пинбары, обведенные кружком на прикрепленном изображении ниже. Для того, что справа, тело составляет около 1/5 размера свечи, а для того, что слева, скажем, тело составляет 1/7 размера свечи, и у него также есть фитиль размером 1/7 свечи. размер внизу. Как я могу использовать iOpen()
, iLow()
и другие подобные функции для поиска этих двух типов пинбаров?
Как я могу использовать iOpen(), iClose(), iLow() и iHigh() для поиска этих пинбаров?
Ответы (2)
Вопрос : Как я могу использовать
iOpen()
,iLow()
и другие подобные функции для поиска этих двух типов пинбаров?
Можете использовать рабочий шаблон, подобный этой функции WasThisTheUserDefinedBearishPATTERN()
, и, определив все ваши пользовательские условия и константы, просто вызовитеif ( WasThisTheUserDefinedBearishPATTERN( aShift, 4.5, 0.1, 2000 ) ) { do_something(); }
при использовании его для торговли:
bool WasThisTheUserDefinedBearishPATTERN( const int aBarNUMBER,
const double aBody2uWICK_MUL,
const double min_FRACTION,
const double MAX_FRACTION
) {
// BAR-UPPER-wick:
double aBarUpWK = ( iHigh( _Symbol, PERIOD_CURRENT, aBarNUMBER )
- iClose( _Symbol, PERIOD_CURRENT, aBarNUMBER )
);
// BAR-body:
double aBarBODY = ( iClose( _Symbol, PERIOD_CURRENT, aBarNUMBER )
- iOpen( _Symbol, PERIOD_CURRENT, aBarNUMBER )
);
// BAR-LOWER-wick:
double aBarLoWK = ( iLow( _Symbol, PERIOD_CURRENT, aBarNUMBER )
- iClose( _Symbol, PERIOD_CURRENT, aBarNUMBER )
);
// FLAG:
bool aBearishFLAG = FALSE;
// -----------------------------------------------------------------
// USER-DEFINE-ABLE SET OF SHAPE-CONDITIONS ..... = add all that apply
// BEARISH BODY:
// has body
// has body BEARISH
// has body not more than about a lo-wick size * < min_FRACTION, MAX_FRACTION >
// has body not less than about a hi-wick size * _MUL
// -------------
if ( aBarBODY >= 0 // not BEARISH
|| aBarUpWK < aBarBODY * aBody2uWICK_MUL // not long enough UpperWICK
){
aBearishFLAG = FALSE; // (NO)
}
else { if ( aBarBODY < 0 // has BEARISH CANDLE
&& ( aBarLoWK == 0 // and may LO-WICK ZERO
|| ( aBarLoWk / aBarBODY > min_FRACTION // .GT. min-WICK-2-BODY-FRACTION
&& aBarLoWk / aBarBODY < MAX_FRACTION // .LT. MAX-WICK-2-BODY-FRACTION
)
)
){ aBearishFLAG = TRUE; } // (YES)
else { aBearishFLAG = FALSE; } // ( NO) OTHERWISE
}
return( aBearishFLAG );
}
Постфактум :
Я сделал
WasThisTheUserDefinedBearishPATTERN( aShift, 1, 1/6, 2/6 )
и ожидал, что это приведет к чему-то...
Помимо комментария ниже, пожалуйста, также соблюдайте Правила языка «Мир MQL4»:
Print( "DIV( 1 / 7 ) == ", 1 / 7 ); // will show you The Rules
Print( "DIV( 1. / 7. ) == ", 1. / 7. ); // will show you The Rules
WasThisTheUserDefinedBearishPATTERN( aShift, 1, 1/6, 2/6 )
и ожидал, что получится что-то похожее на то, что я хочу справа от изображения, но получил свечи с огромными телами. Не могли бы вы объяснить подробнее, возможно, с примерами двух обведенных свечей.
- person SuperHueman; 23.09.2019
Итак, я бы подошел к этому следующим образом:
1) Каковы характеристики каждой свечи, которую я пытаюсь определить?
а) Вниз или вверх (я предпочитаю 1 или -1)
б) Большой отклоняющий хвост относительно тела
c) Большой отклоняющий хвост по сравнению с неотклоняющим хвостом
г) Маленькое тело относительно отклоняющего хвоста
2) Как это закодировать на MQL4 с помощью предопределенных функций?
Сначала сделаем несколько предположений...
Во-первых, вы хотите определить эти свечи в реальном времени, чтобы вы могли выполнять их, когда они формируются.
Во-вторых, давайте уйдем от M30
для любого заданного Symbol()
.
Приведенная ниже функция (не проверенная) вернет 1
при наличии сигнала на покупку, -1
при наличии сигнала на продажу и 0
при отсутствии сигнала. Вам нужно будет соответствующим образом настроить переменные extern
, так как это больше похоже на науку, чем на "один размер подходит всем". Кроме того, вам может понадобиться использовать IsNewBar
.
//the values below should sum to 100
extern int RTail_To_Range_Ratio = 80; //rejection tail ratio to range of candle
extern int Body_To_Range_Ratio = 10; //body size ratio to range of candle
extern int NRTail_To_Range_Ratio = 10; //non-rejection tail ratio to range of candle
int Signal()
{
//candle information
double dOpen = iOpen(Symbol(),PERIOD_M30,0);
double dHigh = iHigh(Symbol(),PERIOD_M30,0);
double dLow = iLow(Symbol(),PERIOD_M30,0);
double dClose = iClose(Symbol(),PERIOD_M30,0);
double dBody = MathAbs(dOpen - dClose);
double dRange = dHigh - dLow;
double dRTail = 0, dTail = 0;
//green candle
if(dClose > dOPen){
dRTail = dOPen - dLow;
dTail = dHigh - dClose;
//now check ratios
if((dTail / dRange) <= (NRTail_To_Range_Ratio / 100) && (dBody / dRange) <= (Body_To_Range_Ratio / 100) && (dRTail / dRange) >= (RTail_To_Range_Ratio / 100)){
return 1;
}
}
//red candle
else{
dRTail = dHigh - dOpen;
dTail = dClose - dLow;
//now check ratios
if((dTail / dRange) <= (NRTail_To_Range_Ratio / 100) && (dBody / dRange) <= (Body_To_Range_Ratio / 100) && (dRTail / dRange) >= (RTail_To_Range_Ratio / 100)){
return -1;
}
}
return 0;
}
Дайте мне знать, если это решит вашу проблему @SuperHueman.