geSCtrl_Tick_v2.2





//+------------------------------------------------------------------+
//|																geSCtrl_Tick_v2.mq4	|
//|																forte928				|
//|                                        									|
//+------------------------------------------------------------------+
#property copyright "forte928"
#property link      ""
/*
	Ñêðèïò ïðåäíàçíà÷åí äëÿ óñòàíîâêè äâóõ ïàðàìåòðîâ ñìåùåíèÿ è êîë-âà ðàñ÷åòíûõ äàííûõ
	äëÿ èíäèêàòîðà ñîâåòíèêà èëè æå äðóãîãî ñêðèïòà	÷åðåç ãëîáàëüíûå ïåðåìåííûå, 
	à òàêæå ñóùåñòâóåò âîçìîæíîñòü àâòîìàòè÷åñêè ïðîõîäèòü ïî äèàïàçîíó äàííûõ îò 
	íà÷àëüíî óñòàíîâëåíîãî áàðà äî íóëåãî ñ çàäåðæêîé..
	
Ïðèâåäåí ïðèìåð èíäèêàòîðà ëèíåéíîé ðåãðåñèè â ñîâìåñòíîì èñïîëüçîâàíèè ñ ïðèëàãàåìûì ñêðèïòîì..
Èíäèêàòîð ìîæåò âûïîëíÿòü ðàñ÷åòû êàê ïðè ñàìîñòîÿòåëüíîì âûïîëíåíèè òàê è â ñâÿçêå ñî ñêðèïòîì (íàëè÷èè çàïóùåíîãî ñêðèïòà)..
Ïðè íàëè÷èè ñâÿçêè ñî ñêðèïòîì ïàðàìåòðû êîòîðûå íåîáõîäèìû èíäèêàòîðó äëÿ ðàñ÷åòà (ñìåùåíèå è êîë-âî ðàñ÷åòíûõ äàííûõ)
íàõîäÿòñÿ â ãëîáàëüíûõ ïåðåìåííûõ (CE_Time è CE_Count ñîîòâåñòâåííî)

ñêðèïò èìååò âîçìîæíîñòü óïðàâëåíèÿ èíäèêàòîðîì êàê â ðó÷íîì ðåæèìå (çàäàíèå ñìåùåíèÿ - ïîçèöèîíèðîâàíèå îáüåêòà ëèíåéíîé ðåãðåñèè ìûøêîé)
èëè æå â àâòîìàòè÷åñêîì (çàäàíèå ñìåùåíèÿ - ïîçèöèîíèðîâàíèå îáüåêòà ëèíåéíîé ðåãðåñèè ÷åðåç óñòàíîâêó íîâûõ êîîðäèíàò ñî ñìåùåíèåì -1).
óïðàâëåíèå ðó÷íûì è àâòîìàòè÷åñêèì ðåæèìîì çàäàåòñÿ ÷åðåç ãëîâàëüíóþ ïåðåìåííóþ _Emulated
_Emulated=0 - ðó÷íîé ðåæèì
_Emulated=1 àâòîìàòè÷åñêèé ðåæèì..
Óñòàíîâêà çíà÷åíèÿ ãëîáàëüíîé ïåðåìåíîé îñóùåñòâëÿåòñÿ êàê ÷åðåç ãëîáàëüíûå ïåðåìåííûå "F3"
òàê è ÷åðåç óäàëåíèå òåêñòîâîé ìåòêè "Auto Emulate"  èëè "Manual Emulate" -  ÷òî ïðèâîäèò ê èçìåíåíèþ çíà÷åíèÿ íà ïðîòèâîïîëîæíîå..

ïðè äîñòèæåíèè îáüåêòîì íóëåâîãî áàðà â àâòîìàòè÷åñêîì ðåæèìå ñêðèïò ïåðåõîäèò â ðó÷íîé ðåæèì óïðàâëåíèÿ..
ãëîáàëüíîé ïåðåìåíîé  _PauseCount óñòàíàâëèâàþò ïàðàìòð çàäåðæêè äëÿ ñëåäóþùåãî âûïîëíåíèÿ èíäèêàòîðà
ãëîáàëüíîé ïåðåìåíîé  _CW_xxxxx - îïðåäåëÿåòñÿ ãîòîâíîñòü èíäèêàòîðà íà âûïîëíåíèåÿ ñëåäóþùåãî ðàñ÷åòà..
ïî çàâåðøåíèþ ðàñ÷åòà èíäèêàòîð âûñòàâëÿåò ôëàã _CW_xxxxx=true.. 
ãëîáàëüíàÿ ïåðåìåíàÿ  _CW_xxxxx - ôîðìèðóåòñÿ ïðè èíèöèàëèçàöèè èíäèêàòîðà è ÿâëÿåòñÿ óíèêàëüíîé 
äëÿ êàæäîãî äîáàâëåíîãî èíäèêàòîðà èíäèêàòîðà íà ëþáîé ãðàôèê ñî ñâîèì âðåìåíûì ïåðèîäîì..
Èíäèêàòîð îïðåäåëÿåò ñàì íåîáõîäèìîñòü ïåðåñ÷åòà äàííûõ ïðè èçìåíåíèè ñìåùåíèÿ â ãëîáàëüíîé ïåðåìåííîé CE_Time


Ïðè âûõîäå êðàéíèõ òî÷åê îáúåêòà ëèíåéíîé ðåãðåñèè çà ãðàíèöû ýêðàíà ãðàôèêà ãðàôèê àâòîìàòè÷åñêè ïåðåìåùàåòñÿ, 
îòîáðàæàÿ íîâûé âûáðàííûé äèàïàçîí
Çàâåðøåíèå âûïîëíåíèÿ ñêðèïòà îñóùåñòâëÿåòñÿ óäàëåíèåì îáüåêòà ëèíåéíîé ðåãðåñèè ñ ïîñëåäóþùèì ïîäòâåðæäåíèåì íà âûãðóçêó
	
	Ìîè áëàãîäàðíîñòè çà íà÷àëüíóþ èäåþ Ïîääóáíîìó Îëåãó åãî ñêðèïò Mover.mq4..
*/
	//#include <WinUser32.mqh> âñòàâëÿë.Íàäî ðàçðåøèòü èìïîðò ÄËË â íàñòðîéêàõ ÌÒ4.
	//PostMessageA (WindowHandle (Symbol(), 0), WM_COMMAND, 33324, 0); // Ýìóëèðóåì òèê äëÿ èíäèêàòîðîâ
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
//==============================================================
//Control Emulated --> "CE_"
#include <WinUser32.mqh> // Çàãîëîâî÷íûé ôàéë áèáëèîòåêè "user32.dll" ôóíêöèé API Windows XP.
#include <ge_VKKeyCode.mq4>
//#include "ge_Debug.mq4"

#define WM_COMMAND   0x0111

#define gnObject		"CE_Ctrl"
#define gnLabel		"CE_Label"
#define gnCount		"CE_Count"
#define gnTime			"CE_Time"
#define gnEmulate		"_Emulated"
#define gnCalculate	"_CW_"			// Calculate Switch - ïðåôèêñ íà÷àëà èìåíè ãëîáàëüíûõ ïåðåìåííûõ ïåðåñ÷åòà èíäèêàòîðîâ 
#define gnPauseCount	"_PauseCount"


#property show_inputs

//==============================================================
string	iSymbol;
int		iPeriod;
bool		IsWorking=true;					// Ïðîâåðêà íà ïðîäîëæåíèå ðàáîòîñïîñîáíîñòè ñêðèïòà
int		TimeRight,TimeLeft;				//	Òåêóùàÿ îáðàáàòûâàåìàÿ ïîçèöèÿ (âðåìåíè)
int		TickPrd,TickLeft,TickRight;	// Òåêóùàÿ îáðàáàòûâàåìàÿ ïîçèöèÿ (áàð)
int		TimeRSave,TimeLSave;				// Çíà÷åíèå ñîõðàíåíîé ïîçèöèè (âðåìåíè)

int		SetBars		=0;					// óñòàíîâêà íà÷àëüíîãî áàðà ýìóëÿöèè òèêîâ
datetime	SetTime		=0;					//	Óñòàíîâêà íà÷àëüíîãî âðåìåíè ýìóëÿöèè òèêîâ
bool		Emulated		=false;				// ôëàã ýìóëÿöèè ïîñòóïëåíèÿ òèêîâ, óñòàíîâêà çíà÷åíèÿ ÷åðåç F3
													// false - ðó÷íàÿ (ïåðåìåùåíèå îáüåêòà ìûøêîé)
													//	true	- àâòîìàòè÷åñêîå ýìóëÿöè ïîñòóïàþùèé òèêîâ äî "0" áàðà 
bool		Calculated	=false;				// ôëàã îêîí÷àíèÿ ïåðåñ÷åòà äàííûõ (èíäèêàòîð, ñîâåòíèê èëè ñêðèïò)
extern int PauseCount	=100;				// Çàäåðæêà âûïîëíåíèÿ Ñêðèïòà ìèíèìàëüíîå çíà÷åíèå 100ìñ.
int		PauseWait	=0;					// Ñ÷åò÷èê ïàóçû âûïîëíåíèÿ Ñêðèïòà â ðåæèìå ýìóëÿöèè
bool		Modifed		=false;				// ôëàã íàëè÷èÿ èçìåíåíèÿ ïîçèöèè îáúåêòà
string	CWName		="";
int		CWCount		=0;
/*

Ïðèìåð  èñïîëüçîâàíèÿ â èíäèêàòîðå :
ñèìâîëàìè "// -->" â êîíöå ñòðî÷åê óêàçàíû ñòðî÷êè îáÿçàòåëüíûå ê âñòàâêå â êîä èíäèêàòîðà

#define		IndicatorName "LR_MA"	// äàííàÿ ñòðî÷êà íå îáÿçàòåëüíà 

...

extern int	Shift=0;			// ïåðåìåíàÿ ñìåùåíèÿ íà÷àëüíûõ ðàñ÷åòíûõ äàííûõ èíäèêàòîðà	// -->
extern int	Count=1000;		// ïåðåìåíàÿ êîë-âà ðàñ÷åòíûõ çíà÷åíèé èíäèêàòîðà

...
#include "ge_TicketCtrl.mq4"													// -->
// ìîäóëü ge_TicketCtrl.mq4 - äîáàâëÿåò âíåøíóþ ïåðåìåíóþ extern	bool	cwEmulated=false;
// êîòîðàÿ îïðåäåëÿåò ðàáîòó èíäèêàòîðà êàê â îáû÷íîì ðåæèìå - âîñïðèÿòèÿ òèêîâûõ çíà÷åíèé ñåðâåðà cwEmulated=false,
// òàê è â ðåæèìå - âîñïðèÿòèÿ ýìóëèðîâàííûõ òèêîâ cwEmulated=true
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Custom indicator initialization function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int init()
{

		.....

	InitTicket(IndicatorName);		// Çäåñü íóæíî óêàçàòü èìÿ èíäèêàòîðà äëÿ îïðåäåëåííèÿ ãëîáàëüíîé ïåðåìåííîé // -->
											// _CW_xxxxx, ê èìåíè äîáàâëÿåòñÿ óíèêàëüíûé íîìåð äëÿ èçáåæàíèÿ êîíôëèêòà
											// äâóõ îäèíàêîâûõ èíäèêàòîðà íà ðàçíûõ ïåðèîäàõ..
//----
	return(0);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int deinit()
  {
//----
		...
	DoneTicket();																	// -->
//----
   return(0);
  }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int start()
{
	if (StartTicket(Shift)==false)											// -->
	{																					// -->
    int limit;
     int counted_bars=IndicatorCounted();
  //---- ïîñëåäíèé ïîñ÷èòàííûé áàð áóäåò ïåðåñ÷èòàí
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
	}																					// -->
	else {																			// -->
		if (Calculated==true) return(0);										// -->
	}																					// -->

  //---- îñíîâíîé öèêë
	ReadValueTicket(Shift,Ix);													// -->

	double Rates[],TimeBuf1[];
	ArrayResize(Rates);ArrayResize(TimeBuf1);
	for (Ix=0;Ix<Count;Ix++) Rates[Ix]=Close[Ix+Shift];

	LineRegressOnArray(Rates,TimeBuf1,DeGree,LRCalc);			// ðàñ÷åò ëèíåéíîé ðåãðåñèè ðåçóëüòàò â TimeBuf1
	// SetIndexBuffer(0, FxView1);
	ArrayCopy(FxView1,TimeBuf1,Shift,0,Count);					// îòîáðàæåíèå íà ëèíèè èíäèêàòîðà
	

	CalculateFinishedTicket();													// -->
//----
   return(0);
  }
//+-----------------------------------------------------------------------------------------------+\\
//**************************************************************/
string EmulateState(bool iEmulate)
{
	if (iEmulate==true) return("Auto Emulate");
	else return("Manual Emulate");
}
int init() 
{
	// ïðîâåðêà íà íàëè÷èå çàïóùåãîãî Ñêðèïòà..
	PauseWait=500;
	if (GlobalVariableCheck(gnEmulate)==true)
	{
		GlobalVariableDel(gnEmulate);
		Sleep(PauseWait);
		if (GlobalVariableCheck(gnEmulate)==true) 
		{
			MessageBox("Ïîäîáíûé ñêðèïò çàïóùåí â äðóãîì îêíå","",IDOK);
			return;
		}
	}
	PauseWait=0;
	
	iSymbol=Symbol();
	iPeriod=Period();
	
	TickPrd=100;
	TimeRight=WindowTimeOnDropped();//Print(TimeToStr(TimeRight,TIME_DATE|TIME_MINUTES));
	TickRight=iBarShift(NULL,iPeriod,TimeRight);
	TickLeft=WindowFirstVisibleBar();
	if ((TickLeft-TickRight)>TickPrd) TickLeft=TickRight+TickPrd;
	if ((TickLeft-TickRight)<TickPrd) TickRight=TickLeft-TickPrd;
	if (TickRight<0) {TickRight=0;TickLeft=TickPrd-1;}
   TimeLeft=Time[TickLeft];
	TimeRight=Time[TickRight];
	TimeRSave=TimeRight;
	TimeLSave=TimeLeft;
	
	ObjectCreate(gnObject,4,0,TimeLeft,0,TimeRight,0);
	ObjectSet(gnObject,OBJPROP_COLOR,Gold);
	ObjectCreate(gnLabel, OBJ_LABEL, 0, 0, 0);
	ObjectSetText(gnLabel,EmulateState(Emulated), 20, "Verdana", Yellow);
	ObjectSet(gnLabel, OBJPROP_XDISTANCE, 10);
	ObjectSet(gnLabel, OBJPROP_YDISTANCE, 50);
	
	GlobalVariableSet(gnCount,TickPrd);
	GlobalVariableSet(gnTime,TimeRight);
	GlobalVariableSet(gnEmulate,Emulated);
	//GlobalVariableSet(gnCalculate,Calculated);
	GlobalVariableSet(gnPauseCount,PauseCount);
	GlobalVariablesDeleteAll(gnCalculate);

	//PostMessageA (WindowHandle(iSymbol,iPeriod), WM_COMMAND, 33324, 0); // Îáíîâëÿåì îêíî.
	WindowRedraw();
}
//**************************************************************
int start() 
{
	if (PauseWait>0) return;
	PauseWait=0;
	int HandlWindow=WindowHandle(iSymbol,iPeriod);        
	//---- 
	while (IsWorking==true)
	{
		while(ObjectFind(gnObject)>=0)
		{
			// ïðîâåðêà íàëè÷èÿ ãëîáàëüíûûõ ïåðåìåííûõ óïðàâëåíèÿ		
			if (GlobalVariableCheck(gnEmulate)==false) GlobalVariableSet(gnEmulate,Emulated);
			Emulated=GlobalVariableGet(gnEmulate);
			if (GlobalVariableCheck(gnPauseCount)==false) GlobalVariableSet(gnPauseCount,PauseCount);
			PauseCount=GlobalVariableGet(gnPauseCount);
			if (PauseCount<100) {PauseCount=100;GlobalVariableSet(gnPauseCount,PauseCount);}
			
			Calculated=true;
			for (CWCount=0;CWCount<GlobalVariablesTotal();CWCount++)
			{
				CWName=GlobalVariableName(CWCount);
				if (StringFind(CWName,gnCalculate, 0)==0) Calculated=Calculated*GlobalVariableGet(CWName);
			}
			//if (GlobalVariableCheck(gnCalculate)==false) GlobalVariableSet(gnCalculate,false);
			//Calculated=GlobalVariableGet(gnCalculate);

			if (ObjectFind(gnLabel)<0)
			{
				Emulated=!Emulated;GlobalVariableSet(gnEmulate,Emulated);
				ObjectCreate(gnLabel, OBJ_LABEL, 0, 0, 0);
				ObjectSetText(gnLabel,EmulateState(Emulated), 20, "Verdana", Yellow);
				ObjectSet(gnLabel, OBJPROP_XDISTANCE, 10);
				ObjectSet(gnLabel, OBJPROP_YDISTANCE, 50);
			}
     		else ObjectSetText(gnLabel,EmulateState(Emulated), 20, "Verdana", Yellow);
     		
			if (Emulated==true)
			{
				//ïðîâåðêà íàëè÷èÿ îêîí÷àíèÿ çàäåðæêè	
				TimeRight=TimeRSave;
				TimeLeft=TimeLSave;
				PauseWait=PauseWait-100;
				if (PauseWait<=0) 
				{
					PauseWait=PauseCount;
					if (Calculated==true)
					{
						TickRight=iBarShift(NULL,iPeriod,TimeRight)-1;
						TickLeft=iBarShift(NULL,iPeriod,TimeLeft)-1;
						if (TickRight>=0)
						{
							TimeRight=Time[TickRight];
							TimeLeft=Time[TickLeft];
							ObjectSet(gnObject,OBJPROP_TIME2,TimeRight); 
							ObjectSet(gnObject,OBJPROP_TIME1,TimeLeft);
						}
						else GlobalVariableSet(gnEmulate,false); // îñòàíîâêà àâòîìàòè÷åñêîé ýìóëÿöèè òèêîâ
					}
				}
				else{
					if (TimeRight!=ObjectGet(gnObject,OBJPROP_TIME2)) ObjectSet(gnObject,OBJPROP_TIME2,TimeRight); 
					if (TimeLeft!=ObjectGet(gnObject,OBJPROP_TIME1)) ObjectSet(gnObject,OBJPROP_TIME1,TimeLeft); 
					TickRight=iBarShift(NULL,iPeriod,TimeRight);
					TickLeft=iBarShift(NULL,iPeriod,TimeLeft);
				}
			}
			else {
				TimeRight=ObjectGet(gnObject,OBJPROP_TIME2); 
				TimeLeft=ObjectGet(gnObject,OBJPROP_TIME1); 
				if (TimeRight>Time[0]) TimeRight=Time[0]; 
				TickRight=iBarShift(NULL,iPeriod,TimeRight);
				TickLeft=iBarShift(NULL,iPeriod,TimeLeft);
			}
// ïðîâåðêà è ñîõðàíåíèå ïîçèöèè  îáüåêòà
			TickPrd=TickLeft-TickRight;
			if (TickPrd<10) 
			{
				TickPrd=10; 
				TickLeft=TickRight+TickPrd; 
				TimeLeft=Time[TickLeft];
				ObjectSet(gnObject,OBJPROP_TIME1,TimeLeft);
			}
			if (TimeRSave!=TimeRight || TimeLSave!=TimeLeft) 
			{
				GlobalVariableSet(gnCount,TickPrd);
				TimeRSave=TimeRight;
				TimeLSave=TimeLeft;
				Modifed=true;					// íàëè÷èå èçìåíåíèÿ ïîçèöèè îáüåêòà
				//Debug("Modifed");
				if (WindowFirstVisibleBar()<TickLeft)
				{
					PostMessageA(HandlWindow, WM_KEYDOWN, VK_LEFT, 1);Sleep(50);
					PostMessageA(HandlWindow, WM_KEYDOWN, VK_LEFT, 1);Sleep(50);
					PostMessageA(HandlWindow, WM_KEYDOWN, VK_LEFT, 1);Sleep(50);PostMessageA(HandlWindow, WM_KEYUP, VK_LEFT, 1);
				}
				if ((WindowFirstVisibleBar()-WindowBarsPerChart())>TickRight)
				{
					PostMessageA(HandlWindow, WM_KEYDOWN, VK_RIGHT, 1);Sleep(50);
					PostMessageA(HandlWindow, WM_KEYDOWN, VK_RIGHT, 1);Sleep(50);
					PostMessageA(HandlWindow, WM_KEYDOWN, VK_RIGHT, 1);Sleep(50);PostMessageA(HandlWindow, WM_KEYUP, VK_RIGHT, 1);
				}
			} 
			if ((Calculated==true)&&(Modifed==true))
			{
				//GlobalVariableSet(gnCalculate,False);Print("Modifed ");
				for (CWCount=0;CWCount<GlobalVariablesTotal();CWCount++)
				{
					CWName=GlobalVariableName(CWCount);
					if (StringFind(CWName,gnCalculate, 0)==0) GlobalVariableSet(CWName,false);
				}
				GlobalVariableSet(gnTime,TimeRSave);
				//Print(TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)," : Script Tick ",TimeToStr(TimeRSave,TIME_DATE|TIME_SECONDS));
				Modifed=false;
				PostMessageA (HandlWindow, WM_COMMAND, 33324, 0); // Îáíîâëÿåì îêíî.
				PostMessageA (HandlWindow, WM_COMMAND, 2, 1); // Ýììóëÿöèÿ òèêà äëÿ ýêñïåðòà.
				//Debug("PostMessageA");
			}
			WindowRedraw();//PostMessageA (HandlWindow, WM_COMMAND, 33324, 0); // Îáíîâëÿåì îêíî.
			//PostMessageA (HandlWindow, WM_COMMAND, 2, 1); // Ýììóëÿöèÿ òèêà äëÿ ýêñïåðòà.
			Comment("TimeLeft :",TimeToStr(TimeLSave,TIME_DATE|TIME_MINUTES),"  LeftBar : ",TickLeft,"  RightBar : ",TickRight,"\n",
						WindowFirstVisibleBar(),"  ",WindowBarsPerChart());
			Sleep(100);
		}//==================== îñíîâíîé öèêë âûïîëíåíèÿ Ñêðèïòà =====================================
		int Result=MessageBox("Çàâåðøèòü âûïîëíåíèå Ñêðèïòà ?", "Question", MB_YESNO|MB_ICONQUESTION);
		if(Result!=IDYES) 
		{
			ObjectCreate(gnObject,4,0,TimeLeft,0,TimeRight,0);
			ObjectSet(gnObject,OBJPROP_COLOR,Gold);
			WindowRedraw();//PostMessageA (WindowHandle(iSymbol,iPeriod), WM_COMMAND, 33324, 0); // Îáíîâëÿåì îêíî.
		} else IsWorking=False;
	}
//=============================================
	
	PauseWait=0;
	return(0);
}
//**************************************************************
void deinit() 
{
	if (PauseWait>0) return;
	ObjectDelete(gnObject); 
	ObjectDelete(gnLabel); 
	GlobalVariableDel(gnCount);
	GlobalVariableDel(gnEmulate);
	GlobalVariableDel(gnPauseCount);
	WindowRedraw();//PostMessageA (WindowHandle(iSymbol,iPeriod), WM_COMMAND, 33324, 0); // Îáíîâëÿåì îêíî.
	Sleep(500);
	GlobalVariablesDeleteAll(gnCalculate);
	//GlobalVariableDel(gnCalculate);
}
//**************************************************************





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar
Series array that contains open time of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It opens Message Boxes to the user