Navigation:Home > Content >

444.mq4

Time: 2012-07-04 | Download file:444.mq4

 //+------------------------------------------------------------------+
//|                                                     For_gcbc.mq4 |
//|                              Copyright © 2009, Игорь Александров |
//|                                            [email protected] |
//|                   ---Прочитать перед компиляцией---              |
//| Советник работает по показания индикатора STS_alert, при этом    |
//|файл STS_alert.ex4  должен находится в папке indicators терминала |
//|При синей стрелке покупка, при красной закрываем покупку и продаем|
//|Входные параметры:                                                |
//|MaMetod  = 3; -  Метод расчета индикатора                         |
//|MaPeriod = 80; - Период расчета индикатора                        |
//|SL=40; - Расстояние до СеллСтопа, в пунктах                       |
//|TP=60; -Расстояние до Тейк профита, в пунктах                     |
//|Prots    =0.1; - Часть свободных средств для торговли в процентах |
//|Lots      =0; -  Жестко заданное колич. лотов Если Lots не равно 0| 
//| то параметр Prots игнорируется                                   |
//|MagicNumber= 48297;- Магик номер ордеров                          | 
//|TrailingStop  = 30; - Растояние в пунктах, откуда начнем тралить  |
//|TrailingStep  = 1;       -  Шаг трала                             |         
//| Советник работает на том финансовом инструменте и на том тайфреме|
//| на котором  установлен. А так же только с теми ордерами которые  |
//| сам установил.                                                   |
//+------------------Да пребудет с Вами профит-----------------------+
#property copyright "Copyright © 2009, Игорь Александров"
#property link      "[email protected]"

extern int MaMetod  = 3; // Метод расчета индикатора
extern int MaPeriod = 80; // Период расчета индикатора 

extern int SL=100;    //Расстояние до СеллСтопа, в пунктах
extern int TP=60;    //Расстояние до Тейк профита, в пунктах
extern double Prots  =0;// Часть свободных средств для торговли в процентах
extern double Lots   =0.01; // Жестко заданное колич. лотов Если Lots не равно 0, то параметр Prots игнорируется
extern int MagicNumber= 48297;// Магик номер ордеров
extern int TrailingStop  = 20; // Растояние в пунктах, откуда начнем тралить
extern int TrailingStep  = 10;    // Шаг трала 
 
double tp;                     //Тейкпрофит
double sl;                      //СтопЛосс
double    Lts;                       //Объем лота
bool New_Bar=false;            // Флаг нового бара 
bool OpenBuy=false;//Флаг критерия открытия Бай
bool OpenSell=false;//Флаг критерия открытия Селл

//+-------------------------------------------------------------------------------------------------------------------+
//|                                 Функция поиска начала образования нового бара                                                |
void Fun_New_Bar()
{
  static datetime New_Time=0;                  // Время текущего бара  
  if(New_Time!=Time[0])                        // Сравниваем время, если время разное    
   {                                           //то
    New_Time=Time[0];                         // теперь время такое     
    New_Bar=true;                             // поднимаем флаг нового бара 
   } 
   else                                       //в противном случае
   {
    New_Bar=false;                            // флаг нового бара опущен 
   } 

} //New_Bar()
//|                                     Конец функции поиска начала образования нового бара                                                |
//+-------------------------------------------------------------------------------------------------------------------+

//+-------------------------------------------------------------------------------------------------------------------+
//|                                            Функция трейлинг стоп лосс                                                |
void T_SL()
{
  int i=0;
  for(i=0; iNormalizeDouble(TrailingStop*Point,Digits))
      {
        if(NormalizeDouble(OrderStopLoss(),Digits)NormalizeDouble(TrailingStop*Point,Digits))
    } //end if(OrderType()==OP_BUY)

    if(OrderType()==OP_SELL)
     {
      if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
       {
        if(NormalizeDouble(OrderStopLoss(),Digits)>NormalizeDouble(Ask+(TrailingStop+TrailingStep-1)*Point,Digits))
          {
          OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point,Digits), OrderTakeProfit(), 0, CLR_NONE);
          }
       } //end if(NormalizeDouble(OrderOpenPrice()-Ask,Digits)>NormalizeDouble(TrailingStop*Point,Digits))
    } //end if(OrderType()==OP_SELL)
  } //end for(i=0; i0) //Если кол-во лотов жестко заданно
      {                  
      Lts =Lots;
      }                                // то выставляем жестко заданное кол-во 
   else 
      {                                        // в другом случае
      Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;    // считаем стоимость лота
      }
   if( Min_Lot>Lts )
      {
      Lts=Min_Lot;               // Не меньше минимального кол-ва лотов
      }
     if (Lts*One_Lot > Free)                      // Лот дороже свободных средств
      {
      Alert(" Не хватает денег на ", Lts," лотов");
       return;                                 // Выход из start()
      }
    }//end void Volume_Lots()
//|         Конец функции расчета обьема лота 
//|-----------------------------------------------------------------+


int start()
  {
  
//|------------------------------------------------------------------+
//|       Объявляем локальные переменные
int Total; // Счетчик открытых ордеров
int Total_Buy;//Счетчик открытых ордеров Бай
int Total_Sell;//Счетчик открытых ордеров Селл
int Ticket_Buy_order;//Тикет ордера Бай 
int Ticket_Sell_order;//Тикет ордера Селл
double Lots_Buy_order; //Объем лота Бай
double Lots_Sell_order;//Объем лота Селл
//|        Конец объявления локальных переменных
//|------------------------------------------------------------------+

 //+-----------------------------------------------------------
 //|              Перебираем  все ордера

  for(int i = 0; i < OrdersTotal(); i ++)        //Выбираем общее кол-во открытых и отложенных ордеров
  {       
      if (OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий рабочий
        {                                       // Анализ ордеров
         if(OrderSymbol()!=Symbol()) continue;      // Не наш фин. инструм.
         if(OrderMagicNumber()!=MagicNumber) continue; //Не наш магический номер       
           Total++;                               // Счётчик рыночных ордеров установленных данным экспертом
           //-------------------------Проверяем  ордера Бай----------------
         if (OrderType()==OP_BUY)               //Перебираем все рабочие ордера BUY
           {
           Total_Buy ++;                         // считаем их кол-во 
           Ticket_Buy_order=OrderTicket();//Запоминаем тикет
           Lots_Buy_order=OrderLots(); // Запоминаем кол-во лотов        
           }
          //---------------------------Проверяем ордера Селл-----------------         
         if(OrderType() == OP_SELL)             //Перебираем все рабочие ордера  SELL        
           {
            Total_Sell++;                         // считаем их кол-во
            Ticket_Sell_order=OrderTicket();//Запоминаем тикет
            Lots_Sell_order=OrderLots(); //Запоминаем кол-во лотов
           }                    
         }//end (OrderSelect(i,SELECT_BY_POS)==true)
        //---------------Конец перебора рабочих ордеров----------------------
   }// end for(int i = 0; i < OrdersTotal(); i ++)

//|                    Конец перебора ордеров
//+--------------------------------------------------------------------

 Fun_New_Bar();                    // Обращение к функции поиска начала образования нового бара 
  
 if (New_Bar||Total==0)               // Если бар  новый или нет открытых ордеров
    {
      //------------------Определяем торговые критерии--------------------------------
       if(iCustom(NULL ,0,"STS_alert",MaMetod,MaPeriod,4,0)!=EMPTY_VALUE&&
       iCustom(NULL ,0,"STS_alert",MaMetod,MaPeriod,4,1)==EMPTY_VALUE)
       //Если в 0 баре синяя стрелка
       {
        OpenBuy=true;//Поднимаем флаг критерия открытия Бай
        OpenSell=false;//Опускаем флаг критерия открытия Селл
       }
       else
       {
        OpenBuy=false;//Опускаем флаг критерия открытия Бай      
       }
       if(iCustom(NULL ,0,"STS_alert",MaMetod,MaPeriod,5,0)!=EMPTY_VALUE&&
       iCustom(NULL ,0,"STS_alert",MaMetod,MaPeriod,5,1)==EMPTY_VALUE)
       //Если 2 последних бара красные
       {
        OpenSell=true;//Поднимаем флаг критерия открытия Селл
        OpenBuy=false;//Опускаем флаг критерия открытия Бай
       }
       else
       {
        OpenSell=false;//Поднимаем флаг критерия открытия Селл       
       }       
      //------------------Конец определения торговых критериев------------------------
    } 
      //---------------Закрытие ордеров------------------------------ 
  if (OpenBuy&&!OpenSell&&Total_Sell!=0)//Если есть критерий открытия Бай и есть открытые Селл, то закрываем ордер
    {
     OrderClose(Ticket_Sell_order,Lots_Sell_order,Ask, 2,CLR_NONE);
     return; //Выходим из start  
    }
  if (OpenSell&&!OpenBuy&&Total_Buy!=0)//Если есть критерий открытия Sell и есть открытые Buy, то закрываем ордер
    {
     OrderClose(Ticket_Buy_order,Lots_Buy_order,Bid, 2,CLR_NONE);
     return; //Выходим из start  
    }
     //------------Конец закрытия ордеров---------------------------
     
     //-----------Открытие ордеров---------------------------------
  if (OpenBuy&&!OpenSell&&Total_Buy==0)//Если есть критерий открытия Бай и нет открытых Бай, то открываем Бай
    {
     Volume_Lots(); //Обращение к функции расчета объема лота
     tp=Ask+TP*Point;
     if(TP==0){tp=0;}
     sl=Bid-SL*Point;
     if(SL==0){sl=0;}  
     OrderSend(Symbol(),OP_BUY,Lts,Ask,2,sl,tp,NULL,MagicNumber,0,CLR_NONE);
     return; //Выходим из start  
    }
  if (OpenSell&&!OpenBuy&&Total_Sell==0)//Если есть критерий открытия Селл и нет открытых Селл, то открываем Селл
    {
     Volume_Lots(); //Обращение к функции расчета объема лота
     tp=Bid-TP*Point;
     if(TP==0){tp=0;}
     sl=Ask+SL*Point;
     if(SL==0){sl=0;}  
     OrderSend(Symbol(),OP_SELL,Lts,Bid,2,sl,tp,NULL,MagicNumber,0,CLR_NONE);
     return; //Выходим из start  
    }    
     //-----------Конец открытия ордеров--------------------------
//----------------------------------------------- 
 T_SL();                           //Обращение к функции тралла 

   return(0);
  }//end int start()
//+------------------------------------------------------------------+

Recommend