//+------------------------------------------------------------------+
//|                                                         Frac.mq4 |
//|                                           Copyright © 2011, AZM. |
//|                                                 azmgod@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, AZM."
#property link      "azmgod@gmail.com"
#include <WinUser32.mqh>
extern double Lot=0.1;
extern bool Loss_percent_lot=false;
extern double  MaxRisk=2;
extern bool       On_time=true;     //включение функции ограничения по времени
extern int        HourStart=6;      //начало расстоновки ордеров
extern int        HourStop=12;      //окончание расстоновки ордеров
extern int MA=135;
extern int indent_up=0;
extern int Prof_up=115;
extern int Prof_dn=120;
extern int Loss_up=65;
extern int Loss_dn=35;
extern bool Trall=true;
extern int Trall_up=30;
extern int Trall_dn=85;
extern int Magic=9;
 int z_up_plus=2;
 int z_dn_plus=2;

int dec,k;double sp,digit,ml,s;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
  Comment("http://strategy4you.ru/\nhttp://MqlLab.ru/"); double ml=MarketInfo(Symbol(),MODE_MINLOT);if(Lot<ml){Lot=ml;
MessageBox("НЕ ДОПУСТИМЫЙ РАЗМЕР ЛОТА. РАБОТА БУДЕТ ПРОДОЛЖЕНА С ЛОТОМ  "+ml,NULL ,MB_OK|MB_ICONEXCLAMATION);}
Print("AZM for http://strategy4you.ru/");
   digit  = MarketInfo(Symbol(),MODE_DIGITS);// sp  = MarketInfo(Symbol(),MODE_SPREAD); 
   if (digit==5 || digit==3) dec=10;if(digit==5)k=100000;if(digit==3)k=1000;
   if (digit==4 || digit==2) dec=1; if(digit==4)k=10000; if(digit==2)k=100;
   ml=MarketInfo(Symbol(),MODE_MINLOT);  s=MarketInfo(Symbol(),MODE_STOPLEVEL);      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {if(Trall)Zero();
  if(On_time&&0==Timers()) return;
  sp  = MarketInfo(Symbol(),MODE_SPREAD); 
//----
   if(bh1())op();
//----
   return(0);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void Zero(){int i;
      for(i=OrdersTotal(); i>=0; i--)                                   // Цикл перебора ордеров
{  if (OrderSelect(i-1,SELECT_BY_POS)==true)      // Если есть следующий
 { if(Magic!=OrderMagicNumber())continue;if(Symbol()!=OrderSymbol())continue;if(0!=OrderType())continue;
if(Bid>=(OrderOpenPrice()+(dec*Trall_up*Point))&&Bid-OrderStopLoss()>=(dec*Trall_up*Point))
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(dec*Trall_up*Point)+(dec*z_up_plus*Point),OrderTakeProfit(),0);
 }}
      for(i=OrdersTotal(); i>=0; i--)                                   // Цикл перебора ордеров
{  if (OrderSelect(i-1,SELECT_BY_POS)==true)      // Если есть следующий
 { if(Magic!=OrderMagicNumber())continue;if(Symbol()!=OrderSymbol())continue;if(1!=OrderType())continue;
if(Bid<=(OrderOpenPrice()-(dec*Trall_dn*Point))&&OrderStopLoss()-Bid>=(dec*Trall_dn*Point))
OrderModify(OrderTicket(),OrderOpenPrice(),Bid+(dec*Trall_dn*Point)-(dec*z_dn_plus*Point),OrderTakeProfit(),0);
 }}} 
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Timers()
{
//if (Timer == false)
  //   return (1);
  if(HourStop==HourStart)return(0);if(HourStop<0||HourStart<0)return(0);
if (HourStart < HourStop)
     {
     if (Hour() >= HourStart && Hour() < HourStop)
          return (1);
     else
          return (0);     
     }
if (HourStart > HourStop)
     {
     if ((Hour() >= HourStart && HourStart <= 23) || (Hour() < HourStop && HourStop >= 0))
          return (1);
     else
          return (0);     
     }     
}


//+------------------------------------------------------------------+
void op(){double fup,fdn,ma;
//+------------------------------------------------------------------+
if(High[3]>High[2]&&High[3]>High[1]&&High[3]>High[4]&&High[3]>High[5])fup=High[3];
if(Low[3]<Low[2]&&Low[3]<Low[1]&&Low[3]<Low[4]&&Low[3]<Low[5])fdn=Low[3];

//fup=iFractals(0,0,0,3);fdn=iFractals(0,0,1,3);
ma=iMA(0,0,MA,0,MODE_SMMA,PRICE_CLOSE,0);
if(fup!=0&&ma<Bid&&High[3]>Bid){
dell(4);dell(5);nord(4,High[3]+sp*Point+dec*indent_up*Point,High[3]+sp*Point+dec*indent_up*Point-dec*Loss_up*Point,High[3]+sp*Point+dec*indent_up*Point+dec*Prof_up*Point);
//Print(High[3]);Print(Bid);
}

if(fdn!=0&&ma>Bid&&Low[3]<Bid){
dell(5);dell(4);nord(5,Low[3],Low[3]+dec*Loss_dn*Point,Low[3]-dec*Prof_dn*Point);
//
}


//Print(fdn);Print(Bid);






}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void nord(int cmd, double pr, double sl, double tp){int i,t;bool order=false;
//+------------------------------------------------------------------+
if(cmd==4){
//+------------------------+
   for(i=OrdersTotal(); i>=0; i--) {  
      if (OrderSelect(i-1,SELECT_BY_POS)==true) { 
         if(Magic!=OrderMagicNumber()) continue;
         if(Symbol()!=OrderSymbol())continue;
         order=true;
         }
      }
 if(!order) { 
   while(!IsTradeAllowed()) Sleep(100);
      while(true){ RefreshRates(); 
      if(cmd==4){ 
         if(pr<(Ask+(s*Point))) pr=Ask+(s*Point);
         if(sl>(pr-(s*Point)))sl=pr-(s*Point);
         if(tp<(pr+(s*Point)))tp=pr+(s*Point);
         }
      if(Loss_percent_lot) Lot=GetLoss((pr-sl)*k);
      if(Lot<ml)Lot=ml; 
      t=OrderSend(Symbol(),cmd,Lot,NormalizeDouble(pr,Digits),dec*2*Point,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),0,Magic);
      if(t>0){break;}
      if(Fun_Error(GetLastError())==1)continue;
      if(Fun_Error(GetLastError())==0)break;
      }
   }
}
//+---------------------------------------------------------------+
if(cmd==5){
//+------------------------+
      for(i=OrdersTotal(); i>=0; i--)                                   // Цикл перебора ордеров
{  if (OrderSelect(i-1,SELECT_BY_POS)==true)      // Если есть следующий
 { if(Magic!=OrderMagicNumber())continue;if(Symbol()!=OrderSymbol())order=true;}}
 if(!order){ while(!IsTradeAllowed()) Sleep(100);while(true){RefreshRates();
 if(cmd==5){if(pr>(Bid-(s*Point)))pr=Bid-(s*Point);if(sl<(pr+(s*Point)))sl=pr+(s*Point);if(tp>(pr-(s*Point)))tp=pr-(s*Point);}
 if(Loss_percent_lot)Lot=GetLoss((sl-pr)*k);if(Lot<ml)Lot=ml;
 t=OrderSend(Symbol(),cmd,Lot,NormalizeDouble(pr,Digits),dec*2*Point,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),0,Magic);
 if(t>0){break;}if(Fun_Error(GetLastError())==1)continue;if(Fun_Error(GetLastError())==0)break;}}}
//+---------------------------------------------------------------+
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
double GetLoss(int sloss)
{double Free    =AccountBalance();
 double LotVal  =MarketInfo(Symbol(),MODE_TICKVALUE);//стоимость 1 пункта 1 лота
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor((Free*MaxRisk/100)/(sloss*LotVal)/Step)*Step;
 if(Lot<Min_Lot)  Lot=Min_Lot;
 if(Lot>Max_Lot)  Lot=Max_Lot;
 //Alert(Lot);
//return(0);
return(Lot);}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void dell( int cmd){int i;double pr;
//+------------------------------------------------------------------+
if(cmd>1){
//+-------+
      for(i=OrdersTotal(); i>=0; i--)                                   // Цикл перебора ордеров
{  if (OrderSelect(i-1,SELECT_BY_POS)==true)      // Если есть следующий
{if(Magic!=OrderMagicNumber())continue;if(cmd!=OrderType())continue;if(Symbol()!=OrderSymbol())continue;
while(!IsTradeAllowed()) Sleep(100);OrderDelete(OrderTicket());}}}
//+------------------------------------------------------------+
/*if(cmd<2){
//+-------+
      for(i=OrdersTotal(); i>=0; i--)                                   // Цикл перебора ордеров
{  if (OrderSelect(i-1,SELECT_BY_POS)==true)      // Если есть следующий
{if(com!=OrderComment())continue;if(1<OrderType())continue;if(Symbol()!=OrderSymbol())continue;
while(!IsTradeAllowed()) Sleep(100);if(cmd==0)pr=Bid;if(cmd==1)pr=Ask;
OrderClose(OrderTicket(),lot,NormalizeDouble(pr,Digits),dec*2*Point);}}}
*///+-------------------------------------------------------------+
}
//+------------------------------------------------------------------+
//--------------------------------------------------------------  --
int Fun_Error(int Error)                        // Ф-ия обработ ошибок
  {
   switch(Error)
     {                                          // Преодолимые ошибки  
      case  4: Print("Торговый сервер занят. Пробуем ещё раз..");   Sleep(3000);   return(1);  
      case 8:   Print("Слишком частые запросы");    Sleep(3000);return(1);  
      case 128: Print("Истек срок ожидания совершения сделки");return(1); 
      case 130: Print("Неправильные стопы");return(1);  
      case 135:Print("Цена изменилась. Пробуем ещё раз..");   RefreshRates();  return(1); 
      case 136:Print("Нет цен. Ждём новый тик..");   while(RefreshRates()==false)   Sleep(1);      return(1); 
      case 137:Print("Брокер занят. Пробуем ещё раз..");  Sleep(3000);  return(1); 
      case 138: Print("Новые цены - Реквот");return(1);   
      case 141: Print("Слишком много запросов");Sleep(3000);return(1);
      case 146:Print("Подсистема торговли занята. Пробуем ещё..");  Sleep(500);  return(1); 
         
         // Критические ошибки
      case 1:   Print("Нет ошибки, но результат неизвестен");  return(0);         
      case  2: Print("Общая ошибка.");  return(0); 
      case 3:   Print("Неправильные параметры"); return(0);                   
      case 5: Print("Старая версия терминала."); return(0); 
      case 6:   Print("Нет связи с торговым сервером");return(0);   
      case 7:   Print("Недостаточно прав"); return(0);   
      case 9:   Print("Недопустимая операция нарушающая функционирование сервера");return(0);                                                                      
      case 64: Print("Счет заблокирован.");  return(0); 
      case 129: Print("Неправильная цена");return(0);   
      case 131: Print("Неправильный объем");return(0);
      case 133:Print("Торговля запрещена.");  return(0); 
      case 134:Print("Недостаточно денег для совершения операции.");  return(0);
      case 148: Print("Количество открытых и отложенных ордеров достигло предела ");return(0);   
       case 4110: Print("Длинные позиции не разрешены");                              return(0);   
       case 4111: Print("Короткие позиции не разрешены");                             return(0);   
       case 0:                            return(0);   
      default: Print("Возникла ошибка ",Error); return(0);
     }
  }
//----------------------------------------------------------------
//+------------------------------------------------------------------+
bool bh1(){
//+------------------------------------------------------------------+
   static datetime New_Time=0;                  // Время текущего бара
  bool New_Bar=false;                               // Нового бара нет
   if(New_Time!=iTime(Symbol(),NULL,0))                        // Сравниваем время
     {
      New_Time=iTime(Symbol(),NULL,0);                         // Теперь время такое
      New_Bar=true;                             // Поймался новый бар
     }
     return(New_Bar);
   }
//+------------------------------------------------------------------+