Welcome to Blog No 6 in this miniseries of 10 daily blogs in which I will exploit MT4GUIs functionalities.
I hope you find it both interesting as well as valuable!
Sincerely
Thommy Tikka
Find it hard to use MT4s built in Terminal for your IN-trade management!?
Want to have an easy way to move your Stoploss- & Takeprofit levels?
Lets look how MT4GUI can help you out with quick buttons as well as visual lines!
// mt4gui-INTradeManagement.mq4
// Created by Thommy Tikka (thommy_tikka@hotmail.com)
// Version 0.1, 20130409
// Include library file with common functions for mt4gui
#include <mt4gui.mqh>
// Declare global variables
int hwnd = 0;
int enableINTradeBtn, visualLinesBtn, bEBtn;
int tP1Btn, tP2Btn, tP3Btn;
int gUIXPos;
double actualTP, actualSL;
//Set default IN-trade variables, possible to change in the EA Properties
extern int DefaultTP = 200,
DefaultSL = 100,
TPLevel1 = 300,
TPLevel2 = 200,
TPLevel3 = 100,
// Y-Position the guiButtons
gUIYPos = 50;
// MT4 function called during the module initialization
//+-------------------------------------------------------------------------------------------+
int init()
{
hwnd = WindowHandle(Symbol(),Period());
guiRemoveAll(hwnd);
// Automatic X-Postion to the right
gUIXPos = guiGetChartWidth(hwnd)-180;
// Delete visual lines from chart
DeleteVisualLines();
// Add screenshot button to chart function call
CreateButtons();
// Disable all gui Buttons
ChangeINTradeState();
return(0);
}
// MT4 function called during deinitialization of the module
//+-------------------------------------------------------------------------------------------+
int deinit()
{
// Very important to cleanup and remove all gui items from chart
if (hwnd>0) guiRemoveAll(hwnd);
guiCleanup(hwnd);
// Delete visual lines from chart
DeleteVisualLines();
// Remove eventual Comment
Comment ("");
return(0);
}
// MT4 function called on every MT4 tick
//+-------------------------------------------------------------------------------------------+
int start()
{
// Call function ManageEvents on every MT4 tick
ManageEvents();
// Call function Move TPSL based on lines
ChangeTPSL();
// Show actual SL and TP settings if not 0
if (actualTP!=0 || actualSL!=0) Comment ("Actual TP: "+ DoubleToStr(actualTP,5)+ "\nActual SL: "+DoubleToStr(actualSL,5));
else Comment ("");
}
// MT4GUI functions to create Button
//+-------------------------------------------------------------------------------------------+
void CreateButtons()
{
// Position and size of the button ,x ,y ,a ,b (x, y = position from top left corner. a, b = size of button)
enableINTradeBtn = guiAdd(hwnd, "checkbox", gUIXPos, gUIYPos, 120, 30, "Enable INTrade"); guiSetBgColor(hwnd, enableINTradeBtn, LightGray);guiSetTextColor(hwnd, enableINTradeBtn, Black);
// Add visual Lines Btn
visualLinesBtn = guiAdd(hwnd, "button", gUIXPos, gUIYPos+30, 120, 30, "TP/SL-lines");
// Add BreakEven button
bEBtn = guiAdd(hwnd, "button", gUIXPos, gUIYPos+120, 120, 30, "BreakEven");
// Add Radio 1-3 for TP-move
tP1Btn = guiAdd(hwnd, "button", gUIXPos, gUIYPos+60, 120, 20, "TP1 ("+TPLevel1+")");
tP2Btn = guiAdd(hwnd, "button", gUIXPos, gUIYPos+80, 120, 20, "TP2 ("+TPLevel2+")");
tP3Btn = guiAdd(hwnd, "button", gUIXPos, gUIYPos+100, 120, 20, "TP3 ("+TPLevel3+")");
}
// MT4GUI functions to capture Button Events
//+-------------------------------------------------------------------------------------------+
void ManageEvents()
{
// If IN-Trade Btn is checked, enable IN-Trade actions
if (guiIsChecked(hwnd, enableINTradeBtn)) {guiSetBgColor(hwnd, enableINTradeBtn, Green);}
else {guiSetBgColor(hwnd, enableINTradeBtn, Aqua);}
ChangeINTradeState();
// If visualLinesBtn is clicked call function to draw lines
if (guiIsClicked(hwnd, visualLinesBtn))
{
PlaySound("click.wav");
if (ObjectFind("INT.TPLine")==-1)
DrawVisualLines();
else
DeleteVisualLines();
}
// If tPButtons are clicked call function to move TP
if (guiIsClicked(hwnd, tP1Btn)) {PlaySound("click.wav"); ChangeTP(1);}
if (guiIsClicked(hwnd, tP2Btn)) {PlaySound("click.wav"); ChangeTP(2);}
if (guiIsClicked(hwnd, tP3Btn)) {PlaySound("click.wav"); ChangeTP(3);}
// If beBtn is clicked call function to move SL to BreakEven
if (guiIsClicked(hwnd, bEBtn)) {PlaySound("click.wav"); MoveSLBE();}
}
// MT4 function draw TP/SL visual lines
//+-------------------------------------------------------------------------------------------+
void DrawVisualLines()
{
if (actualTP==0) ObjectCreate("INT.TPLine", OBJ_HLINE, 0, 0, Bid+DefaultTP*Point);
else ObjectCreate("INT.TPLine", OBJ_HLINE, 0, 0, actualTP);
ObjectSet("INT.TPLine", OBJPROP_STYLE, 1);
ObjectSet("INT.TPLine", OBJPROP_WIDTH, 1);
ObjectSet("INT.TPLine", OBJPROP_COLOR, Blue);
ObjectCreate("INT.TPLineLabel", OBJ_TEXT, 0, Time[5], ObjectGet("INT.TPLine", OBJPROP_PRICE1) );
ObjectSetText("INT.TPLineLabel", "TP", 8, "Arial", Blue);
if (actualSL==0) ObjectCreate("INT.SLLine", OBJ_HLINE, 0, 0, Bid-DefaultSL*Point);
else ObjectCreate("INT.SLLine", OBJ_HLINE, 0, 0, actualSL);
ObjectSet("INT.SLLine", OBJPROP_STYLE, 1);
ObjectSet("INT.SLLine", OBJPROP_WIDTH, 1);
ObjectSet("INT.SLLine", OBJPROP_COLOR, Red);
ObjectCreate("INT.SLLineLabel", OBJ_TEXT, 0, Time[5], ObjectGet("INT.SLLine", OBJPROP_PRICE1) );
ObjectSetText("INT.SLLineLabel", "SL", 8, "Arial", Red);
}
// MT4 function delete TP/SL visual lines
//+-------------------------------------------------------------------------------------------+
void DeleteVisualLines()
{
for(int i = ObjectsTotal(); i >= 0; i--)
if(StringSubstr(ObjectName(i), 0, 4) == "INT.")
ObjectDelete(ObjectName(i));
}
// MT4 function move SL to BreakEven (add your own move SL to BreakEven function here)
//+-------------------------------------------------------------------------------------------+
void MoveSLBE()
{
actualSL= Bid; //Just an example where the SL & the SL line changes based on variable
ObjectMove("INT.SLLine", 0, Time[0], actualSL);
}
// MT4GUI function, change button states
//+-------------------------------------------------------------------------------------------+
void ChangeINTradeState()
{
if (guiIsChecked(hwnd,enableINTradeBtn))
{
guiEnable(hwnd, visualLinesBtn, 1);
guiEnable(hwnd, bEBtn, 1);
guiEnable(hwnd, tP1Btn, 1);
guiEnable(hwnd, tP2Btn, 1);
guiEnable(hwnd, tP3Btn, 1);
guiSetBgColor(hwnd, bEBtn, LimeGreen);
guiSetBgColor(hwnd, visualLinesBtn, LimeGreen);
guiSetBgColor(hwnd, tP1Btn, MediumSpringGreen);
guiSetBgColor(hwnd, tP2Btn, MediumSpringGreen);
guiSetBgColor(hwnd, tP3Btn, MediumSpringGreen);
}
else
{
guiEnable(hwnd, visualLinesBtn, 0);
guiEnable(hwnd, bEBtn, 0);
guiEnable(hwnd, tP1Btn, 0);
guiEnable(hwnd, tP2Btn, 0);
guiEnable(hwnd, tP3Btn, 0);
guiSetBgColor(hwnd, bEBtn, LightGray);
guiSetBgColor(hwnd, visualLinesBtn, LightGray);
guiSetBgColor(hwnd, tP1Btn, LightGray);
guiSetBgColor(hwnd, tP2Btn, LightGray);
guiSetBgColor(hwnd, tP3Btn, LightGray);
DeleteVisualLines();
}
}
// MT4 function, change TP/SL based on visual line move
//+-------------------------------------------------------------------------------------------+
void ChangeTPSL()
{
if (!ObjectFind("INT.SLLine")==-1) actualSL = ObjectGet("INT.SLLine", OBJPROP_PRICE1);
if (!ObjectFind("INT.TPLine")==-1) actualTP = ObjectGet("INT.TPLine", OBJPROP_PRICE1);
ObjectMove("INT.SLLineLabel", 0, Time[5], ObjectGet("INT.SLLine", OBJPROP_PRICE1));
ObjectMove("INT.TPLineLabel", 0, Time[5], ObjectGet("INT.TPLine", OBJPROP_PRICE1));
}
// MT4 function, change TP based on radio button
//+-------------------------------------------------------------------------------------------+
void ChangeTP(int level)
{
if (level==1) actualTP = Bid+TPLevel1*Point;
else if (level==2) actualTP = Bid+TPLevel2*Point;
else if (level==3) actualTP = Bid+TPLevel3*Point;
ObjectMove("INT.TPLine", 0, Time[0], actualTP);
}
Tomorrow I will show you how you can use MT4GUI functionality for “PRE-trade”-actions!
Thats all folks!
You must be logged in to post a comment.