Navigation:Home > Content >

StopOrders(Limit__Рё__STOP_orders).mq4

Time: 2012-10-17 | Download file:StopOrders(Limit__Рё__STOP_orders).mq4

//+------------------------------------------------------------------+
//|                                                StopOrders_v3.mq4 |
//|                               Copyright © 2010, Vladimir Hlystov |
//| v1 Устанавливает до 5 ордеров Stop или Limit в обе стороны       |
//|    от текущей цены. Обозначает их горизонтальными линиями.       |
//|    Перемещая линии можно перемещать стоп ордера                  |
//|    Stop = true  - Stop                                           |
//|    Stop = False - Limit                                          |
//|    Уровни стопов задаются переменными SLoss и TProfit            |
//|    Лот, выставляется у каждлй линии свой lot1,2,3,4,5            |
//|    При удалении линии, удаляется и ордер по ней                  |
//|    Параметры prise_Buy и prise_Sell задают ценовые уровни линий  |
//|    Если они равны 0, то линии выставляются по параметру          |
//|    DeltaPrice - расстояние между линиями                         |
//|    Если в момент установки эксперта на графике были отложенные   |
//|    ордера, то они переместятся по текущему расположению линий.   |
//|                                                                  |
//| v2 если сработал стоп ордер и выставился рыночный, то новый стоп |
//|    ордер этого номера не выставиться, пока не закроется рыночный |
//|    ордер                                                         |
//|                                                                  |
//| v3 рыночные ордера не изменяются при перемещении линий           |
//|    убрал зацикливание Startа                                     |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Vladimir Hlystov"
#property link      "[email protected]"
//-------------------------------------------------------------------
extern int    MAX_Lines       = 5;     //максимальное колличество линий 
                                       //каждого направления (не более 5)
extern bool   Stop            = true;  //true - Stop False - Limit
extern double lot1            = 0.10;  //ЛОТЫ соттветствующих линий
extern double lot2            = 0.20;
extern double lot3            = 0.30;
extern double lot4            = 0.40;
extern double lot5            = 0.50;
extern double prise_Buy_1     = 0.0;
extern double prise_Buy_2     = 0.0;
extern double prise_Buy_3     = 0.0;
extern double prise_Buy_4     = 0.0;
extern double prise_Buy_5     = 0.0;
extern double prise_Sell_1    = 0.0;
extern double prise_Sell_2    = 0.0;
extern double prise_Sell_3    = 0.0;
extern double prise_Sell_4    = 0.0;
extern double prise_Sell_5    = 0.0;
extern int    DeltaPrice      = 10;
extern int    SLoss           = 100;
extern int    TProfit         = 10;
extern color  ColorSellLine   = Brown;     //цвета линий
extern color  ColorBuylLine   = MediumBlue;
extern bool   DeleteLines     = false;     //удалять линии при сработке ордера
extern int    FontSize        = 8;
extern bool   DelOrders       = true;      //Удалять лимитные ордера при выходе
//-------------------------------------------------------------------
string Obj_N;
int SL[6],TP[6];
double lot[6],prise_Sell[6],prise_Buy[6];
datetime dlinna;
string TipStOr;
//-------------------------------------------------------------------
int init()
{
   if (MAX_Lines>5) MAX_Lines=5;
   for (int i=1; i<=MAX_Lines; i++) {SL[i]=SLoss;TP[i]=TProfit;}
   lot[1]=lot1;lot[2]=lot2;lot[3]=lot3;lot[4]=lot4;lot[5]=lot5;
   
   if (prise_Sell_1!=0) prise_Sell[1] = prise_Sell_1; 
   else {if (Stop) prise_Sell[1] = NormalizeDouble(Bid - 1*DeltaPrice*Point,Digits); 
              else prise_Sell[1] = NormalizeDouble(Ask + 1*DeltaPrice*Point,Digits);}
   if (prise_Sell_2!=0) prise_Sell[2] = prise_Sell_2; 
   else {if (Stop) prise_Sell[2] = NormalizeDouble(Bid - 2*DeltaPrice*Point,Digits); 
              else prise_Sell[2] = NormalizeDouble(Ask + 2*DeltaPrice*Point,Digits);}
   if (prise_Sell_3!=0) prise_Sell[3] = prise_Sell_3; 
   else {if (Stop) prise_Sell[3] = NormalizeDouble(Bid - 3*DeltaPrice*Point,Digits); 
              else prise_Sell[3] = NormalizeDouble(Ask + 3*DeltaPrice*Point,Digits);}
   if (prise_Sell_4!=0) prise_Sell[4] = prise_Sell_4; 
   else {if (Stop) prise_Sell[4] = NormalizeDouble(Bid - 4*DeltaPrice*Point,Digits); 
              else prise_Sell[4] = NormalizeDouble(Ask + 4*DeltaPrice*Point,Digits);}
   if (prise_Sell_5!=0) prise_Sell[5] = prise_Sell_5; 
   else {if (Stop) prise_Sell[5] = NormalizeDouble(Bid - 5*DeltaPrice*Point,Digits); 
              else prise_Sell[5] = NormalizeDouble(Ask + 5*DeltaPrice*Point,Digits);}
   if (prise_Buy_1!=0) prise_Buy[1] = prise_Buy_1; 
   else {if (Stop) prise_Buy[1] = NormalizeDouble(Ask + 1*DeltaPrice*Point,Digits); 
              else prise_Buy[1] = NormalizeDouble(Bid - 1*DeltaPrice*Point,Digits);}
   if (prise_Buy_2!=0) prise_Buy[2] = prise_Buy_2; 
   else {if (Stop) prise_Buy[2] = NormalizeDouble(Ask + 2*DeltaPrice*Point,Digits); 
              else prise_Buy[2] = NormalizeDouble(Bid - 2*DeltaPrice*Point,Digits);}
   if (prise_Buy_3!=0) prise_Buy[3] = prise_Buy_3; 
   else {if (Stop) prise_Buy[3] = NormalizeDouble(Ask + 3*DeltaPrice*Point,Digits); 
              else prise_Buy[3] = NormalizeDouble(Bid - 3*DeltaPrice*Point,Digits);}
   if (prise_Buy_4!=0) prise_Buy[4] = prise_Buy_4; 
   else {if (Stop) prise_Buy[4] = NormalizeDouble(Ask + 4*DeltaPrice*Point,Digits); 
              else prise_Buy[4] = NormalizeDouble(Bid - 4*DeltaPrice*Point,Digits);}
   if (prise_Buy_5!=0) prise_Buy[5] = prise_Buy_5; 
   else {if (Stop) prise_Buy[5] = NormalizeDouble(Ask + 5*DeltaPrice*Point,Digits); 
              else prise_Buy[5] = NormalizeDouble(Bid - 5*DeltaPrice*Point,Digits);}
   ObjectCreate("time", OBJ_LABEL, 0, 0, 0);// Создание объ.
   ObjectSet("time", OBJPROP_CORNER, 1);
   ObjectSet("time", OBJPROP_XDISTANCE, 200);
   ObjectSet("time", OBJPROP_YDISTANCE, 0);
   if (Stop) TipStOr="STOP "; else TipStOr="LIMIT";
   for (i=1; i<=MAX_Lines; i++)
   {  
      Obj_N = StringConcatenate("LINES SELL ",TipStOr," ",i);
      if (ObjectFind(Obj_N)==-1)drawline(Obj_N,ColorSellLine,prise_Sell[i]);
      Obj_N = StringConcatenate("LINES BUY  ",TipStOr," ",i);
      if (ObjectFind(Obj_N)==-1)drawline(Obj_N,ColorBuylLine,prise_Buy[i]);
   }
   return(0);
}
//-------------------------------------------------------------------
int deinit()
{
/*   ObjectsDeleteAll(0,OBJ_HLINE);
   ObjectsDeleteAll(0,OBJ_TEXT);
   ObjectDelete("time");
   if (DelOrders)
   {
      while(true)
      {int i;
         for (int j = 0; j < OrdersTotal(); j++)
         {
            if (OrderSelect(j, SELECT_BY_POS))
            {
               if (OrderSymbol() == Symbol())
               {
                  if (OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT || 
                      OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT ) 
                      OrderDelete(OrderTicket(), CLR_NONE);
                  Sleep(100);i++;
               }
            }
         }
         if (i==0) break;
      }
   }*/
   return(0);
}
//-------------------------------------------------------------------
int start()
{
//   while(true)
   {
      massiv();
      for (int i=1; i<=MAX_Lines; i++)
      {  
         Obj_N = StringConcatenate("LINES SELL ",TipStOr," ",i);
         if (ObjectFind(Obj_N)==-1)
         {
            if (DeleteLines) drawline(Obj_N,ColorSellLine,prise_Sell[i]);
            else {deleteOrder(-1,i);ObjectDelete (Obj_N+"n");}
         }

         Obj_N = StringConcatenate("LINES BUY  ",TipStOr," ",i);
         if (ObjectFind(Obj_N)==-1)
         {
            if (DeleteLines) drawline(Obj_N,ColorBuylLine,prise_Buy[i]);
            else {deleteOrder(1,i);ObjectDelete (Obj_N+"n");}
         }
      }
      checkapp();
//      Sleep(1000);
      ObjectSetText("time",TimeToStr(CurTime(),TIME_SECONDS),8,"Arial",ColorSellLine);
   }
return;
}
//------------------------------------------------------------------
int deleteOrder(int ord,int mag)
{
   int tip;
   for (int i=0; i=0; n--) 
   {
      string Obj_N=ObjectName(n);
      if (ObjectType(Obj_N)!=OBJ_HLINE) continue;
      if (StringFind(Obj_N,"LINES ",0)!=-1)//найден обьект-тренд к которому вычисляется приближение
      {
         mag = StrToInteger(StringSubstr(Obj_N,17,1));
         if (StringSubstr(Obj_N,6,2)=="BU") ord= 1;
         if (StringSubstr(Obj_N,6,2)=="SE") ord=-1;
         if (ord==0) {Comment("Error лишняя линия");continue;}
         col=ObjectGet(Obj_N, OBJPROP_COLOR);
         tiket = TrueOrder(ord,mag);
         if (ord== 1) price = prise_Buy[mag];
         if (ord==-1) price = prise_Sell[mag];
         pr = NormalizeDouble(ObjectGet(Obj_N, OBJPROP_PRICE1),Digits);
         //continue;
         if (price == pr) //линия не перемешалась
         { 
            if (tiket==0) SendORDER(ord,mag,price);
         }
         else
         {
            price = pr;
            if (ord== 1) prise_Buy[mag]=price;
            if (ord==-1) prise_Sell[mag]=price;
            if (tiket==0) SendORDER(ord,mag,price);
            else
            {
               if (!OrderSelect(tiket, SELECT_BY_TICKET)) continue;
               if (OrderType()>1)
               {
                  if (Stop)
                  {
                     if (ord==-1) 
                        OrderModify(tiket,price,price+SL[mag]*Point,price-TP[mag]*Point,0,Green);
                     if (ord== 1) 
                        OrderModify(tiket,price,price-SL[mag]*Point,price+TP[mag]*Point,0,Green);
                  }
                  else
                  { 
                     if (ord==-1) 
                        OrderModify(tiket,price,price+SL[mag]*Point,price-TP[mag]*Point,0,Green);
                     if (ord== 1) 
                        OrderModify(tiket,price,price-SL[mag]*Point,price+TP[mag]*Point,0,Green);
                  }
               }
            }
         }
         NameLine=StringConcatenate(Obj_N,"n");
         info=StringConcatenate(StringSubstr(Obj_N,6,11),
            "  lot ",DoubleToStr(lot[mag],2),
            "  SL " ,DoubleToStr(SL[mag] ,0),
            "  TP " ,DoubleToStr(TP[mag] ,0));
         ObjectDelete (NameLine);
         ObjectCreate (NameLine, OBJ_TEXT,0,Time[WindowFirstVisibleBar()/2],pr+shift_Y,0,0,0,0);
         ObjectSetText(NameLine, info ,FontSize,"Arial");
         ObjectSet    (NameLine, OBJPROP_COLOR, col);
//         NameMetka = NameMetka+info+"   mag "+mag+" ord "+ord+" tiket "+tiket+"\n";
      }
   }
//Comment(NameMetka);
   return;
}
//------------------------------------------------------------------------------------------- 
void SendORDER(int ord,int mag,double price)
{
   if (Stop)
   {   
      if (ord==-1) 
         OrderSend(Symbol(),OP_SELLSTOP,lot[mag],price,1,price+SL[mag]*Point,
         price-TP[mag]*Point,"LINES SELLSTOP "+mag,mag,0);
      if (ord== 1) 
         OrderSend(Symbol(),OP_BUYSTOP, lot[mag],price,1,price-SL[mag]*Point,
         price+TP[mag]*Point,"LINES BUYSTOP "+mag,mag,0);
   }
   else
   {
      if (ord==-1) 
         OrderSend(Symbol(),OP_SELLLIMIT,lot[mag],price,1,price+SL[mag]*Point,
         price-TP[mag]*Point,"LINES SELLLIMIT "+mag,mag,0);
      if (ord== 1) 
         OrderSend(Symbol(),OP_BUYLIMIT, lot[mag],price,1,price-SL[mag]*Point,
         price+TP[mag]*Point,"LINES BUYLIMIT "+mag,mag,0);
   }
}
//-------------------------------------------------------------------

Recommend