Author: Evgeny I. SHCHERBINA
Profit factor:
0.00
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
2 Views
0 Downloads
0 Favorites
hammer_v1
#property copyright "Evgeny I. SHCHERBINA"
//hammer_vX.mq4
//01.12.2011

extern int magic = 789;
extern int risk = 1000;
extern int step = 2;
extern int trail = 4;

double buy, lot, sell;
int decimal = 1, trades;

int init(){
  if(MarketInfo(Symbol(),MODE_DIGITS) == 3 || MarketInfo(Symbol(),MODE_DIGITS) == 5){decimal = 10;}
}

int start(){
  bool m, cl;
  if(trail*decimal < MarketInfo(Symbol(),MODE_STOPLEVEL)){trail = MarketInfo(Symbol(),MODE_STOPLEVEL);}
  comments("magic",5,45,"Ìåéäæèê: "+magic+"; îòñòóï: "+step,Gold);
  int i, orders;
  for(i=0; i<OrdersTotal(); i++){
    OrderSelect(i,SELECT_BY_POS);
    if(OrderMagicNumber() == magic){
      orders++;
      if(ObjectGet("close_manual",OBJPROP_XDISTANCE) > 30){
        if(OrderType() == OP_BUY){
          cl = OrderClose(OrderTicket(),OrderLots(),Bid,3,0);
          if(!cl){Print(GetLastError());}
        }
        else if(OrderType() == OP_SELL){
          cl = OrderClose(OrderTicket(),OrderLots(),Ask,3,0);
          if(!cl){Print(GetLastError());}
        }
      }
    }
    if(OrderComment() == "hammer"){
      if(ObjectGet("trailing_stop",OBJPROP_XDISTANCE) > 30){
        if(OrderType() == OP_BUY){
          if(OrderStopLoss() == 0 && OrderOpenPrice() < NormalizeDouble(Bid-trail*decimal*Point,Digits)){
            m = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-trail*decimal*Point,Digits),OrderTakeProfit(),0,Red);
            if(!m){Print(GetLastError());}
          }
          if(OrderStopLoss() < NormalizeDouble(Bid-trail*decimal*Point,Digits) && OrderOpenPrice() < NormalizeDouble(Bid-trail*decimal*Point,Digits)){
            m = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-trail*decimal*Point,Digits),OrderTakeProfit(),0,Red);
            if(!m){Print(GetLastError());}
          }
        }else if(OrderType() == OP_SELL){
          if(OrderStopLoss() == 0 && OrderOpenPrice() > NormalizeDouble(Ask+trail*decimal*Point,Digits)){
            m = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+trail*decimal*Point,Digits),OrderTakeProfit(),0,Red);
            if(!m){Print(GetLastError());}
          }
          if(OrderStopLoss() > NormalizeDouble(Ask+trail*decimal*Point,Digits) && OrderOpenPrice() > NormalizeDouble(Ask+trail*decimal*Point,Digits)){
           m = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+trail*decimal*Point,Digits),OrderTakeProfit(),0,Red);
           if(!m){Print(GetLastError());}
          }
        }
      }
    }
  }
  if(orders > trades){
    trades = orders;
    if(ObjectFind("level") != -1){ObjectDelete("level");}
    buy = 0;
    sell = 0;
  } 
  if(orders < trades){
    trades = orders;
    if(ObjectFind("tp_hammer") != -1){ObjectDelete("tp_hammer");}
  }
  if(orders == 0){comments("close_manual",5,105,"Çàêðûòü ÂÛÊË.",Gold);}
  lot = (MathFloor((AccountEquity()/risk/10)*100))/100;
  lot = (MathFloor(lot/MarketInfo(Symbol(),MODE_LOTSTEP)))*MarketInfo(Symbol(),MODE_LOTSTEP);
  if(lot < MarketInfo(Symbol(),MODE_MINLOT)){lot = MarketInfo(Symbol(),MODE_MINLOT);}
  if(lot > MarketInfo(Symbol(),MODE_MAXLOT)){lot = MarketInfo(Symbol(),MODE_MAXLOT);}
  if(ObjectGet("close_manual",OBJPROP_XDISTANCE) > 30){comments("close_manual",40,105,"Çàêðûòü ÂÊË.",Tomato);}
  else{comments("close_manual",5,105,"Çàêðûòü ÂÛÊË.",Gold);}
  if(ObjectGet("trailing_stop",OBJPROP_XDISTANCE) > 30){comments("trailing_stop",40,60,"Òðåéëèíã-ñòîï ÂÊË.",Tomato);}
  else{comments("trailing_stop",5,60,"Òðåéëèíã-ñòîï ÂÛÊË.",Gold);}
  comments("lot_risk_trail",5,15,"Ëîò: "+DoubleToStr(lot,2)+"; ðèñê: "+DoubleToStr(risk,0)+"; òðàë: "+DoubleToStr(trail,0),Gold);
  check_level();
  define_takeprofit();
  send_order();
}

void check_level(){
  if(ObjectFind("level") == -1 && trades == 0){
    buy = 0; sell = 0;
    ObjectCreate("level",OBJ_HLINE,0,0,Bid+30*decimal*Point);
    ObjectSet("level",OBJPROP_COLOR,Gold);
    ObjectSet("level",OBJPROP_STYLE,STYLE_DASHDOTDOT);
  }
  if(ObjectGet("sell",OBJPROP_XDISTANCE) > 30){
    comments("sell",40,75,"Ïðîäàæà ÂÊË.",Tomato);
    if(Close[0] >= ObjectGet("level",OBJPROP_PRICE1)){
      sell = ObjectGet("level",OBJPROP_PRICE1);
      ObjectSet("level",OBJPROP_PRICE1,sell+5*decimal*Point);
    }
  }else if(ObjectGet("sell",OBJPROP_XDISTANCE) < 30){
    comments("sell",5,75,"Ïðîäàæà ÂÛÊË.",Gold);
  }
  if(ObjectGet("buy",OBJPROP_XDISTANCE) > 30){
    comments("buy",40,90,"Ïîêóïêà ÂÊË.",Tomato);
    if(Close[0] <= ObjectGet("level",OBJPROP_PRICE1)){
      buy = ObjectGet("level",OBJPROP_PRICE1);
      ObjectSet("level",OBJPROP_PRICE1,buy-5*decimal*Point);
    }
  }else if(ObjectGet("buy",OBJPROP_XDISTANCE) < 30){
    comments("buy",5,90,"Ïîêóïêà ÂÛÊË.",Gold);
  }
  comments("buy_sell",5,30,"Áàé: "+DoubleToStr(buy,Digits)+"; ñåëë: "+DoubleToStr(sell,Digits),Gold);
}

void send_order(){
  int ti;
  if(ObjectGet("sell",OBJPROP_XDISTANCE) > 30 && ObjectGet("buy",OBJPROP_XDISTANCE) < 30 && lot != 0 && trades == 0){
    if(sell != 0 && sell-step*decimal*Point > Close[0]){
      ti = OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,0,"hammer",magic,0,Red);
      if(ti < 0){Print(GetLastError());}
    }
  }else if(ObjectGet("buy",OBJPROP_XDISTANCE) > 30 && ObjectGet("sell",OBJPROP_XDISTANCE) < 30 && lot != 0 && trades == 0){
    if(buy != 0 && buy+step*decimal*Point < Close[0]){
      ti = OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,0,"hammer",magic,0,Green);
      if(ti < 0){Print(GetLastError());}
    }
  }
}

void define_takeprofit(){
  bool m;
  double tp;
  for(int i=0; i<OrdersTotal(); i++){
    OrderSelect(i,SELECT_BY_POS);
    if(OrderMagicNumber() == magic){
      if(ObjectFind("tp_hammer") != -1){
        if(OrderTakeProfit() != ObjectGet("tp_hammer",OBJPROP_PRICE1)){
          m = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(ObjectGet("tp_hammer",OBJPROP_PRICE1),Digits),0,0);
          if(!m){Print(GetLastError());}
        }
      }else if(ObjectFind("tp_hammer") == -1){
        if(OrderType() == OP_SELL){tp = OrderOpenPrice()-40*decimal*Point;}
        else if(OrderType() == OP_BUY){tp = OrderOpenPrice()+40*decimal*Point;}
        ObjectCreate("tp_hammer",OBJ_HLINE,0,0,tp);
        ObjectSet("tp_hammer",OBJPROP_COLOR,OrangeRed);
        ObjectSet("tp_hammer",OBJPROP_STYLE,STYLE_DASHDOTDOT);
      }
    }
  }
}

int comments(string name, int x, int y, string texto, color couleur){
  if(ObjectFind(name) == -1){ObjectCreate(name,OBJ_LABEL,0,0,0);}
  ObjectSet(name,OBJPROP_XDISTANCE,x);
  ObjectSet(name,OBJPROP_YDISTANCE,y);
  ObjectSet(name,OBJPROP_CORNER,1);
  ObjectSetText(name,texto,10,"Times New Roman",couleur);
}

Comments