Navigation:Home > Content >

babyMAX.mq4

Time: 2012-09-19 | Download file:babyMAX.mq4

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


#property copyright "Ale"

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 C'0,81,81'
#property indicator_color2 C'104,99,0'
#property indicator_color3 DeepPink
#property indicator_color4 RoyalBlue
#property indicator_color5 White
#property indicator_width1 12
#property indicator_width2 12
#property indicator_width3 4
#property indicator_width4 4
#property indicator_width5 3
#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 = 3; // период усреднения цены для определения пересечения с линией Momentum
extern int		PeriodMomentum = 21; // период усреднения для линии Momentum
extern int		ShiftMomentum = 0; // сдвиг линии Momentum
					
extern string	`` = "** Настройки пересечения HomeBase:";
extern int		PeriodPriceForHomeBase = 3; // период усреднения цены для определения пересечения с линией HomeBase
extern int		PeriodHomeBase = 233; // период усреднения для линии HomeBase
extern int		ShiftHomeBase = 0; // сдвиг линии HomeBase
					
extern string	``` = "** Настройки линий Balance:";
extern int		PeriodBalanceFast = 55; // период усреднения быстрой Balance
extern int		ShiftBalanceFast = 0; // сдвиг быстрой линии Balance
extern int		PeriodBalanceSlow = 89; // период усреднения медленной Balance
extern int		ShiftBalanceSlow = 0; // сдвиг медленной линии Balance
					
extern string	```` = "** Настройки определения тренда:";
extern double	AnglePips = 0.3; // Минимально необходимый угол наклона трёх MA. В пунктах
extern double	SeparationPips = 0.5; // Минимально необходимое разделение трёх MA. В пунктах
extern bool		CounterTrandON = false; // разрешить входы против HomeBase
					
extern string	````` = "** Настройки отображения:";
extern bool		SoundON = TRUE; // показывать алерт?
extern bool		LineON = TRUE; // рисовать вертикальную линию?
		 int		LineWidth = 1; // ширина линии
extern int		LineStyle = 1; // стиль линии
//extern color	LineColor = MediumSpringGreen; // цвет линии


double
	glo.dMOEposition = 0.7,
	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();
	glo.iPeriod = Period();
	AnglePips = MathMax(AnglePips * Point, 0.000001);
	SeparationPips = MathMax(SeparationPips * Point, 0.000001);
	
	IndicatorShortName(glo.sIndicatorName);
	
	IndicatorBuffers(5);
	SetIndexBuffer(0, glo.adBufCrossHB);
	SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID);
	SetIndexBuffer(1, glo.adBufCrossMom);
	SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID);
	SetIndexBuffer(2, glo.adBufMOEDn);
	SetIndexStyle(2, DRAW_ARROW, EMPTY);
	SetIndexArrow(2, 234);
	SetIndexBuffer(3, glo.adBufMOEUp);
	SetIndexStyle(3, DRAW_ARROW, EMPTY);
	SetIndexArrow(3, 233);
	SetIndexBuffer(4, glo.adBufMOELast);
	SetIndexEmptyValue(4, 0);
	SetIndexStyle(4, DRAW_ARROW, EMPTY);
	SetIndexArrow(4, 159);
	
	return(0);
}



int deinit() {
	if(LineON) RemoveObjects("MOE_");
	return(0);
}



int start() {
	int
		iBar,
		iBarsToCount,
		iBarsCounted = IndicatorCounted()
	;
	double
		dPriceCurr, dMACurr, dPricePrev, dMAPrev, dPriceNext, dMANext,
		dPriceForMomentumCurr, dMomentumCurr, dPriceForMomentumPrev, dMomentumPrev, dPriceForMomentumNext, dMomentumNext,
		dPriceForHomeBaseCurr, dHomeBaseCurr, dPriceForHomeBasePrev, dHomeBasePrev, dPriceForHomeBaseNext, dHomeBaseNext
	;
	
	if(iBarsCounted < 0) return(-1);
	if(iBarsCounted > 0) iBarsCounted--;
	iBarsToCount = Bars - iBarsCounted;
	
	for(iBar = iBarsToCount; iBar > 0; iBar--) {
		
		dPriceCurr = iMA(NULL, 0, PeriodPriceForMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar);
		dPricePrev = iMA(NULL, 0, PeriodPriceForMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar+1);
		dPriceNext = iMA(NULL, 0, PeriodPriceForMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar-1);
		
		dMACurr = iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar);
		dMAPrev = iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar+1);
		dMANext = iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar-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(NULL, 0, PeriodPriceForHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar);
		dPricePrev = iMA(NULL, 0, PeriodPriceForHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar+1);
		dPriceNext = iMA(NULL, 0, PeriodPriceForHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar-1);
		
		dMACurr = iMA(NULL, 0, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar);
		dMAPrev = iMA(NULL, 0, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar+1);
		dMANext = iMA(NULL, 0, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar-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(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftMomentum)
					-
					iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast)
					>= SeparationPips
				) { // Momentum выше BalanceFast + разделение достаточно на текущем баре (с учётом сдвига)
					if(
						iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast)
						-
						iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow)
						>= SeparationPips
					) { // BalanceFast выше PeriodBalanceSlow + разделение достаточно
						if(
							iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftMomentum)
							-
							iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftMomentum + 1)
							>= AnglePips
						) { // угол наклона линии Momentum достаточен
							if(
								iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast)
								-
								iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast + 1)
								>= AnglePips
							) { // угол наклона линии BalanceFast достаточен
								if(
									iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow)
									-
									iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow + 1)
									>= AnglePips
								) { // угол наклона линии BalanceSlow достаточен
									if(
										CounterTrandON // если торговать против HomeBase разрешено
										|| (
											iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow)
											>
											iMA(NULL, 0, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftHomeBase + 1)
										) // или линия Momentum выше HomeBase
									) {
//SaveLog(TimeToStr(Time[iBar]));
										glo.adBufMOEUp[iBar] = -glo.dMOEposition; // стрелка вверх
										if(LineON) ObjectHandle("MOE_" + Time[iBar], OBJ_VLINE, Time[iBar], 0, 0, 0, 0, RoyalBlue, 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(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast)
					-
					iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftMomentum)
					>= SeparationPips
				) { // Momentum ниже BalanceFast + разделение достаточно на текущем баре (с учётом сдвига)
					if(
						iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow)
						-
						iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast)
						>= SeparationPips
					) { // BalanceFast ниже PeriodBalanceSlow + разделение достаточно
						if(
							iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftMomentum + 1)
							-
							iMA(NULL, 0, PeriodMomentum, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftMomentum)
							>= AnglePips
						) { // угол наклона линии Momentum достаточен
							if(
								iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast + 1)
								-
								iMA(NULL, 0, PeriodBalanceFast, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceFast)
								>= AnglePips
							) { // угол наклона линии BalanceFast достаточен
								if(
									iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow + 1)
									-
									iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow)
									>= AnglePips
								) { // угол наклона линии BalanceSlow достаточен
									if(
										CounterTrandON // если торговать против HomeBase разрешено
										|| (
											iMA(NULL, 0, PeriodBalanceSlow, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftBalanceSlow)
											<
											iMA(NULL, 0, PeriodHomeBase, 0, MODE_EMA, PRICE_CLOSE, iBar + ShiftHomeBase + 1)
										) // или линия Momentum ниже HomeBase
									) {
										glo.adBufMOEDn[iBar] = glo.dMOEposition; // стрелка вниз
										if(LineON) ObjectHandle("MOE_" + Time[iBar], OBJ_VLINE, Time[iBar], 0, 0, 0, 0, DeepPink, 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.adBufMOELast[iBar] != -1 && glo.adBufMOELast[iBar] != 1) glo.adBufMOELast[iBar] = 0;
		
//SaveLog(TimeToStr(Time[iBar]) + " Last=" + glo.adBufMOELast[iBar] + " Up=" + glo.adBufMOEUp[iBar] + " Dn=" + glo.adBufMOEDn[iBar] + " HB=" + glo.adBufCrossHB[iBar] + " Mom=" + glo.adBufCrossMom[iBar]);
		if(SoundON && iBar == 1 && glo.iAlertTime != Time[0]) {
			if(glo.adBufMOEUp[iBar] == -glo.dMOEposition) {
				Alert("Сложились условия для ПОКУПКИ ", glo.sSymbol, " ", glo.iPeriod);
				glo.iAlertTime = Time[0];
			}
			else if(glo.adBufMOEDn[iBar] == glo.dMOEposition) {
				Alert("Сложились условия для ПРОДАЖИ ", glo.sSymbol, " ", 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);
}

Recommend