//+------------------------------------------------------------------+ //| 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