Trailing_By_Object_v1_2

Author: Copyright � Evgeniy Trofimov, 2009
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself
0 Views
0 Downloads
0 Favorites
Trailing_By_Object_v1_2
//+------------------------------------------------------------------+
//|                                           Trailing_By_Object.mq4 |
//|                               Copyright © Evgeniy Trofimov, 2010 |
//|                                   http://vkontakte.ru/id5374887/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © Evgeniy Trofimov, 2009"
#property link      "http://www.mql4.com/ru/users/EvgeTrofi"
extern int    Ticket        =  0;    // - Íîìåð ïîçèöèè, êîòîðóþ íóæíî ìîäèôèöèðîâàòü. Åñëè 1, òî âñå ïîçèöèè ïî òåêóùåìó èíñòðóìåíòó
extern string NameObject    = "";    // - Íàèìåíîâàíèå ëèíèè, íà ãðàôèêå öåíû, ïî êîòîðîé ñêîëüçèì StopLoss èëè îòëîæåííûé îðäåð 
extern int    SleepPage     = 30;    // - Òî÷íîñòü çàêðûòèÿ ïîçèöèè â ïóíêòàõ
extern int    SparePips     = 50;    // - Çàïàñ â ïóíêòàõ - ðàññòîÿíèå íà êîòîðîå îðäåð ñðàáîòàåò ïîçäíåå
extern bool   CloseExtern   = true;  // - Çàêðûâàòü îòêðûòóþ ïîçèöèþ ñðàçó ïîñëå ïåðåñå÷åíèÿ ëèíèè
extern bool   OunlyOrders   = false; // - Ñîâåòíèê ðàáîòàåò òîëüêî íà îòëîæåííûå îðäåðà (Sell Stop èëè Buy Stop)
extern bool   TrailingTP    = false; // - Äâèãàòü TakeProfit â îòëîæåííûõ îðäåðàõ

double Spare;
//+------------------------------------------------------------------+
int start() {
   int x1,x2;
   double   y1,y2, Price;
   string txt;
   int positions[], j;
   if(ObjectFind(NameObject)==0) {//Îáúåêò â îêíå ãðàôèêà öåíû
      x1=GetBar(ObjectGet(NameObject,OBJPROP_TIME1));
      y1=ObjectGet(NameObject,OBJPROP_PRICE1);
      x2=GetBar(ObjectGet(NameObject,OBJPROP_TIME2));
      y2=ObjectGet(NameObject,OBJPROP_PRICE2);
      Price = y2-(x2-0)*(y2-y1)/(x2-x1);
      if(Ticket==0){
         txt="";
      }else if(Ticket==1){
         txt="\nAll tickets";
         for (int i = 0; i < OrdersTotal(); i++) {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
               if(OrderSymbol()==Symbol()){
                  ArrayResize(positions, j+1);
                  positions[j]=OrderTicket();
                  j++;
               }
            }
         }//Next i
         for(i=0; i<j; i++){
            Move(positions[i], Price);
         }//Next i
      }else{
         txt="\nTicket = "+Ticket;
         if(OrderExist(Symbol(), Ticket)) {
            Move(Ticket, Price);
         } else {
            txt="\nTicket "+Ticket+" not found";
         }
      }
      Comment("Price = "+DoubleToStr(Price, Digits)+txt);
   } else {
      Comment("Object not found");
   }
   return(0);
}//start()
//+------------------------------------------------------------------+
int init(){
   Spare=SparePips*Point;
}//init()
//+------------------------------------------------------------------+
int deinit(){
   Comment("");
}//deinit()
//+------------------------------------------------------------------+
int Move(int myTicket, double Price) {
   double Spread=MarketInfo(Symbol(),MODE_SPREAD)*Point;
   double StopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
   double Delta, tp, sl;
   if(OrderSelect(myTicket,SELECT_BY_TICKET)) {
      switch(OrderType()) {
      case OP_BUY:
         if(OunlyOrders==false){
            if(Price<Bid-StopLevel){
               if(Price>OrderStopLoss()+Spare){
                  if(IsTradeAllowed()){
                     OrderModify(myTicket, OrderOpenPrice(), NormalizeDouble(Price-Spare, Digits), OrderTakeProfit(), 0);
                  }
               }
            }
            if(CloseExtern){
               if(Price-Spare>Bid) {
                  if(IsTradeAllowed()) {
                     OrderClose(myTicket, OrderLots(), MarketInfo(Symbol(),MODE_BID), SleepPage);
                  }
               }
            }
         }
      case OP_SELL:
         if(OunlyOrders==false){
            if(Price>Ask+StopLevel){
               if(OrderStopLoss()>Price+Spread+Spare) {
                  if(IsTradeAllowed()) {
                     OrderModify(myTicket, OrderOpenPrice(), NormalizeDouble(Price+Spread+Spare, Digits),
                        OrderTakeProfit(), 0);
                  }
               }
            }
            if(CloseExtern){
               if(Bid>Price+Spare){
                  if(IsTradeAllowed()){
                     OrderClose(myTicket, OrderLots(), MarketInfo(Symbol(),MODE_ASK), SleepPage);
                  }
               }
            }
         }
      case OP_BUYSTOP:
         if(Price>Ask+StopLevel){
            if(OrderOpenPrice()>Price+Spread+Spare) {
               Delta=OrderOpenPrice()-(Price+Spread+Spare);
               if(Delta>NormalizeDouble(SleepPage*Point,Digits)){
                  if(IsTradeAllowed()){
                     Print("Ïîïûòêà ìîäèôèêàöèè îðäåðà "+myTicket+" íà öåíó "+DoubleToStr(OrderOpenPrice()-Delta, Digits));
                     if(OrderTakeProfit()>0)
                        if(TrailingTP) 
                           tp=NormalizeDouble(OrderTakeProfit()-Delta, Digits);
                        else
                           tp=OrderTakeProfit();
                     else
                        tp=0;
                     if(OrderStopLoss()>0)
                        sl=NormalizeDouble(OrderStopLoss()-Delta, Digits);
                     else
                        sl=0;
                     OrderModify(myTicket, NormalizeDouble(OrderOpenPrice()-Delta, Digits), sl, tp, 0);
                  }
               }
            }
         }
      case OP_SELLSTOP:
         if(Price<Bid-StopLevel){
            if(OrderOpenPrice()<Price-Spare){
               Delta=(Price-Spare)-OrderOpenPrice();
               if(Delta>NormalizeDouble(SleepPage*Point,Digits)){
                  if(IsTradeAllowed()){
                     Print("Ïîïûòêà ìîäèôèêàöèè îðäåðà "+myTicket+" íà öåíó "+DoubleToStr(OrderOpenPrice()+Delta, Digits));
                     if(OrderTakeProfit()>0)
                        if(TrailingTP) 
                           tp=NormalizeDouble(OrderTakeProfit()+Delta, Digits);
                        else
                           tp=OrderTakeProfit();
                     else
                        tp=0;
                     if(OrderStopLoss()>0)
                        sl=NormalizeDouble(OrderStopLoss()+Delta, Digits);
                     else
                        sl=0;
                     OrderModify(myTicket, NormalizeDouble(OrderOpenPrice()+Delta, Digits), sl, tp, 0);
                  }
               }
            }
         }
      }
   }
}//Move()
//+------------------------------------------------------------------+
bool OrderExist(string fSymbol="", int fTicket=0) {
   int  total = OrdersTotal();
   for (int i = total-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==fSymbol || fSymbol=="") {
         if(OrderTicket()==fTicket) {
            return(true);
         }
      } // Åñëè ñâîé
   } // Next i
   return(false);
}//OrderExist()
//+------------------------------------------------------------------+
int GetBar(datetime TimeBar, int start=0){
   for(int i=start; i<Bars; i++){
      if(Time[i]<TimeBar){
         return(i);
      }
   }
}//GetBar()
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---