levels_with_trail

Author: Copyright � 2015, Vladimir V. Tkach
Price Data Components
Series array that contains open prices of each bar
Orders Execution
It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reachedChecks for the total of open orders
0 Views
0 Downloads
0 Favorites
levels_with_trail
//+------------------------------------------------------------------+
//|                                                    Simple Levels |
//|                                Copyright 2015, Vladimir V. Tkach |
//+------------------------------------------------------------------+
#property version "1.0"
#property copyright "Copyright © 2015, Vladimir V. Tkach"
#property description "Expert opens trades from the trend lines and"
#property description "trail its stop loss."
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum on_off_mode
  {
   on=0,
   off=1,
  };

extern int
sl=300,     //Stop Loss (in pips)
tp=900,     //Take Profit (in pips)
slip=30,    //Slippage (in pips)
magic=120;  //Magic number

extern double
lot=0.01;   //Lot size

input on_off_mode trail_sl=0; //Trail stop loss

double
price,
LinePrice[20][2];

int
LineTime[20][2];
//+------------------------------------------------------------------+
//|Initialisation function                                           |
//+------------------------------------------------------------------+ 
void init()
  {
   return;
  }
//+------------------------------------------------------------------+
//|Deinitialisation function                                         |
//+------------------------------------------------------------------+
void deinit()
  {
   return;
  }
//+------------------------------------------------------------------+
//|Trading function                                                  |
//+------------------------------------------------------------------+
void start()
  {
   ProcessingLines();

//Trail stop loss
   Comment(OrderExist()," ",EnumToString(trail_sl)," ",OrderStopLoss());

   if(OrderExist()!=-1 && EnumToString(trail_sl)=="on" && OrderStopLoss()!=0)
     {
      if(OrderType()==OP_BUY)
        {
         if(OrderStopLoss()<Bid-sl*Point && OrderStopLoss()<Bid-sl*Point-slip*Point) if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-sl*Point,OrderTakeProfit(),0)==false) return;
        }
      else
        {
         if(OrderStopLoss()>Ask+sl*Point && OrderStopLoss()>Ask+sl*Point+slip*Point) if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+sl*Point,OrderTakeProfit(),0)==false) return;
        }
     }

//Trading conditions
   if(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*lot>AccountEquity() || OrderExist()!=-1) return;

//Check for signal (crossing any level)
   for(int i=0; i<ObjectsTotal(); i++)
     {
      if(!ObjectGet("Trendline"+DoubleToStr(i,0),OBJPROP_COLOR)) continue;

      if(TradeDirection(i)!=-1)
        {
         int ticket;
         ticket=OrderSend(Symbol(),TradeDirection(i),lot,price,slip,0,0,"",magic,0);

         if(GetLastError()!=false) {Print("Error during order opening."); break;}
         if(OrderSelect(ticket,SELECT_BY_TICKET)==false) break;

         double sl_,tp_;

         if(OrderType()==OP_BUY)
           {
            if(sl!=0) sl_=OrderOpenPrice()-MathAbs(sl)*Point;
            if(tp!=0) tp_=OrderOpenPrice()+MathAbs(tp)*Point;
           }
         else
           {
            if(sl!=0) sl_=OrderOpenPrice()+MathAbs(sl)*Point;
            if(tp!=0) tp_=OrderOpenPrice()-MathAbs(tp)*Point;
           }

         if(OrderModify(OrderTicket(),OrderOpenPrice(),sl_,tp_,0)==false) Print("Error during setting stop loss/take profit.");

         break;
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//|Checking for the new lines                                        |
//+------------------------------------------------------------------+
void ProcessingLines()
  {
   for(int h=0; h<ObjectsTotal(); h++)
     {
      //If a new line was placed on a chart start to work with it
      if(StringSubstr(ObjectName(h),0,10)=="Trendline ")
        {
         double
         price1=ObjectGet(ObjectName(h),OBJPROP_PRICE1),
         price2=ObjectGet(ObjectName(h),OBJPROP_PRICE2);

         int
         time1=(int)ObjectGet(ObjectName(h),OBJPROP_TIME1),
         time2=(int)ObjectGet(ObjectName(h),OBJPROP_TIME2);

         int a=0;
         while(ObjectGet("Trendline"+DoubleToStr(a,0),OBJPROP_COLOR)) a++;

         ObjectDelete(ObjectName(h));
         if(GetLastError())
           {
            ObjectCreate("Trendline"+DoubleToStr(a,0),OBJ_TREND,0,time1,price1,time2,price2);

            LineTime[a][0]=(int)ObjectGet("Trendline"+DoubleToStr(a,0),OBJPROP_TIME1);
            LinePrice[a][0]=ObjectGet("Trendline"+DoubleToStr(a,0),OBJPROP_PRICE1);

            LineTime[a][1]=(int)ObjectGet("Trendline"+DoubleToStr(a,0),OBJPROP_TIME2);
            LinePrice[a][1]=ObjectGet("Trendline"+DoubleToStr(a,0),OBJPROP_PRICE2);

            PlaceArrows(a);
            ObjectSet("Trendline"+DoubleToStr(a,0),OBJPROP_WIDTH,0);
           }
        }
     }

//If line was deleted, delete its arrows.  
   for(int l=0; l<ObjectsTotal(); l++)
     {
      if(!ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_COLOR))
        {
         if(ObjectGet("Trendline"+DoubleToStr(l,0)+"_1",OBJPROP_COLOR)) ObjectDelete("Trendline"+DoubleToStr(l,0)+"_1");
         if(ObjectGet("Trendline"+DoubleToStr(l,0)+"_2",OBJPROP_COLOR)) ObjectDelete("Trendline"+DoubleToStr(l,0)+"_2");
         if(ObjectGet("Arrow_up"+DoubleToStr(l,0),OBJPROP_COLOR)) ObjectDelete("Arrow_up"+DoubleToStr(l,0));
         if(ObjectGet("Arrow_down"+DoubleToStr(l,0),OBJPROP_COLOR)) ObjectDelete("Arrow_down"+DoubleToStr(l,0));
         if(ObjectGet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_COLOR)) ObjectDelete("Arrow_flat"+DoubleToStr(l,0));
         continue;
        }

      //Update line's coordinates     
      LineTime[l][0]=(int)ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_TIME1);
      LinePrice[l][0]=ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_PRICE1);

      LineTime[l][1]=(int)ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_TIME2);
      LinePrice[l][1]=ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_PRICE2);

      //Check its status - "off" or "on"
      LevelStatus(l);
     }

   return;
  }
//+------------------------------------------------------------------+
//|Allowed only one opened order per each instrument                 |
//+------------------------------------------------------------------+
int OrderExist()
  {
   if(OrdersTotal()==0) return(-1);

   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) return(OrderType());
     }
   return(-1);
  }
//+------------------------------------------------------------------+
//|Which direction deal should be opened                             |
//+------------------------------------------------------------------+
int TradeDirection(int i)
  {
   if((ObjectGet("Arrow_up"+DoubleToStr(i,0),OBJPROP_COLOR) || ObjectGet("Arrow_down"+DoubleToStr(i,0),OBJPROP_COLOR)) && ObjectGet("Arrow_flat"+DoubleToStr(i,0),OBJPROP_COLOR)) return(-1);

   if((Ask<LevelPrice(i,TimeCurrent()) || Bid<LevelPrice(i,TimeCurrent())) && iOpen(Symbol(),Period(),0)>LevelPrice(i,TimeCurrent()))
     {
      if(ObjectGet("Arrow_up"+DoubleToStr(i,0),OBJPROP_COLOR))    {price=Ask; return(0);}
      if(ObjectGet("Arrow_flat"+DoubleToStr(i,0),OBJPROP_COLOR))  {price=Bid; return(1);}
     }

   if((Bid>LevelPrice(i,TimeCurrent()) || Ask>LevelPrice(i,TimeCurrent())) && iOpen(Symbol(),Period(),0)<LevelPrice(i,TimeCurrent()))
     {
      if(ObjectGet("Arrow_down"+DoubleToStr(i,0),OBJPROP_COLOR))  {price=Bid; return(1);}
      if(ObjectGet("Arrow_flat"+DoubleToStr(i,0),OBJPROP_COLOR))  {price=Ask; return(0);}
     }

   return(-1);
  }
//+------------------------------------------------------------------+
//|Current price of the level                                        |
//+------------------------------------------------------------------+
double LevelPrice(int i,datetime t)
  {
   return(NormalizeDouble(ObjectGetValueByShift("Trendline"+DoubleToStr(i,0),iBarShift(Symbol(),0,t)),Digits));
  }
//+------------------------------------------------------------------+
//|Level's status - "on" or "off", "up", "down" or "horizontal"      |
//+------------------------------------------------------------------+
void LevelStatus(int l)
  {
   if(!ObjectGet("Arrow_up"+DoubleToStr(l,0),OBJPROP_COLOR) && !ObjectGet("Arrow_down"+DoubleToStr(l,0),OBJPROP_COLOR) && !ObjectGet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_COLOR))
     {
      //If all arrows were deleted set it again and turn line "off"
      PlaceArrows(l);
      ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_WIDTH,0);
     }
   else if((ObjectGet("Arrow_up"+DoubleToStr(l,0),OBJPROP_COLOR) || ObjectGet("Arrow_down"+DoubleToStr(l,0),OBJPROP_COLOR)) && ObjectGet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_COLOR))
     {
      //Turn line "off" if incompatible arrows were set
      ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_WIDTH,0);
     }
   else
     {
      //Turn line "on"
      ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_WIDTH,2);
     }

//Move arrows if line was moved
   if(ObjectGet("Arrow_up"+DoubleToStr(l,0),OBJPROP_COLOR) && (ObjectGet("Arrow_up"+DoubleToStr(l,0),OBJPROP_TIME1)!=LineTime[l][0]-Period()*300 || ObjectGet("Arrow_up"+DoubleToStr(l,0),OBJPROP_PRICE1)!=LinePrice[l][0]))
     {
      ObjectDelete("Arrow_up"+DoubleToStr(l,0));
      ObjectCreate("Arrow_up"+DoubleToStr(l,0),OBJ_ARROW,0,LineTime[l][0]-Period()*300,LinePrice[l][0]);
      ObjectSet("Arrow_up"+DoubleToStr(l,0),OBJPROP_ARROWCODE,241);
      ObjectSet("Arrow_up"+DoubleToStr(l,0),OBJPROP_COLOR,Blue);
     }

   if(ObjectGet("Arrow_down"+DoubleToStr(l,0),OBJPROP_COLOR) && (ObjectGet("Arrow_down"+DoubleToStr(l,0),OBJPROP_TIME1)!=LineTime[l][0]-Period()*300*2 || ObjectGet("Arrow_down"+DoubleToStr(l,0),OBJPROP_PRICE1)!=LinePrice[l][0]))
     {
      ObjectDelete("Arrow_down"+DoubleToStr(l,0));
      ObjectCreate("Arrow_down"+DoubleToStr(l,0),OBJ_ARROW,0,LineTime[l][0]-Period()*300*2,LinePrice[l][0]);
      ObjectSet("Arrow_down"+DoubleToStr(l,0),OBJPROP_ARROWCODE,242);
      ObjectSet("Arrow_down"+DoubleToStr(l,0),OBJPROP_COLOR,Red);
     }

   if(ObjectGet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_COLOR) && (ObjectGet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_TIME1)!=LineTime[l][0]-Period()*300*3 || ObjectGet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_PRICE1)!=LinePrice[l][0]))
     {
      ObjectDelete("Arrow_flat"+DoubleToStr(l,0));
      ObjectCreate("Arrow_flat"+DoubleToStr(l,0),OBJ_ARROW,0,LineTime[l][0]-Period()*300*3,LinePrice[l][0]);
      ObjectSet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_ARROWCODE,244);
      ObjectSet("Arrow_flat"+DoubleToStr(l,0),OBJPROP_COLOR,Green);
     }

//Set level horizontally if its second time-point at the left
   if(LineTime[l][0]>LineTime[l][1])
     {
      ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_PRICE2,LinePrice[l][0]);
      ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_TIME2,LineTime[l][0]+(LineTime[l][0]-LineTime[l][1]));

      LineTime[l][0]=(int)ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_TIME1);
      LinePrice[l][0]=ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_PRICE1);

      LineTime[l][1]=(int)ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_TIME2);
      LinePrice[l][1]=ObjectGet("Trendline"+DoubleToStr(l,0),OBJPROP_PRICE2);
     }

//Set level's color
   if(LinePrice[l][0]==LinePrice[l][1]) ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_COLOR,(Orange));
   else if(LinePrice[l][0]>LinePrice[l][1]) ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_COLOR,(OrangeRed));
   else ObjectSet("Trendline"+DoubleToStr(l,0),OBJPROP_COLOR,(Teal));

   return;
  }
//+------------------------------------------------------------------+
//|Set arrows for the new line                                       |
//+------------------------------------------------------------------+   
void PlaceArrows(int i)
  {
   ObjectDelete("Arrow_up"+DoubleToStr(i,0));
   ObjectDelete("Arrow_down"+DoubleToStr(i,0));
   ObjectDelete("Arrow_flat"+DoubleToStr(i,0));

   ObjectCreate("Arrow_up"+DoubleToStr(i,0),OBJ_ARROW,0,LineTime[i][0]-Period()*300,LinePrice[i][0]);
   ObjectSet("Arrow_up"+DoubleToStr(i,0),OBJPROP_ARROWCODE,241);
   ObjectSet("Arrow_up"+DoubleToStr(i,0),OBJPROP_COLOR,Blue);

   ObjectCreate("Arrow_down"+DoubleToStr(i,0),OBJ_ARROW,0,LineTime[i][0]-Period()*300*2,LinePrice[i][0]);
   ObjectSet("Arrow_down"+DoubleToStr(i,0),OBJPROP_ARROWCODE,242);
   ObjectSet("Arrow_down"+DoubleToStr(i,0),OBJPROP_COLOR,Red);

   ObjectCreate("Arrow_flat"+DoubleToStr(i,0),OBJ_ARROW,0,LineTime[i][0]-Period()*300*3,LinePrice[i][0]);
   ObjectSet("Arrow_flat"+DoubleToStr(i,0),OBJPROP_ARROWCODE,244);
   ObjectSet("Arrow_flat"+DoubleToStr(i,0),OBJPROP_COLOR,Green);

   return;
  }
//+------------------------------------------------------------------+

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 ---