//+------------------------------------------------------------------+
//|                                Copyright 2013, Alexandr Gavrilin |
//|                                            http://sovetnikov.net |
//+------------------------------------------------------------------+
/*
26.05.2014
- ïðîôèò
- íåâèäèìûå ñòîïû è òåéêè
- çàêðûòèå âñåõ îðäåðîâ íà ôîðåêñ, ïðè äîñòèæåíèè ïðîôèòà
- ñáðîñ ëîòîâ íà íà÷àëüíûå ïðè äîñòèæåíèè ïðîôèòà îáùåãî
- òðàë
*/
#property copyright "Copyright 2013, DKeN (Alexandr Gavrilin)"
#property link      "http://sovetnikov.net/"
#include <mt4lib.mqh>
string expert="";
extern bool    forex=false; //åñëè ñ÷åò ôîðåêñ, òî òðóå, èíà÷å ôàëçå (íóæíî äëÿ çàêðûòèå ïî ïðîôèòó)
//extern string  list="EURUSD GBPUSD AUDCAD AUDCHF AUDJPY AUDNZD AUDUSD CADCHF CADJPY CHFJPY EURAUD EURCAD EURCHF EURGBP EURJPY EURNZD GBPAUD GBPCAD GBPCHF GBPJPY NZDJPY NZDUSD USDCAD USDCHF USDJPY"; //è ò.ä. ÷åðåç ïðîáåë , íàèìåíîâàíèå äîëæíî ñîâïàäàòü ñ íàèìåíîâàíèåì â òåðìèíàëå (ñïèñîê äëÿ îïöèîíîâ, áåç ìåòàëëîâ)
extern string  list="EURUSD_OP GBPUSD_OP AUDCAD_OP AUDCHF_OP AUDJPY_OP AUDNZD_OP AUDUSD_OP CADCHF_OP CADJPY_OP CHFJPY_OP EURAUD_OP EURCAD_OP EURCHF_OP EURGBP_OP EURJPY_OP EURNZD_OP GBPAUD_OP GBPCAD_OP GBPCHF_OP GBPJPY_OP NZDJPY_OP NZDUSD_OP USDCAD_OP USDCHF_OP USDJPY_OP"; //è ò.ä. ÷åðåç ïðîáåë , íàèìåíîâàíèå äîëæíî ñîâïàäàòü ñ íàèìåíîâàíèåì â òåðìèíàëå (ñïèñîê äëÿ îïöèîíîâ, áåç ìåòàëëîâ)
extern int     magic=1310; //ìàäæèê
extern double  start_lot=1; //íà÷àëüíûé ëîò
extern int     timeout=4; //âðåìÿ äî ýêñïåðàöèè â ìèíóòàõ, åñëè 09 òî îòêëþ÷åíî
extern double  tp=0; //òåéê
extern double  sl=0; //ñòîï
extern double  koef=2.5; //âî ñêîëüêî óâåëè÷èâàòü óáûòî÷íóþ ñäåëêó (ìíîæèòåëü ëîòà)
extern double  max_lot=1000; //ìàêñèìàëüíûé ëîò, ïîñëå êîòîðîãî îñóùåñòâëÿåòñÿ ñáðîñ ëîòà íà íà÷àëüíûé, åñëè âûñòàâèòü ìàêñ ëîò 0, òî èãíîðèðóåì îãðàíè÷åíèå è óâåëè÷èâàåìñÿ äî ïîáåäíîãî (ïîêà íå ñîëüåò)
extern int     signal_bar=1; //1 ïî çàêðûòèþ áàðà, 0 - ïî òåêóùåìó áàðó (ñèãíàë ìîæåò ïðîïàäàòü!)
extern int     tf=0; //ðàáî÷èé ïåðèîä äëÿ èíäèêàòîðà! â ìèíóòàõ, âàðèàíòû: 1,5,15,30,60,240
extern double  profit=100; //â áàêñàõ ïðîôèò, ïîñëå êîòîðîãî ñáðàñûâàåì
extern bool    bVirtual=false; //íåâèäèìûå ñòîïû
extern double  trailingstop=0; //òðåéëèíã ñòîï, óêàçàòü ïóíêòîâ ÷åðåç ñêîëêüî îí âêëþ÷àåòñÿ
extern int    PriceActionFilter  = 1;
extern int    Length             = 3;
extern int    MajorCycleStrength = 4;
extern bool   UseCycleFilter     = false;
extern int    UseFilterSMAorRSI  = 1;
extern int    FilterStrengthSMA  = 12;
extern int    FilterStrengthRSI  = 21;
bool   alertsOn=false;
extern bool   alertsOnMajorCycle = true;
extern bool   alertsOnMinorCycle = false;
bool   alertsOnCurrent    = false;
bool   alertsMessage      = false;
bool   alertsSound        = false;
bool   alertsNotify       = false;
bool   alertsEmail        = false;
bool   arrowsVisible           = true;
bool   arrowsOnMajorCycle      = true;
color  arrowsMajorUpCycleColor = LimeGreen;
color  arrowsMajorDnCycleColor = Red;
int    arrowsMajorUpCycleCode  = 241;
int    arrowsMajorDnCycleCode  = 242;
int    arrowsMajorCycleSize    = 2;
bool   arrowsOnMinorCycle      = true;
color  arrowsMinorUpCycleColor = DeepSkyBlue;
color  arrowsMinorDnCycleColor = PaleVioletRed;
int    arrowsMinorUpCycleCode  = 159;
int    arrowsMinorDnCycleCode  = 159;
int    arrowsMinorCycleSize    = 5;
string arrowsIdentifier        = "ci arrows1";
double arrowsUpperGap          = 1.0;
double arrowsLowerGap          = 1.0;
bool check;
double balance=0;
datetime tm=0;
string symbols[];
int i_tf=0;
datetime tm_start=0;
double g_balance=0;
int max_thread=100; //ìàêñèìàëüíîå êîë-âî ïîòîêîâ , êîòîðûå óïðàâëÿåò ñîâåòíèê îäíîâðåìåííî, ôàêòè÷åñêè áóäåò ãàðàçäî ìåíüøå
bool bPause=false;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//----
   bPause=false;
   check=false;
   tm=TimeCurrent();
   i_tf=tf;
   if(i_tf==0) i_tf=Period();
   string s_list=list;
   if(IsTesting()) s_list=Symbol();
   ushort u_sep=StringGetCharacter(" ",0);
   StringSplit(s_list,u_sep,symbols);
   Print("Çàãðóæåíî èíñòðóìåíòîâ: ",ArraySize(symbols));
   tm_start=(datetime)GlobalVariableGet(StringConcatenate(WindowExpertName(),".time"));
   g_balance=GlobalVariableGet(StringConcatenate(WindowExpertName(),".balance"));
   Comment("");
   if(bVirtual) mvirtual_OrdersToVirtual();
   else mvirtual_VirtualToOrders();
//----
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//----
   Comment("");
   if(bVirtual) virtual_deinit();
//----
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//----
   if(!work_check(check)) return;
   if(bVirtual) virtual2_init();
   if(forex) trailing_forex(trailingstop,trailingstop,5,bVirtual);
   if(!IsTesting())
     {
      tm_start=(datetime)GlobalVariableGet(StringConcatenate(WindowExpertName(),".time"));
      g_balance=GlobalVariableGet(StringConcatenate(WindowExpertName(),".balance"));
     }
     
   
   if(g_balance!=0.0 && profit>0)
     {
      double pr=NormalizeDouble(AccountEquity()-g_balance,2);
      Comment("Ïðèáûëü â $: ",DoubleToString(pr,2),"\nÑîõðàíåííûé áàëàíñ: ",g_balance,"\nÝêâèòè: ",AccountEquity());
      if(pr>=profit)
        {
         if(forex) my_OrderCloseAll();
         bPause=true; //çàïðåòèì îòêðûòèå íîâûõ îðäåðîâ
         
        }
     }
   int orders[7],all,i;
   double lot;
   all=0;
   ArrayInitialize(orders,0);
   if(IsTesting() || IsOptimization())
     {
      if(timeout>0)
        {
         for(i=OrdersTotal()-1;i>=0;i--)
           {
            if(!OrderSelect(i,SELECT_BY_POS)) continue;
            if(OrderMagicNumber()==magic)
              {
               if(TimeCurrent()-OrderOpenTime()>=timeout*60) order_OrderClose(OrderTicket(),-1,0,CLR_NONE);
              }
           }
        }
     }
   int _all=0;
   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread) //ïðîâåðèì åñòü ëè îòêðûòûå îðäåðà ïî äðóãèì èíñòðóìåíòàì
        {
         _all++;
        }
     }
   if(_all==0 && (bPause || g_balance==0.0))
     {
      //Åñëè îðäåðî íåò, òî îáíîâèì äàííûå
      tm_start=TimeCurrent();
      if(!IsTesting())GlobalVariableSet(StringConcatenate(WindowExpertName(),".time"),tm_start);
      g_balance=AccountBalance();
      if(!IsTesting())GlobalVariableSet(StringConcatenate(WindowExpertName(),".balance"),g_balance);
      bPause=false; //ñíèìåì ñ ïàóçå, ìîæíî îòêðûâàòü íîâûå îðäåðà
     }
   if(bPause) return; //åñëè ñîâåòíèê îñòàíîâèë íà ïàóçó òî æäåì êîãäà îðäåðà çàêðîþòñÿ è îí ñíîâà ðàçðåøèò òîðãîâàòü
   int op=0;
   bool bNew=bar_isNew(1,i_tf);
   double buy[4],sell[4];
   int imagic=0;
//ïðîãðàììíî îãðàíè÷èì 100 ïîòîêàìè
   for(int m=0;m<max_thread;m++)
     {
      imagic=magic+m;
      for(int j=0;j<ArraySize(symbols);j++)
        {
         if((bNew && signal_bar>0) || signal_bar==0)
           {
            op=0;
            buy[0]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                           PriceActionFilter,
                           Length,
                           MajorCycleStrength,
                           UseCycleFilter,
                           UseFilterSMAorRSI,
                           FilterStrengthSMA,
                           FilterStrengthRSI,
                           alertsOn,
                           alertsOnMajorCycle,
                           alertsOnMinorCycle,
                           alertsOnCurrent,
                           alertsMessage,
                           alertsSound,
                           alertsNotify,
                           alertsEmail,
                           arrowsVisible,
                           arrowsOnMajorCycle,
                           arrowsMajorUpCycleColor,
                           arrowsMajorDnCycleColor,
                           arrowsMajorUpCycleCode,
                           arrowsMajorDnCycleCode,
                           arrowsMajorCycleSize,
                           arrowsOnMinorCycle,
                           arrowsMinorUpCycleColor,
                           arrowsMinorDnCycleColor,
                           arrowsMinorUpCycleCode,
                           arrowsMinorDnCycleCode,
                           arrowsMinorCycleSize,
                           arrowsIdentifier,
                           arrowsUpperGap,
                           arrowsLowerGap,1,signal_bar);
            buy[1]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                           PriceActionFilter,
                           Length,
                           MajorCycleStrength,
                           UseCycleFilter,
                           UseFilterSMAorRSI,
                           FilterStrengthSMA,
                           FilterStrengthRSI,
                           alertsOn,
                           alertsOnMajorCycle,
                           alertsOnMinorCycle,
                           alertsOnCurrent,
                           alertsMessage,
                           alertsSound,
                           alertsNotify,
                           alertsEmail,
                           arrowsVisible,
                           arrowsOnMajorCycle,
                           arrowsMajorUpCycleColor,
                           arrowsMajorDnCycleColor,
                           arrowsMajorUpCycleCode,
                           arrowsMajorDnCycleCode,
                           arrowsMajorCycleSize,
                           arrowsOnMinorCycle,
                           arrowsMinorUpCycleColor,
                           arrowsMinorDnCycleColor,
                           arrowsMinorUpCycleCode,
                           arrowsMinorDnCycleCode,
                           arrowsMinorCycleSize,
                           arrowsIdentifier,
                           arrowsUpperGap,
                           arrowsLowerGap,1,signal_bar+1);
            sell[0]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                            PriceActionFilter,
                            Length,
                            MajorCycleStrength,
                            UseCycleFilter,
                            UseFilterSMAorRSI,
                            FilterStrengthSMA,
                            FilterStrengthRSI,
                            alertsOn,
                            alertsOnMajorCycle,
                            alertsOnMinorCycle,
                            alertsOnCurrent,
                            alertsMessage,
                            alertsSound,
                            alertsNotify,
                            alertsEmail,
                            arrowsVisible,
                            arrowsOnMajorCycle,
                            arrowsMajorUpCycleColor,
                            arrowsMajorDnCycleColor,
                            arrowsMajorUpCycleCode,
                            arrowsMajorDnCycleCode,
                            arrowsMajorCycleSize,
                            arrowsOnMinorCycle,
                            arrowsMinorUpCycleColor,
                            arrowsMinorDnCycleColor,
                            arrowsMinorUpCycleCode,
                            arrowsMinorDnCycleCode,
                            arrowsMinorCycleSize,
                            arrowsIdentifier,
                            arrowsUpperGap,
                            arrowsLowerGap,2,signal_bar);
            sell[1]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                            PriceActionFilter,
                            Length,
                            MajorCycleStrength,
                            UseCycleFilter,
                            UseFilterSMAorRSI,
                            FilterStrengthSMA,
                            FilterStrengthRSI,
                            alertsOn,
                            alertsOnMajorCycle,
                            alertsOnMinorCycle,
                            alertsOnCurrent,
                            alertsMessage,
                            alertsSound,
                            alertsNotify,
                            alertsEmail,
                            arrowsVisible,
                            arrowsOnMajorCycle,
                            arrowsMajorUpCycleColor,
                            arrowsMajorDnCycleColor,
                            arrowsMajorUpCycleCode,
                            arrowsMajorDnCycleCode,
                            arrowsMajorCycleSize,
                            arrowsOnMinorCycle,
                            arrowsMinorUpCycleColor,
                            arrowsMinorDnCycleColor,
                            arrowsMinorUpCycleCode,
                            arrowsMinorDnCycleCode,
                            arrowsMinorCycleSize,
                            arrowsIdentifier,
                            arrowsUpperGap,
                            arrowsLowerGap,2,signal_bar+1);
            //minor
            buy[2]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                           PriceActionFilter,
                           Length,
                           MajorCycleStrength,
                           UseCycleFilter,
                           UseFilterSMAorRSI,
                           FilterStrengthSMA,
                           FilterStrengthRSI,
                           alertsOn,
                           alertsOnMajorCycle,
                           alertsOnMinorCycle,
                           alertsOnCurrent,
                           alertsMessage,
                           alertsSound,
                           alertsNotify,
                           alertsEmail,
                           arrowsVisible,
                           arrowsOnMajorCycle,
                           arrowsMajorUpCycleColor,
                           arrowsMajorDnCycleColor,
                           arrowsMajorUpCycleCode,
                           arrowsMajorDnCycleCode,
                           arrowsMajorCycleSize,
                           arrowsOnMinorCycle,
                           arrowsMinorUpCycleColor,
                           arrowsMinorDnCycleColor,
                           arrowsMinorUpCycleCode,
                           arrowsMinorDnCycleCode,
                           arrowsMinorCycleSize,
                           arrowsIdentifier,
                           arrowsUpperGap,
                           arrowsLowerGap,2,signal_bar);
            buy[3]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                           PriceActionFilter,
                           Length,
                           MajorCycleStrength,
                           UseCycleFilter,
                           UseFilterSMAorRSI,
                           FilterStrengthSMA,
                           FilterStrengthRSI,
                           alertsOn,
                           alertsOnMajorCycle,
                           alertsOnMinorCycle,
                           alertsOnCurrent,
                           alertsMessage,
                           alertsSound,
                           alertsNotify,
                           alertsEmail,
                           arrowsVisible,
                           arrowsOnMajorCycle,
                           arrowsMajorUpCycleColor,
                           arrowsMajorDnCycleColor,
                           arrowsMajorUpCycleCode,
                           arrowsMajorDnCycleCode,
                           arrowsMajorCycleSize,
                           arrowsOnMinorCycle,
                           arrowsMinorUpCycleColor,
                           arrowsMinorDnCycleColor,
                           arrowsMinorUpCycleCode,
                           arrowsMinorDnCycleCode,
                           arrowsMinorCycleSize,
                           arrowsIdentifier,
                           arrowsUpperGap,
                           arrowsLowerGap,2,signal_bar+1);
            sell[2]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                            PriceActionFilter,
                            Length,
                            MajorCycleStrength,
                            UseCycleFilter,
                            UseFilterSMAorRSI,
                            FilterStrengthSMA,
                            FilterStrengthRSI,
                            alertsOn,
                            alertsOnMajorCycle,
                            alertsOnMinorCycle,
                            alertsOnCurrent,
                            alertsMessage,
                            alertsSound,
                            alertsNotify,
                            alertsEmail,
                            arrowsVisible,
                            arrowsOnMajorCycle,
                            arrowsMajorUpCycleColor,
                            arrowsMajorDnCycleColor,
                            arrowsMajorUpCycleCode,
                            arrowsMajorDnCycleCode,
                            arrowsMajorCycleSize,
                            arrowsOnMinorCycle,
                            arrowsMinorUpCycleColor,
                            arrowsMinorDnCycleColor,
                            arrowsMinorUpCycleCode,
                            arrowsMinorDnCycleCode,
                            arrowsMinorCycleSize,
                            arrowsIdentifier,
                            arrowsUpperGap,
                            arrowsLowerGap,3,signal_bar);
            sell[3]=iCustom(symbols[j],i_tf,"ForexMT4Systems_Cycle",
                            PriceActionFilter,
                            Length,
                            MajorCycleStrength,
                            UseCycleFilter,
                            UseFilterSMAorRSI,
                            FilterStrengthSMA,
                            FilterStrengthRSI,
                            alertsOn,
                            alertsOnMajorCycle,
                            alertsOnMinorCycle,
                            alertsOnCurrent,
                            alertsMessage,
                            alertsSound,
                            alertsNotify,
                            alertsEmail,
                            arrowsVisible,
                            arrowsOnMajorCycle,
                            arrowsMajorUpCycleColor,
                            arrowsMajorDnCycleColor,
                            arrowsMajorUpCycleCode,
                            arrowsMajorDnCycleCode,
                            arrowsMajorCycleSize,
                            arrowsOnMinorCycle,
                            arrowsMinorUpCycleColor,
                            arrowsMinorDnCycleColor,
                            arrowsMinorUpCycleCode,
                            arrowsMinorDnCycleCode,
                            arrowsMinorCycleSize,
                            arrowsIdentifier,
                            arrowsUpperGap,
                            arrowsLowerGap,3,signal_bar+1);
            if(alertsOnMajorCycle && op==0)
              {
               if(buy[0]!=0 && buy[1]==0) op=1;
               else if(sell[0]!=0 && sell[1]==0) op=-1;
              }
            if(alertsOnMinorCycle && op==0)
              {
               if(buy[2]!=0 && buy[3]==0) op=1;
               else if(sell[2]!=0 && sell[3]==0) op=-1;
              }
           }
         bool bContinue=false;
         all=0;
         ArrayInitialize(orders,0);
         for(i=OrdersTotal()-1;i>=0;i--)
           {
            if(!OrderSelect(i,SELECT_BY_POS)) continue;
            if(symbols[j]==OrderSymbol()) bContinue=true;
            if(OrderMagicNumber()==imagic) //ïðîâåðèì åñòü ëè îòêðûòûå îðäåðà ïî äàííîìó ïîòîêó
              {
               orders[OrderType()]++;
               all++;
              }
           }
         if(bContinue) continue; //åñëè ìû íàøëè ÷òî ïî äàííîìó èíñòðóìåíòó åñòü îòêðûòàÿ ñäåëêà, òî äàííûé ñèãíàë ïðîïóñêàåòñÿ
         if(all>0) continue; //ïðîïóñêàåì ñèãíàë åñëè åñòü îòêðûòûå ñäåëêè â ýòîì ïîòîêå
                             //åñëè îðäåðîâ â ïîòîêå íåò, òî ïðîâåðèì êàê çàêðûëèñü îðäåðà â ïîòîêå
         if(all==0 && op!=0)
           {
            int minus=0;
            double last_lot=0;
            string smb="";
            for(i=OrdersHistoryTotal()-1;i>=0;i--)
              {
               if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
               if(OrderMagicNumber()==imagic && OrderOpenTime()>=tm_start) //íàéäåì ïîñëåäíèé çàêðûòûé îðäåð
                 {
                  if(OrderType()==OP_BUY && ND3(OrderClosePrice()-OrderOpenPrice())<ND3(0.0)) minus=-1;
                  if(OrderType()==OP_SELL && ND3(OrderOpenPrice()-OrderClosePrice())<ND3(0.0)) minus=-1;
                  if(OrderType()==OP_BUY && ND3(OrderClosePrice()-OrderOpenPrice())>ND3(0.0)) minus=0;
                  if(OrderType()==OP_SELL && ND3(OrderOpenPrice()-OrderClosePrice())>ND3(0.0)) minus=0;
                  if(OrderType()==OP_BUY && ND3(OrderClosePrice()-OrderOpenPrice())==ND3(0.0))minus=1;
                  if(OrderType()==OP_SELL && ND3(OrderOpenPrice()-OrderClosePrice())==ND3(0.0))minus=1;
                  last_lot=OrderLots();
                  smb=OrderSymbol();
                  break;
                 }
              }
            if(smb==symbols[j] && minus==-1) continue; //åñëè ïî ýòîé ïàðå áûë ìèíóñ òî åãî ïðîïóñêàåì
                                                       //Comment("Êîë-âî ìèíóñîâûõ: ",minus);   
            if(minus==-1) lot=NLot(last_lot*koef);
            if(minus==1) lot=NLot(last_lot);
            if(minus==0) lot=NLot(start_lot);
            if(lot>max_lot && max_lot>0) lot=NLot(start_lot); //âûñòàâèì ëîò íà íà÷àëüíûé
            int type=-1;
            if(op==1) type=OP_BUY; else type=OP_SELL;
            //ïîäáèðàåì ëîò åñëè ó íàñ ðàññ÷èòàííûì íå õâàòèò ìàðæè
            while(AccountFreeMarginCheck(symbols[j],type,lot)<=0 || GetLastError()==134)
              {
               lot=NLot(lot/koef); //ïðîáóåì óìåíüøèòü
              }
            if(op==1) order_OrderSendNDD(symbols[j],imagic,OP_BUY,lot,-1,sl,tp,DoubleToStr(timeout,0),0,clrBlue,bVirtual);
            else if(op==-1) order_OrderSendNDD(symbols[j],imagic,OP_SELL,lot,-1,sl,tp,DoubleToStr(timeout,0),0,clrRed,bVirtual);
           }
        }
     }
//----
  }
//+------------------------------------------------------------------+
void my_OrderCloseAll()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
        { //ïðîâåðèì åñòü ëè îòêðûòûå îðäåðà ïî äðóãèì èíñòðóìåíòàì
         order_OrderClose(OrderTicket(),-1,0,CLR_NONE);
        }
     }
  }
//+------------------------------------------------------------------+
void trailing_forex(double level1,double step1,int trailingpause_time=5,bool bvirtual=false)
  {
   datetime tm_buy=0,tm_sell=0;
   double st;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderType()>=2) continue;
      if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
        {
         string n=OrderSymbol();
         double tick=MarketInfo(n,MODE_TICKSIZE);
         double pt=0;
         double stop=OrderStopLoss();
         double p=p(n);
         if(bvirtual) stop=virtual_get_sl(OrderTicket());
         if(OrderType()==OP_BUY)
           {
            pt=(dBid(n)-OrderOpenPrice())/p;
            // Print("buy pt=",pt);    
            st=NormalizeDouble(MathFloor((dBid(n)-step1*p)/tick)*tick,dDigits(n));
            if(pt>=level1 && level1!=0)
              {
               if(stop==0 || (stop<st && TimeCurrent()-tm_buy>=trailingpause_time))
                 {
                  order_OrderModify(OrderTicket(),-1,st,-1,0,Green,bvirtual);
                  tm_buy=TimeCurrent();
                  continue;
                 }
              }
           }
         if(OrderType()==OP_SELL)
           {
            pt=(OrderOpenPrice()-dAsk(n))/p;
            st=NormalizeDouble(MathFloor((dAsk(n)+step1*p)/tick)*tick,dDigits(n));
            if(pt>=level1 && level1!=0)
              {
               if(stop==0 || (stop>st && TimeCurrent()-tm_sell>=trailingpause_time))
                 {
                  order_OrderModify(OrderTicket(),-1,st,-1,0,Green,bvirtual);
                  tm_sell=TimeCurrent();
                  continue;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void mvirtual_OrdersToVirtual()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
        {
         if(OrderStopLoss()!=0.0 || OrderTakeProfit()!=0.0)
           {
            virtual_set(OrderTicket(),OrderStopLoss(),OrderTakeProfit());
            order_OrderModify(OrderTicket(),OrderOpenPrice(),0,0,OrderExpiration(),CLR_NONE);
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void mvirtual_VirtualToOrders()
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS)) continue;
      if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+max_thread)
        {
         if(OrderStopLoss()==0.0 && OrderTakeProfit()==0.0 && virtual_check(OrderTicket()))
           {
            order_OrderModify(OrderTicket(),-1,virtual_get_sl(OrderTicket()),virtual_get_tp(OrderTicket()),0,CLR_NONE);
           }
        }
     }
  }
//+------------------------------------------------------------------+
bool virtual_check(int ticket){
   if(ticket<=0) return (false);
   string n;
   
   if(IsTesting()) n=StringConcatenate("virtual_",DoubleToStr(ticket,0),"_tp");
   else n=StringConcatenate(DoubleToStr(ticket,0),"_tp");
   
   if(GlobalVariableCheck(n)) return (true);
   
   if(IsTesting()) n=StringConcatenate("virtual_",DoubleToStr(ticket,0),"_sl");
   else n=StringConcatenate(DoubleToStr(ticket,0),"_sl");
   
   if(GlobalVariableCheck(n)) return (true);
   
   return (false);
}
             
            
            
            
Comments