//+------------------------------------------------------------------+ //| VininI ConstTickPrice.mq4 | //| Copyright © 2008, Victor Nicolaev aka Vinin | //| e-mail: vinin@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Victor Nicolaev aka Vinin" #property link "e-mail: vinin@mail.ru" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 White #property indicator_color2 White extern int Price_Mode=0; extern int CountTick=100; extern bool DrawAll=false; //---- buffers double Price[]; double _CountBar[]; double _Volume[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- drawing settings int i; IndicatorBuffers(3); SetIndexStyle(0,DRAW_NONE); SetIndexStyle(1,DRAW_NONE); if (!SetIndexBuffer(0,Price)) Print("Íåâîçìîæíî èíèöèàëèçèðîâàòü ìàññèâ Price"); if (!SetIndexBuffer(1,_CountBar)) Print("Íåâîçìîæíî èíèöèàëèçèðîâàòü ìàññèâ CountBar"); if (!SetIndexBuffer(2,_Volume)) Print("Íåâîçìîæíî èíèöèàëèçèðîâàòü ìàññèâ Volume"); SetIndexLabel(0,"Price"); Price_Mode=MathMax(Price_Mode,0); Price_Mode=MathMin(Price_Mode,6); return(0); }//int init() //+------------------------------------------------------------------+ int start() { int limit; int counted_bars=IndicatorCounted(); int i, pos; if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; for (i = limit;i>=0;i--){ _Volume[i]=_Volume[i+1]+Volume[i]; _CountBar[i]=_CountBar[i+1]+1; CheckWeek(i); CheckBar(i); CheckTick(i); RedRaw(i); } return(0); }// int start() void RedRaw(int pos){ int i; if (!DrawAll) { for (i=1;i<=_CountBar[pos];i++) { Price[pos+i]=EMPTY_VALUE; } } Price[pos]=fPrice(Price_Mode,pos,_CountBar[pos]); } void CheckWeek(int pos){ if (TimeDayOfWeek(Time[pos+1])>TimeDayOfWeek(Time[pos+0])) { _Volume[pos] = Volume[pos]; _CountBar[pos] = 0; RedRaw(pos+1); } } void CheckBar(int pos){ int tmp0=Ostatok(_Volume[pos+0],CountTick); int tmp1=Ostatok(_Volume[pos+1],CountTick); if (tmp0<tmp1) { if (tmp0>CountTick-tmp1) { _CountBar[pos] = 0; RedRaw(pos+1); } else { _CountBar[pos+1] = 0; _CountBar[pos] = 1; RedRaw(pos+2); RedRaw(pos+1); } } } void CheckTick(int pos) { if (Volume[pos]>CountTick) { _CountBar[pos]=0; RedRaw(pos+1); } } int Ostatok(double Value1, double Value2){ double tmp=NormalizeDouble(Value1/Value2,0); if (tmp*Value2>Value1) tmp--; return(Value1-tmp*Value2); } double fPrice(int Price_Mode, int pos, int shift) { double _CLOSE, _OPEN, _HIGH, _LOW, _MEDIAN, _TYPICAL, _WEIGHTED; _OPEN=Open[pos+shift]; if (shift>0) { _HIGH=High[iHighest(NULL,0,MODE_HIGH,shift,pos)]; _LOW=Low[ iLowest( NULL,0,MODE_LOW, shift,pos)]; } else { _HIGH=High[pos]; _LOW=Low[pos]; } _CLOSE=Close[pos]; _MEDIAN=(_HIGH+_LOW)/2.0; _TYPICAL=(_HIGH+_LOW+_CLOSE)/3.0; _WEIGHTED=(_HIGH+_LOW+2.0*_CLOSE)/4.0; switch (Price_Mode) { case PRICE_CLOSE: return(_CLOSE); case PRICE_OPEN: return(_OPEN); case PRICE_HIGH: return(_HIGH); case PRICE_LOW: return(_LOW); case PRICE_MEDIAN: return(_MEDIAN); case PRICE_TYPICAL: return(_TYPICAL); case PRICE_WEIGHTED: return(_WEIGHTED); } return(0); }
Sample
Analysis
Market Information Used:
Series array that contains tick volumes of each bar
Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_NONE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: