TRAYLER+





//+------------------------------------------------------------------+
//|                                                      TRAYLER.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <stderror.mqh>
#include <stdlib.mqh>
//---- input parameters
extern double    lots = 0.1;
extern bool      DelAllOrders=false;
extern bool      DelSelfOrders=false;
extern bool      Tp=true;
extern bool      sound=true;
extern bool      coment=true;
//-------------
bool traling = true;
static datetime prevtime = 0;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
ObjectsDeleteAll(0,OBJ_HLINE);   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double spr = MarketInfo(Symbol(),MODE_SPREAD);
int total=OrdersTotal();
int ticket,Count,OpCount,OtlCount,err;
//-----
Comment("         ");
//-----------------------------------------------------------
  if(total>0)
   {
   //---------------------------   
    for(int m=0;m<total;m++)
      {
       OrderSelect(m,SELECT_BY_POS,MODE_TRADES);
        if(OrderSymbol()==Symbol()){Count++;}
         if(OrderSymbol()==Symbol()&&(OrderType()==OP_BUY ||OrderType()==OP_SELL)){OpCount++;int tick=OrderTicket();}
          if((OrderType()==OP_BUYSTOP)||(OrderType()==OP_SELLSTOP)
           ||(OrderType()==OP_BUYLIMIT)||(OrderType()==OP_SELLLIMIT)){OtlCount++;}
            if(coment){Comment("Íàéäåíî îðäåðîâ ="+total+"\nÎòëîæåííûõ ="+OtlCount+"\nÎòêðûòûõ îðäåðîâ ="+OpCount+"\nÎðäåð¹"+tick);}   
             }
      //----------------------------------             
      if(OtlCount<1&&OpCount<1)
       {
        if(ObjectFind("Order1")<0)
         { 
          ObjectCreate("Order1", OBJ_HLINE, 0,10, Ask+(30*Point), Blue);
           ObjectSet("Order1",OBJPROP_STYLE,STYLE_DASHDOT );
            ObjectSet("Order1",OBJPROP_COLOR,Blue );
             }
        if(ObjectFind("Order2")<0)
         {     
          ObjectCreate("Order2", OBJ_HLINE, 0,10, Bid-(30*Point), Red);
           ObjectSet("Order2",OBJPROP_STYLE,STYLE_DASHDOT );
            ObjectSet("Order2",OBJPROP_COLOR,Red );
            }
       }         
      //------------------------------------             
           if(OtlCount>0&&OpCount<1)      
            {
             for (int n=0;n<total;n++)
              {
              OrderSelect(n, SELECT_BY_POS, MODE_TRADES);
               if(OrderSymbol()==Symbol()&& OrderType()==OP_BUYSTOP)
                {
                 int TickBuySt=OrderTicket();
                  if(ObjectFind("Order1")<0)
                   { 
                    ObjectCreate("Order1", OBJ_HLINE, 0,10,OrderOpenPrice(), Blue);
                     ObjectSet("Order1",OBJPROP_STYLE,STYLE_DASHDOT );
                      ObjectSet("Order1",OBJPROP_COLOR,Blue );
                       }
                        }
               if(OrderSymbol()==Symbol()&& OrderType()==OP_SELLSTOP)
                {
                 int TickSellSt=OrderTicket();
                  if(ObjectFind("Order2")<0)
                   { 
                    ObjectCreate("Order2", OBJ_HLINE, 0,10,OrderOpenPrice(), Red);
                     ObjectSet("Order2",OBJPROP_STYLE,STYLE_DASHDOT );
                      ObjectSet("Order2",OBJPROP_COLOR,Red );
                       }
                        } 
                   }
              }          
          //--------------------------------     
            if(TickBuySt>0&&ObjectFind("Order1")>=0)
             {
              double BuyStPr = ObjectGet("Order1",OBJPROP_PRICE1 );
               OrderSelect(TickBuySt,SELECT_BY_TICKET,MODE_TRADES);
                if(MathAbs(BuyStPr- OrderOpenPrice())!=0){OrderModify(TickBuySt, BuyStPr,OrderStopLoss(),OrderTakeProfit(), 0, CLR_NONE);}
                 }
            if(TickSellSt>0&&ObjectFind("Order2")>=0)
             {
              double SellStPr = ObjectGet("Order2",OBJPROP_PRICE1 );
               OrderSelect(TickSellSt,SELECT_BY_TICKET,MODE_TRADES);
                if(MathAbs(SellStPr- OrderOpenPrice())!=0){OrderModify(TickSellSt, SellStPr,OrderStopLoss(),OrderTakeProfit(), 0, CLR_NONE);}
                 }
    //----------------------------
     for(int i=0;i<total;i++)
      {
       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderSymbol()==Symbol()&&(OrderType()==OP_BUY ||OrderType()==OP_SELL))
         {
     //----------------------    
          if(DelAllOrders)
           {
            for (n=total;n>0;n--)
             {
              OrderSelect(n-1, SELECT_BY_POS, MODE_TRADES);
               if((OrderType()==OP_BUYSTOP)||(OrderType()==OP_SELLSTOP)
                ||(OrderType()==OP_BUYLIMIT)||(OrderType()==OP_SELLLIMIT))
                 err=del(OrderTicket());
                   ObjectsDeleteAll(0,OBJ_HLINE);
                    if(sound&&err==0){PlaySound("expert.wav");}
                     } 
                      }
            //-----//-------------       
           if(DelSelfOrders)
            {
             for (n=total;n>0;n--)
              {
               OrderSelect(n-1, SELECT_BY_POS, MODE_TRADES);
                if(OrderSymbol()==Symbol()&&((OrderType()==OP_BUYSTOP)||(OrderType()==OP_SELLSTOP)
                 ||(OrderType()==OP_BUYLIMIT)||(OrderType()==OP_SELLLIMIT)))
                  err=del(OrderTicket());
                    ObjectsDeleteAll(0,OBJ_HLINE);
                     if(sound&&err==0){PlaySound("expert.wav");}
                      } 
                       }           
       //-----------//---------------------                       
       if(OrderType()==OP_BUY&& Minute()%2==0 && traling)
        {
          //-------------------------
            if(Tp)
             {
              double tp=OrderTakeProfit();
               if(tp==0.0&&OrderProfit()>0)
                {
                 int TpFrAp = FindFractal(21,true);
                  if(TpFrAp > 0)
                   {
                    double TpFrApPr = iHigh(Symbol(),NULL,TpFrAp)-((spr)*Point);
                     if(OrderTakeProfit()==0){ModifyOrder(OrderOpenPrice(),OrderStopLoss(),TpFrApPr,Green);}
                     if(OrderTakeProfit()!=0&&OrderTakeProfit()<TpFrApPr)
                       {ModifyOrder(OrderOpenPrice(),OrderStopLoss(),TpFrApPr,Green);}
                        }
                         }           
                          }
                          //------------------------
            int FrDn = FindFractal(7,false);
             if(FrDn > 0)
              {
               double ModFrDnPr = iLow(Symbol(),NULL,FrDn)-((spr+2)*Point);
                if(ModFrDnPr > OrderStopLoss()||OrderStopLoss()==0)
                 {
                  ModifyOrder(OrderOpenPrice(),ModFrDnPr,OrderTakeProfit(),Green);
                   }
                    }    
            if(FrDn == 0)
             {
              ModFrDnPr = iLow(Symbol(),NULL,3)-(2*Point);
               if(ModFrDnPr > OrderStopLoss()||OrderStopLoss()==0)
                {
                 ModifyOrder(OrderOpenPrice(),ModFrDnPr,OrderTakeProfit(),Green);//Sleep(70000);
                  }
                   }
                                                                     
          }//if(OrderType()==OP_BUY&& Minute()%5==0 && traling)--------------
            //-------------------------
                   
         if (OrderType()==OP_SELL&& Minute()%2==0 && traling)
          {

            if(Tp==true)
             {
              tp=OrderTakeProfit();
               if(tp==0&&OrderProfit()>0)
                {
                 int TpFrDn = FindFractal(21,false);
                          
                  if(TpFrDn > 0)
                   {
                    double TpFrDnPr = iLow(Symbol(),NULL,TpFrDn)-((spr)*Point);
                     //Print(OrderTakeProfit(),"  ",OrderProfit(),"  ",TpFrDnPr); 
                     if(OrderTakeProfit()==0){ModifyOrder(OrderOpenPrice(),OrderStopLoss(),TpFrDnPr,Green);}
                     if(OrderTakeProfit()!=0&&OrderTakeProfit()>TpFrDnPr)
                       {ModifyOrder(OrderOpenPrice(),OrderStopLoss(),TpFrDnPr,Green);}
                        }
                         }           
                          }
                          //------------------------            
           int ModFrAp = FindFractal(7,true);
            if(ModFrAp > 0)
             {
              double ModFrApPr = iHigh(Symbol(),NULL,ModFrAp)+(2*Point);
               if((OrderStopLoss() - ModFrApPr >0 )||OrderStopLoss()==0)
                {
                 ModifyOrder(OrderOpenPrice(),ModFrApPr,OrderTakeProfit(),Green);//Sleep(70000);
                  }
                   }
            if(ModFrAp == 0)
             {
              double ModSl = iHigh(Symbol(),NULL,3)+(2*Point);
               if((OrderStopLoss() - ModSl >0)||OrderStopLoss()==0)
                {
                 ModifyOrder(OrderOpenPrice(),ModSl,OrderTakeProfit(),Green);//Sleep(70000);
                  }
                   }
                    }
                  } 
                }
              }
//----
   return(0);
  }
//+------------------------------------------------------------------+
int FindFractal(int count,bool mode)
{
 if (mode == false){int Md = MODE_LOWER;}
  if (mode == true){Md = MODE_UPPER;}
   for(int i = 2; i< count+2; i++)
    {
     int Fr = iFractals(0,0,Md,i);
      if (Fr != 0)
       {
        return(i);
         break;
         }
          }
 return(0);
 }  
//-----------Áëîê óäàëåíèÿ íå ñðàáîòàâøèõ îòëîæåííèêîâ-----------------
int del(int ticket)
   {
    int err;
    for (int i=0;i<5;i++)
        {
        GetLastError();//îáíóëÿåì îøèêó
        OrderDelete(ticket);
        err = GetLastError();
        if (err == 0){break;} if (err != 0) {PlaySound("timeout.wav");} 
        while (!IsTradeAllowed()){ Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê 
        } 
    return(err);     
    }    
//----------------Áëîê ìîäèôèêàöèè îðäåðîâ----------------------------+    
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 28.11.2006                                                     |
//|  Îïèñàíèå : Ìîäèôèêàöèÿ îäíîãî ïðåäâàðèòåëüíî âûáðàííîãî îðäåðà.           |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    pp - öåíà óñòàíîâêè îðäåðà                                              |
//|    sl - öåíîâîé óðîâåíü ñòîïà                                              |
//|    tp - öåíîâîé óðîâåíü òåéêà                                              |
//|    cl - öâåò çíà÷êà ìîäèôèêàöèè                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=0, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot,st,oldsl;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
  int    NumberOfTry = 5;
 
  if (pp<=0) {pp=OrderOpenPrice();}
  if (sl<0 ) {sl=OrderStopLoss();}
  if (tp<0 ) {tp=OrderTakeProfit();}
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
  st=MarketInfo(OrderSymbol(), MODE_STOPLEVEL)*Point;
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      if(OrderType()==OP_BUY&& (sl>(Bid+st))){sl=NormalizeDouble(pb-(st*2),dg);}
      if(OrderType()==OP_SELL&& (sl<(Ask+st))){sl=NormalizeDouble(pa+(st*2),dg);}
      //if(sl==os){break;}
      if(OrderType()==OP_SELL&& (sl>os&&os!=0)){break;}
      if(OrderType()==OP_BUY&& (sl<os&&os!=0)){break;}
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (sound) PlaySound("ok.wav"); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);

        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op= Modify"+(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}  
//-------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar


Indicator Curves created:


Indicators Used:

Fractals


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It can change open orders parameters, due to possible stepping strategy

Other Features:

It plays sound alerts