Price Data Components
0
Views
0
Downloads
0
Favorites
riskrewardbox
//+------------------------------------------------------------------+
//| riskrewardbox.mq5 |
//| Copyright 2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property indicator_chart_window
#property strict
#property indicator_chart_window
input bool DrawAllChart = false; // Draw Box on all opened charts
input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1; // Cart timeframe
string OBJprefix = "ziwoxRSRW";
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
ChartDraw();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
long chartID = ChartFirst();
string symb = "";
ENUM_TIMEFRAMES ChartPer = 0;
if (DrawAllChart)
while(chartID>=0)
{
ObjectsDeleteAll(chartID,OBJprefix,-1,-1);
chartID = ChartNext(chartID);
}
else
ObjectsDeleteAll(0,OBJprefix,-1,-1);
ObjectDelete(0,"Reset");
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
ButtonCreate(0,"Reset",0,20,30,110,25,CORNER_LEFT_UPPER,"Reset All Box","Trebuchet MS",10,clrWhite,clrMediumSeaGreen,clrMediumSeaGreen,false,false,false,true,1,"");
return(1);
}
void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
if(id==CHARTEVENT_OBJECT_CLICK)
{
if(sparam=="Reset") // Pause forwarder
{
ChartClean();
}
}
if(id==CHARTEVENT_OBJECT_DRAG)
{
double pricePink1 = ObjectGetDouble(0, OBJprefix+".Risk_Reward_Pink", OBJPROP_PRICE, 0); // low pink
double pricePink2 = ObjectGetDouble(0, OBJprefix+".Risk_Reward_Pink", OBJPROP_PRICE, 1); // top pink
double priceGreen1 = ObjectGetDouble(0, OBJprefix+".Risk_Reward_Green", OBJPROP_PRICE, 0); // low green
double priceGreen2 = ObjectGetDouble(0, OBJprefix+".Risk_Reward_Green", OBJPROP_PRICE, 1); // top green
double maxPink = MathMax(pricePink1, pricePink2);
double minPink = MathMin(pricePink1, pricePink2);
double maxGreen = MathMax(priceGreen1, priceGreen2);
double minGreen = MathMin(priceGreen1, priceGreen2);
if(sparam==OBJprefix+".Risk_Reward_Green" )
{
double pinkSize = maxPink - minPink;
int time1 = ObjectGetInteger (0, OBJprefix+".Risk_Reward_Green",OBJPROP_TIME, 0);
int time2 = ObjectGetInteger (0, OBJprefix+".Risk_Reward_Green",OBJPROP_TIME, 1);
if (maxPink > maxGreen ) { // Risk at top
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Pink",OBJPROP_PRICE, 0, maxGreen);
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Pink",OBJPROP_PRICE, 1, maxGreen+pinkSize);
}
else { // Risk at bottom
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Pink",OBJPROP_PRICE, 1, minGreen);
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Pink",OBJPROP_PRICE, 0, minGreen-pinkSize);
}
ObjectSetInteger(0, OBJprefix+".Risk_Reward_Pink",OBJPROP_TIME, 0, time1); // mid
ObjectSetInteger(0, OBJprefix+".Risk_Reward_Pink",OBJPROP_TIME, 1, time2); // mid
ChartRedraw(0);
}
if(sparam==OBJprefix+".Risk_Reward_Pink" )
{
double greeSize = maxGreen - minGreen;
int time1 = ObjectGetInteger (0, OBJprefix+".Risk_Reward_Pink",OBJPROP_TIME, 0);
int time2 = ObjectGetInteger (0, OBJprefix+".Risk_Reward_Pink",OBJPROP_TIME, 1);
if (maxGreen > maxPink ) { // Reward at top
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Green", OBJPROP_PRICE, 0, maxPink);
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Green",OBJPROP_PRICE, 1, maxPink+greeSize);
}
else { // Reward at bottom
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Green",OBJPROP_PRICE, 1, minPink);
ObjectSetDouble (0, OBJprefix+".Risk_Reward_Green",OBJPROP_PRICE, 0, minPink-greeSize);
}
ObjectSetInteger(0, OBJprefix+".Risk_Reward_Green", OBJPROP_TIME, 0, time1);
ObjectSetInteger(0, OBJprefix+".Risk_Reward_Green", OBJPROP_TIME, 1, time2);
ChartRedraw(0);
}
}
}
//+------------------------------------------------------------------+
bool ButtonCreate(const long chart_ID=0, // chart's ID
const string name="Button", // button name
const int sub_window=0, // subwindow index
const int x=0, // X coordinate
const int y=0, // Y coordinate
const int width=50, // button width
const int height=18, // button height
const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // chart corner for anchoring
const string text="Button", // text
const string font="Arial", // font
const int font_size=10, // font size
const color clr=clrBlack, // text color
const color back_clr=C'236,233,216', // background color
const color border_clr=clrNONE, // border color
const bool state=false, // pressed/released
const bool back=false, // in the background
const bool selection=false, // highlight to move
const bool hidden=true, // hidden in the object list
const long z_order=0, // priority for mouse click
const string tooltip="\n") // tooltip for mouse hover
{
//--- reset the error value
ResetLastError();
//---
if(ObjectFind(chart_ID,name)!=0)
{
if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
{
Print(__FUNCTION__,
": failed to create the button! Error code = ",_LastError);
return(false);
}
//--- SetObjects
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,tooltip);
}
else
{
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,tooltip);
}
//---
return(true);
}
void ChartClean()
{
long chartID = ChartFirst();
string symb = "";
ENUM_TIMEFRAMES ChartPer = 0;
if (DrawAllChart)
while(chartID>=0)
{
ObjectsDeleteAll(chartID,OBJprefix,-1,-1);
chartID = ChartNext(chartID);
}
else ObjectsDeleteAll(0,OBJprefix,-1,-1);
ObjectSetInteger(0,"Reset",OBJPROP_STATE,false);
ChartDraw();
}
//====================================================================
//+------------------------------------------------------------------+
//| OnTick Deinit |
//+------------------------------------------------------------------+
void ChartDraw()
{
long chart_ID = ChartFirst();
string symbl = "";
ENUM_TIMEFRAMES chartperiod = 0;
if (DrawAllChart)
while(chart_ID>=0)
{
symbl = ChartSymbol(chart_ID);
chartperiod = ChartPeriod(chart_ID);
string name = OBJprefix+".Risk_Reward_Pink";
double top = iHigh(symbl,chartperiod,iHighest(symbl,chartperiod,MODE_HIGH,20,0));
double low = iLow(symbl,chartperiod,iLowest(symbl,chartperiod,MODE_LOW,20,0));
double mid = SymbolInfoDouble(symbl,SYMBOL_ASK);
if (ObjectFind(chart_ID,name)<0)
{
ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,iTime(symbl,chartperiod,0),low,iTime(symbl,chartperiod,0)+PeriodSeconds()*25,mid);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clrPink);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,2);
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,true);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,true);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0);
}
name = OBJprefix+".Risk_Reward_Green";
if (ObjectFind(chart_ID,name)<0)
{
ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,iTime(symbl,chartperiod,0),mid,iTime(symbl,chartperiod,0)+PeriodSeconds()*25,top);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clrLightGreen);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,2);
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,true);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,true);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0);
}
chart_ID = ChartNext(chart_ID);
}
else {
chart_ID = 0;
symbl = Symbol();
chartperiod = PERIOD_CURRENT;
string name = OBJprefix+".Risk_Reward_Pink";
double top = iHigh(symbl,chartperiod,iHighest(symbl,chartperiod,MODE_HIGH,20,0));
double low = iLow(symbl,chartperiod,iLowest(symbl,chartperiod,MODE_LOW,20,0));
double mid = SymbolInfoDouble(symbl,SYMBOL_ASK);
if (ObjectFind(chart_ID,name)<0)
{
ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,iTime(symbl,chartperiod,0),low,iTime(symbl,chartperiod,0)+PeriodSeconds()*25,mid);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clrPink);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,2);
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,true);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,true);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0);
}
name = OBJprefix+".Risk_Reward_Green";
if (ObjectFind(chart_ID,name)<0)
{
ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,iTime(symbl,chartperiod,0),mid,iTime(symbl,chartperiod,0)+PeriodSeconds()*25,top);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clrLightGreen);
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,2);
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,true);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,true);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0);
}
}
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---