TRUE Forex

Просмотр кода форекс советника ATS_Ichimoku_2.mq4

//+------------------------------------------------------------------+
//|                                                 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-теги и ссылки. Благодарим за понимание.

  • X
  • 0% загружено
« советник ATR_Separate_Labeled.mq4
советник AUTO profit diler.mq4 »