Java TO mql4

 

Кто поможет переделать код в mql? Или это не Java?

 
class IndADX  extends Indicator
{
   IndNonAvarageADX    DX_indicator;

   IndADX()
   {
      super( 1 );

      iParams[0]  = new Integer( iIndicatorPeriod = 13);
      useOwnScale( true );

      setStyle( Style.getInstance(Style.LINE) );
      sShortName  = ISNAME_DirectnlMovementADX;
      sLongName   = ILNAME_DirectnlMovementADX;

      // Create & init support indicator for store every day DX
      // and build Moving Average
        supportIndicators = new Indicator[ 1 ];
        supportIndicators[0] = DX_indicator  = new IndNonAvarageADX();
   }

   protected int getFirstCalculationShift()
   {   return Math.max( super.getFirstCalculationShift(), iIndicatorPeriod + 1); }
   
   protected Object calculate( Displayable Src, int pos)
   {
      Object val = DX_indicator.calculate( Src, pos);
      if ( pos <= DX_indicator.getLastIdx() )
            DX_indicator.setAt( pos, val);
      else   DX_indicator.append( val );

      return IndEMAve.calculate( DX_indicator, pos, iIndicatorPeriod);
    }
   
   protected Object calculateFast( Displayable Src, int pos)
   {
      Object val = DX_indicator.calculateFast( Src, pos);
      if ( pos <= DX_indicator.getLastIdx() )
            DX_indicator.setAt( pos, val);
      else   DX_indicator.append( val );

      return IndEMAve.calculateFast( DX_indicator, Data, pos, iIndicatorPeriod);
    }
}

//@METAGS indADX
class IndNonAvarageADX  extends Indicator
{
   IndDMI      pos_neg_DI;
   IndNonAvarageADX()
   {
      super( 1 );
      
      // Create & init support indicator for store every day ADX
      // and build Moving Average
        supportIndicators = new Indicator[ 1 ];
        supportIndicators[0] = pos_neg_DI = new IndDMI();
   }
   
   protected Object calculate( Displayable Src, int pos)
   {
      Object val = pos_neg_DI.calculate( Src, pos);
      if ( pos <= pos_neg_DI.getLastIdx() )
            pos_neg_DI.setAt( pos, val);
      else   pos_neg_DI.append( val );

      double positive_DI_N, negative_DI_N, DX;
         pos_neg_DI.setContext( pos_neg_DI.POSITIVE );       // Set as current Positive DI for pos_neg_DI
         positive_DI_N = pos_neg_DI.getValueAt( pos );

         pos_neg_DI.setContext( pos_neg_DI.NEGATIVE );       // Set as current Negative DI for pos_neg_DI
         negative_DI_N = pos_neg_DI.getValueAt( pos );

         // V. Calculate every days DX
         DX = positive_DI_N + negative_DI_N == 0
                                             ? 100.0
                                             : java.lang.Math.abs( positive_DI_N - negative_DI_N )
                                             *(( double) 100.0)
                                             / (positive_DI_N + negative_DI_N);
      return new Double( DX );
   }
}

class IndEMAve extends Indicator   //Exponencial Moving Average
{
   IndEMAve( )
   {
      super( 1 );

      iParams[0] = new Integer( iIndicatorPeriod = 15);

      useOwnScale( false );
      setStyle( Style.getInstance(Style.LINE) );
      sShortName = ISNAME_ExpMovingAverage;
      sLongName =   ILNAME_ExpMovingAverage;
   }

   protected int getFirstCalculationShift()   
   {   return Math.max( super.getFirstCalculationShift(), iIndicatorPeriod + 1); }
   
   protected Object calculateFast( Displayable Src,
                           int pos)    { return calculateFast( Src, Data, pos, iIndicatorPeriod); }
   protected Object calculate( Displayable Src, int pos)
   { return calculate( Src, pos, iIndicatorPeriod );}
   
   protected static Object calculate( Displayable Src, int pos, int _period )
   { return _period > 1
                ? calculate( ((Double)(IndMAve.calculate( Src, pos - 1, _period-1))).doubleValue(),
                           Src.getValueAt( pos ),
                           _period)
                : new Double(Src.getValueAt( pos ));
   }
   
   public static Object calculateFast( Displayable Src, LoopArray Data, int pos, int _period)
   {   return calculate( getValueAt( pos -1, Data ), Src.getValueAt( pos ), _period ); }

   public static Object calculate( double dst_prev, double src_now, int _period)
   {   // (now - prev)*k + prev = now*k + prev*(1-k)
      return new Double ( ((src_now - dst_prev)*2.0)/(_period + 1.0)   +   dst_prev );
//      return new Double ( (src_now - dst_prev)/_period   +   dst_prev );
   }
}

//@METAGS IndDMI
class IndDMI extends IndMultiline //Directional Movement
{
   public static final int POSITIVE = 0;
   public static final int NEGATIVE = 1;
   IndNonAverageDMI nonAverageDIIndicator;

   IndDMI()
   {
        super( 1, 2 );
        BandNames[ POSITIVE ] = "+DI";
        BandNames[ NEGATIVE ] = "-DI";

        iParams[0] = new Integer( iIndicatorPeriod = 13 ); // Average period ( n for +-DI)

        useOwnScale( true );
      setStyle( Style.getInstance(Style.LINE) );
      Styles[ POSITIVE ] = Styles[ NEGATIVE ] = Style.getInstance(Style.LINE);
      
        sShortName  = ISNAME_DirectnlMovementDI;
        sLongName   = ILNAME_DirectnlMovementDI;

        // Create & init support indicators for store every day Directional indexes
        // and build Moving Average
        supportIndicators = new Indicator[ 1 ];
        supportIndicators[0] = nonAverageDIIndicator = new IndNonAverageDMI();
   }
   
   protected int getFirstCalculationShift()   
   {   return Math.max( super.getFirstCalculationShift(), iIndicatorPeriod + 1); }

   protected Object calculateFast( Displayable Src, int pos)
   {
      Object val = nonAverageDIIndicator.calculateFast( Src, pos);
      if ( pos <= nonAverageDIIndicator.getLastIdx() )
            nonAverageDIIndicator.setAt( pos, val);
      else   nonAverageDIIndicator.append( val );

      Object [] ret = new Object[2];
      nonAverageDIIndicator.setContext( POSITIVE );
      ret[ POSITIVE ] = IndEMAve.calculateFast( nonAverageDIIndicator, Bands[ POSITIVE ], pos, iIndicatorPeriod );
      nonAverageDIIndicator.setContext( NEGATIVE );
        ret[ NEGATIVE ] = IndEMAve.calculateFast( nonAverageDIIndicator, Bands[ NEGATIVE ], pos, iIndicatorPeriod );
      return ret;
   }
   
   protected Object calculate( Displayable Src, int pos)
   {
      Object val = nonAverageDIIndicator.calculate( Src, pos);
      if ( pos <= nonAverageDIIndicator.getLastIdx() )
            nonAverageDIIndicator.setAt( pos, val);
      else   nonAverageDIIndicator.append( val );
         
      Object [] ret = new Object[2];
      nonAverageDIIndicator.setContext( POSITIVE );
      ret[ POSITIVE ] = IndEMAve.calculate( nonAverageDIIndicator, pos, iIndicatorPeriod );
      nonAverageDIIndicator.setContext( NEGATIVE );
        ret[ NEGATIVE ] = IndEMAve.calculate( nonAverageDIIndicator, pos, iIndicatorPeriod );
      return ret;
   }
} 
 
где этот код запускается? не похоже, чтобы этот код использовал JForex API
 

если кто и возьмется, скиньте в архиве как можно больше скринов с эти индюком, возможно это уже есть в кодобазе.

посмотрел ваши посты в http://www.akmos.ru/forum/viewtopic.php?t=735&view=previous&sid=2e00cf5c45ccb3e4a32c6727ab83341b 

 
progma137:

если кто и возьмется, скиньте в архиве как можно больше скринов с эти индюком, возможно это уже есть в кодобазе.

посмотрел ваши посты в http://www.akmos.ru/forum/viewtopic.php?t=735&view=previous&sid=2e00cf5c45ccb3e4a32c6727ab83341b 


Да, собственно это там тема. Скринов нету. По памяти помню старый торговый терминал и попытался по той формуле на mql написать, не то выходит. Добрый человек с того форума поделился оригинальным кодом, вот только точно не знаю что за язык, только догадки...

По сути, это всем известный ADX. Только какой-то уникальный. Я почти такой же в терминале Ninja Trader видел, но там тоже не то.

 
Noterday:

По сути, это всем известный ADX. Только какой-то уникальный. Я почти такой же в терминале Ninja Trader видел, но там тоже не то.


Не нужно переписывать. А то разочаруетесь, когда узнаете, что он ничем не лучше того, что уже есть здесь. Поверьте :)
 
Rosh:

Не нужно переписывать. А то разочаруетесь, когда узнаете, что он ничем не лучше того, что уже есть здесь. Поверьте :)

Не поверю. Для Вас не лучше, а для меня это решение.
 

По разному строятся просто.

Вот пример того, что показывает этот индикатор:

Как видите, две буферные линии зеркальны. по середине идёт линия 0 (из-за сжатости написано 0.5). В МТшном ADX всё по-другому.

 
Это похоже на известный индикатор тренда Aroon.
 
Noterday:

Не поверю. Для Вас не лучше, а для меня это решение.


улыбнуло )))
Причина обращения: