//+------------------------------------------------------------------+ //| ID.mq4 | //| Copyright © 2006, Oasis | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Oasis" extern double Lots = 1; extern double MaxLots = 10; extern double UnitLot = 1000; extern bool Reinvest = false; extern int StopLoss = 0; extern int TakeProfit = 0; extern int TotalOrders = 1; extern int AlligatorMode = 1; // 2 - RedLine (не проверено) 1 - All (проверено) // --- --- --- extern bool Buy = true; // - проверено extern bool Sell = true; // - проверено extern bool TwoPosition = false; // - проверено extern bool ACCross = false; // - проверено extern bool AC2 = false; // - проверено extern bool AC3 = false; // - проверено extern bool AOCross = false; // - проверено extern bool AOSaucer = false; // - проверено extern bool AO2Peak = false; // - ошибка extern bool FractalsSignal = false; // - проверено extern bool Ang = false; // - не проверено extern bool CloseZone = false; // - проверено extern bool CloseFractal = false; // - проверено extern bool CloseAlligator = false; // - проверено //extern bool TradingZone = false; // - не работает // Глобальные переменные datetime TimeOpen, TimeID, Time1, Time2, TimeOpenFra; datetime TimePeak, PreTimePeak; double Peak, PrePeak, Lot; double FractalUpper, FractalLower; double SL, TP; int Ticket; // --- переменные Zone bool BarsGreen, BarsRed; double PriceZone; // Инициализатор выполнения на цене открытия bool StartProgram() { if(TimeOpen != Time[0]) { TimeOpen = Time[0]; return(true); }else return(false); } void init() { // --- Первичная проверка (50 последних баров) for(int a = 50; a >= 1; a--) { Fractal(a); AOModel(a); FiveBars(a); // --- открытие фракталом BUY if(OrdersTotal() < TotalOrders && FractalsSignal == true && High[a] >= FractalUpper && TimeID != Time1 && High[a] > AlligatorMax(a)) TimeID = Time1; // --- открытие фракталом SELL if(OrdersTotal() < TotalOrders && FractalsSignal == true && Low[a] <= FractalLower && TimeID != Time2 && Low[a] < AlligatorMin(a)) TimeID = Time2; } Print("Первичная проверка закончена."); } // Завершение кода на init() void start() { // --- --- --- --- --- ТОРГОВОЕ ЯДРО --- --- --- --- --- // закрытие в зоне if(BarsGreen == true) { if(Bid < PriceZone) { BarsGreen = false; if(CloseZone) CloseAll(); } } if(BarsRed == true) { if(Bid > PriceZone) { BarsRed = false; if(CloseZone) CloseAll(); } } // --- // --- открытие фракталом BUY if(FractalsSignal == true && Buy == true && Bid >= FractalUpper && TimeID != Time1 && ( (AlligatorMode == 2 && Bid > AlligatorRed()) || (AlligatorMode == 1 && Bid > AlligatorMax()) )) { if(TwoPosition == true && OrdersTotal() != 0) { if(_OrderType() == OP_SELL) CloseAll(); } if(OrdersTotal() < TotalOrders) Buy(); TimeID = Time1; TimeOpenFra = Time[0]; } // --- открытие фракталом SELL if(FractalsSignal == true && Sell == true && Bid <= FractalLower && TimeID != Time2 && ( (AlligatorMode == 2 && Bid < AlligatorRed()) || (AlligatorMode == 1 && Bid < AlligatorMin()) )) { if(TwoPosition == true && OrdersTotal() != 0) { if(_OrderType() == OP_BUY) CloseAll(); } if(OrdersTotal() < TotalOrders) Sell(); TimeID = Time2; TimeOpenFra = Time[0]; } // --- открытие ангуляцией BUY if(Ang == true && OrdersTotal() < TotalOrders && Low[1] < Low[2] && Low[1] < Low[3] && High[1] < AlligatorMin() && Bid > High[1]) Buy(); // --- открытие ангуляцией SELL if(Ang == true && OrdersTotal() < TotalOrders && High[1] > High[2] && High[1] > High[3] && Low[1] > AlligatorMax() && Bid < Low[1]) Sell(); if(StartProgram()) // --- код на цене открытия { // Выполнение функций AOModel(); Fractal(); FiveBars(); // BUY if(OrdersTotal() < TotalOrders && ((AC2 == true && ACBuy1()) || (AC3 == true && ACBuy2()) || (ACCross == true && ACBuy3()) || (AOCross == true && AOBuy1()) || (AOSaucer == true && AOBuy2()) || (AO2Peak == true && AOModel() == 1)) && Bid > AlligatorMax()) Buy(); // SELL if(OrdersTotal() < TotalOrders && ((AC2 == true && ACSell1()) || (AC3 == true && ACSell2()) || (ACCross == true && ACSell3()) || (AOCross == true && AOSell1()) || (AOSaucer == true && AOSell2()) || (AO2Peak == true && AOModel() == 2)) && Bid < AlligatorMin()) Sell(); // Закрытие фракталом (поддержка одного ордера) --- на цене открытия if(OrdersTotal() != 0 && CloseFractal == true) { if(OrderSelect(Ticket, SELECT_BY_TICKET)) { if(OrderType() == OP_BUY && iFractals(NULL, 0, MODE_UPPER, 3) != 0 && Ask > OrderOpenPrice() + (Ask - Bid) + 1*Point) OrderClose(Ticket, Lots, Bid, 3, Orange); if(OrderType() == OP_SELL && iFractals(NULL, 0, MODE_LOWER, 3) != 0 && Bid < OrderOpenPrice() - (Ask - Bid) - 1*Point) OrderClose(Ticket, Lots, Ask, 3, Orange); } } // Закрытие Аллигатором (Зубы Аллигатора) --- на цене открытия !! не забыть поддержка одного ордера if(OrdersTotal() != 0 && CloseAlligator == true) { if(OrderSelect(Ticket, SELECT_BY_TICKET)) { if(OrderType() == OP_BUY && Close[1] < AlligatorRed() && TimeOpenFra != Time[0]) CloseAll();//OrderClose(Ticket, Lots, Bid, 3, Orange); if(OrderType() == OP_SELL && Close[1] > AlligatorRed() && TimeOpenFra != Time[0]) CloseAll();//OrderClose(Ticket, Lots, Bid, 3, Orange); } } } // окончание кода на StartProgram() // --- ОКОНЧАНИЕ ТОРГОВОГО ЯДРА --- // --- --- --- Модель поведения - Торговля в зонах // !!ОКОНЧАНИЕ!! --- Модель поведения - Торговля в зонах } // Завершение кода на Start() // Функционал // Сигналы AC --- --- --- Выполнение на цене открытия // --- Buy bool ACBuy1() // Два зеленых столбца выше 0 { if(AC(1) > AC(2) && AC(2) > AC(3) && AC(3) < AC(4) && AC(3) > 0) return(true); else return(false); } bool ACBuy2() // Три зеленых столбца нише 0 { if(AC(1) > AC(2) && AC(2) > AC(3) && AC(3) > AC(4) && AC(4) < AC(5) && ((AC(1) < 0) || (AC(1) > 0 && AC(2) < 0))) return(true); else return(false); } bool ACBuy3() // Два зеленых столбца при пересечении { if(AC(1) > AC(2) && AC(2) > AC(3) && AC(3) < AC(4) && AC(1) > 0 && AC(2) < 0) return(true); else return(false); } // --- Sell bool ACSell1() // Два красных столбца ниже 0 { if(AC(1) < AC(2) && AC(2) < AC(3) && AC(3) > AC(4) && AC(3) < 0) return(true); else return(false); } bool ACSell2() // Три красных столбца выше 0 { if(AC(1) < AC(2) && AC(2) < AC(3) && AC(3) < AC(4) && AC(4) > AC(5) && ((AC(1) > 0) || (AC(1) < 0 && AC(2) > 0))) return(true); else return(false); } bool ACSell3() // Два красных столбца при пересечении { if(AC(1) < AC(2) && AC(2) < AC(3) && AC(3) > AC(4) && AC(1) < 0 && AC(2) > 0) return(true); else return(false); } // Сигналы AO --- --- --- Выполнение на цене открытия // --- Buy bool AOBuy1() // Пересечение { if(AO(1) > 0 && AO(2) < 0) return(true); else return(false); } bool AOBuy2() // Блюдце { if(AO(1) > AO(2) && AO(2) < AO(3) && AO(2) > 0) return(true); else return(false); } // --- Sell bool AOSell1() // Пересечение { if(AO(1) < 0 && AO(2) > 0) return(true); else return(false); } bool AOSell2() // Блюдце { if(AO(1) < AO(2) && AO(2) > AO(3) && AO(2) < 0) return(true); else return(false); } // --- --- --- Модель две вершины AO! Bull - 1; Bear - 2; N/A - 0 int AOModel(int Shift = 0) { int a = 0; if(AO(Shift + 1) > 0 && Peak < 0) {Peak = 0; TimePeak = 0; PrePeak = 0; PreTimePeak = 0;} if(AO(Shift + 1) < 0 && Peak > 0) {Peak = 0; TimePeak = 0; PrePeak = 0; PreTimePeak = 0;} /*if(Peak < 0 && // --- Bull (AO(Shift + 1) > AO(Shift + 2) && AO(Shift + 2) < AO(Shift + 3) && AO(Shift + 1) < 0 && AO(Shift + 3) < 0) && AO(Shift + 2) > Peak) a = 1; else a = 3; if(Peak > 0 && // --- Bear (AO(Shift + 1) < AO(Shift + 2) && AO(Shift + 2) > AO(Shift + 3) && AO(Shift + 1) > 0 && AO(Shift + 3) > 0) && AO(Shift + 2) < Peak) a = 2; else {if(a != 1) a = 3;}*/ if((AO(Shift + 1) > AO(Shift + 2) && // --- Вершина меньше нуля AO(Shift + 2) < AO(Shift + 3) && AO(Shift + 1) < 0 && AO(Shift + 3) < 0/* && AO(Shift + 2) < Peak*/) || (AO(Shift + 1) < AO(Shift + 2) && // --- Вершина больше нуля AO(Shift + 2) > AO(Shift + 3) && AO(Shift + 1) > 0 && AO(Shift + 3) > 0/* && AO(Shift + 2) > Peak*/) && TimePeak != Time[Shift + 2]) { PrePeak = Peak; PreTimePeak = TimePeak; Peak = AO(Shift + 2); TimePeak = Time[Shift + 2]; if(Peak < 0 && PrePeak < 0 && Peak > PrePeak) a = 1; else a = 3; if(Peak > 0 && PrePeak > 0 && Peak < PrePeak) a = 2; else {if(a != 1) a = 3;} }else a = 3; //if(a != 3) Print(a); if(a == 1) return(1); if(a == 2) return(2); if(a == 3) return(0); } // Фильтр Аллигатор! // Минимальное значение double AlligatorMin(int Shift = 1) { double Min; Min = MathMin(iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, Shift), iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, Shift)); Min = MathMin(Min, iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, Shift)); Min = NormalizeDouble(Min, Digits); return(Min); } // Максимальное значение double AlligatorMax(int Shift = 1) { double Max; Max = MathMax(iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, Shift), iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, Shift)); Max = MathMax(Max, iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, Shift)); Max = NormalizeDouble(Max, Digits); return(Max); } // Красная линия аллигатора double AlligatorRed(int Shift = 1) { double _Red = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, Shift); return(NormalizeDouble(_Red, Digits)); } // Фрактал void Fractal(int Shift = 0) { if(iFractals(NULL, 0, MODE_UPPER, Shift + 3) > 0 && ( (iFractals(NULL, 0, MODE_UPPER, Shift + 3) > AlligatorMax(Shift + 3) && AlligatorMode == 1) || (iFractals(NULL, 0, MODE_UPPER, Shift + 3) > AlligatorRed(Shift + 3) && AlligatorMode == 2)) ) { FractalUpper = iFractals(NULL, 0, MODE_UPPER, Shift + 3); Time1 = Time[Shift + 3]; Print("Найден фрактал вверх, значение: ", DoubleToStr(FractalUpper, Digits)); } if(iFractals(NULL, 0, MODE_LOWER, Shift + 3) > 0 && ( (iFractals(NULL, 0, MODE_LOWER, Shift + 3) < AlligatorMin(Shift + 3) && AlligatorMode == 1) || (iFractals(NULL, 0, MODE_LOWER, Shift + 3) < AlligatorRed(Shift + 3) && AlligatorMode == 2)) ) { FractalLower = iFractals(NULL, 0, MODE_LOWER, Shift + 3); Time2 = Time[Shift + 3]; Print("Найден фрактал вниз, значение: ", DoubleToStr(FractalLower, Digits)); } } // 5 баров одного цвета void FiveBars(int Shift = 0) { int NumBarsGreen = 0, NumBarsRed = 0; for(int a = 1; a <= 5; a++) { if(AO(Shift + a) > AO(Shift + a + 1) && AC(Shift + a) > AC(Shift + a + 1)) NumBarsGreen++; if(AO(Shift + a) < AO(Shift + a + 1) && AC(Shift + a) < AC(Shift + a + 1)) NumBarsRed++; } if(NumBarsGreen == 5 && Low[Shift + 1] > AlligatorMax(Shift + 1)) {BarsGreen = true; BarsRed = false; PriceZone = Low[Shift + 1];} if(NumBarsRed == 5 && High[Shift + 1] < AlligatorMin(Shift + 1)) {BarsRed = true; BarsGreen = false; PriceZone = High[Shift + 1];} // --- if(BarsGreen == true && PriceZone < Low[Shift + 1]) PriceZone = Low[Shift + 1]; if(BarsRed == true && PriceZone > High[Shift + 1]) PriceZone = High[Shift + 1]; } // Закрытие всех открытых позиций void CloseAll() { int Orders; Orders = OrdersTotal(); for(int a = Orders; a > 0; a--) { if(OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) { int OrdTicket = OrderTicket(); double OrdLots = OrderLots(); if(OrderType() == OP_BUY) OrderClose(OrdTicket, OrdLots, Bid, 3, Orange); else OrderClose(OrdTicket, OrdLots, Ask, 3, Orange); } } } // Значение индикатора AO! double AO(int Shift) { return(NormalizeDouble(iAO(NULL, 0, Shift), Digits + 1)); } // Значение индикатора AC! double AC(int Shift) { return(NormalizeDouble(iAC(NULL, 0, Shift), Digits + 2)); } // Открытие - Buy() void Buy() { if(Reinvest) Lot = NormalizeDouble((AccountFreeMargin()*Lots)/(UnitLot*Ask), 1); else Lot = Lots; if(Lot >= MaxLots) Lot = MaxLots; if(StopLoss != 0) SL = Bid - StopLoss*Point; else SL = 0; if(TakeProfit != 0) TP = Bid + TakeProfit*Point; else TP = 0; //--- if(AccountFreeMargin() - Lot*UnitLot*Ask > 0) Ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, SL, TP, "", 0, 0, Red); } // Открытие - Sell() void Sell() { if(Reinvest) Lot = NormalizeDouble((AccountFreeMargin()*Lots)/(UnitLot*Bid), 1); else Lot = Lots; if(Lot >= MaxLots) Lot = MaxLots; if(StopLoss != 0) SL = Ask + StopLoss*Point; else SL = 0; if(TakeProfit != 0) TP = Ask - TakeProfit*Point; else TP = 0; //--- if(AccountFreeMargin() - Lot*UnitLot*Bid > 0) Ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, SL, TP, "", 0, 0, Blue); } // Тип открытой позиции (если она есть) int _OrderType() { if(OrderSelect(0, SELECT_BY_POS, MODE_TRADES)) { if(OrderType() == OP_BUY) return(0); if(OrderType() == OP_SELL) return(1); } }