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