TrendAndDiver





       
//+------------------------------------------------------------------+
//|                                                    TrendAndDiver |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#include <WinUser32.mqh>
#include <stderror.mqh>
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| EX4 imports                                                      |
//+------------------------------------------------------------------+
 #import "Diver.ex4"
 int BreackUpTrendCondition (int TimeFrame, int MaxWaveNum);
 int BreackDownTrendCondition (int TimeFrame, int WaveNum);
 bool SeachDiv(int TimeFrame, int MaxWaveNum, int StartBar);
 bool SeachConv(int TimeFrame,int cMaxWaveNum,int StartBar);
 bool DiverKind(int SeekBar, int TimeFrame);
 bool ConvKind(int SeekBar, int TimeFrame);
 void dinstall(int StrBar);
 void cinstall(int StrBar);
 void AddpipsInit(int spips,int bpips);
 void PeriodInit(int P1,int P2);
 #import
//+------------------------------------------------------------------+

#property copyright "Mikhail Sapozhnikov "
#property link      "http://www.metaquotes.net"

//---- input parameters

//extern int    trend = 1;

extern double Lots = 1;
extern double StopLoss = 150;
extern double TakeProfit = 0;

extern double    dADX0 = 65; 
extern double    dADX1 = 30 ;
extern double    cADX0 = 30; 
extern double Bulls100=0.041  ;
//extern double Bears100=-0.02;
extern double MaxStStopSellonDn= 25;
extern double MinStSellonDn=53;
extern int    cWaveTopNum = 12;
extern int    dWaveTopNum = 8;
extern double    dMinTp = 600;
extern int Days=5 ;

extern int    OrderNum=3;
extern int    MainOrderNum=2;
extern int    LocalOrderNum=2;
extern int    LocalOrderNum1=3;
extern double Boundary=0.5;

extern int    Spips=25;
extern int    Bpips=0;
// ----- Òðåíäîâûå êîíñòàíòû ------
#define Up 3
#define Flat 2  
#define Down 1
#define Unknown -1

#define NoSignal 9
#define Ready 8
#define Ready1 7
#define Ready2 6
#define Go 1
#define TakeYourTime 10
#define MainLongMagic 234
#define LongMagic 2345
#define LongMagic1 2346
#define LongMagic2 2347
#define MainShortMagic 123
#define ShortMagic 1235
#define ShortMagic1 1236
#define ShortMagic2 1237


 int  cMainFrame=PERIOD_D1;
 int  cSlaveFrame=PERIOD_W1;
 int  dMainFrame=PERIOD_W1;
 int  dSlaveFrame=PERIOD_H4;
 int  shift=0; //Ãîòîâèìñÿ ê àíàëèçó íà ïðîøëûõ áàðàõ
 double    W1MinBears=-0.055 ;

 int    Week = 5;
 bool Gb,test1;

int total,OrderCount; //îáùåå êîë-âî îòêðûòûõ îðäåðîâ
int lastCloseMagic, lastCloseProf;

int sMagicNum,sMagicNum1, sMagicNum2, sMainMagicNum,
    lMagicNum, lMagicNum1, lMagicNum2, lMainMagicNum; 

int lWaitMagicCnt;
int sWeekMnMagicCnt,lWeekMnMagicCnt,lDayMagicCnt, sDayMagicCnt;
int sDaySmallMagicCnt, sDaySmallMagic2Cnt, lDaySmallMagicCnt,lDaySmallMagic2Cnt;

datetime  LastMainDnGoWeek,LastMainUpGoWeek;
datetime  LastLocDnGoDay,LastLocUpGoDay;
datetime  LastSmallUpDay, LastSmallUpDay2, LastSmallDnDay, LastSmallDn2Day;

double StartBalance, HPR, SumHPR, AHPR, GHPR;

int BarsNum=500, BullsP=13, BearsP=13, ADXperiod=13, adx55step=16;
   
//== ñèãíàëû  ===
double buyADX, sellADX,sellADXDmax, sellADXWmax;

  int WaitUp, WaitDn, WaitCorre, WaitCont, WaitSmallCorr,WaitSmallCont,
      WaitSmallUp, WaitSmallDn;

  int sStartWaitingTime,bStartWaitingTime,sStartCorreTime, sStartTakeYourTime; //íà÷àëî îòñ÷åòà
  int MainTrend,  LocalTrend, SmallTrend,MA100Vector;
  int   WaveNum, LongCall, ShortCall;
  

bool SetGlobVar(string Name, int Val)
{ datetime Now=TimeCurrent(), r=0;
  while (!(r>0 || TimeCurrent()-Now>10))
   r=GlobalVariableSet(Name,Val);
   if(r==0)
    { Print("Oøèáêà ",GetLastError()," ãëîáàëüíîé ïåðåìåííîé ",Name);
            return(false);            
    }
    return(true);
}

//--------------------------
bool LastCloseParam()
{ int i , histotal= OrdersHistoryTotal();
   int mag;
   bool Y;
   
    for( i=histotal-1;i>=0;i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
    { Print("Error in history!");lastCloseProf=0 ;break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
 
     lastCloseMagic=OrderMagicNumber();
    if ((lastCloseMagic!=MainLongMagic 
        && lastCloseMagic!=LongMagic 
        && lastCloseMagic!=LongMagic1 
        && lastCloseMagic!=LongMagic2 
        && lastCloseMagic!=MainShortMagic 
        && lastCloseMagic!=ShortMagic 
        && lastCloseMagic!=ShortMagic1 
        && lastCloseMagic!=ShortMagic2 ))
         {Y=false;continue;}
        Y=true;
       lastCloseProf=OrderProfit();
       break;
   }
   
   if(lastCloseProf>=0) Y=true;
   else Y=false;
 return(Y);
}

//-------------------------- 
 void OrdersMagic() 
  {  int cn; 
     double Prof;
     
     lMagicNum=0;
     lMagicNum1=0;
     lMagicNum2=0;
     lMainMagicNum=0;
     lWeekMnMagicCnt=0;
     lDayMagicCnt=0;
     lDaySmallMagicCnt=0;
     lDaySmallMagic2Cnt=0;
    
     sMagicNum=0;
     sMagicNum1=0;
     sMagicNum2=0;
     sMainMagicNum=0;
     sWeekMnMagicCnt=0;
     sDayMagicCnt=0;
     sDaySmallMagicCnt=0;
     sDaySmallMagic2Cnt=0;


    lWaitMagicCnt=0;    
    
     for(cn=0;cn<total;cn++)
       {//for
        if( OrderSelect(cn, SELECT_BY_POS, MODE_TRADES)==true)
        if(OrderType()<=OP_SELL && 
           OrderSymbol()==Symbol())  // check for symbol
          {//1 
        if(OrderType()==OP_BUY)   // long position is opened
            {//2
            if(OrderMagicNumber()==MainLongMagic)
              { lMainMagicNum++; LastMainUpGoWeek=OrderOpenTime();
                if(TimeCurrent()- LastMainUpGoWeek<86400*10)
                 lWeekMnMagicCnt++;
                 continue;
               }    
                         
             if(OrderMagicNumber()==LongMagic)
              {lMagicNum++; LastLocUpGoDay=OrderOpenTime();
                if(TimeCurrent()- LastLocUpGoDay<86400*3)
                lDayMagicCnt++;
                continue;
               }
               
             if(OrderMagicNumber()==LongMagic1) 
             {lMagicNum1++; LastSmallUpDay=OrderOpenTime();
              if( TimeCurrent()-LastSmallUpDay<86400*2)
               lDaySmallMagicCnt++;

             if(Bid-OrderOpenPrice()>90*Point && !(OrderStopLoss()==OrderOpenPrice()) )
                 OrderModify(OrderTicket(),Bid-20*Point,OrderOpenPrice(),OrderTakeProfit(),0,Gold);
              
               if(Bid-OrderOpenPrice()>200*Point)
                 {LocalTrend=Up; GlobalVariableSet("gLocalTrend"+Symbol(),Up);}
             continue;    
           }
              
             if(OrderMagicNumber()==LongMagic2) 
             {lMagicNum2++; LastSmallUpDay2=OrderOpenTime();
              if( TimeCurrent()-LastSmallUpDay2<86400*2)
               lDaySmallMagic2Cnt++;
               continue;
               }
            }
        if(OrderType()==OP_SELL) 
            {if(OrderMagicNumber()==MainShortMagic) 
            {sMainMagicNum++;LastMainDnGoWeek=OrderOpenTime();
             if(TimeCurrent()- LastMainDnGoWeek<86400*10)
             sWeekMnMagicCnt++;
             continue;
             }              
            if(OrderMagicNumber()==ShortMagic)
             {sMagicNum++;LastLocDnGoDay=OrderOpenTime();
              if(TimeCurrent()- LastLocDnGoDay<86400*5)
                sDayMagicCnt++;
             if( TimeCurrent()-LastLocDnGoDay>86400*Days 
                  )
             {  if(iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,1)
                  >iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,10))
              {Prof=MathFloor(10000*iIchimoku(NULL, dMainFrame, 9, 26, 52, MODE_KIJUNSEN, 0))/10000;
               if (Prof-MathFloor(10000*iIchimoku(NULL, dMainFrame, 9, 26, 52, MODE_KIJUNSEN, 1))/10000>3*Point
                   && Prof!=OrderTakeProfit()  )
              { if(sellADXDmax>=59) 
               { if( (sellADXDmax<=68 || MainTrend==Down) && OrderOpenPrice()-Bid >15*Point
                      && OrderStopLoss()!=OrderOpenPrice())
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),Prof,0,Gold);
                }
                } 
               }
              }
            continue;
              }
            if(OrderMagicNumber()==ShortMagic1)
             {sMagicNum1++; LastSmallDnDay=OrderOpenTime();
              if(TimeCurrent()- LastSmallDnDay<86400*3)
                sDaySmallMagicCnt++;
              continue;
              }
             if(OrderMagicNumber()==ShortMagic2)
             {sMagicNum2++; LastSmallDn2Day=OrderOpenTime();
              if(TimeCurrent()- LastSmallDn2Day<86400*1)
                sDaySmallMagic2Cnt++;
                if( iMA(NULL,240,21,0,MODE_EMA,PRICE_CLOSE,21)-
                   iMA(NULL,240,21,0,MODE_EMA,PRICE_CLOSE,1)>=90*Point
                   &&  OrderTakeProfit()>0)
                   OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,0,Gold);   
              }
              continue; 
            }
          }
       }
 }
//==============================

   int CheckADX (int TimeFrame, int P, int Start, int adxStep)
 {
    if ( iADX(NULL,TimeFrame,P,PRICE_HIGH,MODE_MAIN,Start)<
         iADX(NULL,TimeFrame,P,PRICE_HIGH,MODE_MAIN,Start+adxStep)
        )
        return(Down);
        else
        {if ( iADX(NULL,TimeFrame,P,PRICE_HIGH,MODE_MAIN,Start)>
         iADX(NULL,TimeFrame,P,PRICE_HIGH,MODE_MAIN,Start+adxStep))
        return(Up);}
    return(Flat);
   }
//--------------------------------------------------------------
   int CheckiMa(int TimeFrame, int P, int Mode, int Start, int Step)
 {
    if ( iMA(NULL,TimeFrame,P,0,PRICE_CLOSE,Mode,Start)<
         iMA(NULL,TimeFrame,P,0,PRICE_CLOSE,Mode,Start+Step)
        )
        return(Down);
        else
        {if (iMA(NULL,TimeFrame,P,0,PRICE_CLOSE,Mode,Start)>
         iMA(NULL,TimeFrame,P,0,PRICE_CLOSE,Mode,Start+Step))
        return(Up);}
    return(Flat);
   }
//===================================================================+
double minStoch(int Frame, int StartBar, int BarCnt )
{ int i,j;
 double minStoch;
 minStoch=iStochastic(NULL,Frame,8,3,3,MODE_SMA,0,MODE_MAIN, StartBar);
for (i=StartBar+1;i<=StartBar+BarCnt;i++)
{ if(minStoch>iStochastic(NULL,Frame,8,3,3,MODE_SMA,0,MODE_MAIN, i))
   minStoch=iStochastic(NULL,Frame,8,3,3,MODE_SMA,0,MODE_MAIN, i);
}//for
return(minStoch);
}
//===================================================================+
double maxADX(int Frame, int StartBar, int BarCnt )
{ int i,j;
 double maxAD=iADX(NULL,Frame,13,PRICE_HIGH,MODE_MAIN,StartBar);
 for (i=StartBar+1;i<=StartBar+BarCnt;i++)
{ if(maxAD<iADX(NULL,Frame,13,PRICE_HIGH,MODE_MAIN,i))
   maxAD=iADX(NULL,Frame,13,PRICE_HIGH,MODE_MAIN,i);
}//for
return(maxAD);
}
//===================================================================+
double BearForce(int Frame, int BarCnt )
{ int i,j;
 double Bear;
 Bear= iBearsPower( NULL, Frame, 13, PRICE_CLOSE, 1);
for (i=2;i<=BarCnt;i++)
{ if(Bear>iBearsPower( NULL, Frame, 13, PRICE_CLOSE, i))
   Bear=iBearsPower( NULL, Frame, 13, PRICE_CLOSE, i);
}//for
return(Bear);
}
double BullDecline(int Frame, int BarCnt )
{ int i,j;
 double  Bull;
 Bull= iBullsPower( NULL, Frame, 13, PRICE_CLOSE, 1);
for (i=2;i<=BarCnt;i++)
{ if(Bull>iBullsPower( NULL, Frame, 13, PRICE_CLOSE, i))
   Bull=iBullsPower( NULL, Frame, 13, PRICE_CLOSE, i);
}//for
return(Bull);
}
//+------------------------------------------------------------------+
//  óñëîâèÿ äëÿ äèâåðãåíöèè
//+------------------------------------------------------------------+
double dStrongCond (int TimeFrame, double dADXhigh, int StBar)
{  double tmpADX;
    tmpADX=iADX(NULL,TimeFrame,ADXperiod,PRICE_HIGH,MODE_MAIN,StBar);
  if (  ( tmpADX>dADXhigh 
        && iADX(NULL,TimeFrame,ADXperiod,PRICE_HIGH,MODE_PLUSDI,StBar+1)>
           iADX(NULL,TimeFrame,ADXperiod,PRICE_HIGH,MODE_MINUSDI,StBar+1))
      )
     return(tmpADX);
     else
     return(0);
}

//+------------------------------------------------------------------+
//  óñëîâèÿ äëÿ êîíâåðãåíöèè
//+------------------------------------------------------------------+
double  cMidlCond(int TimeFrame,int applied_price, double cADXhigh, int StBar)
{
double tmpADX;
   tmpADX=iADX(NULL,TimeFrame,ADXperiod,applied_price,MODE_MAIN,StBar);
if (  ( tmpADX>cADXhigh 
        && iADX(NULL,TimeFrame,ADXperiod,applied_price,MODE_PLUSDI,StBar+1)<
        iADX(NULL,TimeFrame,ADXperiod,applied_price,MODE_MINUSDI,StBar+1))
        ) 
        return(tmpADX);
        else
        return(0);
}  

//+------------------------------------------------------------------+
//| expert  function for short 
//+------------------------------------------------------------------+
int MainShortOrder(int OrderCnt, int MagNum, double  sTP=0)
{   datetime Begin=TimeCurrent();
    double SL; // StopLoss â ïóíêòàõ
     int mg, error,result;
     bool Y;
//---- 
if( total<OrderNum )
{Y=true;
mg=MagNum;
switch (mg)
{
case MainShortMagic :
{ if (
       sMainMagicNum>=MainOrderNum 
     || sWeekMnMagicCnt>=1 ) 
    Y=false;
   else    SL= iHigh(NULL,dMainFrame,0)+250*Point;
 }
 break;
 case ShortMagic :
 if (sMagicNum>=LocalOrderNum
 || sDayMagicCnt>=1)
  Y=false;
   else    SL= iHigh(NULL,dMainFrame,0)+StopLoss*Point;
 break;
 case ShortMagic1 :
 if (sMagicNum1>=LocalOrderNum1
     || sDaySmallMagicCnt>=1 ) 
 Y=false;
  else    SL= iHigh(NULL,dMainFrame,0)+StopLoss*Point;
 break;
 case ShortMagic2 :
 {if (sMagicNum2>=LocalOrderNum1
     || sDaySmallMagic2Cnt>=1 ) 
 Y=false;
 else    SL= iHigh(NULL,dMainFrame,0)+80*Point;
 }
 break;

 }//sw
}else Y=false;


if(Y )
{
  result= OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,
           sTP,"",mg,0,White);
  
   if (result==-1)
    {error=GetLastError();
      Print("error(",error,"): ",ErrorDescription(error));
       if(!IsTesting())
         {while(!( result>0 || TimeCurrent()-Begin>20))
          {Sleep(1000);   RefreshRates();
           result= OrderSend(Symbol(),OP_SELL,Lots,Bid,3,SL,
            sTP,"",mg,0,White); }
         }
     }
           else  
           { total=OrdersTotal();ChangeLot();
            SelectData();
           }
   }
   return(result);
 }
 
	   
//-----------------------------------------  
// Ïðîôèò äëÿ äëèííûõ ïîçèöèé íà êîíâåðãåíöèè D1
//-----------------------------------------
  double bProfit( double Adx)
  { double Level;
    double Level1;
   if (
   CheckADX(1440,13,0,adx55step)==Up
        || MainTrend==Up)
   { 
    Level=0;
  return(0);   }
  else
   { 
   //Åñëè äâèæåíèå íàèñõîäå, îãðàíè÷èâàåì Profit
   if (CheckADX(1440,13,0,adx55step)==Down)
     {Level1 =       iMA(NULL,cMainFrame,55,0,MODE_EMA,PRICE_HIGH, 0 );
      Level=Level1 + iMA(NULL,cMainFrame,55,0,MODE_EMA,PRICE_HIGH,1)-
                     iMA(NULL,cMainFrame,55,0,MODE_SMA,PRICE_HIGH, 10);
      return(Level);
      }
   }
  return(Level);
  }
  
 int MainLongOrder(double  bTkP=0, int Mag=MainLongMagic)
{ datetime Begin=TimeCurrent();
double StL;
  int magic, res, err;
  res=-1;
   if( total<OrderNum )
{ 
     magic=Mag;
     switch (magic)
     {case MainLongMagic :
      {if (lMainMagicNum>=MainOrderNum
      || lWeekMnMagicCnt>=1
      ) return;
      else  StL=iLow(NULL,cMainFrame,0)-StopLoss*Point;
      }
      break;
      case LongMagic :
      {if (lMagicNum>=LocalOrderNum
      || lDayMagicCnt>=1)return;
      else  StL=iLow(NULL,cMainFrame,0)-StopLoss*Point;
      }
      break;
      case LongMagic1 :
      {if (lMagicNum1>=LocalOrderNum1
      || lDaySmallMagicCnt>=1)return;
      else  StL=iLow(NULL,cMainFrame,0)-80*Point;
      }
      break;
      case LongMagic2 :
      {if (lMagicNum2>=LocalOrderNum1
      || lDaySmallMagic2Cnt>=1)return;
      else  StL=iLow(NULL,cMainFrame,0)-80*Point;
      }
     }
        res= OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StL,
           bTkP,"",magic,0,Lime);

    if (res<0)
        {err=GetLastError();
         Print("error(",err,"): ",ErrorDescription(err));
    if(!IsTesting())
     {while(!( res>0 || TimeCurrent()-Begin>20))
      {Sleep(1000);   RefreshRates();
       res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StL,
           bTkP,"",magic,0,Lime);
      }
     }

         }
        else   { total=OrdersTotal();ChangeLot(); SelectData(); }
}
    return(res);
}

void SelectData()
{ double BullTop, BearTop, AdxD1,AdxD2;
Print("WaveNum=",WaveNum);
int Move=CheckADX(1440,13,1,2);
if (Move==Up) Print("ADX Up");
 else 
  if (Move==Down) Print("ADX Down");
  else
    if (Move==Flat) Print("ADX Flat");

AdxD1=  iADX(NULL,1440,13,PRICE_HIGH,MODE_MAIN,1);
AdxD2=  iADX(NULL,1440,13,PRICE_HIGH,MODE_MAIN,2);
Print("AdxD1=",AdxD1,"  AdxD2=",AdxD2);
Print("sellADXDmax=",sellADXDmax);

BullTop=iBullsPower( NULL, dMainFrame, 13, PRICE_CLOSE, 0);
for (int i=1;i==10;i++)
{if(iBullsPower( NULL, dMainFrame, 13, PRICE_CLOSE, i)>BullTop)
BullTop=iBullsPower( NULL, dMainFrame, 13, PRICE_CLOSE, i);
}
BearTop=iBearsPower( NULL, dMainFrame, 13, PRICE_CLOSE, 0);
for ( i=1;i==10;i++)
{if(iBearsPower( NULL, dMainFrame, 13, PRICE_CLOSE, i)>BearTop)
BearTop=iBearsPower( NULL, dMainFrame, 13, PRICE_CLOSE, i);
}
if(WaitDn==Ready) Print("WaitDn=Ready");
else
  if(WaitDn==NoSignal) Print("WaitDn=NoSignal");
  else
  if(WaitDn==Go) {Print("WaitDn=Go");
   Print("Bid=", Bid);}   

if(WaitUp==Ready) Print("WaitUp=Ready");
else
  if(WaitUp==NoSignal) Print("WaitUp=NoSignal");
  else
  if(WaitUp==Go) {Print("WaitUp=Go");
   Print("Ask=", Ask);}   
Print("BullTop=",BullTop,"  BearTop=",BearTop);
if(WaitCorre==Ready) Print("WaitCorre=Ready");
else
  if(WaitCorre==NoSignal) Print("WaitCorre=NoSignal");
  else
  if(WaitCorre==Go) {Print("WaitCorre=Go");
   Print("Bid=", Bid);}
   
if(WaitCont==Ready) Print("WaitCont=Ready");
 else
   if(WaitCont==Go)
  {Print("WaitCont=Go"); Print("Ask=", Ask); }   
  Print("");
  Print("========================= New Data =======================================");
return;
}

void ChangeLot()
{ int histtotal=OrdersHistoryTotal();
      if(histtotal>0)
      {HPR=(AccountBalance()/(AccountBalance()-lastCloseProf));
       SumHPR=SumHPR+HPR;
       AHPR=(SumHPR)/histtotal;
       }

 if(lastCloseProf>0) Lots+=0.1;
  if(lastCloseProf<0) Lots-=0.1;
     if(Lots>5)   Lots=5;
     if(Lots<0.1)   Lots=0.1;
}

void TestInstall()
{ if(TimeCurrent()<StrToTime("2006.10.10 00:00"))
{WaveNum=0;
WaitUp=NoSignal; WaitDn=NoSignal;  WaitCorre=NoSignal;
 MainTrend=Unknown;
 LocalTrend=Unknown;
 SmallTrend=Unknown;  
 WaitSmallUp=NoSignal;
 WaitSmallDn=NoSignal;
 WaitSmallCont=NoSignal;}
 else
 { if(  TimeCurrent()<StrToTime("2007.9.21 00:00"))
   {MainTrend=Up;SetGlobVar("gMainTrend"+Symbol(),MainTrend);}
   if(TimeCurrent()<StrToTime("2006.12.08 16:01"))
   {LocalTrend=Up;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=1;SetGlobVar("gWaveNum"+Symbol(),1);}
   else
   if(TimeCurrent()<StrToTime("2007.01.11 15:20"))
   {LocalTrend=Down;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=2;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}
   else
   if(TimeCurrent()<StrToTime("2007.04.25 00:00"))
   {LocalTrend=Up;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=3;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}
      else
   if(TimeCurrent()<StrToTime("2007.06.2 00:00"))
   {LocalTrend=Down;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=4;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}
      else
   if(TimeCurrent()<StrToTime("2007.07.17 00:00"))
   {LocalTrend=Up;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=5;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}
      else
   if(TimeCurrent()<StrToTime("2007.08.20 00:00"))
   {LocalTrend=Down;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=6;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}
      else
   if(TimeCurrent()<StrToTime("2007.09.21 00:00"))
   {LocalTrend=Up;SetGlobVar("gLocalTrend"+Symbol(),LocalTrend);
   WaveNum=7;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}

}
}
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
 {    LastMainUpGoWeek=0;
      LastMainDnGoWeek=0;
      LastLocUpGoDay=0;
      LastLocDnGoDay=0;
      LastSmallUpDay=0;
      LastSmallUpDay2=0;
      LastSmallDnDay=0;
      LastSmallDn2Day=0;
      StartBalance=AccountBalance(); HPR=0; SumHPR=0;
      AHPR=0; GHPR=0;
      
   test1=true;  
   Gb=true;

    if (!GlobalVariableCheck("gMainTrend"+Symbol()))
      Gb= SetGlobVar("gMainTrend"+Symbol(),Unknown);
    if (!GlobalVariableCheck("gLocalTrend"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gLocalTrend"+Symbol(),Unknown);
    if (!GlobalVariableCheck("gSmallTrend"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gSmallTrend"+Symbol(),Unknown);  
    
    if (!GlobalVariableCheck("gWaitUp"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaitUp"+Symbol(),NoSignal);  
    if (!GlobalVariableCheck("gWaitDn"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaitDn"+Symbol(),NoSignal);  
     if (!GlobalVariableCheck("gWaitCorre"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaitCorre"+Symbol(),NoSignal);  
     if (!GlobalVariableCheck("gWaitSmallUp"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);  
     if (!GlobalVariableCheck("gWaitSmallDn"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);  
     if (!GlobalVariableCheck("gWaitSmallCont"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaitSmallCont"+Symbol(),NoSignal);  
     if (!GlobalVariableCheck("gWaveNum"+Symbol()))
      Gb=  Gb &&   SetGlobVar("gWaveNum"+Symbol(),0);  
     if (!GlobalVariableCheck("sWaitTime"+Symbol()))
      Gb=  Gb &&   SetGlobVar("sWaitTime"+Symbol(),0);  
     if (!GlobalVariableCheck("bWaitTime"+Symbol()))
      Gb=  Gb &&   SetGlobVar("bWaitTime"+Symbol(),0);  
                    
     
   WaitCont=NoSignal;
   if (! IsTesting())
   {  MainTrend=GlobalVariableGet("gMainTrend"+Symbol());
      LocalTrend=GlobalVariableGet("gLocalTrend"+Symbol());
      WaitUp=GlobalVariableGet("gWaitUp"+Symbol());
      WaitDn=GlobalVariableGet("gWaitDn"+Symbol());
      WaitCorre=GlobalVariableGet("gWaitCorre"+Symbol());
      WaitSmallUp=GlobalVariableGet("gWaitSmallUp"+Symbol());
      WaitSmallDn=GlobalVariableGet("gWaitSmallDn"+Symbol());
      WaitSmallCont=GlobalVariableGet("gWaitSmallCont"+Symbol());
      sStartWaitingTime=GlobalVariableGet("sWaitTime"+Symbol()); 
      bStartWaitingTime=GlobalVariableGet("bWaitTime"+Symbol()); 

    }  else
{WaveNum=0;
WaitUp=NoSignal; WaitDn=NoSignal;  WaitCorre=NoSignal;
 MainTrend=Unknown;
 LocalTrend=Unknown;
 SmallTrend=Unknown;  
 WaitSmallUp=NoSignal;
 WaitSmallDn=NoSignal;
 WaitSmallCont=NoSignal;
}

//----
 AddpipsInit(Spips, Bpips);
 PeriodInit(BearsP,BullsP);
 OrderCount=OrdersTotal();

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {int histtotal=OrdersHistoryTotal();
      if(histtotal>0)
      {GHPR=MathPow(StartBalance/AccountBalance(),1/histtotal);
      Print("AHPR=",AHPR,"   GHPR=",GHPR);
       }
   
//----
   return(0);
  }
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
   {if (!Gb) 
   {Print("Begin againe!!");
   return(0);}

//MainTrend=trend;SetGlobVar("gMainTrend"+Symbol(),MainTrend);
//LocalTrend=trend;SetGlobVar("gMainTrend"+Symbol(),MainTrend);
    int  cnt;//ñ÷åò÷èê îðäåðîâ
    int  res; // ðåçóëüòàò óñòàíîâêì îðäåðà
    int err,i,j;
    int shift55; //ñäâèã  íà H4 ñ ïåðèîäîì ADX 55
    double maxAdx;
   double Adx;
    double StL; // StopLoss â ïóíêòàõ
    double bTkP; // TakeProfit â ïóíêòàõ
    double sTkP; // TakeProfit â ïóíêòàõ
     int magic;
//---- 
   if(Bars<BarsNum)  return(0);  
     if (IsTesting() &&  test1)
  { TestInstall(); test1=false;}

  MA100Vector=Up; 
     res=0;//âñïîìîãàòåëüíàÿ ïåðåì. äëÿ ñîõð. ðóçóëüòàòîâ óñòàíîâêè îðäåðîâ
     total=OrdersTotal();
     LastCloseParam();
    OrdersMagic();     

    if (OrderCount<total)
    OrderCount=total;


      //Ãîòîâèìñÿ àíàëèçèðîâàòü ãðàôèê íà çàêðûòûõ áàðàõ
       if (shift>0)
         shift55=(shift-1)*6+1+TimeHour(TimeCurrent())/4;
       else
        shift55=0;  

//============================================================== 
// Äî òåõ ïîð ïîêà êîëè÷åñòâî ïèêîâ èíäèêàòîðà íà áóäåò ðàâíûì WaveTopNum 
// èññëåäóåì ãðàôèê íà íàëè÷èå äèâåðãåíöèè ì-äó èíäèêàòîðì è High(Low)_ 
//Ïðîâåðÿåòñÿ äèâåðãåíöèÿ è-äó áàðîì 0 è 1 è åñëè äèâåðãåíöèè íåò,
// à áûêè íà áàðå 1 ñèëüíåå, òî áàð 1 ñòàíîâèòñÿ íà÷àëîì ïîèñêà äèâåðãåíöèè.
// Åñëè äèâåðãåíöèÿ åñòü - óâåëè÷èâàåì ñ÷åò÷èê äèâåðãåíöèé è ñîõðàíÿåì íîìåð åå áàðà.
// "Ïî ïóòè" íàõîäÿòñÿ ïèêè èíäèêàòîðà ñèëû áûêîâ(ìåäâåäåé). Íà íèõ ñ÷åò÷èê 
//âîëí óâåëè÷èâàåòñÿ íà 1
// Òàê ïðîäîëæàåòñÿ äî òåõ ïîð, ïîêà íå  îáíàðóæåíî òðè äèâåðãååíöèè (Div=3), 
// èëè íå íàéäåíî WaveTopNum ïèêîâ èíäèêàòîðà.
//============================================================== 
//-----------Ïðèíÿòèå ðåøåíèÿ ïî êîðîòêèì ïîçèöèÿì ------------
  switch(WaitDn)
   {//sw
   case NoSignal :
   {
 sellADX=dStrongCond(dMainFrame,dADX0,0) ;
 if (  sellADX>0  )
 { AddpipsInit(Spips, Bpips);

 if (  SeachDiv(dMainFrame,dWaveTopNum,shift) 
       &&  DiverKind(0, dMainFrame)
     )
  {  
           if ( CheckADX(240,55,shift,adx55step)==Down
           && maxADX(1440, 1, 30 )<81)
           {//Print("sellADXDmax=",sellADXDmax);
           WaitDn=Go; SetGlobVar("gWaitDn"+Symbol(), Go);
           sStartWaitingTime = TimeCurrent();
           }
           else
           {WaitDn=Ready;  SetGlobVar("gWaitDn"+Symbol(), Ready);}
 }// if Seach
 }
 }//case  NoSignal  
 break;
case Ready : 
 {//case Ready
  if (maxADX(1440, 1, 30 )<81) 
        {WaitDn=Go; sStartWaitingTime = TimeCurrent();SetGlobVar("sWaitTime"+Symbol(), sStartWaitingTime);
        SetGlobVar("gWaitDn"+Symbol(), Go);
        }
        else 
        {WaitDn=TakeYourTime;SetGlobVar("gWaitDn"+Symbol(), TakeYourTime);
              sStartTakeYourTime = TimeCurrent();}
  }//case Ready
break;
case Go : 
 {//case Go
  // Alert("Ïðîäàåì!"); 
   MainShortOrder(OrderNum,MainShortMagic);
   if(MainTrend!=Down)
         {WaveNum=1;SetGlobVar("gWaveNum"+Symbol(),1);}
         else  if(TimeCurrent()- LastMainDnGoWeek>86400*40)
         {WaveNum++;SetGlobVar("gWaveNum"+Symbol(),WaveNum);}//Wave counter

   MainTrend=Down;
   GlobalVariableSetOnCondition("gMainTrend"+Symbol(), Down, Up);
   GlobalVariableSetOnCondition("gMainTrend"+Symbol(), Down, Flat);
   LocalTrend=Down;GlobalVariableSet("gLocalTrend"+Symbol(),Down);

if((TimeCurrent()-sStartWaitingTime) > 864000 )
WaitDn=NoSignal;    SetGlobVar("gWaitDn"+Symbol(),NoSignal);
sStartWaitingTime=NoSignal;SetGlobVar("sWaitTime"+Symbol(), sStartWaitingTime);
 }//case Go
 break;
 case TakeYourTime : 
 {
 if(iClose(NULL, cMainFrame,1)-iOpen(NULL, cMainFrame,1)<=0
  || MathAbs(iClose(NULL, cMainFrame,1)-iOpen(NULL, cMainFrame,1))<=15*Point)
        { WaitCorre=NoSignal; sellADXDmax=0; sStartTakeYourTime =0;
        WaitDn=Go; sStartWaitingTime = TimeCurrent(); SetGlobVar("sWaitTime"+Symbol(), sStartWaitingTime);
        SetGlobVar("gWaitDn"+Symbol(),Go);
        SetGlobVar("gWaitCorre"+Symbol(),NoSignal);
    }
   }//TakeYourTime
break;
 }//sw
 
 
//==========================================================
maxAdx=iADX(NULL,cMainFrame,13,PRICE_HIGH,MODE_MAIN,0);
 if(((maxAdx>=58 && MainTrend==Up) //58
        ||
      (maxAdx>27  && MainTrend==Down)
        ||
       (maxAdx>25 && MainTrend==Flat)
      )  
    && CheckADX(1440,13,1,2)==Up 
    && WaitCorre!=Go) 
{
 sellADXDmax=maxAdx; sellADXWmax=iADX(NULL,dMainFrame,13,PRICE_HIGH,MODE_MAIN,0);
 WaitCorre=Ready;SetGlobVar("gWaitCorre"+Symbol(),Ready);
 } else
{ //SelectData();
if( iBearsPower( NULL, 1440, 13, PRICE_CLOSE,3)<0 )
     {WaitCorre=NoSignal;GlobalVariableSet("gWaitCorre"+Symbol(),NoSignal);}
}//else
if ( iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,1)
    <iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,10)
     && 
     MathAbs(iBands(NULL,1440,100,2,0,PRICE_CLOSE,MODE_UPPER,0)-iHigh(NULL,1440,0))
     <100*Point && WaitCorre==NoSignal
     )
{WaitCorre=Ready;SetGlobVar("gWaitCorre"+Symbol(),Ready);}
if( iBearsPower( NULL, 1440, 13, PRICE_CLOSE,3)<0  && WaitCorre<NoSignal)
     {WaitCorre=NoSignal;SetGlobVar("gWaitCorre"+Symbol(),NoSignal);}


if(WaitCorre<NoSignal )
{if(MainTrend==Up &&
iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,1)
 >iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,10))
WaitCorre=sellSw(WaitCorre);
else WaitCorre=sellSw(WaitCorre,0);
SetGlobVar("gWaitCorre"+Symbol(),WaitCorre);
}

//==============Long================================
 if(LocalTrend==Down)
 { double Bulls=BullDecline(1440, 32 );
   double Bears=BearForce(1440, 32 );
     if(MainTrend==Up  && LocalTrend==Down 
     && WaitUp==NoSignal
     && CheckADX(10080,13,1,5)==Up 
     && dStrongCond(dMainFrame,dADX0,0)>0
     )
     if(
       sellADXDmax>50   
        && MathAbs(iMA(NULL,cMainFrame,21,0,MODE_EMA,PRICE_CLOSE,0)-
           iClose(NULL,1440,0 ))<100*Point             
         )
     {WaitUp=Go; SetGlobVar("gWaitUp"+Symbol(),Go); LongCall=0;
      bStartWaitingTime =TimeCurrent(); SetGlobVar("bWaitTime"+Symbol(), bStartWaitingTime);}

   if(((MainTrend!=Up  && WaveNum==1) ||
        (MainTrend==Up  && (WaveNum==4 || WaveNum==6 || WaveNum==8)))
        && WaitUp>Ready && CheckiMa(1440, 100, MODE_SMA, 1, 40)== Up &&
     MathAbs(iClose(NULL,1440,1)-
     iIchimoku(NULL, dMainFrame, 9, 26, 52, MODE_KIJUNSEN, 1))<=50*Point)
      {   if(Bears+Bulls>-0.06) {WaitUp=Ready;SetGlobVar("gWaitUp"+Symbol(),WaitUp); 
                                 bStartWaitingTime=TimeCurrent();SetGlobVar("bWaitTime"+Symbol(), bStartWaitingTime);
                                }
         else {WaitSmallUp=Ready;SetGlobVar("gWaitSmallUp"+Symbol(),Ready);}
       }
   else
  { if((MainTrend==Up || (MainTrend==Flat && WaveNum==1)) && WaitUp==NoSignal 
     &&
     MathAbs(iLow(NULL,1440,0 )-
     iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,1))<=50*Point)
        {if(MainTrend!=Flat)
        {WaitUp=Ready;GlobalVariableSet("gWaitUp"+Symbol(),Ready); }
     }
   }
 }

 WaitUp=LongSwich( WaitUp, cADX0);
 SetGlobVar("gWaitUp"+Symbol(),WaitUp); 

//=== Äîáàâî÷íûå îðäåðà Buy
//+++++++++++++++++++++++++++++++++++++++++++
//1
if(LocalTrend==Down && MainTrend==Up)
{
if (iTime(NULL,cMainFrame,0)-LastLocDnGoDay>86400*3
&& iMFI(NULL, cMainFrame,7,0)>15 )
  WaitSmallCont=buySw(WaitSmallCont,6,cMainFrame,cMainFrame);
}

//==========================================================
if(MainTrend!=Unknown && LocalTrend!=Unknown)
{
switch (WaitSmallUp)
{
case NoSignal :
 { if(LocalTrend==Up) 
 SmallBuyonUp();
   }
 break;
case Ready :
  {  AddpipsInit(0, 5);WaitSmallDn=NoSignal; SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);
    if ( SeachConv(240,cWaveTopNum,shift)
        && ConvKind(0, 240))
 {WaitSmallUp=Go; SetGlobVar("gWaitSmallUp"+Symbol(),WaitSmallUp);}
 else   StopSmallBuyonUp();
   AddpipsInit(Spips, Bpips);
   }
 break;
case Ready1 :
  {  AddpipsInit(0, 0);WaitSmallDn=NoSignal; SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);
    if ( SeachConv(60,cWaveTopNum,0)
        && ConvKind(0, 60))
 {WaitSmallUp=Go; SetGlobVar("gWaitSmallUp"+Symbol(),Go);}
 else   StopSmallBuyonUp();
   AddpipsInit(Spips, Bpips);
   }
 break; 

}//sw

if(WaitSmallUp==Go)
//if(MainTrend==Up )
{ SmallTrend=Up;SetGlobVar("gSmallTrend"+Symbol(),Up);
   StopSmallBuyonUp(); 
 if ( AccountFreeMargin()/AccountBalance()>0.90)
  {if(LocalTrend==Up) bTkP=Ask+250*Point;
  else bTkP=Ask+180*Point;
  if(WaitDn>Go && WaitCorre>Go)
  MainLongOrder(bTkP,LongMagic2);
   }
}
//++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++Small+++++++++++++++++++++
if(!(WaitDn==TakeYourTime || WaitDn==Ready))
 switch (WaitSmallDn)
{case NoSignal : 
{if(LocalTrend==Down)
SmallSellonDn();}
 break;
 case Ready :
  {  AddpipsInit(10, 0); WaitSmallUp=NoSignal;SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);
     SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);
     StopSmallSellonDn();
    if ( SeachDiv(240,cWaveTopNum,1) )
   {//if(LocalTrend==Up)
      //WaitSmallDn=Ready1;
   //else  
   WaitSmallDn=Go;
    SetGlobVar("gWaitSmallDn"+Symbol(),WaitSmallDn);
     AddpipsInit(Spips, Bpips);}
    else{AddpipsInit(Spips, Bpips);}
    break; 
   }
 case Ready1 :
  {  AddpipsInit(10, 0); WaitSmallUp=NoSignal;
     SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);
    if ( (SeachDiv(60,cWaveTopNum,shift) && LocalTrend==Down)
         ||
       (SeachDiv(60,cWaveTopNum,shift) && LocalTrend==Up &&  DiverKind(shift, 60))
       //SeachDiv(60,cWaveTopNum,shift)
         )    
   {WaitSmallDn=Go; SetGlobVar("gWaitSmallDn"+Symbol(),Go);
     AddpipsInit(Spips, Bpips);}
    else{AddpipsInit(Spips, Bpips); StopSmallSellonDn(); 
    break;} 
   }   
 case Ready2 :
  {  AddpipsInit(10, 0); WaitSmallUp=NoSignal;
     SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);
    if ( SeachDiv(1440,cWaveTopNum,shift)
        &&  DiverKind(0, 1440)
              )    
   {WaitSmallDn=Go; SetGlobVar("gWaitSmallDn"+Symbol(),Go);
     AddpipsInit(Spips, Bpips);}
    else{AddpipsInit(Spips, Bpips); StopSmallSellonDn(); 
    break;} 
   }      
case Go : 
{  if( (iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,1)>
      iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,2) 
      && iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,1)<10)
      ||
      (LocalTrend==Up 
      && iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0)<50   )
       )
      {WaitSmallDn=NoSignal; SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);}
else      
if(LocalTrend==Down && iBearsPower(NULL, 240, 13,PRICE_CLOSE,1)>0
)
{SmallTrend=Down;SetGlobVar("gSmallTrend"+Symbol(),Down);}
else if(LocalTrend==Up)
{SmallTrend=Down;SetGlobVar("gSmallTrend"+Symbol(),Down);}
}
break;
}
if (WaitSmallDn==Go)
{SmallTrend=Down; SetGlobVar("gSmallTrend"+Symbol(),Down);
 if ( AccountFreeMargin()/AccountBalance()>0.90)
  { if (LocalTrend==Down)  sTkP=Bid-200*Point; else sTkP=Bid-150*Point;
    if(WaitUp>Go)
  MainShortOrder(OrderNum,ShortMagic2,sTkP);}
if(iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0)<35)
{WaitSmallDn=NoSignal;SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}

if (WaitUp==NoSignal && WaitDn==NoSignal  && WaitCorre!=Go
    && iADX(NULL,dMainFrame,13,PRICE_HIGH,MODE_MAIN,0)<65 
   )
{
   if (    
   (  iMA(NULL,dMainFrame,100,0,MODE_SMA,PRICE_CLOSE,1)>
     iMA(NULL,dMainFrame,100,0,MODE_SMA,PRICE_CLOSE, 10 )
   &&
        iClose(NULL, 1440,1)>
        iBands(NULL,1440,100,2,0,PRICE_CLOSE,MODE_UPPER,1)
        &&
       iClose(NULL, 1440,2)>
       iBands(NULL,1440,100,2,0,PRICE_CLOSE,MODE_UPPER,2) 
    )
   ) 
    {if(CheckADX(1440,13,1,2)==Up && MainTrend!=Up)
          {MainTrend=Up;GlobalVariableSet("gMainTrend"+Symbol(),Up);  }
   } 
}

//---- Óñëîâèÿ çàêðûòèÿ, ìîäèôèêàöèè è óäàëåíèÿ îðäåðîâ------------
  for(cnt=0;cnt<total;cnt++)
       {//for
        if( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==true)
        {//Seltct
         if(OrderType()<=OP_SELL &&   // check for opened position 
            OrderSymbol()==Symbol())  // check for symbol
          {//1

 //--Îáðàáîòêà äëèííûõ ïîçèöèé ----------------
            if(OrderType()==OP_BUY)   // long position is opened
              {//OP_BUY
             //-----------------
              if ( AccountFreeMargin()/AccountBalance()<Boundary)
              { res=OrderClose(OrderTicket(),OrderLots(),Bid,3,Gold); continue;}

              if (  WaitDn==Go  
                   ||
                   (MainTrend==Down && OrderMagicNumber()==MainLongMagic)
                  )
                    res=OrderClose(OrderTicket(),OrderLots(),Bid,3,Aqua);
                    
             if (  LocalTrend==Down
                   && (OrderMagicNumber()==LongMagic || OrderMagicNumber()==MainLongMagic)
                )
                 res=OrderClose(OrderTicket(),OrderLots(),Bid,3,Aqua);
              
              if ( (OrderMagicNumber()==LongMagic2 || OrderMagicNumber()==LongMagic1)
                   && (SmallTrend==Down || WaitSmallDn==Go)
                  )
                  res=OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
                      
                   
             //-----------------  
     
             }//OP_BUY
   //--Êîíåö îáðàáîòêè äëèííûõ ïîçèöèé -----------           

   //--Îáðàáîòêà êîðîòêèõ ïîçèöèé ------------------
          if(OrderType()==OP_SELL)   // short position is opened
            {//OP_SELL
             //-----------------------------
              if ( AccountFreeMargin()/AccountBalance()<Boundary)
                  {if(OrderMagicNumber()!=MainShortMagic)
                   res=OrderClose(OrderTicket(),OrderLots(),Ask,3,Gold); continue;
                  }
                 
               if ( OrderMagicNumber()==MainShortMagic  && MainTrend==Up)
                    res=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
              if ( OrderMagicNumber()==ShortMagic  && LocalTrend==Up)
                    res=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);                  
                  

              if (  //if
                    (//2
                     (TimeCurrent()-OrderOpenTime()>dMainFrame*Week*60)
                      &&
                     (TimeCurrent()-OrderOpenTime()<dMainFrame*(Week+2)*60) 
                      &&
                     (iHigh(NULL,dMainFrame,Highest(NULL,dMainFrame,MODE_HIGH,Week+5,0))-
                      iLow(NULL,dMainFrame,Lowest(NULL,dMainFrame,MODE_LOW,Week,0)) )
                      <dMinTp*Point
                      && OrderMagicNumber()==MainShortMagic
                     )//2
                   )//if
                       {res=OrderClose(OrderTicket(),OrderLots(),Ask,3,Aqua);
                        MainTrend=Flat; 
                        GlobalVariableSetOnCondition("gMainTrend"+Symbol(),Flat ,Down);
                        }
                    
 
                if ( OrderMagicNumber()==MainShortMagic
                     && MainTrend==Flat
                     && iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)<20 
                     &&  SeachConv(240,dWaveTopNum,0) 
                     )
                   res=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);

              if ( OrderMagicNumber()==ShortMagic2 
                   && (SmallTrend==Up || WaitSmallUp==Go)
                 )
                  res=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
         
           }//OP_SELL
          //--Êîíåö îáðàáîòêè êîðîòêèõ ïîçèöèé -----------           
         }
        //Êîíåö óñëîâèé äëÿ îòêðûòûõ îðäåðîâ
        }//Select
      }//for ;
 //---------------
  
//-------------------------------------------------------------------+
   return(0);
//+------------------------------------------------------------------+
}

//+------------------------------------------------------------------+
int buySw(int Wait, int MFIperiod, int  MFITimeFrame, int  ConvTimeFrame)
{ int shf;
  if( iMFI(NULL, MFITimeFrame,MFIperiod,0)>30 || WaitUp<NoSignal) 
  Wait=NoSignal;

switch (Wait)
{case NoSignal :
{ if(MFIperiod<7) shf=0; else shf=1;
if ( iMFI(NULL, MFITimeFrame,MFIperiod,shf)==0) Wait=Ready;
}
break;
case Ready :
{if( iMFI(NULL, MFITimeFrame,MFIperiod,0)>30 || WaitUp<NoSignal) Wait=NoSignal;
else
{if(MFIperiod<7) AddpipsInit(Spips, 5);
if (SeachConv(ConvTimeFrame,cWaveTopNum,shift)
    && ConvKind(shift, ConvTimeFrame)
         )Wait= Go;
AddpipsInit(Spips, Bpips);         
}
 } break;
case Go :  
{//SelectData();
 if(MFIperiod==7)
  {LocalTrend=Up;GlobalVariableSet("gLocalTrend"+Symbol(),Up);
    MainLongOrder(0,LongMagic);}

if(MFIperiod<7)
  {SmallTrend=Up;  GlobalVariableSet("gSmallTrend"+Symbol(),Up);
  double Tp=Ask+100*Point;
  if(lMagicNum1==1)
   Tp=0;
  MainLongOrder(Tp,LongMagic1); }
}
break;
}
return(Wait);
}

//+++++++++++++++++++++++++++++++++
 int sellSw(int WaitCorr, int StartBar=1)
{switch (WaitCorr)
{//sw
case NoSignal :
  ShortCall=0;
  break;
case Ready :
{ShortCall=0;
if (
   CheckADX(1440,13,StartBar,StartBar+1)==Down 
   ||
   (  CheckADX(240,55,1,14)==Down 
       &&
     !(MainTrend==Up && iBullsPower( NULL, 1440, 100, PRICE_CLOSE, 0)>Bulls100)
   //&& iADX(NULL,240,55,PRICE_HIGH,MODE_MAIN,1)>32
   )   
)
  WaitCorr=Go; 
}
 break;
case Go :
{  AddpipsInit(10, 0);
    if (SeachDiv(cMainFrame,dWaveTopNum,shift)
        &&   DiverKind(shift, cMainFrame)
      )
    DownCorrection();
     else
   if ((MainTrend==Down ||       
       iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,1)
       <iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,10))

    &&
        TimeCurrent()-sStartCorreTime>86400*5 &&
        SeachDiv(dSlaveFrame,dWaveTopNum,shift)
       &&   DiverKind(shift, dSlaveFrame) )
            DownCorrection();
  AddpipsInit(Spips, Bpips);

}
break;
}//sw WaitCorr
return(WaitCorr);
}

void DownCorrection(int Frame=1440)
{  double TP;
      if(iMA(NULL,Frame,100,0,MODE_SMA,PRICE_CLOSE,1)
         >iMA(NULL,cMainFrame,100,0,MODE_SMA,PRICE_CLOSE,10))
    { if( sellADXDmax>75 && MainTrend==Up) 
      TP=iMA(NULL,cMainFrame,21,0,MODE_EMA,PRICE_CLOSE,0)+20*Point;
       else
       TP=iIchimoku(NULL, dMainFrame, 9, 26, 52, MODE_KIJUNSEN, 0);
       }
       else
       TP=  0;      
       //TP= ( iHigh(NULL,cMainFrame,1) + 
        //     iLow(NULL,dMainFrame,iLowest(NULL,dMainFrame,MODE_LOW,12,1)))/2.2;
 
      ShortCall++;
     if(ShortCall==1)
   {
       if(MainTrend==Up 
       )
        WaveNum+=1; 
         else
          if(MainTrend==Down 
             && TimeCurrent()- LastLocDnGoDay>86400*30
             &&  TimeCurrent()- LastMainDnGoWeek>86400*30)
           WaveNum+=1;//Wave counter

       SetGlobVar("gWaveNum"+Symbol(),WaveNum);
       LocalTrend=Down;GlobalVariableSet("gLocalTrend"+Symbol(),Down);
         }
     if(AccountFreeMargin()/AccountBalance()>0.80)       
      MainShortOrder(OrderNum,ShortMagic, TP);
       
}
//-----------------------------------------------------------
int LongSwich(int Wait, double ADX, int magicnum=MainLongMagic,  int DayCnt=10 )
{int magic, ret, lastTrend;
 double bTkP;
 switch(Wait)
   {//sw
 case NoSignal : 
   {LongCall=0;
   buyADX= cMidlCond(cMainFrame,PRICE_HIGH, ADX, shift );
  if ( buyADX>0  )
    {     
     if ( SeachConv(cMainFrame,cWaveTopNum,shift)
         && ConvKind(shift, cMainFrame)
         )
    { if (CheckADX(240,55,0,adx55step/2)==Down
        && iBearsPower( NULL, cSlaveFrame, 13, PRICE_CLOSE,1)>W1MinBears)
       {Wait=Go; bStartWaitingTime =TimeCurrent();SetGlobVar("bWaitTime"+Symbol(), bStartWaitingTime);}
       else
	    Wait=Ready;
	  }
     }
   }//case 0
   break;
   case Ready :
   {//case Ready : 
   LongCall=0;
   if (CheckADX(240,55,0,adx55step/2)==Down
       && iBearsPower( NULL, cSlaveFrame, 13, PRICE_CLOSE,1)>W1MinBears)
        { Wait=Go; bStartWaitingTime = TimeCurrent();SetGlobVar("bWaitTime"+Symbol(), bStartWaitingTime);
}
   }//case Ready 
   break;
   case Go :
   {//case 2 :  
       AddpipsInit(Spips, 15 );
 if (   ( SeachConv(cMainFrame,cWaveTopNum,0)
         && ConvKind(0, cMainFrame))
         ||
          (SeachConv(dMainFrame,cWaveTopNum,0)
         && ConvKind(0, dMainFrame))
      )
    {lastTrend=MainTrend; LongCall++;
      LocalTrend=Up;GlobalVariableSet("gLocalTrend"+Symbol(),Up);

    AddpipsInit(Spips, Bpips);
     { bTkP=bProfit(buyADX);
       if (bTkP==0)  
       {magic=MainLongMagic;MainTrend=Up;GlobalVariableSet("gMainTrend"+Symbol(),Up);
       if(LongCall==1){
       if(lMainMagicNum==0 && lastTrend!=Up)WaveNum=1;
      else if(lWeekMnMagicCnt==0 && lastTrend==Up && TimeCurrent()- LastMainUpGoWeek>86400*30)
               WaveNum++;}
          }
        else
        { magic=LongMagic;
          if(LongCall==1 && (TimeCurrent()- LastLocUpGoDay>86400*30))WaveNum++;
        }
        GlobalVariableSet("gWaveNum"+Symbol(),WaveNum);

     if( AccountFreeMargin()/AccountBalance()>0.9)
        {ret=MainLongOrder(bTkP,magic);
        }
      }       
}
if((TimeCurrent()-bStartWaitingTime) > 86400*DayCnt )
{ 
Wait=NoSignal; bStartWaitingTime=NoSignal;SetGlobVar("bWaitTime"+Symbol(), bStartWaitingTime);
 }
}//case Go
break;
}//sw
return(Wait);
}

//==========================================================
void StopSmallBuyonUp()
 {   
  if((WaitCorre!=NoSignal && iBullsPower( NULL, 1440, 100, PRICE_CLOSE, 0)<Bulls100)
       ||WaitDn==Go)
   RotUpWaitSmall();
else
{  if (!(MainTrend==Up && iBullsPower( NULL, 1440, 100, PRICE_CLOSE, 0)>Bulls100))
{
 if(iMA(NULL,240,100,0,MODE_SMA,PRICE_CLOSE,1)-
     iMA(NULL,240,100,0,MODE_SMA,PRICE_CLOSE,5)
         <5*Point 
         &&
   iMA(NULL,240,5,0,MODE_SMA,PRICE_CLOSE,1)-
   iMA(NULL,240,5,0,MODE_SMA,PRICE_CLOSE,11)
        <80*Point                 
     )
  {  if(iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)>80
                    &&
        iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,0)>75
       )
      { WaitSmallDn=Ready2;
        SetGlobVar("gWaitSmallDn"+Symbol(),Ready2);
        WaitSmallUp=NoSignal;
        SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal); }

}//iMa>
else
  if(iMA(NULL,240,21,0,MODE_SMA,PRICE_CLOSE,0)-
     iMA(NULL,240,21,0,MODE_SMA,PRICE_CLOSE,6)
         <45*Point 
         )
 {if(minStoch(240, 1, 4 )>87
       &&
   iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,1)<=
   iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_SIGNAL,1) 
   )
   RotUpWaitSmall();
   }
   else
    Rot1WaitSmall();
  }
  else
    if ( MainTrend==Up && iBullsPower( NULL, 1440, 100, PRICE_CLOSE, 0)>Bulls100
    )
     if(CheckiMa(60, 21, MODE_SMA, 1, 10)== Up)
      {WaitSmallUp=NoSignal;
       SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);}

  }
}
//===========================================================

 void SmallBuyonUp()
 {
  if ( MainTrend==Up && iBullsPower( NULL, 1440, 100, PRICE_CLOSE, 0)>Bulls100)
  {if(CheckiMa(60, 21, MODE_SMA, 1, 10)== Down)
      Rot1UpWaitSmall();
    else       
      {WaitSmallUp=NoSignal;
       SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);}
  }
else
 {if(iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0)>=
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0)
   &&
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)>
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,2)
      &&
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)<25
            &&
   iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,0)<82
)
Rot1WaitSmall();
else
StopSmallBuyonUp();
  }
 }
//===========================================================

 void StopSmallSellonDn()
 { switch (MainTrend)
 {//sw
 case  Flat:
 { if(iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0)>=
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0)
   &&
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)>
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,2)
      &&
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)<25
         &&
   iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,2)<80
   )     
          Rot1WaitSmall();
 }
 break;
 default :
 {if((MainTrend==Down && LocalTrend==Down && 
       CheckiMa(1440, 100, MODE_SMA, 1, 10)== Down ))
{  if(CheckiMa(60, 21, MODE_SMA, 1, 10)== Up )  
       {WaitSmallDn=NoSignal;
       SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);
       }    else RotDnWaitSmall();
 }
 else
   if(MainTrend==Down && LocalTrend==Down && 
       CheckiMa(1440, 100, MODE_SMA, 1, 10)== Up  
      &&  iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,0)<25)
        {WaitSmallDn=NoSignal;
       SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);
       }
else   
 if(!( iMA(NULL,240,21,0,MODE_EMA,PRICE_CLOSE,21)-
         iMA(NULL,240,21,0,MODE_EMA,PRICE_CLOSE,1)>=90*Point)
         )
{
  if( iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,1)<=MaxStStopSellonDn//25!
        &&
    iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)<25
       &&              
    iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)>=
    iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,2)
    )
   Rot1WaitSmall();
    }
     else
     {if( iRSI(NULL,1440,14,PRICE_CLOSE,1)<=33
         &&
       iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)<20
        &&              
      iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)>
      iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,2) )
   Rot1WaitSmall();
    }
   }
    break;
    }//sw
 }
//==============================================================  
  void SmallSellonDn()
 {
  if(LocalTrend==Down)
  {//1
 if(CheckiMa(240, 100, MODE_SMA, 1, 24)== Down 
    && SmallTrend==Down
    && WaitUp>Ready  )
  {//2
    if(iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,0)<
    iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,1)
    &&
    iStochastic(NULL,60,8,3,3,MODE_SMA,0,MODE_MAIN,0)<
    iStochastic(NULL,60,8,3,3,MODE_SMA,0,MODE_MAIN,1)
    &&
    iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0)>22
     && 
    iStochastic(NULL,60,8,3,3,MODE_SMA,0,MODE_MAIN,1)>60
     &&
   iStochastic(NULL,60,8,3,3,MODE_SMA,0,MODE_MAIN,0)<=
   iStochastic(NULL,60,8,3,3,MODE_SMA,0,MODE_SIGNAL,0)
   )
RotDnWaitSmall();
  }//2
else
 if(iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0)<=
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0)
      &&
   iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,1)>60
            &&
    iStochastic(NULL,1440,8,3,3,MODE_SMA,0,MODE_MAIN,1)>MinStSellonDn
   )
    RotWaitSmall();
   else
    StopSmallSellonDn(); 
  }//1
   }
   //----------------------------------------------
  void RotWaitSmall()
   {WaitSmallDn=Ready;
    SetGlobVar("gWaitSmallDn"+Symbol(),Ready);
    WaitSmallUp=NoSignal;
    SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);
    }
   //----------------------------------------------
  void Rot1WaitSmall()
      {WaitSmallUp=Ready;
       SetGlobVar("gWaitSmallUp"+Symbol(),Ready);
       WaitSmallDn=NoSignal;
       SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);
       }

  void RotDnWaitSmall()
   {WaitSmallDn=Ready1;
    SetGlobVar("gWaitSmallDn"+Symbol(),Ready1);
    WaitSmallUp=NoSignal;
    SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal);
    }
  
    void RotUpWaitSmall()  
    {WaitSmallDn=Ready2;
     SetGlobVar("gWaitSmallDn"+Symbol(),Ready2);
     WaitSmallUp=NoSignal;
     SetGlobVar("gWaitSmallUp"+Symbol(),NoSignal); }

      void Rot1UpWaitSmall()
      {WaitSmallUp=Ready1;
       SetGlobVar("gWaitSmallUp"+Symbol(),Ready1);
       WaitSmallDn=NoSignal;
       SetGlobVar("gWaitSmallDn"+Symbol(),NoSignal);
       }





Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Moving average indicator
Ichimoku Kinko Hyo
Movement directional index
Stochastic oscillator
Bears Power indicator
Bulls Power indicator
Bollinger bands indicator
Money flow index
Relative strength index


Custom Indicators Used:
Diver

Order Management characteristics:
Checks for the total of closed orders

It can change open orders parameters, due to possible stepping strategy
Checks for the total of open orders
It Closes Orders by itself

Other Features: