148 lines
6.5 KiB
Plaintext
148 lines
6.5 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| KeyFinder.mq5 |
|
|
//| Trofimov Pavel |
|
|
//| trofimovpp@mail.ru |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Trofimov Pavel"
|
|
#property link "trofimovpp@mail.ru"
|
|
#property version "1.00"
|
|
#property description "Âíèìàíèå! Äàííûé àëãîðèòì èñïîëüçóåò â ðàñ÷åòàõ öèêëû!"
|
|
#property description "Íàñòîÿòåëüíî ðåêîìåíäóåòñÿ çàäàâàòü äëÿ îáðàáîòêè íå áîëåå 1000 áàðîâ!"
|
|
#property script_show_inputs
|
|
//--- input parameters
|
|
input int MinDimesion=5;//Ìèíèìàëüíàÿ ðàçìåðíîñòü òî÷åê
|
|
input int MaxBars=300;//Êîëè÷åñòâî îáðàáàòûâàåìûõ áàðîâ
|
|
//+------------------------------------------------------------------+
|
|
//| Script program start function |
|
|
//+------------------------------------------------------------------+
|
|
void OnStart()
|
|
{
|
|
//---
|
|
//ïðîâåðêà äîñòóïíîñòè èñòîðèè äëÿ óñòàíîâëåííîãî êîëè÷åñòâà áàðîâ
|
|
int SMaxBars=Bars(Symbol(),0),iMaxBars=MaxBars;
|
|
if(SMaxBars<MaxBars)
|
|
{
|
|
iMaxBars=SMaxBars;
|
|
Comment("Ïàðàìåòð MaxBars çàäàí ñëèøêîì áîëüøèì."+"\n"+"Äëÿ ðàñ÷åòîâ áóäåò èñïîëüçîâàíî "+IntegerToString(SMaxBars)+" áàðîâ.");
|
|
};
|
|
int clean=CleanChart();//÷èñòèì ãðàôèê ïðè ïîâòîðíîì ïðèìåíåíèè
|
|
MqlRates rates_array[];
|
|
string Com="";
|
|
int iCod=CopyRates(Symbol(),Period(),0,iMaxBars,rates_array);//êîëè÷åñòâî ýëåìåíòîâ ìàññèâà
|
|
iCod=iCod-1;//Èíäåêñ ìàêñèìàëüíîãî ýëåìåíòà â ìàññèâå
|
|
Com="Ðàáîòàþ...Æäèòå!";
|
|
Comment(Com);
|
|
if(iCod>0)
|
|
{
|
|
FindUpKeyPoints(iCod,rates_array);//Ïîèñê âåðõíèõ êëþ÷åâûõ òî÷åê
|
|
Com=Com+"\n"+"Îáðàáîòàíû âåðõíèå òî÷êè."+"\n";
|
|
Comment(Com);
|
|
FindLowKeyPoints(iCod,rates_array);//Ïîèñê íèæíèõ êëþ÷åâûõ òî÷åê
|
|
Comment("Îáðàáîòêà çàâåðøåíà");
|
|
}
|
|
else Comment("Îòñóòñòâóþò áàðû äëÿ îáðàáîòêè!!!");
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Ïîèñê âåðõíèõ êëþ÷åâûõ òî÷åê |
|
|
//+------------------------------------------------------------------+
|
|
void FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])
|
|
{
|
|
int HD=1;
|
|
for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)//öèêë ïî áàðàì îò êîíå÷íîãî - MinDimension äî íóëåâîãî + MinDimension
|
|
{
|
|
HD=getHighDimension(temp_rates,i,temp_iCod);//ïîëó÷àåì ðàçìåðíîñòü òî÷åê
|
|
if((HD>=MinDimesion) || (HD==-1))
|
|
{//ñîçäàåì ìàðêó åñëè ïîïàäàåò ïîä óñëîâèÿ MinDimension
|
|
string Ob_Name="KF_Label"+IntegerToString(i);
|
|
if(HD!=-1)
|
|
{
|
|
ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].high);
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_LOWER);
|
|
ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(HD));
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
|
|
}
|
|
else
|
|
{ //Åñëè íå ìîæåì îïðåäåëèòü ðàçìåðíîñòü ìàðêèðóåì øàðèêîì
|
|
ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].high);
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_BOTTOM);
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
|
|
};
|
|
};
|
|
};
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Ïîèñê íèæíèõ êëþ÷åâûõ òî÷åê |
|
|
//+------------------------------------------------------------------+
|
|
void FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])
|
|
{
|
|
int LD=1;//èíèöèàëèçèðóåì ðàçìåðíîñòè òî÷åê
|
|
bool iCreate;
|
|
for(int i=temp_iCod-MinDimesion; i>(MinDimesion-1); i--)
|
|
{
|
|
LD=getLowDimension(temp_rates,i,temp_iCod);
|
|
if((LD>=MinDimesion) || (LD==-1))
|
|
{
|
|
string Ob_Name="KF_Label"+IntegerToString(i)+"_1";//Ñòðàõóåìñÿ îò áàðîâ ãäå ëîé è õàé ìîãóò áûòü êëþ÷åâûìè òî÷êàìè
|
|
if(LD!=-1)
|
|
{
|
|
iCreate=ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].low);
|
|
if(iCreate)
|
|
{
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_UPPER);
|
|
ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(LD));
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
|
|
}
|
|
else Comment("Íå ìîãó ñîçäàòü îáúåêò");
|
|
}
|
|
else
|
|
{
|
|
iCreate=ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].low);
|
|
if(iCreate)
|
|
{
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_TOP);
|
|
ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
|
|
}
|
|
else Comment("Íå ìîãó ñîçäàòü îáúåêò");
|
|
};
|
|
};
|
|
};
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Îïðåäåëåíèå ðàçìåðíîñòè âåðõíåé òî÷êè |
|
|
//+------------------------------------------------------------------+
|
|
int getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)
|
|
{
|
|
int k=1;
|
|
while((tmpRates[tmp_i].high>tmpRates[tmp_i+k].high) && (tmpRates[tmp_i].high>tmpRates[tmp_i-k].high) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++;
|
|
if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1;
|
|
return(k);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Îïðåäåëåíèå ðàçìåðíîñòè íèæíåé òî÷êè |
|
|
//+------------------------------------------------------------------+
|
|
int getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)
|
|
{
|
|
int k=1;
|
|
while((tmpRates[tmp_i].low<tmpRates[tmp_i+k].low) && (tmpRates[tmp_i].low<tmpRates[tmp_i-k].low) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++;
|
|
if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1;
|
|
return(k);
|
|
}
|
|
//+-------------------------------------------------------------------------------+
|
|
//| Î÷èñòêà ãðàôèêà îò ñîçäàííûõ ñêðèïòîì îáúåêòîâ â ñëó÷àå ïîâòîðíîãî ïðèìåíåíèÿ |
|
|
//+-------------------------------------------------------------------------------+
|
|
int CleanChart()
|
|
{
|
|
string Label="KF_Label";
|
|
int obj_total=ObjectsTotal(0,0,-1),n=0;
|
|
for(int obj=obj_total-1; obj>=0; obj--)
|
|
{
|
|
string objname=ObjectName(0,obj,0,-1);
|
|
if(StringFind(objname,Label)>=0) ObjectDelete(0,objname);
|
|
n++;
|
|
}
|
|
return(n);
|
|
}
|
|
//+------------------------------------------------------------------+
|