Как я могу использовать iOpen(), iClose(), iLow() и iHigh() для поиска этих пинбаров?

Я хочу найти пинбары, обведенные кружком на прикрепленном изображении ниже. Для того, что справа, тело составляет около 1/5 размера свечи, а для того, что слева, скажем, тело составляет 1/7 размера свечи, и у него также есть фитиль размером 1/7 свечи. размер внизу. Как я могу использовать iOpen(), iLow() и другие подобные функции для поиска этих двух типов пинбаров?

введите здесь описание изображения


person SuperHueman    schedule 23.09.2019    source источник
comment
Попробуйте использовать отношения хвостов относительно диапазона свечи, а также отношение тела свечи к хвостам и диапазону свечи.   -  person Dean    schedule 01.10.2019
comment
@Dean спасибо, хотя я уже решил это, используя идею, очень похожую на вашу рекомендацию. Но я все еще пытаюсь получить stackoverflow.com/questions/58139482/. Я был бы очень признателен, если бы вы могли взглянуть на это для меня   -  person SuperHueman    schedule 02.10.2019


Ответы (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
person user3666197    schedule 23.09.2019
comment
Я не думаю, что хорошо понимаю последние 3 параметра. Я сделал WasThisTheUserDefinedBearishPATTERN( aShift, 1, 1/6, 2/6 ) и ожидал, что получится что-то похожее на то, что я хочу справа от изображения, но получил свечи с огромными телами. Не могли бы вы объяснить подробнее, возможно, с примерами двух обведенных свечей. - person SuperHueman; 23.09.2019
comment
Последние три параметра помогают отфильтровать, какие бары совпадают, а какие нет. Учитывая ваши потребности в Quant, просто отрегулируйте эти (и все другие параметры, которые можно добавить в дизайн фильтра, как было отмечено в коде) и перекрестно проверьте их на любом из баров, которые вы обводите для соответствия. Используя этот обратный цикл, вы получаете пороговые значения для фильтрации совпадений. Это элементарно, поэтому, пожалуйста, не просите сообщество StackOverflow выполнить задачи Quant-R&D, которые выходят далеко за рамки проблемы MCVE. Был представлен метод решения, сопровождение кода и пороговые перекрестные проверки. - person user3666197; 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.

person Dean    schedule 03.10.2019