Скачать MetaTrader 5

помогите исправить баг

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
3veriek
27
3veriek  
//+------------------------------------------------------------------+
//| forAnna.mq4 |
//+------------------------------------------------------------------+
//| Version 01. Mxx. 07.10.10 |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_width1 1
#property indicator_width2 1

extern int prmBars = 1000;
extern int prmLength = 5;
extern double width=0.05;

///////////////////////////////////////////////////////////
double MarkNord[];
double MarkZuid[];

void init()
{
IndicatorDigits(Digits);

SetIndexStyle (0, DRAW_ARROW); SetIndexArrow(0, 163);
SetIndexBuffer(0, MarkNord);
SetIndexStyle (1, DRAW_ARROW); SetIndexArrow(1, 163);
SetIndexBuffer(1, MarkZuid);

IndicatorShortName("Frct:"+prmLength);
SetIndexLabel(0, "top:"+prmLength);
SetIndexLabel(1, "bot");
}
//=========================================================

void start()
{
int nMax = prmBars; //количество бар
if (nMax < 10 || nMax > Bars)
nMax = Bars;
ObjectsDeleteAll();
int nRight = (prmLength-1)/2;
int prevTop = nMax+prmLength; //количество бар перед верхним фракталом
int prevBot = nMax+prmLength; //количество бар перед нижним фракталом
int nOffset = prmLength/2;
if (prmLength%2 == 0)
nOffset--;
int shift=iTime(NULL,0,prmBars);
string t=TimeToStr(shift,TIME_DATE|TIME_SECONDS);
Print("shift of bar with open time ",t," is ",shift);

///////////////////////////////////////////////////////
for (int k = nMax-prmLength/2; nRight <= k; k--) {

if (nOffset < prevTop-k && true == GetTopFrac(k, prmLength)) {
MarkNord[k] = High[k]; //EMPTY_VALUE
// Print("MarkNord[k]: ",MarkNord[k]);
prevTop = k;
//
}
//Print("High[k]: ",High[k]);

if (nOffset < prevBot-k && true == GetBotFrac(k, prmLength)) {
MarkZuid[k] = Low[k];
// Print("MarkZuid[k]: ",MarkZuid[k]);
prevBot = k;
// Print("prevBot: ",prevBot);
}
//Print("Low[k]: ",Low[k]);
}
/* bool test = true;
if (MarkNord[0] == EMPTY_VALUE) test = false;
Print("prevTop: ", test, " ", DoubleToStr(MarkNord[0],4));*/
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int Has_Fractal_Regd[]; //массив для хранения информации о том, был ли i-й фрактал уже учтен ранее
ArrayResize(Has_Fractal_Regd, nMax);
//ArrayInitialize(Has_Fractal_Regd, 0);
int Fr_Chart[]; //Содержит количество Slave-фракталов в зоне Ведущего (i-го) Master-фрактала
ArrayResize (Fr_Chart, nMax);
int temp,cnt; //Глобальный счетчик и Счетчик для прохода от последнего фр-ла до самого старого
double Carrier; //Значение средней величины зоны (не важно: Up или Down)
double CurrentFr; //Контейнер для хранения рассматриваемого Slave-фрактала
int maxValueIdx; //saves index of the max val of array
int maxValue;
Print(" HERE ARE RESULTS: RATING OF FRACTALS ");
//=====================//Цикл для взятия Фр-ла и детерменирования его F-zone==========================================================================================
for(temp=0; temp<=prmBars; temp++)
{
if( MarkNord[temp]!= EMPTY_VALUE || MarkZuid[temp]!= EMPTY_VALUE ) // temp-й бар - фрактал? (не важно: Up или Down)
{
if (MarkNord[temp]== EMPTY_VALUE) Carrier=MarkZuid[temp];
else Carrier=MarkNord[temp]; //Текущий Фр-ал - теперь это среднее(carrier) значение своей F-zone
for( cnt=temp+1; cnt<=prmBars; cnt++ ) //перебираем все БОЛЕЕ старые бары
{
if( (MarkNord[cnt]!=EMPTY_VALUE || MarkZuid[cnt]!=EMPTY_VALUE) && (Has_Fractal_Regd[cnt]==0) ) //Если ЭТОТ бар - фрактал и он не входил ни в чью зону, то
{
if(MarkNord[cnt]!=EMPTY_VALUE) CurrentFr=MarkNord[cnt];
else CurrentFr=MarkZuid[cnt]; //КТО из них фрактал а кто ноль?
if( CurrentFr<=Carrier+width && CurrentFr>=Carrier-width ) //если текущий фрактал попал в F-zone
{
Has_Fractal_Regd[cnt]=1; //Фиксиреум факт попадпния в F-zone
Fr_Chart[temp]++; //Увеличиваем рейтинг Master-фрактала
}
}
}
// Fr_Chart[temp]++;
}
}
maxValueIdx=ArrayMaximum(Fr_Chart); //РЕЗУЛЬТАТ поиска максимальных зон:
maxValue =Fr_Chart[maxValueIdx];
int coz=0;
for(temp=prmBars; temp>=0; temp--) //перебираем весь массив с рейтингами и выбираем САМЫЕ популярные зоны (А вдрух не одна, а n?)
{
if( Fr_Chart[temp]==maxValue ) // Если взятый фрактал возглавляет одну из сам попул. зон....то:
{
if(MarkNord[temp]!=EMPTY_VALUE)
Print("Max value = ", maxValue+1," Time: ",TimeToStr(iTime(NULL,0,temp),TIME_DATE|TIME_MINUTES)," №: ",temp," Value: ",iHigh(NULL,0,temp));
else
Print("Max value = ", maxValue+1," Time: ",TimeToStr(iTime(NULL,0,temp),TIME_DATE|TIME_MINUTES)," №: ",temp," Value: ",iLow(NULL,0,temp));
coz++; //coz - количество построенных зон
}
}
Print("count of zone: ",coz);
//===================================== End Outputing =========================================================================
//=====================================Painting All Most Populular zones=====================================
for(temp=0; temp<=prmBars; temp++) //перебираем весь массив с рейтингами и выбираем САМЫЕ популярные зоны (А вдрух не одна, а n?)
{
string str = "Obj_"+temp;
ObjectSet(str, OBJPROP_COLOR, Gold);
if( Fr_Chart[temp]==maxValue )
if(MarkNord[temp]!=EMPTY_VALUE)
ObjectCreate(str, OBJ_RECTANGLE, 0, 0, iHigh(NULL,0,temp)-width, t, iHigh(NULL,0,temp)+width);
else
ObjectCreate(str, OBJ_RECTANGLE, 0, 0, iLow(NULL,0,temp)-width, t, iLow(NULL,0,temp)+width);
}
}
//=========================================================

bool GetTopFrac (int shift, int nLength)
// Bерхние фракталы
{
int j, nVl, nVr;

// Левая часть
for (j = nLength/2; j > 0; j--) {
nVl = 0.5 + High[shift+j ]/Point;
nVr = 0.5 + High[shift+j-1]/Point;
if (nVr >= nVl) {
}
else
return(false);
}

// Правая часть
int nRight = (nLength-1)/2;
for (j = 1; j <= nRight; j++) {
nVl = 0.5 + High[shift-j+1]/Point;
nVr = 0.5 + High[shift-j ]/Point;
if (nVl >= nVr) {
}
else
return(false);
}
return(true);
}
//=========================================================

bool GetBotFrac (int shift, int nLength)
// Нижние фракталы
{
int j, nVl, nVr;

// Левая часть
for (j = nLength/2; j > 0; j--) {
nVl = 0.5 + Low[shift+j ]/Point;
nVr = 0.5 + Low[shift+j-1]/Point;
if (nVr <= nVl) {
}
else
return(false);
}

// Правая часть
int nRight = (nLength-1)/2;
for (j = 1; j <= nRight; j++) {
nVl = 0.5 + Low[shift-j+1]/Point;
nVr = 0.5 + Low[shift-j ]/Point;
if (nVl <= nVr) {
}
else
return(false);
}
return(true);
}
//=========================================================

Прога должна рисовать самые "популярные" зоны


Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий