//+----------------------------------------------------------------------------------+
//| Candle_Temperatura.mq4 |
//| |
//+----------------------------------------------------------------------------------+
#property copyright "rodolfo.leonardo@gmail.com"
#property version "1.30"
#property link "https://www.mql5.com/pt/users/rodolfolm"
#property description "Indicator Candle heat"
#property strict
//===================================//
#property indicator_chart_window
#property indicator_buffers 1
//===================================//
enum CSpectrum
{
GREEN = 1, // Green
RED = 2 // Red
};
extern bool MaxMinVolume_AllCandles=false; // false/true - Determination of the maximum volume / min on each candle separately / on all candles
extern bool CandleShadow=true; // Display "temperature" in shadows of candles
extern bool CandleBody=true; // Display "temperature" on the bodies of candles
extern CSpectrum BullSpectrum=GREEN; //Spectrum for candles "high"
extern CSpectrum BearSpectrum=RED; // Spectrum for "low" candles
extern int DrawSize=1; // Candle cell size (in points)
extern ENUM_TIMEFRAMES VolumeTf=PERIOD_M15; //Period of time (in minutes) from which the volume values are read
extern int SumBars=2; // Number of candles to display the "temperature"
//===================================//
double MaxVolume,MinVolume,Volume_;
int Bars_,TimePrev=0;
//===================================//
int init()
{
HistoryCheck();
return(0);
}
//===================================//
int deinit()
{
Comment("");
Obj_Del();
return(0);
}
//===================================//
int start()
{
if(TimePrev==Time[0])
{
RemoveObjects();
CandlesDraw(1);
}
else
{
if(SumBars>0)
{
Bars_=SumBars;
if(Bars_>Bars) Bars_=Bars;
}
else
Bars_=Bars;
MaxVolume=0.0; MinVolume=0.0;
Obj_Del();
CandlesDraw(Bars_);
TimePrev=Time[0];
}
return(0);
}
//===================================//
void CandlesDraw(int sum)
{
double HighValue,LowValue,HighValue_,LowValue_,High_,Low_,Vol_,
Step=DrawSize*Point;
int i,j,n,Time_,cell_numb,Spectrum;
if(MaxMinVolume_AllCandles)
{ // расчёт макс/мин объёма по всем свечам
if(CandleBody)
{
for(i=0; i<=sum-1; i++)
{
if(!CandleShadow)
{
HighValue=ND(MathMax(Open[i],Close[i]));
LowValue=ND(MathMin(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
}
else
{
HighValue=ND(High[i]);
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
}
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(Volume_!=0.0)
{
if(Volume_>MaxVolume) MaxVolume=Volume_;
if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
}
} // end of while
} // end of for
for(i=0; i<=sum-1; i++)
{
if(!CandleShadow)
{
HighValue=ND(MathMax(Open[i],Close[i]));
LowValue=ND(MathMin(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
}
else
{
HighValue=ND(High[i]);
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
}
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(ND(Volume_-MinVolume)==0.0)
cell_numb=1;
else if(ND(Volume_-MaxVolume)==0.0)
cell_numb=20;
else if(ND(MaxVolume-MinVolume)==0.0)
cell_numb=1;
else
{
cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; //Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);
}
if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
} // end of while
} // end of for
}
else if(CandleShadow)
{
for(i=0; i<=sum-1; i++)
{
HighValue=ND(High[i]);
LowValue=ND(MathMax(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(Volume_!=0.0)
{
if(Volume_>MaxVolume) MaxVolume=Volume_;
if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
}
} // end of while
} // end of for
for(i=0; i<=sum-1; i++)
{
HighValue=ND(MathMin(Open[i],Close[i]));
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(Volume_!=0.0)
{
if(Volume_>MaxVolume) MaxVolume=Volume_;
if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
}
} // end of while
} // end of for
for(i=0; i<=sum-1; i++)
{
HighValue=ND(High[i]);
LowValue=ND(MathMax(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(ND(Volume_-MinVolume)==0.0)
cell_numb=1;
else if(ND(Volume_-MaxVolume)==0.0)
cell_numb=20;
else if(ND(MaxVolume-MinVolume)==0.0)
cell_numb=1;
else
{
cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; //Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);
}
if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
} // end of while
} // end of for
for(i=0; i<=sum-1; i++)
{
HighValue=ND(MathMin(Open[i],Close[i]));
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(ND(Volume_-MinVolume)==0.0)
cell_numb=1;
else if(ND(Volume_-MaxVolume)==0.0)
cell_numb=20;
else if(ND(MaxVolume-MinVolume)==0.0)
cell_numb=1;
else
{
cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; //Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);
}
if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
} // end of while
} // end of for
}
}
else if(!MaxMinVolume_AllCandles)
{ // расчёт макс/мин объёма по каждой свече
if(CandleBody)
{
for(i=0; i<=sum-1; i++)
{
if(!CandleShadow)
{
HighValue=ND(MathMax(Open[i],Close[i]));
LowValue=ND(MathMin(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
}
else
{
HighValue=ND(High[i]);
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
}
n=0; HighValue_=0.0; MinVolume=0.0; MaxVolume=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(Volume_!=0.0)
{
if(Volume_>MaxVolume) MaxVolume=Volume_;
if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
}
} // end of while
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(ND(Volume_-MinVolume)==0.0)
cell_numb=1;
else if(ND(Volume_-MaxVolume)==0.0)
cell_numb=20;
else if(ND(MaxVolume-MinVolume)==0.0)
cell_numb=1;
else
{
cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; /*Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);*/
}
if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
} // end of while
} // end of for
}
else if(CandleShadow)
{
for(i=0; i<=sum-1; i++)
{
HighValue=ND(High[i]);
LowValue=ND(MathMax(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0; MinVolume=0.0; MaxVolume=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(Volume_!=0.0)
{
if(Volume_>MaxVolume) MaxVolume=Volume_;
if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
}
} // end of while
HighValue=ND(MathMin(Open[i],Close[i]));
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(Volume_!=0.0)
{
if(Volume_>MaxVolume) MaxVolume=Volume_;
if(MinVolume==0.0 || (MinVolume>0.0 && Volume_<MinVolume)) MinVolume=Volume_;
}
} // end of while
HighValue=ND(High[i]);
LowValue=ND(MathMax(Open[i],Close[i]));
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(ND(Volume_-MinVolume)==0.0)
cell_numb=1;
else if(ND(Volume_-MaxVolume)==0.0)
cell_numb=20;
else if(ND(MaxVolume-MinVolume)==0.0)
cell_numb=1;
else
{
cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; /*Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);*/
}
if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
} // end of while
HighValue=ND(MathMin(Open[i],Close[i]));
LowValue=ND(Low[i]);
if(ND(HighValue-LowValue)==0.0) continue;
n=0; HighValue_=0.0;
while(HighValue>HighValue_)
{
if(n==0)
{
LowValue_=LowValue;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
n++;
}
else
{
LowValue_=HighValue_;
HighValue_=ND(LowValue_+Step);
if(HighValue<HighValue_) HighValue_=HighValue;
if(ND(HighValue_-LowValue_)==0.0) break;
}
if(i==0) Time_=Time[0]+60*Period(); else Time_=Time[i-1];
j=iBarShift(_Symbol,VolumeTf,Time[i]);
Volume_=0.0;
while(Time_>iTime(_Symbol,VolumeTf,j) && j>=0)
{
High_=ND(iHigh(_Symbol,VolumeTf,j)); if(High_==0.0) { j--; continue; }
Low_=ND(iLow(_Symbol,VolumeTf,j));
Vol_=iVolume(_Symbol,VolumeTf,j);
if(High_<=LowValue_ || Low_>=HighValue_) { j--; continue; }
if((High_<=HighValue_ && Low_>=LowValue_) || ND(High_-Low_)==0.0)
Volume_=Volume_+Vol_;
else if((High_>HighValue_ && Low_<=LowValue_) || (High_>=HighValue_ && Low_<LowValue_))
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*DrawSize;
else if(High_>=HighValue_ && Low_<HighValue_ && Low_>LowValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(HighValue_-Low_)/Point);
else if(Low_<=LowValue_ && High_>LowValue_ && High_<HighValue_)
Volume_=Volume_+(Vol_/(ND(High_-Low_)/Point))*(ND(High_-LowValue_)/Point);
j--;
} // end of while
if(ND(Volume_-MinVolume)==0.0)
cell_numb=1;
else if(ND(Volume_-MaxVolume)==0.0)
cell_numb=20;
else if(ND(MaxVolume-MinVolume)==0.0)
cell_numb=1;
else
{
cell_numb=MathFloor((Volume_-MinVolume)/((MaxVolume-MinVolume)/20.0))+1; /*Print("(",Volume_,"-",MinVolume,")/((",MaxVolume,"-",MinVolume,")/20.0)+1=",cell_numb);*/
}
if(cell_numb<1) cell_numb=1; else if(cell_numb>20) cell_numb=20;
if(Close[i]>=Open[i]) Spectrum=BullSpectrum; else Spectrum=BearSpectrum;
Draw_Cell(Time[i],Time_,LowValue_,HighValue_,GetColor(Spectrum,cell_numb));
} // end of while
} // end of for
}
}
WindowRedraw();
}
//===================================//
bool HistoryCheck(int j=0)
{
if(j==0) Comment("Подождите, идет обновление данных таймфреймов...");
int i=0;
while(i<100)
{
iTime(_Symbol,0,0);
iTime(_Symbol,VolumeTf,0);
if(GetLastError()!=4066) break;
Sleep(1000);
i++;
} // end of while
if(i==100)
{
Comment("Обновление данных завершилось с ошибкой. Переход к следующей попытке.");
return(false);
}
Comment("");
return(true);
}
//===================================//
double ND(double A)
{
return(NormalizeDouble(A,Digits));
}
//===================================//
void Draw_Cell(datetime x1,datetime x2,double y1,double y2,color Color)
{
string label="Cell_volume"+"_"+DoubleToStr(y1,Digits)+"_"+TimeToStr(x1);
ObjectDelete(label);
ObjectCreate(label,OBJ_RECTANGLE,0,x1,y1,x2,y2,0,0);
ObjectSet(label,OBJPROP_COLOR,Color);
}
//===================================//
void Obj_Del()
{
string label;
for(int i=ObjectsTotal()-1; i>=0; i--)
{
label=ObjectName(i);
if(StringSubstr(label,0,11)=="Cell_volume") { ObjectDelete(label); continue; }
}
/* end of for */
}
//===================================//
void RemoveObjects()
{
int t1=ObjectsTotal()-1;
while(t1>=0)
{
if(StringFind(ObjectName(t1),TimeToStr(Time[0]),0)>-1) { ObjectDelete(ObjectName(t1)); }
t1--;
}
}
//===================================//
color GetColor(int palette,int cell)
{
if(palette==1)
{
switch(cell)
{
case 1: return(C'10,219,0');
case 2: return(C'22,210,1');
case 3: return(C'35,222,2');
case 4: return(C'48,224,3');
case 5: return(C'61,226,4');
case 6: return(C'73,228,5');
case 7: return(C'86,230,6');
case 8: return(C'99,232,7');
case 9: return(C'112,234,8');
case 10: return(C'125,236,9');
case 11: return(C'137,237,10');
case 12: return(C'150,239,11');
case 13: return(C'163,241,12');
case 14: return(C'176,243,13');
case 15: return(C'189,245,14');
case 16: return(C'201,247,15');
case 17: return(C'214,249,16');
case 18: return(C'227,251,17');
case 19: return(C'240,253,18');
case 20: return(C'253,255,20');
}
/* end of switch */
}
else if(palette==2)
{
switch(cell)
{
case 1: return(C'219, 0, 19');
case 2: return(C'220, 13, 19');
case 3: return(C'222, 26, 19');
case 4: return(C'224, 40, 19');
case 5: return(C'226, 53, 19');
case 6: return(C'227, 67, 19');
case 7: return(C'229, 80, 19');
case 8: return(C'231, 93, 19');
case 9: return(C'233, 107, 19');
case 10: return(C'235, 120, 19');
case 11: return(C'236, 134, 19');
case 12: return(C'238, 147, 19');
case 13: return(C'240, 161, 19');
case 14: return(C'242, 174, 19');
case 15: return(C'244, 187, 19');
case 16: return(C'245, 201, 19');
case 17: return(C'247, 214, 19');
case 18: return(C'249, 228, 19');
case 19: return(C'251, 241, 19');
case 20: return(C'253, 255, 20');
}
/* end of switch */
}
return(C'0,0,0');
}
//===================================//