//+------------------------------------------------------------------+
//| 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);
}
//**************************************************************
Comments