DeleteSpike

Author: Navoikov Alexey aka meat
0 Views
0 Downloads
0 Favorites
DeleteSpike
//+------------------------------------------------------------------+
//|                                                  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