Navigation:Home > Content >

exp_filter_3.mq4

Time: 2014-11-28 | Download file:exp_filter_3.mq4

  //+------------------------------------------------------------------+
//|                                                   exp filter.mq4 |
//|                                                           vasili |
//|                                                vasssay@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "vasili"
#property link      "vasssay@yandex.ru"

//--- input parameters
extern int       step=20;//Расстояни на котором выставляются отложки

extern int       take=50;//Тейкпрофит  если useVolume отключен false
extern int       loss=20;//СтопЛосс если useVolume отключен false
extern bool      useVolume=false;//Использовать ли волантильность при расчете  ТП и СЛ
extern double    koefVol=1.618;//Коэффициент для расчета ТП=koefVol*СЛ. СЛ=волантильности на 4 последних свечах
extern int       typeVol=0;//Как расчитывать волантильность 0- Волантильность= мах(на последних 4-х свчах) - минимум(на последних)
//4 свечах). 1- Волантльность = разности цен открытия первой из четрых свеч и ценой закрытия последней свечи

extern double    lot=0.01;//Начальный объём сделок
extern double    koefLot=1.681;//Коэффициент последующего умножения объёмов сделок
extern bool      useTpSl=false;//Учитывать ли при расчете коэффициента сделок СЛ и ТП последнего ордера koefLot=TP/Sl


extern int       countOrdStop=3;//После скольки ордеров с убытком подряд, прерывать торговлю
extern int       key=1999;//MagicNumber

int NumberOfTry=3;
int slip = 5;
static datetime time;
int init()
  {
   if(Digits==3 || Digits==5)
   {
    slip*=10;
    take*=10;
    loss*=10;
    step*=10;
   }
 }   
int start()
  {

    //Если нет открытых ордеров
     //определяем тейкпрофит и стоплосс открываемых ордеров
      if(!useVolume) //Если волантильность не используется
       {
        int _take=take;
        int _loss=loss;
       } 
      if(useVolume)//Если волантильность используется
       {
        if(typeVol==0)//Используется первый тип расчета волантильности 
         {
          double max=High[iHighest(NULL,0,MODE_HIGH,4,1)];
          double min=Low[iLowest(NULL,0,MODE_LOW,4,1)];
          int vol=ND(max-min)/Point;
          string log=StringConcatenate("Текущая волантильность ",vol," мак.= ",max," мин.=",min);
          _take=vol*koefVol;
          _loss=vol;
         }
       if(typeVol==1)//Используется первый тип расчета волантильности 
        {
         double op=iOpen(Symbol(),0,4);
         double cl=iClose(Symbol(),0,1);
         vol=ND(MathAbs(op-cl))/Point;
                log=StringConcatenate("Текущая волантильность ",vol," откр.= ",op," закр.=",cl);
         _take=vol*koefVol;
         _loss=vol;
         
        }
       }
        
    //Проверка на минмальное значение тейкпрофита и стоплосса
    if(_take0)
          {
           if(_ty==OP_BUY)
            openorder(OP_BUY ,lot,slip,ND(Ask),_loss,_take,0,key,"expert filter");
          if(_ty==OP_SELL)
            openorder(OP_SELL ,lot,slip,ND(Bid),_loss,_take,0,key,"expert filter");
          }
          
          if(getLastTypeclose(key)<0)
          {
           if(_ty==OP_BUY)
            openorder(OP_SELL ,_lot,slip,ND(Ask),_loss,_take,0,key,"expert filter");
          if(_ty==OP_SELL)
            openorder(OP_BUY ,_lot,slip,ND(Bid),_loss,_take,0,key,"expert filter");
          }
         } 
       
     
   return(0);
  }
//+------------------------------------------------------------------+
//как закрылся и сколько раз
int getLastTypeclose(int _key)
{
 int KolType=0;
 int j=1;       
              for(int i=OrdersHistoryTotal() ; i>=0; i--)
                {  
                  if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY ) && OrderSymbol()==Symbol() && OrderMagicNumber()==_key  && OrderType()<=1) {
                  if(j==1 && OrderProfit()>=0)KolType++;
                  if(j==1 && OrderProfit()<0)KolType--;
                  if(j!=1 && OrderProfit()>=0 && KolType>0)KolType++;
                  if(j!=1 && OrderProfit()>=0 && KolType<0)break;
                  if(j!=1 && OrderProfit()<0 && KolType<0){KolType--;time=OrderOpenTime();}
                  if(j!=1 && OrderProfit()<0 && KolType>0)break;
                  j++;                 }
                } 
         return(KolType); 
}

//4.Округляем до определенной степени точности
double ND(double price)
{
return(NormalizeDouble(price,Digits));
} 

//+---------------------------------------+
//|2.открытие ордера
//+---------------------------------------+
/*входящие
int type = тип открываемого ордера
OP_BUY 0 Покупка 
OP_SELL 1 Продажа 
OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT 
OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT 
OP_BUYSTOP 4 Отложенный ордер BUY STOP 
OP_SELLSTOP 5 Отложенный ордер SELL STOP 
double lot   - volume
int    slip  - slippage
double price - open price
int _loss - stoploos if =0 do not Set
int _take - takeprofit if =0 do not Set
int _key  - MagicNumber 
*/
void openorder(int type,double lot,int slip,double price,double _loss, double _take,datetime time,int key,string comm)
{
 
 
 if(type==1 || type==3 ||type==5)
  {
   color col=Red;
   if(_loss!=0)double __loss=ND(price+_loss*Point);
   if(_loss==0)       __loss=0;
   if(_take!=0)double __take=ND(price-_take*Point);
   if(_take==0)       __take=0;
  } 
  
   if(type==0 || type==2 ||type==4)
  {
   col=Blue;
   if(_loss!=0)       __loss=ND(price-_loss*Point);
   if(_loss==0)       __loss=0;
   if(_take!=0)       __take=ND(price+_take*Point);
   if(_take==0)       __take=0;
  } 
 //т.к. Для многих ДЦ есть требование сначал открыть ордер, а затем его модифицировать ... то делаем для всех ДЦ открытие затем модификация
 for(int j=0;j<=NumberOfTry;j++)//10 попыток на открытие ордера 
         {
          if(!IsTradeAllowed())Sleep(500); 
          if(IsTradeContextBusy())Sleep(500); 
          RefreshRates();
          int tik=OrderSend(Symbol(),type,lot,price,slip,0,0,comm,key,time,col);
          if(tik!=-1)         
           break;
         Print("ошибка открытия "+GetLastError()," t=",type," P=",price," s=",_loss," t=",_take," bid",ND(Bid)," ask",ND(Ask));
         Sleep(1000);
         }
     // Print(tik," ",price," ",_loss," ",_take);
      
      OrderSelect(tik,SELECT_BY_TICKET,MODE_TRADES);
      
      if(_take!=0 || _loss!=0)
      if (!OrderModify(OrderTicket(),OrderOpenPrice(),__loss,__take, OrderExpiration(),col))//е
      Print("ошибка "+GetLastError()," t=",type," P=",price," s=",_loss," t=",_take," bid",ND(Bid)," ask",ND(Ask) );
//TimeCurrent()+Period()*60*10  
      RefreshRates();
}

//+---------------------------------------+
//|3.Считаем количество ордеров
//+---------------------------------------+
/*
входящие 
int type (if -1 all type)
OP_BUY 0 Покупка 
OP_SELL 1 Продажа 
OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT 
OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT 
OP_BUYSTOP 4 Отложенный ордер BUY STOP 
OP_SELLSTOP 5 Отложенный ордер SELL STOP 
int _key MagicNumber 

*/

int totalO(int type,int _key)
 {
       int TotalNumber = 0;  
              for(int i=0; i1 ) OrderDelete(OrderTicket(),CLR_NONE);
      if(GetLastError()!=0)Print("ошибка удаления =",GetLastError());
   }
   
}
}   

 


Recommend