Navigation:Home > Content >

e_YD_TDI_MA_avg_v02.mq4

Time: 2016-11-04 | Download file:e_YD_TDI_MA_avg_v02.mq4

//+------------------------------------------------------------------+
//|                                          e_YD_TDI_MA_avg_v02.mq4 |
//+------------------------------------------------------------------+
//|                                          e_YD_TDI_MA_avg_v01.mq4 |
//+------------------------------------------------------------------+
#property copyright "fion"
#property link      ""

extern string p1="-- ПАРАМЕТРЫ  ИНДИКАТОРА --------- ";
extern int       SimpleTP         =  5;
extern int       RSI_Period       = 13;    //8-25
extern int       RSI_Price        =  0;    //0-6
extern int       Volatility_Band  = 34;    //20-40
extern int       RSI_Price_Line   =  2;           
extern int       RSI_Price_Type   =  0;    //0-3
extern int       Trade_Signal_Line = 7;    // период быстрой ма
extern int       Trade_Signal_Type = 0;    //0-3 тип быстрой ма
extern int       SlowPeriod        =16;    // период медленной ма
extern string    ts= " ---- ПАРАМЕТРЫ ШАГОВОГО ТРЕЙЛИНГ СТОПА------";
extern int       Stop_BU          =      25; // уровень перевода в безубыток(пунктов) 0-выкл.
extern int       TrailingStop     =      25; // дистация трейлинга 0- выкл.  
extern int       TrailingStep     =      15; // шаг трейлинга 
extern string p2="-------- ОБЩИЕ ПАРАМЕТРЫ --------- ";
extern bool   OneDaySeria     = true; // использовать одну серию в день 
extern bool   OneSideTrade    = FALSE; // работать в одну сторону 
extern bool   Long_Position   = true;// использовать покупки
extern bool   Short_Position  = true;// использовать продажи
extern int    SL              =   0; // стоплосс 0-выкл. (пунктов)
extern int    TP              =  70; // тейкпрофит 0-выкл. (пунктов)
extern int    Avr_TP          =  10; // тейкпрофит при усреднении (пунктов)
extern int    Min_Avr_Dist    =  20; // минимальная дистанция усреднения(пунктов)
extern int    MaxOrders       =   5; // максимум ордеров одного направления 
extern double Lots            = 0.1; // лот    
extern double K_mm            =   2; // множитель мартина   
extern int    Magic           = 777; // магический номер.
//.......................................................
int ticket,pos,close_pos,prevtime,mp,minstop,last_open,lot_digit;
double op,sl,tp,price,minlot,maxlot,lotstep,lots; color col; 
string comm;
int    orders_buy,orders_sell, TimeOpenSeria;
double LastOpenPriseOpenBuy, LastOpenPriseOpenSell,BuyLots,SellLots; 
double LastOpenBuySL, LastOpenSellSL,LastOpenBuyTP, LastOpenSellTP,LastOpenBuyLots,LastOpenSellLots;
int    LastOpenSellMagic,LastOpenBuyTicket,LastOpenSellTicket; 
datetime OpenBuyTime,OpenSellTime;
//--------------------------------------------------------------------
double NL(double lots){
   double MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
   double MinLots=MarketInfo(Symbol(),MODE_MINLOT);
   double StepLots=MarketInfo(Symbol(),MODE_LOTSTEP);
   double lot=NormalizeDouble(lots/StepLots,0)*StepLots;
   if (lot>MaxLots) lot=MaxLots; 
   if (lotred)return( 1);
if(green0)
    {
    if(orders_buy ==1) Tral(OP_BUY );
    if(orders_sell==1) Tral(OP_SELL);
    }

  if(prevtime==Time[0])return(0); prevtime=Time[0];
//---- 
  int signal=Filter(); 
  //
  if(orders_buy>0 && orders_buy=Min_Avr_Dist*Point)
      if(OpenBuyMarket (Magic,NL(LastOpenBuyLots*K_mm),SL,TP,"avr",Blue)>0)
         {
          Modify_avr(OP_BUY,BU(OP_BUY));
          }
       else prevtime=Time[1];
  if(orders_sell>0 && orders_sell=Min_Avr_Dist*Point)
      if(OpenSellMarket (Magic,NL(LastOpenSellLots*K_mm),SL,TP,"avr",Red)>0){
         Modify_avr(OP_SELL,BU(OP_SELL));
        }
       else prevtime=Time[1];
 
  if(OneSideTrade && orders_buy+orders_sell>0)return(0);
  
  if(Long_Position && orders_buy==0 && iTime(NULL,1440,0)> TimeOpenSeria)
    if(signal== 1)if(OpenBuyMarket (Magic,NL(Lots),SL,TP,"start",Blue)>0){
                     if(OneDaySeria)TimeOpenSeria=Time[0]; else TimeOpenSeria=0;
                     Sleep(3000);}
                   else prevtime=Time[1];
  
  if(Short_Position && orders_sell==0 && iTime(NULL,1440,0)> TimeOpenSeria)
    if(signal==-1)if(OpenSellMarket(Magic,NL(Lots),SL,TP,"start",Red )>0){
                     if(OneDaySeria)TimeOpenSeria=Time[0]; else TimeOpenSeria=0;
                     Sleep(3000);}
                   else prevtime=Time[1];
  return(0); 
}

//---------------------------------------------------------------------------
int OrdersScaner(){
   //------------------сканер ордеров ---------      
   orders_buy=0;orders_sell=0;
   LastOpenPriseOpenBuy=0;LastOpenPriseOpenSell=0;LastOpenBuySL=0;  LastOpenSellSL=0;
   LastOpenBuyTP=0;  LastOpenSellTP=0; LastOpenBuyTicket=0;LastOpenSellTicket=0;
   OpenBuyTime=0;OpenSellTime=0; LastOpenBuyLots=0; LastOpenSellLots=0;
   BuyLots=0;SellLots=0; 
   //----   
   for (int i=OrdersTotal();i>=1;i--){
         if(OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES)==FALSE)break;
         if(OrderSymbol ()!= Symbol())continue;
         if(OrderMagicNumber()!=Magic)continue;
              if(OrderType() == OP_BUY && OrderComment()!="lock"){
                 if(OpenBuyTime < OrderOpenTime()){
                    OpenBuyTime=OrderOpenTime(); LastOpenPriseOpenBuy=OrderOpenPrice();
                    LastOpenBuyTP = OrderTakeProfit();LastOpenBuySL = OrderStopLoss();                    
                    LastOpenBuyTicket=OrderTicket();LastOpenBuyLots=OrderLots();} orders_buy ++;
                    BuyLots+=OrderLots();
                    }
              if(OrderType() == OP_SELL  && OrderComment()!="lock"){
                 if(OpenSellTime < OrderOpenTime()){
                    OpenSellTime=OrderOpenTime(); LastOpenPriseOpenSell=OrderOpenPrice();
                    LastOpenSellTP = OrderTakeProfit();LastOpenSellSL = OrderStopLoss();
                    LastOpenSellTicket=OrderTicket();LastOpenSellLots=OrderLots();} orders_sell ++;
                    SellLots+=OrderLots();
                    }   
                             
               } 
int status=0;
//--- определение статуса советника
if(orders_buy+orders_sell>0)status=1; 
return(status);
}
//--------------------------------------------------------------------------------------
void Modify_avr(int type, double TP){double tp,sl;
OrdersScaner();
if(orders_buy >0 && type== OP_BUY){TP+=Avr_TP*Point;sl=LastOpenBuySL;}
if(orders_sell>0 && type==OP_SELL){TP-=Avr_TP*Point;sl=LastOpenSellSL;}
for (int i=OrdersTotal();i>=1;i--){
         if(OrderSelect(i-1, SELECT_BY_POS, MODE_TRADES)){
         if(OrderSymbol ()!= Symbol())continue;
         if(OrderType()!= type)continue;
         if(OrderMagicNumber()!=Magic)continue;
            tp=OrderTakeProfit();
            if(tp-TP!=0 ){tp=TP;
            OrderModify(OrderTicket(), OrderOpenPrice(),sl,tp, 0, Lime);}
}}}
//---------------------------------------------------------------------------------------
double BU(int type)
{
 int Spr= MarketInfo(Symbol(),MODE_SPREAD);
//------------ Безубыток  ------------------
 double B2_B=0,B2_S=0,B2_LB=0,B2_LS=0,BSw=0,SSw=0;
      for(int b2=0;b2B2_LS){   // Идём вверх
for(int J2=0;J2<10000;J2++){
    M2B=J2*B2_LB*10;
    M2S=((B2_B-B2_S+Spr*Point)/Point+J2)*(B2_LS*(-10));
    if (M2B+M2S+BSw+SSw>=0){ 
        M5=NormalizeDouble(B2_B+J2*Point,Digits);
        break;
        }}} 
if (B2_LS>B2_LB){ //  Идём вниз
for(int J3=0;J3<10000;J3++){
    M2S=J3*B2_LS*10;
    M2B=((B2_B-B2_S+Spr*Point)/Point+J3)*(B2_LB*(-10));
    if (M2S+M2B+BSw+SSw>=0){
        M5=NormalizeDouble(B2_S-J3*Point,Digits);
        break;
        }}}
//----
   return(M5);
  }

//----------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------
int OpenBuyMarket(int Magic,double lots,int SL,int TP,string _comm,color clr){ 
   if(AccountFreeMarginCheck(Symbol(), OP_BUY, lots) <= 0 || GetLastError() == 134)/* NOT_ENOUGH_MONEY */
     {
       Print("Нет или не хватает для открытия  свободных средств");
       Comment("Нет или не хватает для открытия  свободных средств"); Sleep(5000);return(0);}
           while (IsTradeContextBusy()) Sleep(1000); RefreshRates();
           double ask=NormalizeDouble(Ask,Digits);
           int ticket=OrderSend(Symbol(),OP_BUY,lots,ask,3*mp,0,0,_comm,Magic,0,clr);
     if(ticket>0){if(SL+TP>0)
                  {
                  if (OrderSelect(ticket, SELECT_BY_TICKET))
                     {
                     while (IsTradeContextBusy()) Sleep(1000); RefreshRates();
                     op=OrderOpenPrice();
                     minstop= MarketInfo(Symbol(),MODE_STOPLEVEL);
                     if (SL!=0) sl = ND(op-SL*Point); else sl = 0;
                     if (TP!=0) tp = ND(op+TP*Point); else tp = 0;
                     if (TP!=0)if(tp-Ask0){if(SL+TP>0)
                  {
                  if (OrderSelect(ticket, SELECT_BY_TICKET))
                     {
                     while (IsTradeContextBusy()) Sleep(1000); RefreshRates();
                     op=OrderOpenPrice();
                     minstop= MarketInfo(Symbol(),MODE_STOPLEVEL);
                     if (SL!=0) sl = ND(op+SL*Point); else sl = 0;
                     if (TP!=0) tp = ND(op-TP*Point); else tp = 0;
                     if (TP!=0)if(Bid-tp0 &&  stop Stop_BU*k_8*Point)new_stop=op+1*k_8*Point;
      
      if(TrailingStop>0)
      if((Stop_BU >0 &&  stop>op) ||Stop_BU ==0)
        if(stop < bid-(TrailingStop+TrailingStep-1)*k_8*Point || stop == 0) new_stop= bid-TrailingStop*k_8*Point;
      
      
      if(new_stop<=stop || new_stop==0)continue;   
       if(new_stop!=0 && new_stop > minstop*Point){ 
          if(!OrderModify(OrderTicket(),op,NormalizeDouble(new_stop,Digits),OrderTakeProfit(), 0, Aqua))
            {Print(" Повторить операцию трейлинг-стопа, ошибка - ", GetLastError()); Sleep (1000);} 
           
       }}
    if (OrderType() == OP_SELL && type==OP_SELL) {
      while (IsTradeContextBusy()) Sleep(1000); RefreshRates();
      ask=Ask;stop=OrderStopLoss(); op=OrderOpenPrice();
      new_stop=stop;
      if(Stop_BU >0 && ( stop>op|| stop == 0))
         if(op-ask > Stop_BU*k_8*Point)new_stop=op-1*k_8*Point;
     
      if(TrailingStop>0) 
       if((Stop_BU >0  &&  stop!=0 &&  stop ask+(TrailingStop+TrailingStep-1)*k_8*Point || stop == 0)
             new_stop=ask+TrailingStop*k_8*Point;
      
      
         if(new_stop!=stop && new_stop-ask > minstop*Point){
         if(!OrderModify(OrderTicket(),op,NormalizeDouble(new_stop,Digits),OrderTakeProfit(), 0, Lime))
            {Print(" Повторить операцию трейлинг-стопа, ошибка - ",GetLastError()); Sleep (1000); } 
            
         }}
       }
   }
}
//---------------------------------------------------------------------------
////////////////////////////////// END///////////////////////////////////////////////

Recommend