//+------------------------------------------------------------------+ //| ATS_Ichimoku.mq4 | //| Copyright © 2010, Unknown Software Corp. | //| http://www.Unknown.net | //| Automatic Trade System by Ichimoku Trade Indicator in MT4 | //| Written and Compiled by AnSol | //| 2010 June | //| Include Control of Equity and Auto Trailing Stop | //| | //+------------------------------------------------------------------+ // Ставить на любой график с нужным таймфреймом. ТФ не менять! // Для анализа использовать другие графики! // Используется встроенный в МТ4 индикатор Ишимоку. // Для работы наличие индикатора на графике не обязательно. #property copyright "Copyright © 2010, AnSol Co.Ltd" #property link "http://ansol.dyndns.org" #include <stderror.mqh> #include <stdlib.mqh> // Задаваемые параметры extern string sDescription = "Советник на основе индикатора Ишимоку"; extern string sDescr0 = "0 - не торговать, 1 - торговать (BUY&SELL)"; extern string sDescr01 = "Для тестера"; extern string pair = "EURUSD"; extern string sSymbols1 = "EURUSD: 1; GBPUSD: 1; USDJPY: 1; USDCHF: 1; USDCAD: 1; AUDUSD: 1; NZDUSD: 1; EURJPY: 1; EURCHF: 1; EURGBP: 1; AUDCAD: 1; AUDCHF: 1; AUDJPY: 1; CADCHF: 1;"; extern string sSymbols2 = "CADJPY: 1; CHFJPY: 1; NZDCAD: 1; NZDCHF: 1; NZDJPY: 1; EURAUD: 1; GBPCHF: 1; GBPJPY: 1; AUDNZD: 1; EURCAD: 1; EURNZD: 1; GBPAUD: 1; GBPCAD: 1; GBPNZD: 1;"; extern string sDescA = "Номер счета для торговли, 0 - любой счет"; extern int nAccount = 0; extern string sDesc1 = "SL и TP"; extern int iStopLossPoint = 350; extern int iTakeProfitPoint = 150; extern string sDesc3 = "Slip, уровень в %%"; extern int iSlipPage = 3; extern double dLevel = 220.0; extern string sDesc5 = "Звуки trailing и открытие/закрытие"; extern bool lFlagUseSound = True; extern string sSoundFileName = "stops.wav"; extern string sSoundOpCl = "alert.wav"; extern string sDesc8 = "Отложенный ордер в пунктах"; extern int iPendingOrder = 25; extern string sDesc81 = "Макс.Лот в ед. и %%"; extern double dmaxLot = 1.0; extern double dRisk = 0.5; extern int iMaxSL = 15; extern string sDesc9 = "Параметры Ишимоку"; extern int TenkanSen = 5; extern int KijunSen = 13; extern int SenkouSpan = 55; extern string sNameExpert = "Ichimoku 2"; extern int MagicNumber = 37010; extern string Desc11 = "Начальный трал"; extern int TrailingStart = 25; extern string Desc21 = "Миним. трал"; extern int TrailingEnd = 5; extern string Desc31 = "Шаг трала"; extern int TrailingStep = 2; extern string Desc41 = "Длина тренда"; extern int MaxTrend = 100; extern string Desc51 = "false/true - по открытию/закрытию свечи"; extern bool OpenClose = false; extern string Desc61 = "Использовать звук"; extern bool UseSound = True; // Использовать звуковой сигнал extern string NameFileSound = "stops.wav"; // Наименование звукового файла extern string Desc71 = "Закрывать встречные ордера"; extern bool CloseFoulOrder = true; // Общие переменные программы string sSymbol; // Переменная для текущего символа string Kod = ""; int iStopLevel; // Разрешенный уровень Stoploss и TakeProfit int iStopLoss; int iTakeProfit; int iDigits; int iTimeFrame; int iExpireTime; int iSpread; double dBid; double dAsk; double dLots; double dPoint; double dminLot; double iPendingStop; //---- //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Comment(""); // Проверяем, на каком счете торговать можно if (nAccount > 0 && nAccount != AccountNumber()){ Comment("Trade on account :"+AccountNumber()+" FORBIDDEN!"); return(0); } // Скорректируем параметры на 5-знак, если надо MagicNumber = MagicNumber + Period(); if(Period() < 30) iPendingOrder = MathFloor(iPendingOrder/1.5); if(Digits == 5 || Digits == 3) { iStopLossPoint = iStopLossPoint*10; iTakeProfitPoint = iTakeProfitPoint*10; iSlipPage = iSlipPage*10; iPendingOrder = iPendingOrder*10; iMaxSL = iMaxSL*10; TrailingStart = 10*TrailingStart; TrailingEnd = 10*TrailingEnd; TrailingStep = 10*TrailingStep; MaxTrend = 10*MaxTrend; } //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { // Этот кусок формирует массив доступных для торговли валютных пар string Add2Sym = ""; if (StringLen(Symbol()) > 6) Add2Sym = StringSubstr(Symbol(), 6, StringLen(Symbol()) - 1); string gsa_968[]; int gi_964 = 0; int li_12; int li_16; bool li_20; string ls_24; string ls_32; string lsa_40[]; for (int l_index_8 = 1; l_index_8 <= 2; l_index_8++) { switch (l_index_8) { case 1: ls_24 = sSymbols1; break; case 2: ls_24 = sSymbols2; } li_16 = glSeparateStringInArray(ls_24, lsa_40, ";"); for (int l_index_0 = 0; l_index_0 < li_16; l_index_0++) { li_12 = StringFind(lsa_40[l_index_0], ":"); if (li_12 != -1) { if (glStringTrimAll(StringSubstr(lsa_40[l_index_0], li_12 + 1)) == "1" && MarketInfo(glStringTrimAll(StringSubstr(lsa_40[l_index_0], 0, li_12) + Add2Sym),MODE_TRADEALLOWED) && MarketInfo(glStringTrimAll(StringSubstr(lsa_40[l_index_0], 0, li_12) + Add2Sym),MODE_BID) != 0.0 && MarketInfo(glStringTrimAll(StringSubstr(lsa_40[l_index_0], 0, li_12) + Add2Sym),MODE_STOPLEVEL) <= iMaxSL && MarketInfo(glStringTrimAll(StringSubstr(lsa_40[l_index_0], 0, li_12) + Add2Sym),MODE_SPREAD) <= iMaxSL) { ls_32 = glStringTrimAll(StringSubstr(lsa_40[l_index_0], 0, li_12) + Add2Sym); gi_964++; ArrayResize(gsa_968, gi_964); gsa_968[gi_964 - 1] = ls_32; } } } } // Все, поехали! int iPair; // Для теста if(IsTesting() || IsOptimization()) { gi_964=1; gsa_968[0]=pair; } // Организуем цикл по массиву доступных валютных пар for (iPair = 0; iPair < gi_964; iPair++) { RefreshRates(); sSymbol = gsa_968[iPair]; // Comment(sSymbol); dBid = MarketInfo(sSymbol,MODE_BID); dAsk = MarketInfo(sSymbol,MODE_ASK); dPoint = MarketInfo(sSymbol,MODE_POINT); iStopLevel = MarketInfo(sSymbol,MODE_STOPLEVEL); dminLot = MarketInfo(sSymbol,MODE_MINLOT); if(dmaxLot == 0) { dmaxLot = MarketInfo(sSymbol,MODE_MAXLOT); } iDigits = MarketInfo(sSymbol,MODE_DIGITS); iSpread = MarketInfo(sSymbol,MODE_SPREAD); // Comment(sSymbol," ",iSpread);Sleep(1000);continue; double dStepLotSize = MarketInfo(sSymbol,MODE_LOTSTEP); iStopLoss = iStopLossPoint + iStopLevel + iSpread; iTakeProfit = iTakeProfitPoint + iStopLevel + iSpread; iPendingStop = iPendingOrder + iStopLevel + iSpread; iTimeFrame = Period(); iExpireTime = 15 + 4*MathSqrt(iTimeFrame); if(iBars(sSymbol,Period()) < 100) continue; // Вычисляем ZigZag double zZ = 0, zZ1 = 0; int z = 0; while(!zZ) { zZ = iCustom(sSymbol,iTimeFrame,"ZigZag",21,8,5,0,z); z++;} // Берем параметры Ишимоку для данной пары и ТФ // Comment(sSymbol," ",iSpread);Sleep(1000);continue; double diRed2=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_TENKANSEN, 2); double diBlu2=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_KIJUNSEN, 2); double diRed=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_TENKANSEN, 0); double diBlu=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_KIJUNSEN, 0); double diSSA=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_SENKOUSPANA, 0); double diSSB=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_SENKOUSPANB, 0); double diGre=iIchimoku(sSymbol, iTimeFrame, TenkanSen, KijunSen, SenkouSpan, MODE_CHINKOUSPAN, KijunSen); double diClose=iClose(sSymbol, iTimeFrame, 0); double diClose2=iClose(sSymbol, iTimeFrame, 2); double diOpen=iOpen(sSymbol, iTimeFrame, 0); double diOpen2=iOpen(sSymbol, iTimeFrame, 2); double diCloseK=iClose(sSymbol, iTimeFrame, KijunSen-1); // Генерируем флаги покупки и продажи по параметрам Ишимоку bool lFlagBuyOpen = false, lFlagBuyOpen1 = false, lFlagSellOpen = false, lFlagSellOpen1 = false, lFlagBSClose = false, lFlagBuyOpen2 = false, lFlagSellOpen2 = false, lFlagBuyOpen3 = false, lFlagSellOpen3 = false; double open = MathMin(diOpen,iOpen(sSymbol, iTimeFrame, 1)); if(open < diClose - dPoint*(iSpread + iStopLevel) && diCloseK < diGre) { // Бар вверх // Красная пересекает синюю снизу вверх и зеленая перешла цену снизу вверх lFlagBuyOpen1 = diRed2 <= diBlu2 && diRed >= diBlu + dPoint*iSpread; // Пробив границы облака снизу вверх lFlagBuyOpen2 = diRed > diBlu && diClose > diSSB + dPoint*iSpread && diOpen2 < diSSB + dPoint*iSpread; // Красная выше синей над облаком, зеленая выше цены - продолжение тренда lFlagBuyOpen3 = diClose > diSSB && diClose > diSSA && diRed - diRed2 > diBlu - diBlu2 && diRed > diBlu; } open = MathMax(diOpen,iOpen(sSymbol, iTimeFrame, 1)); if(open > diClose + dPoint*(iSpread + iStopLevel) && diCloseK > diGre) { // Бар вниз // Красная пересекает синюю сверху вниз и зеленая перешла цену сверху вниз lFlagSellOpen1 = diRed2 >= diBlu2 && diRed <= diBlu - dPoint*iSpread; // Пробив границы облака сверху вниз lFlagSellOpen2 = diRed < diBlu && diClose < diSSB + dPoint*iSpread && diOpen2 > diSSB + dPoint*iSpread; // Синяя выше красной под облаком, зеленая ниже цены - продолжение тренда lFlagSellOpen3 = diClose < diSSB && diClose < diSSA && diRed2 - diRed > diBlu2 - diBlu && diBlu > diRed; } // Перекручивание облака - смена тренда lFlagBuyOpen = (lFlagBuyOpen1 || lFlagBuyOpen2 || lFlagBuyOpen3) && zZ < dBid; lFlagSellOpen = (lFlagSellOpen1 || lFlagSellOpen2 || lFlagSellOpen3) && zZ > dAsk; lFlagBSClose = (lFlagBuyOpen || lFlagSellOpen) && (MathAbs(diSSA - diSSB) < 10*(dPoint*(iSpread + iStopLevel))) || ((diGre < diSSA && diGre > diSSB) || (diGre > diSSA && diGre < diSSB)); // Формируем значение лота в зависимости от средств и крутизны графика double dLot1, dLot2, dLot3; Kod = ""; if(lFlagBuyOpen1 || lFlagSellOpen1) { dLot1 = dminLot*(1.0 + dLevel*MathAbs(diBlu - diRed)*iMaxSL/(100.0*dPoint*MathLog(iTimeFrame)*iSpread)); Kod = Kod + "X"; } if(lFlagBuyOpen2 || lFlagSellOpen2) { dLot2 = dminLot*(1.0 + dLevel*MathAbs(diRed - diRed2)*iMaxSL/(100.0*dPoint*MathLog(iTimeFrame)*iSpread)); Kod = Kod + "B"; } if(lFlagBuyOpen3 || lFlagSellOpen3) { dLot3 = dminLot*(1.0 + dLevel*MathAbs(diBlu - diBlu2)*iMaxSL/(100.0*dPoint*MathLog(iTimeFrame)*iSpread)); Kod = Kod + "C"; } dLots = 0.4*(dLot1 + dLot2 + dLot3); // if(dLots > dmaxLot) dLots = dmaxLot; dLots = MathMin(dmaxLot,dLots); dLots = NormalizeDouble(dLots,2); // Если средств мало - уменьшаем лот до минимума int lRisk = 0; while(0.01*(dRisk+dminLot*lRisk)*AccountFreeMargin() < dLots*MarketInfo(sSymbol,MODE_MARGINREQUIRED)) { dLots -= MarketInfo(sSymbol,MODE_LOTSTEP); lRisk++; } if(dLots < MarketInfo(sSymbol,MODE_MINLOT)) { lFlagBuyOpen = false; lFlagSellOpen = false; } // Закрыть встречные позиции if(lFlagBSClose) { CloseOpenOrders(); } Trailing(); // Проверяем уровень в %% if(dLevel > 100.0*(AccountEquity()/(AccountMargin()+0.95))) continue; // Торгуем только если нет открытой позиции в данном направлении if (!ExistPositions(lFlagBuyOpen,lFlagSellOpen)){ if (lFlagBuyOpen) OpenBuy(); if (lFlagSellOpen) OpenSell(); } //---- Конец цикла по парам } //+------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+ // Подпрограммы //+------------------------------------------------------------------+ // Подпрограмма проверки на открытую позицию bool ExistPositions(bool lFlagBuy, bool lFlagSell) { int timexist; for (int i=0; i<OrdersTotal(); i++) { bool lMagic = True; if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderMagicNumber() != MagicNumber) { lMagic = False; } int iOrderType = OrderType(); if( lMagic && OrderSymbol() == sSymbol) { timexist = NormalizeDouble((TimeCurrent() - OrderOpenTime())/3600,iDigits); if((iOrderType == OP_BUY || iOrderType == OP_BUYSTOP) && lFlagBuy && timexist < NormalizeDouble(0.1*MathLog(iExpireTime),iDigits)) { return(True); } if((iOrderType == OP_SELL || iOrderType == OP_SELLSTOP) && lFlagSell && timexist < NormalizeDouble(0.1*MathLog(iExpireTime),iDigits)) { return(True); } } } } return(False); } // Подпрограмм проверки на наличие встречной позиции double CrossPosition (int Type) { for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == sSymbol && OrderType() == Type) { return(OrderLots()); } } } return(0); } // Подпрограмма открытия ордера на покупку void OpenBuy() { double dStopLoss, dTakeProfit, dBuy, dSell, dSwap, dLotB; int err1, err2, numorder; dSwap = MarketInfo(sSymbol,MODE_SWAPLONG); dBuy = dAsk + iPendingStop*dPoint; dLotB = dLots + CrossPosition(OP_SELL); while(dLotB*MarketInfo(sSymbol,MODE_MARGINREQUIRED) > AccountFreeMargin()) dLotB -= dminLot; dStopLoss = dBuy - (iStopLoss + 10*dSwap + iSpread)*dPoint; dTakeProfit = dBuy + iTakeProfit*dPoint; err1 = OrderSend(sSymbol,OP_BUYSTOP,dLots,dBuy,iSlipPage,dStopLoss,dTakeProfit,sNameExpert+Kod+" P"+iTimeFrame,MagicNumber,TimeCurrent() + 90*iExpireTime,CLR_NONE); // Comment("BUY STOP ",sSymbol,"/",err1); // if (err1 == -1) { dStopLoss = dBid - iStopLoss*dPoint; dTakeProfit = dAsk + iTakeProfit*dPoint; numorder = OrderSend(sSymbol, OP_BUY, dLotB, dAsk, iSlipPage, dStopLoss, dTakeProfit, sNameExpert+Kod+" M"+iTimeFrame, MagicNumber, 0, CLR_NONE); Comment("УРОВЕНЬ=", MathRound(100.0*AccountEquity()/(AccountMargin()+0.95)),"% (", dLevel,"%)","\nLot=",dLots," for ",sSymbol, "\nBid=",dBid," Ask=",dAsk,"\nNeed: ",dLotB*MarketInfo(sSymbol,MODE_MARGINREQUIRED)," /Have: ",0.01*dRisk*AccountFreeMargin(),"\n BUY"); // } // Страховочный встречный отложенник dSwap = MarketInfo(sSymbol,MODE_SWAPSHORT); dSell = dBid - 3*iPendingStop*dPoint; dLots = dLots + CrossPosition(OP_BUY); dStopLoss = dSell + (iStopLoss + 10*dSwap + iSpread)*dPoint; dTakeProfit = dSell - iTakeProfit*dPoint; err2 = OrderSend(sSymbol,OP_SELLSTOP,dLots+dLotB,dSell,iSlipPage,dStopLoss,dTakeProfit,sNameExpert+Kod+" C"+iTimeFrame,MagicNumber,TimeCurrent() + 120*iExpireTime,CLR_NONE); if (numorder > -1 && lFlagUseSound) { PlaySound(sSoundOpCl); } else { err1 = GetLastError(); Print("error(",err1,"): ",ErrorDescription(err1)," Lots=",dLots," SL=",dStopLoss," TP=",dTakeProfit," for ",sSymbol," by ",dAsk,"/BUY"); } return(0); } // Подпрограмма открытия ордера на продажу void OpenSell() { double dStopLoss, dTakeProfit, dSell, dBuy, dSwap, dLotS; int err1, err2, numorder; dSwap = MarketInfo(sSymbol,MODE_SWAPSHORT); dSell = dBid - iPendingStop*dPoint; dLotS = dLots + CrossPosition(OP_BUY); while(dLotS*MarketInfo(sSymbol,MODE_MARGINREQUIRED) > AccountFreeMargin()) dLotS -= dminLot; dStopLoss = dSell + (iStopLoss + 10*dSwap + iSpread)*dPoint; dTakeProfit = dSell - iTakeProfit*dPoint; err1 = OrderSend(sSymbol,OP_SELLSTOP,dLots,dSell,iSlipPage,dStopLoss,dTakeProfit,sNameExpert+Kod+" P"+iTimeFrame,MagicNumber,TimeCurrent() + 90*iExpireTime,CLR_NONE); // Comment("SELL STOP-1 ",sSymbol,"/",err1); // if (err1 == -1) { dStopLoss = dAsk + iStopLoss*dPoint; dTakeProfit = dBid - iTakeProfit*dPoint; numorder = OrderSend(sSymbol, OP_SELL, dLotS, dBid, iSlipPage, dStopLoss, dTakeProfit, sNameExpert+Kod+" M"+iTimeFrame, MagicNumber, 0, CLR_NONE); Comment("УРОВЕНЬ=", MathRound(100.0*AccountEquity()/(AccountMargin()+0.95)),"% (", dLevel,"%)","\nLot=",dLots," for ",sSymbol, "\nBid=",dBid," Ask=",dAsk,"\nNeed: ",dLotS*MarketInfo(sSymbol,MODE_MARGINREQUIRED)," /Have: ",0.01*dRisk*AccountFreeMargin(),"\n SELL"); // } // Страховочный встречный отложенник dSwap = MarketInfo(sSymbol,MODE_SWAPSHORT); dBuy = dAsk + 3*iPendingStop*dPoint; dLots = dLots + CrossPosition(OP_BUY); dStopLoss = dBuy - (iStopLoss + 10*dSwap + iSpread)*dPoint; dTakeProfit = dBuy + iTakeProfit*dPoint; err1 = OrderSend(sSymbol,OP_BUYSTOP,dLots+dLotS,dBuy,iSlipPage,dStopLoss,dTakeProfit,sNameExpert+Kod+" C"+iTimeFrame,MagicNumber,TimeCurrent() + 120*iExpireTime,CLR_NONE); if (numorder > -1 && lFlagUseSound) { PlaySound(sSoundOpCl); } else { err1 = GetLastError(); Print("error(",err1,"): ",ErrorDescription(err1)," Lots=",dLots," SL=",dStopLoss," TP=",dTakeProfit," for ",sSymbol," by ",dAsk,"/SELL"); } return(0); } // Подпрограмма формирования массива доступных валютных пар int glSeparateStringInArray(string as_0, string &asa_8[], string as_12 = ";", bool ai_20 = TRUE) { int li_ret_32 = 0; ArrayResize(asa_8, 0); if (as_12 == " ") as_0 = glStringTrimAll(as_0); for (int li_24 = StringFind(as_0, as_12); li_24 != -1; li_24 = StringFind(as_0, as_12)) { li_ret_32++; ArrayResize(asa_8, li_ret_32); asa_8[li_ret_32 - 1] = StringSubstr(as_0, 0, li_24); if (as_12 == " ") as_0 = StringTrimLeft(as_0); else as_0 = StringSubstr(as_0, li_24 + StringLen(as_12)); } if (as_0 != "") { li_ret_32++; ArrayResize(asa_8, li_ret_32); asa_8[li_ret_32 - 1] = as_0; } if (ai_20) for (int l_index_28 = 0; l_index_28 < li_ret_32; l_index_28++) asa_8[l_index_28] = glStringTrimAll(asa_8[l_index_28]); return (li_ret_32); } string glStringTrimAll(string as_0) { return (StringTrimLeft(StringTrimRight(as_0))); } void Trailing() { //-- Trailing Started int iProfit; int Trailing; double takeprofit; double stoploss; int total = OrdersTotal(); for (int i=0; i<total; i++) { bool no = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(no && OrderSymbol() == sSymbol && MagicNumber == OrderMagicNumber() && OrderProfit() > 0) { if (CloseFoulOrder) CloseOpenOrders(); RefreshRates(); if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { double dOpenClose = iOpen(OrderSymbol(),Period(),1); if (OpenClose) dOpenClose = iClose(OrderSymbol(),Period(),1); if(OrderType() == OP_BUY) { iProfit = (dBid - OrderOpenPrice())/dPoint; Trailing = TrailingStart - (iProfit - TrailingStart)*(TrailingStart - TrailingEnd)/MaxTrend; if (Trailing < TrailingEnd) Trailing = TrailingEnd; if (Trailing <= iStopLevel) Trailing = iStopLevel + 1; stoploss = NormalizeDouble(dBid - dPoint*Trailing,iDigits); if (stoploss > OrderOpenPrice()) { if (stoploss > dOpenClose && dOpenClose > OrderOpenPrice()) stoploss = dOpenClose; takeprofit = NormalizeDouble(dAsk + dPoint*(iStopLevel + TrailingEnd + iSpread + TrailingStep),iDigits); if (stoploss > OrderStopLoss() + dPoint*TrailingStep || takeprofit > OrderTakeProfit() + dPoint*TrailingStep ) { ModifyStop(stoploss,takeprofit,"BUY",Trailing,iProfit); } } } if(OrderType() == OP_SELL) { iProfit = (OrderOpenPrice() - dAsk)/dPoint; Trailing = TrailingStart - (iProfit - TrailingStart)*(TrailingStart - TrailingEnd)/MaxTrend; if (Trailing < TrailingEnd) Trailing = TrailingEnd; if (Trailing <= iStopLevel) Trailing = iStopLevel + 1; stoploss = NormalizeDouble(dAsk + dPoint*Trailing,iDigits); if (stoploss < OrderOpenPrice()) { if (stoploss < dOpenClose && dOpenClose < OrderOpenPrice()) stoploss = dOpenClose; takeprofit = NormalizeDouble(dBid - dPoint*(iStopLevel + TrailingEnd + iSpread + TrailingStep),iDigits); if (stoploss < OrderStopLoss() - dPoint*TrailingStep || takeprofit < OrderTakeProfit() - dPoint*TrailingStep || OrderStopLoss() == 0 || OrderTakeProfit() == 0) { ModifyStop(stoploss,takeprofit,"SELL",Trailing,iProfit); } } } } } } //---- return(0); } //+------------------------------------------------------------------+ int ModifyStop(double ldStopLoss, double ldTakeProfit, string Type, int Trail, int Profit) { bool fm; fm=OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,ldTakeProfit,0,CLR_NONE); if (fm && UseSound) { PlaySound(NameFileSound); Comment("Modify ", OrderTicket()," by ",OrderSymbol()," - ",OrderComment(),"/",Type,"\nPROFIT=",OrderProfit(),"/",Profit," Trailing=",Trail); } return(0); } // Подпрограмма закрытия встречных ордеров void CloseOpenOrders() { bool numclose = false; int iTicket1, iTicket2; string sComment1, sComment2; double dTrail1, dTrail2; for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == sSymbol && (OrderProfit() < 0 || OrderMagicNumber() == MagicNumber)) { if(OrderType() == OP_BUY) { iTicket1 = OrderTicket(); } if(OrderType() == OP_SELL) { iTicket2 = OrderTicket(); } if(iTicket1 && iTicket2) { OrderSelect(iTicket1,SELECT_BY_TICKET); sComment1 = OrderComment(); dTrail1 = (OrderStopLoss() - OrderOpenPrice())/MarketInfo(OrderSymbol(),MODE_POINT); if(OrderStopLoss() == 0) dTrail1 = -1; OrderSelect(iTicket2, SELECT_BY_TICKET); sComment2 = OrderComment(); dTrail2 = (OrderOpenPrice() - OrderStopLoss())/MarketInfo(OrderSymbol(),MODE_POINT); if(OrderStopLoss() == 0) dTrail2 = -1; if(dTrail1 > MarketInfo(sSymbol,MODE_STOPLEVEL) + MarketInfo(sSymbol,MODE_SPREAD)) numclose = OrderCloseBy(iTicket1, iTicket2, CLR_NONE); if(dTrail2 > MarketInfo(sSymbol,MODE_STOPLEVEL) + MarketInfo(sSymbol,MODE_SPREAD)) numclose = OrderCloseBy(iTicket2, iTicket1, CLR_NONE); if(numclose) { Comment("CLOSE ORDERS ",iTicket1,"-",sComment1," & ",iTicket2,"-",sComment2); break; } } } } } return(0); } // The End!
Комментарии к исходному коду форекс советника ATS_Ichimoku_2.mq4
В целях безопасности и борьбы со спамом в тексте комментариев запрещено размещать html-теги и ссылки. Благодарим за понимание.