geSCtrl_Tick_v2





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

ñêðèïò èìååò âîçìîæíîñòü óïðàâëåíèÿ èíäèêàòîðîì êàê â ðó÷íîì ðåæèìå (çàäàíèå ñìåùåíèÿ - ïîçèöèîíèðîâàíèå îáüåêòà ëèíåéíîé ðåãðåñèè ìûøêîé)
èëè æå â àâòîìàòè÷åñêîì (çàäàíèå ñìåùåíèÿ - ïîçèöèîíèðîâàíèå îáüåêòà ëèíåéíîé ðåãðåñèè ÷åðåç óñòàíîâêó íîâûõ êîîðäèíàò ñî ñìåùåíèåì -1).
óïðàâëåíèå ðó÷íûì è àâòîìàòè÷åñêèì ðåæèìîì çàäàåòñÿ ÷åðåç ãëîâàëüíóþ ïåðåìåííóþ _Emulated
_Emulated=0 - ðó÷íîé ðåæèì
_Emulated=1 àâòîìàòè÷åñêèé ðåæèì..
ïðè äîñòèæåíèè îáüåêòîì íóëåâîãî áàðà â àâòîìàòè÷åñêîì ðåæèìå ñêðèïò ïåðåõîäèò â ðó÷íîé ðåæèì óïðàâëåíèÿ..
ãëîáàëüíîé ïåðåìåíîé  _PauseCount óñòàíàâëèâàþò ïàðàìòð çàäåðæêè äëÿ ñëåäóþùåãî âûïîëíåíèÿ èíäèêàòîðà
ãëîáàëüíîé ïåðåìåíîé  _Calculated - îïðåäåëÿåòñÿ ãîòîâíîñòü èíäèêàòîðà íà âûïîëíåíèåÿ ñëåäóþùåãî ðàñ÷åòà..
ïî çàâåðøåíèþ ðàñ÷åòà èíäèêàîð âûñòàâëÿåò ôëàã _Calculated=true.. 
	
Ïðè âûõîäå êðàéíèõ òî÷åê îáúåêòà ëèíåéíîé ðåãðåñèè çà ãðàíèöû ýêðàíà ãðàôèêà ãðàôèê àâòîìàòè÷åñêè ïåðåìåùàåòñÿ, 
îòîáðàæàÿ íîâûé âûáðàííûé äèàïàçîí
Çàâåðøåíèå âûïîëíåíèÿ ñêðèïòà îñóùåñòâëÿåòñÿ óäàëåíèåì îáüåêòà ëèíåéíîé ðåãðåñèè ñ ïîñëåäóþùèì ïîäòâåðæäåíèåì íà âûãðóçêó
	
	Ìîè áëàãîäàðíîñòè çà íà÷àëüíóþ èäåþ Ïîääóáíîìó Îëåãó åãî ñêðèïò 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 gnShift		"CE_Shift"
#define gnCount		"CE_Count"
#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;
/*

Ïðèìåð  èñïîëüçîâàíèÿ â èíäèêàòîðå :

...

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

...

#define		IndicatorPrefix "LR_MA"

#define gnShift		"CE_Shift"
#define gnCount		"CE_Count"
#define gnEmulate		"_Emulated"
#define gnCalculate	"_CW_"
#define gnPauseCount	"_PauseCount"
string  CWName			="";			// óíèêàëüíîå èìÿ èíäèêàòîðà

int start()
{
bool		Emulated		=false;
bool		Calculated	=false;
bool		Checked		=false;
	if (CWName=="") {
		MathSrand(TimeLocal());
		CWName=gnCalculate+IndicatorPrefix+MathRand();
		Print(CWName);
	}

	if (GlobalVariableCheck(gnEmulate)==true)
	{
		Emulated=GlobalVariableGet(gnEmulate);
		if (GlobalVariableCheck(CWName)==false) GlobalVariableSet(CWName,true);
		Calculated=GlobalVariableGet(CWName);
		Checked=true;
	}
	if (Checked==false)
	{
    int limit;
     int counted_bars=IndicatorCounted();
  //---- ïîñëåäíèé ïîñ÷èòàííûé áàð áóäåò ïåðåñ÷èòàí
     if(counted_bars>0) counted_bars--;
     limit=Bars-counted_bars;
	}
	else {
		if (Calculated==true) return(0);
	}

  //---- îñíîâíîé öèêë

	if (Checked==true)
	{
		Shift=GlobalVariableGet(gnShift);
		Count=GlobalVariableGet(gnCount);
	}
	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);					// îòîáðàæåíèå íà ëèíèè èíäèêàòîðà
	

	if ((Checked==true)&&(Calculated==false)) GlobalVariableSet(CWName,true);
//----
   return(0);
  }
//+-----------------------------------------------------------------------------------------------+\\
//+-----------------------------------------------------------------------------------------------+\\
//+-----------------------------------------------------------------------------------------------+\\
int deinit()
  {
//----
	if (CWName!="") {
		if (GlobalVariableCheck(CWName)==true) GlobalVariableDel(CWName);		
		Print("Delete Global Variable");
	}

//----
   return(0);
  }
*/
//**************************************************************
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);
	
	GlobalVariableSet(gnShift,TickRight);
	GlobalVariableSet(gnCount,TickPrd);
	GlobalVariableSet(gnEmulate,Emulated);
	//GlobalVariableSet(gnCalculate,Calculated);
	GlobalVariableSet(gnPauseCount,PauseCount);

	//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 (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(gnShift,TickRight);
				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);
				}
				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); 
	GlobalVariableDel(gnShift);
	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