Author: Copyright � 2012, Ivan Kornilov. All rights reserved.
Indicators Used
Moving average indicator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
BrakeMa
//+------------------------------------------------------------------+
//|                                   Copyright © 2012, Ivan Kornilov|
//|                                                       BrakeMa.mq4|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Ivan Kornilov. All rights reserved."
#property link "excelf@gmail.com"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color2 Red
#property indicator_color1 Green

extern int    ma   = 34;
extern double speed   = 0.00;
extern int    maType  = 3;

extern bool isLine = false;


double upValue[];
double downValue[];
double maValue[];

int init() {
   IndicatorShortName("BrakeMa (" + ma + "," + maType + " )");
   SetIndexBuffer(0, upValue);
   SetIndexLabel(0, "Up Value");
   
   SetIndexBuffer(1, downValue);
   SetIndexLabel(1, "Down Value");
   
   SetIndexBuffer(2, maValue);
   IndicatorBuffers(3);
   
   if(isLine) {
      SetIndexStyle(0, DRAW_LINE, EMPTY, 2);
      SetIndexStyle(1, DRAW_LINE, EMPTY, 2);
   } else {
      SetIndexStyle(0, DRAW_ARROW, EMPTY, 2);
      SetIndexArrow(0, 159);
      SetIndexStyle(1, DRAW_ARROW, EMPTY, 2);
      SetIndexArrow(1, 159);
   }
   
   IndicatorDigits(Digits);   
}

double   last_beginPrice = -1;
datetime last_beginTime  = 0;
bool     last_isLong     = true;
double maxPrice = -999;
double minPrice = 999;

int start() {
   int indicatorCounted = IndicatorCounted();
   if (indicatorCounted < 0) { 
        return (-1);
   }
   if (indicatorCounted > 0) {
        indicatorCounted--;
   }
   
   int limit = Bars - indicatorCounted - 2;

   
   for (int i = limit; i >= 0; i--) {
      if(last_beginPrice == -1) {
         last_beginPrice = Low[i];
         last_beginTime = Time[i];
         last_isLong = true;
      }
      
      if(maxPrice < High[i]) {
         maxPrice = High[i];
      }
      if(minPrice > Low[i]) {
         minPrice = Low[i];
      }
      double value;
      int beginBar = iBarShift(NULL, 0, last_beginTime, false);
      double maShift = iMA(NULL, 0, ma, 0, maType, 0, beginBar) - last_beginPrice; 
      
      maValue[i] = iMA(NULL, 0, ma, 0, maType, 0, i);
      if(last_isLong) {
        if(maValue[i + 1] > maValue[i]) {
            double move = (maValue[i + 1] - maValue[i]) * speed;
            value = maValue[i+1] + move - maShift;
            last_beginPrice = last_beginPrice + move; 
            maValue[i] = maValue[i + 1];
        } else {
            value = maValue[i] - maShift ;
        }
      } else {
        if(maValue[i + 1] < maValue[i]) {
            move = (maValue[i] - maValue[i + 1]) * speed;
            value = maValue[i+1] - move - maShift;
            last_beginPrice = last_beginPrice - move; 
            maValue[i] = maValue[i + 1];
        } else {
            value = maValue[i] - maShift ;
        }
      }
      
      
      
      if(last_isLong && value > Low[i]) { 
         last_isLong = false;
         last_beginPrice = maxPrice;
         value = last_beginPrice;
         last_beginTime = Time[i];
         
         maxPrice = -999;
         minPrice = 999;  
         
      } else if(!last_isLong && value < High[i]) {
         last_isLong = true;
         last_beginPrice = minPrice;
         value = last_beginPrice;
         last_beginTime = Time[i];
         
         maxPrice = -999;
         minPrice = 999;
      }
      if(last_isLong) {
         upValue[i] = value;
         downValue[i] = EMPTY_VALUE;
      } else {
         upValue[i] = EMPTY_VALUE;
         downValue[i] = value;
      }
   }
}

//double getNormValue(int period, int shift) {
//   return(iCustom(NULL, 0, "ATRNorm", period, 1, "", 0, 1, shift));
//}

Comments