如何使用iOpen(),iClose(),iLow()和iHigh()查找这些插销?

时间:2019-09-23 01:09:34

标签: mql4 algorithmic-trading trading metatrader4 mt4

我想在下面的图片中找到带圆圈的插销。对于右边的蜡烛,蜡烛的主体大约是蜡烛大小的1/5,对于左边的蜡烛,蜡烛的主体大约是蜡烛大小的1/7,蜡烛芯的长度是蜡烛的1/7底部尺寸。我如何使用iOpen()iLow()和其他类似功能来找到这两种类型的插针式广告?

enter image description here

2 个答案:

答案 0 :(得分:1)

  

Q 我如何使用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

答案 1 :(得分:0)

因此,我的处理方式如下:

  

1)我要定义的每支蜡烛的特征是什么?

a)向下或向上(我更喜欢1或-1)

b)与身体相比相对的大甩尾

c)与非拒绝尾巴相比相对的大拒绝尾巴

d)与拒绝尾巴相对的小身体

  

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是否可以解决您的问题。