Navigation:Home > Content >

1tradeday_2.mq4

Time: 2016-05-17 | Download file:1tradeday_2.mq4

//+------------------------------------------------------------------+
//|                                                1 Trade a Day.mq4 |
//|                                                Copyright © 2009. |
//|                                           http://strategy4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009."
#property link      "http://strategy4you.ru"
#define Magic       20100225
#define h2s         3600
extern double Lot=0.0;            // Размер лота для одного ордера(если 0 - расчитывается автоматически)
extern int    MaxRisk=2;          // % от свободных средств(для расчета лота)
extern int    GMTShift=1;         // Смещение времени брокера относительно GMT
extern string StartTime="00:00";  // Время начала интервала(время GMT)
extern string EndTime="08:59";    // Время окончания интервала(время GMT)
extern int    Delta=10;           // Смещение для установки ордеров
extern int    NoTrade=120;        // Размер коробки больше которого не торгуем(0-торгуем всегда)
extern int    TPSize=100;         // Размер тейкпрофита(в % от коробки)
extern int    SLSize=100;         // Размер стоплосса(в % от коробки)
extern int    ClosePos=0;         // Закрывать сработавший ордер:
                                  // 0 - нет
                                  // 1 - в начале следующего дня
                                  // 2 - в начале следующего дня перенос в безубыток
extern bool   DelRorder=true;     // Удалять отложенный ордер при срабатывании противоположного
extern bool   ShowWarn=true;      // Выводить пользователю предупреждения
string StrategyName="1 Trade a Day";
bool   work=true;
string error;
int d=0;
//+------------------------------------------------------------------+
int init()
{if(Lot!=0 && LotMarketInfo(Symbol(),MODE_MAXLOT))
   {Alert("Лот больше разрешенного брокером!"); work=false;}
 if(Lot==0 && MaxRisk<1)
   {Alert("Неправильно задан % от свободных средств для расчета лота!"); work=false;}
 if(Lot==0 && MaxRisk>100)
   {Alert("Неправильно задан % от свободных средств для расчета лота!"); work=false;}
return(0);}
//+------------------------------------------------------------------+
int deinit() {Comment("");return(0);}
//+------------------------------------------------------------------+
int start()
{if(!work) {Comment("Ошибка в параметрах! Советник остановлен."); return(0);}
 if(DayOfWeek()==0 || DayOfWeek()==6) return(0); // в выходные не работаем
 if(!IsTradeAllowed()) return(0); // пропустим тик если терминал занят
 double mLot=Lot;
 if(Lot==0.0) mLot=GetOptimalLot(MaxRisk);
 Comment("http://strategy4you.ru");
//...Подсчет ордеров и удаление противоположного ордера
 int oCount=0,sCount=0,Ticket=0;
 for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
       {if(OrderType()==OP_BUY || OrderType()==OP_SELL) oCount++;
        if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {sCount++;Ticket=OrderTicket();}}
 if(oCount>0 && DelRorder)
   if(OrderSelect(Ticket,SELECT_BY_TICKET)) DelOrder();
//...проверка что сегодня уже торговали
 if(d==TimeDay(TimeCurrent())) return(0);
//...закрытие ордеров
 if(oCount+sCount>0 && ClosePos>0)
   {if(ClosePos==1) CloseAll();
    if(ClosePos==2 && oCount>0)
      {for(i=OrdersTotal()-1;i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
             {if(OrderType()==OP_BUY && OrderStopLoss()OrderOpenPrice())
                EditOrder(OrderOpenPrice()+Point);
              if(OrderType()==OP_SELL && OrderStopLoss()>OrderOpenPrice() && Bid0) {d=TimeDay(TimeCurrent());return(0);}
//...проверка размера коробки
 if(NoTrade>0 && Box>NoTrade*Point)
   {int r=Box/Point;
    error="Размер коробки: "+r+" больше разрешенного: "+NoTrade+"! Не торгуем.";
    if(ShowWarn) Alert(error);
    Print(error);
    d=TimeDay(TimeCurrent());
    return(0);}
//...установка ордеров
 double a=NormalizeDouble(Ask,Digits);
 double b=NormalizeDouble(Bid,Digits);
 double level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
 if((u-a)0) break;
    Print("#",OrderTicket(),"  Error: ",GetLastError()," Function: NewOrder(",Cmd,",",lot,",",pr,",",tp,",",sl,") №",er);
    Sleep(1000);}
return(tick);}
//+------------------------------------------------------------------+
void EditOrder(double sl)
{for(int er=0;er<3;er++)
  {while(!IsTradeAllowed()) Sleep(100);
   if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,CLR_NONE)) break;
   Print("#",OrderTicket(),"  Error: ",GetLastError()," Function: EditOrder(",sl,") №",er);
   Sleep(1000);}}
//+------------------------------------------------------------------+
void DelOrder()
{for(int er=0;er<3;er++)
  {while(!IsTradeAllowed()) Sleep(100);
   if(OrderDelete(OrderTicket(),CLR_NONE)) break;
   Print("#",OrderTicket(),"  Error: ",GetLastError()," Function: DelOrder() №",er);
   Sleep(1000);}}
//+------------------------------------------------------------------+
void CloseOrder(double lot=0)
{double pr=0,a=0,b=0,l=0;
 for(int er=0;er<3;er++)
   {while(!IsTradeAllowed()) Sleep(100);
    if(OrderType()==OP_BUY)  pr=NormalizeDouble(Bid,Digits);
    if(OrderType()==OP_SELL) pr=NormalizeDouble(Ask,Digits);
    if(lot==0) l=OrderLots();
    if(OrderClose(OrderTicket(),l,pr,3,CLR_NONE)) break;
    Print("#",OrderTicket(),"  Error: ",GetLastError()," Function: CloseOrder(",lot,") №",er);
    Sleep(1000);}}
//+------------------------------------------------------------------+
void CloseAll()
{for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
       {if(OrderType()==OP_BUY || OrderType()==OP_SELL) CloseOrder();
        if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) DelOrder();}}
//+------------------------------------------------------------------+
double NormLot(double lot)
{double Min_Lot=MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot=MarketInfo(Symbol(),MODE_MAXLOT);
 double Step   =MarketInfo(Symbol(),MODE_LOTSTEP);
 int    DigLot =0;
 if(Step<0.1)  DigLot=2;
 if(Step>=0.1) DigLot=1;
 if(Step>=1)   DigLot=0;
 if(lotMax_Lot) lot=Max_Lot;
return(NormalizeDouble(lot,DigLot));}
//+------------------------------------------------------------------+
double GetOptimalLot(int Percent)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lots_New=MathFloor(Free*Percent/100/One_Lot/Step)*Step;
return(NormLot(Lots_New));}
//+------------------------------------------------------------------+

Recommend