Navigation:Home > Content >

babyMAX_для_THV.mq4

Time: 2011-07-14 | Download file:babyMAX_для_THV.mq4

// babyMAX.mq4
//	Индикатор для системы MAX - http://forexsystems.ru/ruchnye-torgovye-strategii-i-taktiki/39417-max-trading-system.html
// Автор Ale при участии roland17
// версия 26.09.2010

#property copyright "Ale"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 C'0,81,81'
#property indicator_color2 C'0,54,89'
#property indicator_color3 Aqua
#property indicator_color4 Maroon
#property indicator_color5 Green
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1
#property indicator_width5 1
#property indicator_minimum -2
#property indicator_maximum 2
#property indicator_level1 0
#property indicator_levelcolor Black
#property indicator_levelwidth 5
#property indicator_levelstyle 1


extern string	` = "** Настройки пересечения Momentum:";
extern int		PeriodPriceForMomentum = 1; // период усреднения цены для определения пересечения с линией Momentum
extern int		PeriodMomentum = 34; // период усреднения для линии Momentum
extern int		ShiftMomentum = 0; // сдвиг линии Momentum
					
extern string	`` = "** Настройки пересечения HomeBase:";
extern int		PeriodPriceForHomeBase = 1; // период усреднения цены для определения пересечения с линией HomeBase
extern int		PeriodHomeBase = 275; // период усреднения для линии HomeBase
extern int		ShiftHomeBase = 0; // сдвиг линии HomeBase
					
extern string	``` = "** Настройки линий Balance:";
extern int		PeriodBalanceFast = 89; // период усреднения быстрой Balance
extern int		ShiftBalanceFast = 0; // сдвиг быстрой линии Balance
extern int		PeriodBalanceSlow = 105; // период усреднения медленной Balance
extern int		ShiftBalanceSlow = 0; // сдвиг медленной линии Balance
					
extern string	```` = "** Настройки определения тренда:";
extern string	TimeFrame = ""; // рабочий таймфрейм
extern double	AnglePipsMomentum = 0.0; // Минимально необходимый угол наклона линии Momentum. В пунктах
extern double	AnglePipsBalanceFast = 0.0; // Минимально необходимый угол наклона быстрой линии Balance. В пунктах
extern double	AnglePipsBalanceSlow = 0.0; // Минимально необходимый угол наклона медленной линии Balance. В пунктах
extern double	SeparationPipsMomentum = 0.0; // Минимально необходимое разделение линии Momentum и быстрой линии Balance. В пунктах
extern double	SeparationPipsBalanceFast = 0.0; // Минимально необходимое разделение быстрой линии Balance и медленной линии Balance. В пунктах
extern bool		CounterTrandON = false; // разрешить входы против HomeBase
					
extern string	````` = "** Настройки отображения:";
extern bool		SoundON = true; // показывать алерт?
extern bool		DrawON = true; // рисовать гистограмму и стрелки?
extern bool		LineON = true; // рисовать вертикальную линию?
		 int		LineWidth = 1; // ширина линии
extern int		LineStyle = 4; // стиль линии
extern color	LineBuyColor = Green; // цвет линии для MOE Buy
extern color	LineSellColor = Maroon; // цвет линии для MOE Sell


double
	glo.dMOEposition = -1,
	glo.adBufCrossMom[], glo.adBufCrossHB[],
	glo.adBufMOELast[], glo.adBufMOEUp[], glo.adBufMOEDn[]
;
int
	glo.iAlertTime,
	glo.iPeriod
;
string
	glo.sIndicatorName = "бэбиМАКС",
	glo.sDebugFile = "МОЁ.dat",
	glo.sScriptName = "Б",
	glo.sSymbol
;



int init() {
	glo.sSymbol = Symbol();
	
	// рабочий ТФ в минутах:
	if(TimeFrame == "") glo.iPeriod = Period();
	else glo.iPeriod = StringToTimeFrame(TimeFrame);
	if(glo.iPeriod < Period()) glo.iPeriod = Period();
	
	// переведём пункты в цены:
	AnglePipsMomentum = MathMax(AnglePipsMomentum * Point, 0.000001);
	AnglePipsBalanceFast = MathMax(AnglePipsBalanceFast * Point, 0.000001);
	AnglePipsBalanceSlow = MathMax(AnglePipsBalanceSlow * Point, 0.000001);
	SeparationPipsMomentum = MathMax(SeparationPipsMomentum * Point, 0.000001);
	SeparationPipsBalanceFast = MathMax(SeparationPipsBalanceFast * Point, 0.000001);
		
	// уникальное имя для этого экземпляра индикатора:
	glo.sIndicatorName = MakeUniqueName(glo.sIndicatorName + "-" + glo.iPeriod + "-");
	IndicatorShortName(glo.sIndicatorName);
	
	// определим буфера данных:
	SetIndexBuffer(0, glo.adBufCrossHB); SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID);
	SetIndexBuffer(1, glo.adBufCrossMom); SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID);
	SetIndexBuffer(2, glo.adBufMOELast); SetIndexStyle(2, DRAW_ARROW, EMPTY); SetIndexArrow(2, 159); SetIndexEmptyValue(2, 0);
	SetIndexBuffer(3, glo.adBufMOEDn); SetIndexStyle(3, DRAW_ARROW, EMPTY); SetIndexArrow(3, 159);
	SetIndexBuffer(4, glo.adBufMOEUp); SetIndexStyle(4, DRAW_ARROW, EMPTY); SetIndexArrow(4, 159);
	
	if(!DrawON) { // если гистограмму рисовать не нужно
		SetIndexStyle(0, DRAW_NONE);
		SetIndexStyle(1, DRAW_NONE);
		SetIndexStyle(2, DRAW_NONE);
		SetIndexStyle(3, DRAW_NONE);
		SetIndexStyle(4, DRAW_NONE);
	}
	
	return(0);
}



int deinit() {
	if(LineON) RemoveObjects(glo.sIndicatorName); // уберём объекты этого экземпляра индикатора
	return(0);
}



int start() {
	int
		iBar, iPeriodBar,
		iBarsToCount, iBarsCounted = IndicatorCounted()
	;
	double
		dPriceCurr, dMACurr, dPricePrev, dMAPrev, dPriceNext, dMANext
	;
	
	if(iBarsCounted < 0) return(-1);
	if(iBarsCounted > 0) iBarsCounted--;
	iBarsToCount = Bars - iBarsCounted;
	
	for(iBar = iBarsToCount; iBar > 0; iBar--) {
		iPeriodBar = iBarShift(glo.sSymbol, glo.iPeriod, Time[iBar]);
		
		dPriceCurr = iMA(glo.sSymbol, glo.iPeriod, PeriodPriceForMomentum, 0, MODE_EMA , PRICE_MEDIAN, iPeriodBar);
		dPricePrev = iMA(glo.sSymbol, glo.iPeriod, PeriodPriceForMomentum, 0, MODE_EMA , PRICE_MEDIAN, iPeriodBar+1);
		dPriceNext = iMA(glo.sSymbol, glo.iPeriod, PeriodPriceForMomentum, 0, MODE_EMA , PRICE_MEDIAN, iPeriodBar-1);
		
		dMACurr = iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar);
		dMAPrev = iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar+1);
		dMANext = iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar-1);
		
		if(dPriceCurr > dMACurr && dPricePrev < dMAPrev && dPriceNext > dMANext)
			glo.adBufCrossMom[iBar] = 1;
		else if(dPriceCurr < dMACurr && dPricePrev > dMAPrev && dPriceNext < dMANext)
			glo.adBufCrossMom[iBar] = -1;
		else glo.adBufCrossMom[iBar] = glo.adBufCrossMom[iBar+1];
		
		dPriceCurr = iMA(glo.sSymbol, glo.iPeriod, PeriodPriceForHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar);
		dPricePrev = iMA(glo.sSymbol, glo.iPeriod, PeriodPriceForHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar+1);
		dPriceNext = iMA(glo.sSymbol, glo.iPeriod, PeriodPriceForHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar-1);
		
		dMACurr = iMA(glo.sSymbol, glo.iPeriod, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar);
		dMAPrev = iMA(glo.sSymbol, glo.iPeriod, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar+1);
		dMANext = iMA(glo.sSymbol, glo.iPeriod, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar-1);
		
		if(dPriceCurr > dMACurr && dPricePrev < dMAPrev && dPriceNext > dMANext)
			glo.adBufCrossHB[iBar] = 2;
		else if(dPriceCurr < dMACurr && dPricePrev > dMAPrev && dPriceNext < dMANext)
			glo.adBufCrossHB[iBar] = -2;
		else glo.adBufCrossHB[iBar] = glo.adBufCrossHB[iBar+1];
		
		if(glo.adBufCrossHB[iBar] + glo.adBufCrossMom[iBar] > 2) { // последние пересечения линий Momentum и HomeBase были направлены вверх
			if(glo.adBufMOELast[iBar+1] != 1.0) { // последний из направленных вверх сигналов на вход уже был аннулирован
				// Проверим правильнсть чередования, достаточность угла наклона и разделения 3х MA:
				if(
					iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar + ShiftMomentum)
					-
					iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast)
					>= SeparationPipsMomentum
				) { // Momentum выше BalanceFast + разделение достаточно на текущем баре (с учётом сдвига)
					if(
						iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast)
						-
						iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow)
						>= SeparationPipsBalanceFast
					) { // BalanceFast выше PeriodBalanceSlow + разделение достаточно
						if(
							iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar + ShiftMomentum)
							-
							iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar + ShiftMomentum + 1)
							>= AnglePipsMomentum
						) { // угол наклона линии Momentum достаточен
							if(
								iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast)
								-
								iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast + 1)
								>= AnglePipsBalanceFast
							) { // угол наклона линии BalanceFast достаточен
								if(
									iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow)
									-
									iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow + 1)
									>= AnglePipsBalanceSlow
								) { // угол наклона линии BalanceSlow достаточен
									if(
										CounterTrandON // если торговать против HomeBase разрешено
										|| (
											iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow)
											>
											iMA(glo.sSymbol, glo.iPeriod, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftHomeBase + 1)
										) // или линия Momentum выше HomeBase
									) {
										glo.adBufMOEUp[iBar] = -glo.dMOEposition; // стрелка вверх
										if(LineON) ObjectHandle(glo.sIndicatorName + "-" + Time[iBar], OBJ_VLINE, Time[iBar], 0, 0, 0, 0, LineBuyColor, LineWidth, LineStyle); // нарисуем линию если задано
										glo.adBufMOELast[iBar] = 1; // последний сигнал на вход направленн вверх
									}
								}
							}
						}
					}
				}
			}
			else glo.adBufMOELast[iBar] = 1; // последний из направленных вверх сигналов на вход по-прежнему не аннулирован
		}
		else // последнее пересечение линий Momentum или HomeBase не были направлены вверх
			if(glo.adBufMOELast[iBar+1] > 0.0) // если последний сигнал на вход был направлен вверх
				glo.adBufMOELast[iBar] = 0; // аннулируем его
		
		if(glo.adBufCrossHB[iBar] + glo.adBufCrossMom[iBar] < -2) { // последние пересечения линий Momentum и HomeBase были направлены вниз
			if(glo.adBufMOELast[iBar+1] > -1.0) { // последний из направленных вниз сигналов на вход уже был аннулирован
				// Проверим правильнсть чередования, достаточность угла наклона и разделения 3х MA:
				if(
					iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast)
					-
					iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar + ShiftMomentum)
					>= SeparationPipsMomentum
				) { // Momentum ниже BalanceFast + разделение достаточно на текущем баре (с учётом сдвига)
					if(
						iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow)
						-
						iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast)
						>= SeparationPipsBalanceFast
					) { // BalanceFast ниже PeriodBalanceSlow + разделение достаточно
						if(
							iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar + ShiftMomentum + 1)
							-
							iMA(glo.sSymbol, glo.iPeriod, PeriodMomentum, 0, MODE_EMA , PRICE_CLOSE, iPeriodBar + ShiftMomentum)
							>= AnglePipsMomentum
						) { // угол наклона линии Momentum достаточен
							if(
								iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast + 1)
								-
								iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceFast)
								>= AnglePipsBalanceFast
							) { // угол наклона линии BalanceFast достаточен
								if(
									iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow + 1)
									-
									iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow)
									>= AnglePipsBalanceSlow
								) { // угол наклона линии BalanceSlow достаточен
									if(
										CounterTrandON // если торговать против HomeBase разрешено
										|| (
											iMA(glo.sSymbol, glo.iPeriod, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftBalanceSlow)
											<
											iMA(glo.sSymbol, glo.iPeriod, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iPeriodBar + ShiftHomeBase + 1)
										) // или линия Momentum ниже HomeBase
									) {
										glo.adBufMOEDn[iBar] = glo.dMOEposition; // стрелка вниз
										if(LineON) ObjectHandle(glo.sIndicatorName + "-" + Time[iBar], OBJ_VLINE, Time[iBar], 0, 0, 0, 0, LineSellColor, LineWidth, LineStyle); // нарисуем линию если задано
										glo.adBufMOELast[iBar] = -1; // последний сигнал на вход направленн вниз
									}
								}
							}
						}
					}
				}
			}
			else glo.adBufMOELast[iBar] = -1; // последний из направленных вниз сигналов на вход по-прежнему не аннулирован
		}
		else // последнее пересечение линий Momentum или HomeBase не были направлены вниз
			if(glo.adBufMOELast[iBar+1] < 0.0) // если последний сигнал на вход был направлен вниз
				glo.adBufMOELast[iBar] = 0; // аннулируем его
		
		if(SoundON && iBar == 1 && glo.iAlertTime != Time[0]) {
			if(glo.adBufMOEUp[iBar] == -glo.dMOEposition) {
				Alert("Сложились условия для ПОКУПКИ ", glo.sSymbol, " ", TimeFrameToString(glo.iPeriod));
				glo.iAlertTime = Time[0];
			}
			else if(glo.adBufMOEDn[iBar] == glo.dMOEposition) {
				Alert("Сложились условия для ПРОДАЖИ ", glo.sSymbol, " ", TimeFrameToString(glo.iPeriod));
				glo.iAlertTime = Time[0];
			}
		}
	}
	return(0);
}


void ObjectHandle(string sObjectName, int iType = -1, datetime iTime1 = 0, double dPrice1 = 0, datetime iTime2 = 0, double dPrice2 = 0, int iArrowCode = 0, color cColor = Bisque, int iWidth = 0, int iStyle = 0, bool bRay = false, bool bBackground = true, int iWindow = 0) {
	// Объекты на графике
	if(ObjectFind(sObjectName) != -1) ObjectDelete(sObjectName);
	if(iType != -1) {
		ObjectCreate(sObjectName, iType, iWindow, 0, 0);
		ObjectSet(sObjectName, OBJPROP_TIME1, iTime1);
		ObjectSet(sObjectName, OBJPROP_PRICE1, dPrice1);
		ObjectSet(sObjectName, OBJPROP_ARROWCODE, iArrowCode);
		ObjectSet(sObjectName, OBJPROP_TIME2, iTime2);
		ObjectSet(sObjectName, OBJPROP_PRICE2, dPrice2);
		ObjectSet(sObjectName, OBJPROP_COLOR, cColor);
		ObjectSet(sObjectName, OBJPROP_STYLE, iStyle);
		ObjectSet(sObjectName, OBJPROP_WIDTH, iWidth);
		ObjectSet(sObjectName, OBJPROP_BACK, bBackground);
		ObjectSet(sObjectName, OBJPROP_RAY, bRay);
	}
}

/*
void SaveLog(string sMessage="") {
	// Запись сообщения в файл
	// Глобальные переменные: glo.sDebugFile, glo.sScriptName
	if(glo.sDebugFile != "" && sMessage != "") {
		if(glo.sScriptName != "") sMessage = glo.sScriptName + ": " + sMessage;
		int iHandle = FileOpen(glo.sDebugFile, FILE_CSV|FILE_READ|FILE_WRITE, '\t');
		if(iHandle > 0) {
			sMessage = TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS) + "  " + sMessage;
			FileSeek(iHandle, 0, SEEK_END);
			FileWrite(iHandle, sMessage);
			FileClose(iHandle);
		}
	}
}
*/

void RemoveObjects(string sName="", bool bExact=false) {
	// Удаляет объекты с графика
	int iObjectID = ObjectsTotal();
	while(iObjectID > 0) {
		iObjectID--;
		if(sName == "") ObjectDelete(ObjectName(iObjectID)); // если имя не указано - косим всех!
		else {
			if(bExact) { // если задано удалить только того, чьё имя указано
				if(ObjectName(iObjectID) == sName) ObjectDelete(ObjectName(iObjectID)); // kill'em
			}
			else {
				if(StringFind(ObjectName(iObjectID), sName) != 0) continue; // если имя граф.объекта не начинается с указанного - не наш клиент
				ObjectDelete(ObjectName(iObjectID)); // kill'em
			}
		}
	}
	
	return(0);
}


string TimeFrameToString (int iTimeFrame) {
	switch (iTimeFrame) {
		case PERIOD_M1		: return("M1");
		case PERIOD_M5		: return("M5");
		case PERIOD_M15	: return("M15");
		case PERIOD_M30	: return("M30");
		case PERIOD_H1		: return("H1");
		case PERIOD_H4		: return("H4");
		case PERIOD_D1		: return("D1");
		case PERIOD_W1		: return("W1");
		case PERIOD_MN1	: return("MN1");
	}
}


string MakeUniqueName(string sFirst = "", string sRest = "") {
	string sResult = sFirst + (MathRand()%1001) + sRest;
	while (WindowFind(sResult)> 0) sResult = sFirst + (MathRand()%1001) + sRest;
	return (sResult);
}


int StringToTimeFrame(string sTF) {
	// Используем функции: StringToUpper
	sTF = StringToUpper(sTF);
	int iTF = 0;
	if(sTF == "M1" || sTF == "1")				iTF = PERIOD_M1;
	else if(sTF == "M5" || sTF == "5")		iTF = PERIOD_M5;
	else if(sTF == "M15"|| sTF == "15")		iTF = PERIOD_M15;
	else if(sTF == "M30"|| sTF == "30")		iTF = PERIOD_M30;
	else if(sTF == "H1" || sTF == "60")		iTF = PERIOD_H1;
	else if(sTF == "H4" || sTF == "240")	iTF = PERIOD_H4;
	else if(sTF == "D1" || sTF == "1440")	iTF = PERIOD_D1;
	else if(sTF == "W1" || sTF == "10080")	iTF = PERIOD_W1;
	else if(sTF == "MN" || sTF == "43200")	iTF = PERIOD_MN1;
//	if(iTF == 0) iTF = Period();
	return(iTF);
}


string StringToUpper (string sString) {
	string
		sOutput = "",
		sLower = "abcdefghijklmnopqrstuvwxyz",
		sUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	;
	for(int i=0; i=0) sOutput = sOutput + StringSubstr(sUpper, iPos, 1);
		else sOutput = sOutput + StringSubstr(sString, i, 1);
	}
	return(sOutput);
}

Recommend