/* Добавлено - Режим включения "ручного" первого ордера - "Растягивание" серии. После по достижении KeyTrade, динамический пипстеп отключается PipStep = DefaultPips*DEL _VS */ //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC #property copyright "Глебыч and _VS logix edit" #property link "" //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC extern bool Buy = TRUE; // при FALSE новые ордера открываться не будут, усредняющие ордера (колена) - будут extern bool Sell = TRUE; // при FALSE новые ордера открываться не будут, усредняющие ордера (колена) - будут extern bool ManualFirstOrder = FALSE; // открываем первый ордер вручную extern double Lots = 0.01; // разер лота для начала торгов extern int lotdecimal = 2; // сколько знаков после запятой в лоте рассчитывать 0 - нормальные лоты (1), 1 - минилоты (0.1), 2 - микро (0.01) extern double LotExponent = 1.4; // на сколько умножать лот при выставлении следующего колена. пример: первый лот 0.1, серия: 0.16, 0.26, 0.43 ... extern int MaxTrades = 10; // максимально количество одновременно открытых ордеров extern int KeyTrade = 7; //if(total >= KeyTrade) PipStep = DefaultPips*DEL; extern int DefaultPips = 10; extern string PSMode = "0-DefaultPips, 1-Dynamic, 2-Turbo"; extern int PipStepMode = 0; int Glubina = 35; extern double DEL = 2.5; extern double slip = 30; // на сколько может отличаться цена в случае если ДЦ запросит реквоты (в последний момент немного поменяет цену) extern double TakeProfit = 10; // по достижении скольких пунктов прибыли закрывать сделку double Drop = 50000; extern int MagicNumber = 2222; // волшебное число (помогает советнику отличить свои ставки от чужих) //+-----------------------------------------------------------------------------------------------------------------------------+ extern string ПАРАМЕТРЫ..ИНДИКАТОРОВ = "Indicators Settings"; //+-----------------------------------------------------------------------------------------------------------------------------+ extern int RandomSignal = 1; //Если 1, то все индикаторы отключены - случайный вход //+-----------------------------------------------------------------------------------------------------------------------------+ extern string Параметры..Баров = "+---------------------------+iClose"; extern int Вкл..выкл..баров = 1; //Вкл/выкл баров. extern int TFBar = 0; //Таймфрэйм закрытия бара. extern int shiftBarCurr = 1; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern int shiftBarPrev = 2; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). //+-----------------------------------------------------------------------------------------------------------------------------+ extern string Параметры..MA = "+---------------------------+iMA"; extern int Вкл..выкл..MA = 1; //Вкл/выкл. extern int TFMA = 0; //Таймфрэйм. extern int periodMA = 7; //Период. extern int mashiftMA = 0; //Сдвиг индикатора относительно ценового графика. extern int mamethodMA = 0; //Метод усреднения. Значение 0-3. extern int appliedpriceMA = 0; //Используемая цена. Может быть любой из ценовых констант. Значение 0-6. extern int shiftMACurr = 1; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern int shiftMAPrev = 3; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). //+-----------------------------------------------------------------------------------------------------------------------------+ extern string Параметры..Bands = "+---------------------------+iBands"; extern int Вкл..выкл..Bands = 0; //Вкл/выкл. extern int TFBands = 0; //Таймфрэйм. extern int periodBands = 16; //Период. extern int deviationBands = 2; //Отклонение от основной линии. extern int bandsshiftBands = 0; //Сдвиг индикатора относительно ценового графика. extern int appliedpriceBands = 4; //Используемая цена. Может быть любой из ценовых констант. Значение 0-6. extern int shiftBandsCurr = 0; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern int shiftBandsPrev = 1; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). //+-----------------------------------------------------------------------------------------------------------------------------+ extern string Параметры..RSI = "+---------------------------+iRSI"; extern int Вкл..выкл..RSI = 0; //Вкл/выкл. extern int TFRSI = 0; //Таймфрэйм. extern int periodRSI = 7; //Период. extern int appliedpriceRSI = 0; //Используемая цена. Может быть любой из ценовых констант. Значение 0-6. extern int shiftRSICurr = 0; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern int shiftRSIPrev = 2; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern int RsiMinimum = 30; //нижняя граница. extern int RsiMaximum = 70; //верхняя граница. //+-----------------------------------------------------------------------------------------------------------------------------+ extern string Параметры..DeMarker = "+---------------------------+iDeMarker"; extern int Вкл..выкл..DeMarker = 0; //Вкл/выкл. extern int TFDeMarker = 0; //Таймфрэйм. extern int periodDeMarker = 7; //Период. extern int shiftDeMarkerCurr = 0; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern int shiftDeMarkerPrev = 2; //Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). extern double DeMarkerMinimum = 0.3; //нижняя граница. extern double DeMarkerMaximum = 0.7; //верхняя граница. //+-----------------------------------------------------------------------------------------------------------------------------+ extern string МЕГА..СИГНАЛ = "Со всех включенных индикаторов"; //Совпадение сигнала включенных индикаторов бай и селл. extern int Вкл..выкл..MegaSig = 0; //Вкл/выкл. Все сигналы должны быть на бай или селл. Иначе игнор. extern string Режим..Инд1 = "1-По сигналу большинства включенных индикаторов"; extern string Режим..Инд2 = "2-По согласию всех включенных индикаторов"; extern int IndicatorsMode = 2; //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC bool UseEquityStop = FALSE; double TotalEquityRisk = 20.0; bool UseTrailingStop = FALSE; double TrailStart = 30.0; double TrailStop = 20.0; bool UseTimeOut = FALSE; // использовать таймаут (закрывать сделки если они "висят" слишком долго) double MaxTradeOpenHours = 48.0; // время таймаута сделок в часах (через сколько закрывать зависшие сделки) //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC double Stoploss = 5000.0; // уровень безубытка int PipStep=0; double PriceTarget, StartEquity, BuyTarget, SellTarget; double AveragePrice, SellLimit, BuyLimit; double CurrClose, PrevClose; double LastBuyPrice, LastSellPrice, Spread; bool flag; extern string EAName="Ilan1.6 logicPipStep"; int mper[10]={0,1,5,15,30,60,240,1440,10080,43200}; double CurrSigMA, PrevSigMA, CurrSigBandsUP, PrevSigBandsUP, CurrSigBandsLO, PrevSigBandsLO, CurrSigRSI, PrevSigRSI, CurrSigDeMarker, PrevSigDeMarker; int timeprev = 0, expiration; int NumOfTrades = 0; double iLots; int cnt = 0, total; double Stopper = 0.0; bool TradeNow = FALSE, LongTrade = FALSE, ShortTrade = FALSE; int ticket, Signal; bool NewOrdersPlaced = FALSE; double AccountEquityHighAmt, PrevEquity; //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC int init() { Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point; return (0); } int deinit() { return (0); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC int start() { if(total >= KeyTrade) PipStep = DefaultPips*DEL; // PipStep on or after KeyTrade up to MaxTrades if(total < KeyTrade) { if(PipStepMode == 0) PipStep = DefaultPips; if(PipStepMode == 1) // Dynamic Mode { double hival=High[iHighest(NULL,0,MODE_HIGH,Glubina,1)]; // calculate highest and lowest price from last bar to 24 bars ago double loval=Low[iLowest(NULL,0,MODE_LOW,Glubina,1)]; // chart used for symbol and time period PipStep=NormalizeDouble((hival-loval)/DEL/Point,0); // calculate pips for spread between orders if(PipStepDefaultPips*DEL) PipStep = NormalizeDouble(DefaultPips*DEL,0); // if dynamic pips fail, assign pips extreme value } if(PipStepMode == 2) // Turbo Mode { if(total == 1) PipStep = DefaultPips/3; // Turbo Mode 1st step if(total == 2) PipStep = DefaultPips/3*2; // Turbo Mode 2nd step if(total >= 3 && total < KeyTrade) PipStep = DefaultPips; // Turbo Mode 3d step Static PipStep up to KeyTrade } } Print("PipStep = ",PipStep); if(UseTrailingStop) TrailingAlls(TrailStart, TrailStop, AveragePrice); if((iCCI(NULL,15,55,0,0)>Drop && ShortTrade)||(iCCI(NULL,15,55,0,0)<(-Drop) && LongTrade)) { CloseThisSymbolAll(); Print("Closed All due to Strong Movement"); } if(UseTimeOut) { if(TimeCurrent() >= expiration) { CloseThisSymbolAll(); Print("Closed All due to TimeOut"); } } double CurrentPairProfit = CalculateProfit(); if(UseEquityStop) { if(CurrentPairProfit < 0.0 && MathAbs(CurrentPairProfit) > TotalEquityRisk / 100.0 * AccountEquityHigh()) { CloseThisSymbolAll(); Print("Closed All due to Stop Out"); NewOrdersPlaced = FALSE; } } total = CountTrades(); if(timeprev == Time[0]) return (0); timeprev = Time[0]; if(total == 0) flag = FALSE; for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY) { LongTrade = TRUE; ShortTrade = FALSE; break; } } if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_SELL) { LongTrade = FALSE; ShortTrade = TRUE; break; } } } if(total > 0 && total <= MaxTrades) { RefreshRates(); LastBuyPrice = FindLastBuyPrice(); LastSellPrice = FindLastSellPrice(); if(LongTrade && LastBuyPrice - Ask >= PipStep * Point) TradeNow = TRUE; if(ShortTrade && Bid - LastSellPrice >= PipStep * Point) TradeNow = TRUE; } if(total < 1) { ShortTrade = FALSE; LongTrade = FALSE; TradeNow = TRUE; StartEquity = AccountEquity(); } if(TradeNow) { LastBuyPrice = FindLastBuyPrice(); LastSellPrice = FindLastSellPrice(); if(ShortTrade) { NumOfTrades = total; iLots = NormalizeDouble(Lots * MathPow(LotExponent, NumOfTrades), lotdecimal); RefreshRates(); ticket = OpenPendingOrder(1, iLots, Bid, slip, Ask, 0, 0, EAName + "-" + NumOfTrades + "-" + PipStep, MagicNumber, 0, HotPink); if(ticket < 0) { Print("Error: ", GetLastError()); return (0); } LastSellPrice = FindLastSellPrice(); TradeNow = FALSE; NewOrdersPlaced = TRUE; } if(LongTrade) { NumOfTrades = total; iLots = NormalizeDouble(Lots * MathPow(LotExponent, NumOfTrades), lotdecimal); ticket = OpenPendingOrder(0, iLots, Ask, slip, Bid, 0, 0, EAName + "-" + NumOfTrades + "-" + PipStep, MagicNumber, 0, Lime); if(ticket < 0) { Print("Error: ", GetLastError()); return (0); } LastBuyPrice = FindLastBuyPrice(); TradeNow = FALSE; NewOrdersPlaced = TRUE; } } if(!ManualFirstOrder&&TradeNow && total < 1) { if(TradeNow && total < 1) { double PrevCl = iClose(Symbol(), 0, 2); double CurrCl = iClose(Symbol(), 0, 1); SellLimit = Bid; BuyLimit = Ask; if(!ShortTrade && !LongTrade) { NumOfTrades = total; iLots = NormalizeDouble(Lots * MathPow(LotExponent, NumOfTrades), lotdecimal); Signal = GetSignal(); if(Sell && PrevCl > CurrCl) { if(Signal == -1) { ticket = OpenPendingOrder(1, iLots, SellLimit, slip, SellLimit, 0, 0, EAName + "-" + NumOfTrades, MagicNumber, 0, HotPink); if(ticket < 0) { Print("Error: ", GetLastError()); return (0); } LastBuyPrice = FindLastBuyPrice(); NewOrdersPlaced = TRUE; } } if(Buy && PrevCl < CurrCl) { if(Signal == 1) { ticket = OpenPendingOrder(0, iLots, BuyLimit, slip, BuyLimit, 0, 0, EAName + "-" + NumOfTrades, MagicNumber, 0, Lime); if(ticket < 0) { Print("Error: ", GetLastError()); return (0); } LastSellPrice = FindLastSellPrice(); NewOrdersPlaced = TRUE; } } if(ticket > 0) expiration = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours); TradeNow = FALSE; } } } total = CountTrades(); AveragePrice = 0; double Count = 0; for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY || OrderType() == OP_SELL) { AveragePrice += OrderOpenPrice() * OrderLots(); Count += OrderLots(); if(OrderTakeProfit() == 0) NewOrdersPlaced = TRUE; } } } if(total > 0) AveragePrice = NormalizeDouble(AveragePrice / Count, Digits); if(NewOrdersPlaced) { for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY) { PriceTarget = AveragePrice + TakeProfit * Point; BuyTarget = PriceTarget; Stopper = AveragePrice - Stoploss * Point; flag = TRUE; } } if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_SELL) { PriceTarget = AveragePrice - TakeProfit * Point; SellTarget = PriceTarget; Stopper = AveragePrice + Stoploss * Point; flag = TRUE; } } } } if(NewOrdersPlaced) { if(flag == TRUE) { for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) OrderModify(OrderTicket(), NormalizeDouble(AveragePrice,Digits), NormalizeDouble(OrderStopLoss(),Digits), NormalizeDouble(PriceTarget,Digits), 0, Yellow); NewOrdersPlaced = FALSE; } } } return (0); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC int CountTrades() { int count = 0; for(int trade = OrdersTotal() - 1; trade >= 0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) if(OrderType() == OP_SELL || OrderType() == OP_BUY) count++; } return (count); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC void CloseThisSymbolAll() { for(int trade = OrdersTotal() - 1; trade >= 0; trade--) { OrderSelect(trade, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol()) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Blue); if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Red); } Sleep(1000); } } } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC int OpenPendingOrder(int pType, double pLots, double pLevel, int sp, double pr, int sl, int tp, string pComment, int pMagic, int pDatetime, color pColor) { int ticket = 0; int err = 0; int c = 0; int NumberOfTries = 100; switch (pType) { case 2: for(c = 0; c < NumberOfTries; c++) { ticket = OrderSend(Symbol(), OP_BUYLIMIT, pLots, pLevel, sp, StopLong(pr, sl), TakeLong(pLevel, tp), pComment, pMagic, pDatetime, pColor); err = GetLastError(); if(err == 0/* NO_ERROR */) break; if(!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break; Sleep(1000); } break; case 4: for(c = 0; c < NumberOfTries; c++) { ticket = OrderSend(Symbol(), OP_BUYSTOP, pLots, pLevel, sp, StopLong(pr, sl), TakeLong(pLevel, tp), pComment, pMagic, pDatetime, pColor); err = GetLastError(); if(err == 0/* NO_ERROR */) break; if(!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break; Sleep(5000); } break; case 0: for(c = 0; c < NumberOfTries; c++) { RefreshRates(); ticket = OrderSend(Symbol(), OP_BUY, pLots, NormalizeDouble(Ask,Digits), sp, NormalizeDouble(StopLong(Bid, sl),Digits), NormalizeDouble(TakeLong(Ask, tp),Digits), pComment, pMagic, pDatetime, pColor); err = GetLastError(); if(err == 0/* NO_ERROR */) break; if(!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break; Sleep(5000); } break; case 3: for(c = 0; c < NumberOfTries; c++) { ticket = OrderSend(Symbol(), OP_SELLLIMIT, pLots, pLevel, sp, StopShort(pr, sl), TakeShort(pLevel, tp), pComment, pMagic, pDatetime, pColor); err = GetLastError(); if(err == 0/* NO_ERROR */) break; if(!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break; Sleep(5000); } break; case 5: for(c = 0; c < NumberOfTries; c++) { ticket = OrderSend(Symbol(), OP_SELLSTOP, pLots, pLevel, sp, StopShort(pr, sl), TakeShort(pLevel, tp), pComment, pMagic, pDatetime, pColor); err = GetLastError(); if(err == 0/* NO_ERROR */) break; if(!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break; Sleep(5000); } break; case 1: for(c = 0; c < NumberOfTries; c++) { ticket = OrderSend(Symbol(), OP_SELL, pLots, NormalizeDouble(Bid,Digits), sp, NormalizeDouble(StopShort(Ask, sl),Digits), NormalizeDouble(TakeShort(Bid, tp),Digits), pComment, pMagic, pDatetime, pColor); err = GetLastError(); if(err == 0/* NO_ERROR */) break; if(!(err == 4/* SERVER_BUSY */ || err == 137/* BROKER_BUSY */ || err == 146/* TRADE_CONTEXT_BUSY */ || err == 136/* OFF_QUOTES */)) break; Sleep(5000); } } return (ticket); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC double StopLong(double price, int stop) { if(stop == 0) return (0); else return (price - stop * Point); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double StopShort(double price, int stop) { if(stop == 0) return (0); else return (price + stop * Point); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double TakeLong(double price, int stop) { if(stop == 0) return (0); else return (price + stop * Point); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double TakeShort(double price, int stop) { if(stop == 0) return (0); else return (price - stop * Point); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC double CalculateProfit() { double Profit = 0; for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) if(OrderType() == OP_BUY || OrderType() == OP_SELL) Profit += OrderProfit(); } return (Profit); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC void TrailingAlls(int pType, int stop, double AvgPrice) { int profit; double stoptrade; double stopcal; if(stop != 0) { for(int trade = OrdersTotal() - 1; trade >= 0; trade--) { if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY) { profit = NormalizeDouble((Bid - AvgPrice) / Point, 0); if(profit < pType) continue; stoptrade = OrderStopLoss(); stopcal = NormalizeDouble(Bid - stop * Point, Digits); if(stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua); } if(OrderType() == OP_SELL) { profit = NormalizeDouble((AvgPrice - Ask) / Point, 0); if(profit < pType) continue; stoptrade = OrderStopLoss(); stopcal = NormalizeDouble(Ask + stop * Point, Digits); if(stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red); } } Sleep(1000); } } } } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC double AccountEquityHigh() { if(CountTrades() == 0) AccountEquityHighAmt = AccountEquity(); if(AccountEquityHighAmt < PrevEquity) AccountEquityHighAmt = PrevEquity; else AccountEquityHighAmt = AccountEquity(); PrevEquity = AccountEquity(); return (AccountEquityHighAmt); } //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC double FindLastBuyPrice() { double oldorderopenprice; int oldticketnumber; double unused = 0; int ticketnumber = 0; for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_BUY) { oldticketnumber = OrderTicket(); if(oldticketnumber > ticketnumber) { oldorderopenprice = OrderOpenPrice(); unused = oldorderopenprice; ticketnumber = oldticketnumber; } } } return (oldorderopenprice); } double FindLastSellPrice() { double oldorderopenprice; int oldticketnumber; double unused = 0; int ticketnumber = 0; for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue; if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() == OP_SELL) { oldticketnumber = OrderTicket(); if(oldticketnumber > ticketnumber) { oldorderopenprice = OrderOpenPrice(); unused = oldorderopenprice; ticketnumber = oldticketnumber; } } } return (oldorderopenprice); } //+------------------------------------------------------------------+ int GetSignal() { int SummInd = 0; int Summ = 0; int Result = 0; double Ask0 = Ask; double Bid0 = Bid; if(RandomSignal == 1) { MathSrand(TimeLocal()); if(MathMod(MathRand(),2) == 0) Summ += 1; // Четное случайное число - Сигнал бай. else Summ -= 1; //Нечетное случайное число - Сигнал селл. } else SummInd = Вкл..выкл..баров + Вкл..выкл..MA + Вкл..выкл..Bands + Вкл..выкл..RSI + Вкл..выкл..DeMarker; if(Вкл..выкл..баров == 1) { CurrClose = iClose(Symbol(), mper[TFBar], shiftBarCurr); PrevClose = iClose(Symbol(), mper[TFBar], shiftBarPrev); if(CurrClose > PrevClose) Summ += 1; //Сигнал бай. else if(CurrClose < PrevClose) Summ -=1; //Сигнал селл. } if(Вкл..выкл..MA == 1) { CurrSigMA = iMA(Symbol(), mper[TFMA], periodMA, mashiftMA, mamethodMA, appliedpriceMA, shiftMACurr); PrevSigMA = iMA(Symbol(), mper[TFMA], periodMA, mashiftMA, mamethodMA, appliedpriceMA, shiftMAPrev); if(CurrSigMA > PrevSigMA) Summ += 1; //Сигнал бай. else if(CurrSigMA < PrevSigMA) Summ -=1; //Сигнал селл. } if(Вкл..выкл..Bands == 1) { //Сделано грубовато, можно облегчить касанием верхней и нижней линии, зато точней. double CloseBarBands01 = Close[shiftBandsPrev]; CurrSigBandsUP = iBands(Symbol(), mper[TFBands], periodBands, deviationBands, bandsshiftBands, appliedpriceBands, MODE_UPPER, shiftBandsCurr); PrevSigBandsUP = iBands(Symbol(), mper[TFBands], periodBands, deviationBands, bandsshiftBands, appliedpriceBands, MODE_UPPER, shiftBandsPrev); CurrSigBandsLO = iBands(Symbol(), mper[TFBands], periodBands, deviationBands, bandsshiftBands, appliedpriceBands, MODE_LOWER, shiftBandsCurr); PrevSigBandsLO = iBands(Symbol(), mper[TFBands], periodBands, deviationBands, bandsshiftBands, appliedpriceBands, MODE_LOWER, shiftBandsPrev); if(CloseBarBands01 < PrevSigBandsLO && Bid > PrevSigBandsLO) Summ += 1; //Сигнал бай. else if(CloseBarBands01 > PrevSigBandsUP && Bid < CurrSigBandsUP) Summ -=1; //Сигнал селл. } if(Вкл..выкл..RSI == 1) { CurrSigRSI = iRSI(Symbol(), mper[TFRSI], periodRSI, appliedpriceRSI, shiftRSICurr); PrevSigRSI = iRSI(Symbol(), mper[TFRSI], periodRSI, appliedpriceRSI, shiftRSIPrev); if(CurrSigRSI > PrevSigRSI && CurrSigRSI < RsiMinimum) Summ += 1; //Сигнал бай. else if(CurrSigRSI < PrevSigRSI && CurrSigRSI > RsiMaximum) Summ -=1; //Сигнал селл. } if(Вкл..выкл..DeMarker == 1) { CurrSigDeMarker = iDeMarker(Symbol(), mper[TFDeMarker], periodDeMarker, shiftDeMarkerCurr); PrevSigDeMarker = iDeMarker(Symbol(), mper[TFDeMarker], periodDeMarker, shiftDeMarkerPrev); if(CurrSigDeMarker > PrevSigDeMarker && CurrSigDeMarker < DeMarkerMinimum) Summ += 1; //Сигнал бай. else if(CurrSigDeMarker < PrevSigDeMarker && CurrSigDeMarker > DeMarkerMaximum) Summ -=1; //Сигнал селл. } if(Вкл..выкл..MegaSig == 1 && // По сигналу большинства включенных индикаторов IndicatorsMode == 1) { if(SummInd != MathAbs(Summ)) return; } if(Summ > 0) Result = 1; else if(Summ < 0) Result = -1; if(Вкл..выкл..MegaSig == 1 && //По согласию всех включенных индикаторов IndicatorsMode == 2 && Вкл..выкл..баров >= 0 && Вкл..выкл..MA >= 0 && Вкл..выкл..Bands >= 0 && Вкл..выкл..RSI >= 0 && Вкл..выкл..DeMarker >= 0) Result = 1; if(Вкл..выкл..MegaSig == 1 && //По согласию всех включенных индикаторов IndicatorsMode == 2 && Вкл..выкл..баров <= 0 && Вкл..выкл..MA <= 0 && Вкл..выкл..Bands <= 0 && Вкл..выкл..RSI <= 0 && Вкл..выкл..DeMarker <= 0) Result = -1; return(Result); } //+------------------------------------------------------------------+ //ILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMICILANDYNAMIC