286 lines
11 KiB
MQL5
286 lines
11 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| Price.mqh |
| |||
//| Andrew Young |
| |||
//| http://www.expertadvisorbook.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
#property copyright "Andrew Young"
| |||
#property link "http://www.expertadvisorbook.com"
| |||
| |||
| |||
class CBars {
| |||
private:
| |||
int BarCount;
| |||
public:
| |||
CBars(void);
| |||
MqlRates bar[];
| |||
void Update(string pSymbol, ENUM_TIMEFRAMES pPeriod, int barCount);
| |||
double Close(int pShift);
| |||
double High(int pShift);
| |||
double Low(int pShift);
| |||
double Open(int pShift);
| |||
datetime Time(int pShift);
| |||
long TickVolume(int pShift);
| |||
long Volume(int pShift);
| |||
void GetCloses(double &closes[]);
| |||
void GetOpens(double &opens[]);
| |||
void GetHighs(double &highs[]);
| |||
void GetLows(double &lows[]);
| |||
void GetTimes(datetime ×[]);
| |||
void GetVolumes(long &volumes[]);
| |||
int GetBarCount();
| |||
int IndexByTime(datetime t);
| |||
double Point(string pSymbol);
| |||
double HighestHigh(string pSymbol, ENUM_TIMEFRAMES pPeriod, int pBars, int pStart = 0);
| |||
int HighestHighIndex(string pSymbol, ENUM_TIMEFRAMES pPeriod, int pBars, int pStart = 0);
| |||
double LowestLow(string pSymbol, ENUM_TIMEFRAMES pPeriod, int pBars, int pStart = 0);
| |||
int LowestLowIndex(string pSymbol, ENUM_TIMEFRAMES pPeriod, int pBars, int pStart = 0);
| |||
};
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
CBars::CBars(void) {
| |||
ArraySetAsSeries(bar, true);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::Update(string pSymbol, ENUM_TIMEFRAMES pPeriod, int barCount = 1000) {
| |||
CopyRates(pSymbol, pPeriod, 0, barCount, bar);
| |||
BarCount = barCount;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars::Point(string pSymbol) {
| |||
return(SymbolInfoDouble(pSymbol, SYMBOL_POINT));
| |||
}/**/
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars::Close(int pShift = 0) {
| |||
return(bar[pShift].close);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars::High(int pShift = 0) {
| |||
return(bar[pShift].high);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars::Low(int pShift = 0) {
| |||
return(bar[pShift].low);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars::Open(int pShift = 0) {
| |||
return(bar[pShift].open);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
long CBars::TickVolume(int pShift = 0) {
| |||
return(bar[pShift].tick_volume);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
datetime CBars::Time(int pShift = 0) {
| |||
return(bar[pShift].time);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
long CBars::Volume(int pShift = 0) {
| |||
return(bar[pShift].real_volume);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Current Price Information |
| |||
//+------------------------------------------------------------------+
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double Ask(string pSymbol = NULL) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
return(SymbolInfoDouble(pSymbol, SYMBOL_ASK));
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double Bid(string pSymbol = NULL) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
return(SymbolInfoDouble(pSymbol, SYMBOL_BID));
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
long Spread(string pSymbol = NULL) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
return(SymbolInfoInteger(pSymbol, SYMBOL_SPREAD));
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
long StopLevel(string pSymbol = NULL) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
long stopLevel = SymbolInfoInteger(pSymbol, SYMBOL_TRADE_STOPS_LEVEL);
| |||
return(stopLevel);
| |||
}
| |||
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Highest High & Lowest Low |
| |||
//+------------------------------------------------------------------+
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars:: HighestHigh(string pSymbol = NULL, ENUM_TIMEFRAMES pPeriod = PERIOD_H1, int pBars = 10, int pStart = 0) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
int maxIdx = iHighest(pSymbol, pPeriod, MODE_HIGH, pBars, pStart);
| |||
double highest = High(maxIdx);
| |||
| |||
return(highest);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
int CBars:: HighestHighIndex(string pSymbol = NULL, ENUM_TIMEFRAMES pPeriod = PERIOD_H1, int pBars = 10, int pStart = 0) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
int maxIdx = iHighest(pSymbol, pPeriod, MODE_HIGH, pBars, pStart);
| |||
return(maxIdx);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
double CBars:: LowestLow(string pSymbol = NULL, ENUM_TIMEFRAMES pPeriod = PERIOD_H1, int pBars = 10, int pStart = 0) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
int minIdx = iHighest(pSymbol, pPeriod, MODE_HIGH, pBars, pStart);
| |||
double lowest = High(minIdx);
| |||
| |||
return(lowest);
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
int CBars:: LowestLowIndex(string pSymbol = NULL, ENUM_TIMEFRAMES pPeriod = PERIOD_H1, int pBars = 10, int pStart = 0) {
| |||
if(pSymbol == NULL)
| |||
pSymbol = _Symbol;
| |||
int minIdx = iLowest(pSymbol, pPeriod, MODE_HIGH, pBars, pStart);
| |||
| |||
return(minIdx);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::GetCloses(double &closes[]) {
| |||
int size = ArraySize(bar);
| |||
ArrayResize(closes, size);
| |||
for(int i = 0; i < size; i++)
| |||
closes[i] = bar[i].close;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::GetOpens(double &opens[]) {
| |||
int size = ArraySize(bar);
| |||
ArrayResize(opens, size);
| |||
for(int i = 0; i < size; i++)
| |||
opens[i] = bar[i].open;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::GetHighs(double &highs[]) {
| |||
int size = ArraySize(bar);
| |||
ArrayResize(highs, size);
| |||
for(int i = 0; i < size; i++)
| |||
highs[i] = bar[i].high;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::GetLows(double &lows[]) {
| |||
int size = ArraySize(bar);
| |||
ArrayResize(lows, size);
| |||
for(int i = 0; i < size; i++)
| |||
lows[i] = bar[i].low;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::GetTimes(datetime ×[]) {
| |||
int size = ArraySize(bar);
| |||
ArrayResize(times, size);
| |||
for(int i = 0; i < size; i++)
| |||
times[i] = bar[i].time;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| |
| |||
//+------------------------------------------------------------------+
| |||
void CBars::GetVolumes(long &volumes[]) {
| |||
int size = ArraySize(bar);
| |||
ArrayResize(volumes, size);
| |||
for(int i = 0; i < size; i++)
| |||
volumes[i] = bar[i].tick_volume;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
int CBars::GetBarCount(void) {
| |||
return BarCount;
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Get bar index by time |
| |||
//+------------------------------------------------------------------+
| |||
int CBars::IndexByTime(datetime t) {
| |||
if(t == 0 || BarCount == 0) return -1;
| |||
| |||
// bars are stored as series (latest = 0)
| |||
for(int i = 0; i < BarCount; i++) {
| |||
if(bar[i].time == t) return i;
| |||
}
| |||
return -1; // not found
| |||
}
| |||
//+------------------------------------------------------------------+
|