//+------------------------------------------------------------------+
//| DeleteSpike.mq4 | v.1.0
//+------------------------------------------------------------------+
#property copyright "Navoikov Alexey aka meat"
#property link "nalx@yandex.ru"
#import "user32.dll"
int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
int GetDlgItem(int hDlg, int nIDDlgItem);
int GetAncestor(int hwnd, int gaFlags);
int FindWindowExA(int hwndParent, int hwndChildAfter, string lpClassName, string lpWindowName);
int CharPrevA(string lpszStart,string lpszCurrent); // èñïîëüçóåì äëÿ ïîëó÷åíèÿ àäðåñà ñòðîêè
int CharPrevW(int lpszStart[],int lpszCurrent[]); // èñïîëüçóåì äëÿ ïîëó÷åíèÿ àäðåñà ìàññèâà öåëûõ ÷èñåë
#import
#include <WinUser32.mqh>
#define TVM_GETCOUNT 4357
#define TVM_GETNEXTITEM 4362
#define TVM_SELECTITEM 4363
#define TVM_GETITEM 4364
#define TVGN_ROOT 0
#define TVGN_NEXT 1
#define TVGN_CHILD 4
#define TVGN_CARET 9
#define TVIF_TEXT 1
#define LVM_GETITEMCOUNT 4100
#define LVM_GETITEMTEXT 4141
#define LVM_ENSUREVISIBLE 4115
#define LVM_SETITEMSTATE 4139
#define LVIS_SELECTED 2
#define LVIS_FOCUSED 1
#define BM_CLICK 245
string textbuffer="Àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ";
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
int time=WindowTimeOnDropped();
if (time==0) { Alert("Íåîáõîäèìî ïåðåòàùèòü ñêðèïò íà òðåáóåìûé áàð!"); return(0); }
if (!IsDllsAllowed()) { Alert("Íåîáõîäèìî ðàçðåøèòü DLL â íàñòðîéêàõ!"); return(0); }
int bar=iBarShift(NULL,0,time);
string TimeString=TimeToStr(time);
string ParameterNames[5]={ "Open","High","Low","Close","Volume" };
string BarParameterStrings[5];
BarParameterStrings[0]=DoubleToStr(Open[bar],Digits);
BarParameterStrings[1]=DoubleToStr(High[bar],Digits);
BarParameterStrings[2]=DoubleToStr(Low[bar],Digits);
BarParameterStrings[3]=DoubleToStr(Close[bar],Digits);
BarParameterStrings[4]=DoubleToStr(Volume[bar],0);
string text=StringConcatenate("Óäàëèòü áàð ¹",bar," ?","\nTime:\t",TimeString);
for (int n=0; n<5; n++)
text=text+"\n"+ParameterNames[n]+":\t"+BarParameterStrings[n];
bool Delete=false;
int btn=MessageBox(text,0,MB_YESNOCANCEL);
if (btn==IDYES) Delete=true;
if (btn==IDCANCEL) return(0);
int hChart=WindowHandle(Symbol(),Period());
int hTerminal=GetAncestor(hChart,3);
int hArchiveWindow=OpenArchiveWindow(hTerminal);
if (hArchiveWindow==0) { Alert("Íå íàéäåíî îêíî àðõèâà êîòèðîâîê"); return(0); }
CloseWindow(hArchiveWindow); // ñâ¸ðòûâàåì îêíî â çíà÷îê
int hTreeView=GetDlgItem(hArchiveWindow,0x546);
int hSymbol=SelectSymbol(hTreeView,Symbol());
if (hSymbol==0) { Alert("Òåêóùèé èíñòðóìåíò íå íàéäåí â àðõèâå êîòèðîâîê"); return(0); }
if (!SelectTimeframe(hTreeView,hSymbol,Period()))
{ Alert("Òåêóùèé òàéìôðåéì íå íàéäåí â àðõèâå êîòèðîâîê"); return(0); }
int hListView=GetDlgItem(hArchiveWindow,0x4F4);
string FindBarParameterStrings[5];
if (!FindBar(hListView,TimeString,FindBarParameterStrings))
{ Alert("Âûáðàííûé áàð íå íàéäåí â àðõèâå êîòèðîâîê!"); return(0); }
if (Delete)
{
string txt="";
bool ok=true;
for (int i=0; i<5; i++)
{
txt=txt+"\n"+ParameterNames[i]+":\t"+BarParameterStrings[i]+"\t"+FindBarParameterStrings[i];
if (FindBarParameterStrings[i]!=BarParameterStrings[i]) ok=false;
}
if (!ok)
if (MessageBox("Ïàðàìåòðû áàðà îòëè÷àþòñÿ!\n\tÃðàôèê\tÀðõèâ"+txt+"\n\nÂñ¸ ðàâíî óäàëèòü?",0,MB_YESNO)
!=IDYES) Delete=false;
}
int IdButton=0x459; // ïðàâêà
if (Delete) IdButton=0x44C; // óäàëèòü
int hButton=GetDlgItem(hArchiveWindow,IdButton);
PostMessageA(hButton,BM_CLICK,0,0);
//EnableWindow(hTerminal,true);
SendMessageA(hArchiveWindow,WM_CLOSE,0,0); // çàêðûòèå îêíà
int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hChart,MT4InternalMsg, 2, 1); //ýìóëÿöèÿ òèêà
return(0);
}
//---- Îòêðûòèå îêíà àðõèâà êîòèðîâîê ----
int OpenArchiveWindow(int hTerminal)
{
string null_string;
int h=0;
bool postmessage=0;
while (true)
{
h=FindWindowExA(0,h,"#32770",null_string);
if (h==0)
if (!postmessage)
{ PostMessageA(hTerminal,WM_COMMAND,33262,0); Sleep(100); postmessage=true; continue; }
else return(0);
if (GetAncestor(h,3)!=hTerminal) continue;
GetWindowTextA(h,textbuffer,255);
if (StringFind(textbuffer,"Àðõèâ êîòèðîâîê")==0) break;
}
return(h);
}
//---- Ïîèñê è âûáîð çàäàííîãî èíñòðóìåíòà â äðåâîâèäíîì ñïèñêå ----
int SelectSymbol(int hTreeView,string symbol)
{
int count=SendMessageA(hTreeView,TVM_GETCOUNT,0,0);
int TVITEM[10];
int TVITEM_address=CharPrevW(TVITEM,TVITEM); // ïîëó÷àåì àäðåñ ìàññèâà // Dll_GetAddressOfInteger(TVITEM);
int textbuffer_address=CharPrevA(textbuffer,textbuffer); // ïîëó÷àåì àäðåñ òåêñòîâîãî áóôåðà // Dll_GetAddressOfString(textbuffer);
int hRoot=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_ROOT,0);
int hGroup=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_CHILD,hRoot);
int hSymbol=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_CHILD,hGroup);
int Count=0;
while (hGroup>0)
{
if (hSymbol==0)
{
hGroup=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_NEXT,hGroup);
hSymbol=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_CHILD,hGroup);
continue;
}
TVITEM[0]=TVIF_TEXT;
TVITEM[1]=hSymbol;
TVITEM[4]=textbuffer_address;
TVITEM[5]=255;
bool result=SendMessageA(hTreeView,TVM_GETITEM,0,TVITEM_address);
if (result>0) Count++;
if (textbuffer==symbol) break;
hSymbol=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_NEXT,hSymbol);
}
if (hGroup==0) return(0);
SendMessageA(hTreeView,TVM_SELECTITEM,TVGN_CARET,hSymbol);
SendMessageA(hTreeView,WM_LBUTTONDBLCLK,0,0);
return(hSymbol);
}
//---- Âûáîð íóæíîãî òàéìôðåéìà ----
bool SelectTimeframe(int hTreeView,int hSymbol,int period)
{
int hPeriod=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_CHILD,hSymbol);
int Periods[]={ PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1 };
for (int i=0; i<ArraySize(Periods); i++)
{
if (period==Periods[i]) break;
hPeriod=SendMessageA(hTreeView,TVM_GETNEXTITEM,TVGN_NEXT,hPeriod);
}
if (hPeriod==0) return(0);
SendMessageA(hTreeView,TVM_SELECTITEM,TVGN_CARET,hPeriod);
SendMessageA(hTreeView,WM_LBUTTONDBLCLK,0,0);
return(true);
}
//---- Ïîèñê è âûäåëåíèå áàðà ñ òðåáóåìûì âðåìåíåì â ñïèñêå ----
bool FindBar(int hListView, string timestring, string& valuestring[])
{
int LVITEM[10];
int LVITEM_address=CharPrevW(LVITEM,LVITEM); // ïîëó÷àåì àäðåñ ìàññèâà // Dll_GetAddressOfInteger(LVITEM);
LVITEM[2]=0; // subitem
LVITEM[5]=CharPrevA(textbuffer,textbuffer); // ïîëó÷àåì àäðåñ òåêñòîâîãî áóôåðà // Dll_GetAddressOfString(textbuffer);
LVITEM[6]=255; // textmask
int ItemsCount=SendMessageA(hListView,LVM_GETITEMCOUNT,0,0);
for (int i=0; i<ItemsCount; i++)
{
if (SendMessageA(hListView,LVM_GETITEMTEXT,i,LVITEM_address)==0) continue;
if (textbuffer==timestring) break;
}
if (i==ItemsCount) return(0);
//---- Ïîëó÷åíèå çíà÷åíèé öåí è îáú¸ìà âûáðàííîãî áàðà ----
for (int j=0; j<ArraySize(valuestring); j++)
{
LVITEM[2]=j+1; // subitem
if (SendMessageA(hListView,LVM_GETITEMTEXT,i,LVITEM_address)>0)
valuestring[j]=textbuffer+"";
else valuestring[j]="";
}
// âûäåëÿåì íàéäåííûé ýëåìåíò è äåëàåì åãî âèäèìûì
LVITEM[3]=LVIS_FOCUSED|LVIS_SELECTED; // state
LVITEM[4]=LVIS_FOCUSED|LVIS_SELECTED; // statemask
SendMessageA(hListView,LVM_SETITEMSTATE,i,LVITEM_address);
SendMessageA(hListView,LVM_ENSUREVISIBLE,i,0);
return(true);
}
Comments