Author: MagistrSanich
Profit factor:
0.00
3 Views
0 Downloads
0 Favorites
Pin-Bar
ÿþ//+------------------------------------------------------------------+

//|                                                    MagistrSanich |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright "MagistrSanich"

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//|                                                                  |

//|                                                                  |

//+------------------------------------------------------------------+

enum modeStopLoss //57C1KB>:

  {

   offZeroDamage,//B:;NG8BL

   onZeroDamage //:;NG8BL

  };

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

enum modePinBar //:;NG5=85 ?8=10@0

  {

   offPinBar,//B:;NG8BL

   onPinBar  //:;NG8BL

  };

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

input int                 Magic= 0;                //038: ( >@45@>2 B5:CI53> >B0)

input int                 Slip= 30;                //@>A:0;L7K20=85

input int                 period=5;                //"09<D@59< (2 <8=CB0E)

input int                 maxOpenOrders=1;         //3@0=8G5=85 ?> :>;8G5AB2C B5:CI8E >@45@>2

input int                 relaxTime=30;            //@5<O >B4KE0 2 <8=CB0E ?>A;5 >B:@KB8O >@45@0

input bool                dinamicLot=true;         // 568< @0AG5B0 ;>B0

input double              Lot=0.1;                 //>B ;81> ?@>F5=B >B 45?>78B0

input modeStopLoss        ZeroDamage=offZeroDamage;// 568< @01>BK 57C1KB:0

input int                 profit=50;               //@>D8B ?@8 :>B>@>< =0G8=0BL 459AB2>20BL

input modePinBar          PinBar=offPinBar;        // 01>B0 A 8= 0@><

input int                 takeProfit=400;          //"59:?@>D8B 2 ?8?A0E

input int                 stopLoss=200;            //!B>?;>AA 2 ?8?A0E

input int                 difference=100;          // 07=8F0 <564C High/Low

input int                 distance = 50;           //  0AAB>O=85 >B High/Low 2 B5:CI59 A25G5

input int                 sameBars=3;              //>;8G5AB2> 10@>2 ?>4@O4 >4=>3> F25B0



double countOrders=0; //70?><8=05B :>;8G5AB2> >B:@KBKE >@45@>2

double LotValue;      //>1J5< ;>B0

int ticket;

datetime relax;       //@5<O >B4KE0 

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

int OnInit()

  {

//K2>4 =5:>B>@KE =0AB@>5: 2 =0G0;5, 4;O C4>1AB20

//---

   int j=0,x=15,y=15;

   string name = "txt" + IntegerToString(j);

   string text = ""09<D@59< (2 <8=CB0E)= " +IntegerToString(period);

   labelCreat(name,text,x,y);

//#2

   y+=15;j++;

   name = "txt" + IntegerToString(j);

   text = "3@0=8G5=85 ?> :>;8G5AB2C B5:CI8E >@45@>2 = "+IntegerToString(maxOpenOrders);

   labelCreat(name,text,x,y);

//#3

   y+=15;j++;

   name = "txt" + IntegerToString(j);

   text = "@5<O >B4KE0 2 <8=CB0E ?>A;5 >B:@KB8O >@45@0 =  "+IntegerToString(relaxTime);

   labelCreat(name,text,x,y);

   if(ZeroDamage!=0)

     {

      //#4

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = "57C1KB>: 2:;NG5=";

      labelCreat(name,text,x,y,clrRed);

      //#5

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = "@>D8B = "+IntegerToString(profit);

      labelCreat(name,text,x,y);

     }

   if(PinBar!=0)

     {

      //#6

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = "8=0@ 2:;NG5= ";

      labelCreat(name,text,x,y,clrRed);

      //#7

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = ""59:@>D8B  = "+IntegerToString(takeProfit);

      labelCreat(name,text,x,y);

      //#8

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = "!B>?>AA  = "+IntegerToString(stopLoss);

      labelCreat(name,text,x,y);

      //#9

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = " 07=8F0 <564C High/Low = "+IntegerToString(difference);

      labelCreat(name,text,x,y);

      //#10

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = " 0AAB>O=85 >B High/Low 2 B5:CI59 A25G5 = "+IntegerToString(distance);

      labelCreat(name,text,x,y);

      //#11

      y+=15;j++;

      name = "txt" + IntegerToString(j);

      text = ">;8G5AB2> 10@>2 ?>4@O4 >4=>3> F25B0 = "+IntegerToString(sameBars);

      labelCreat(name,text,x,y);

     }

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {



  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   int b=Counter(OP_BUY); //!G8B05B 108

   int s=Counter(OP_SELL); // !G8B05B AB>?K



                           //B4KE ?>A;5 A45;>:

//A;8 :>;8G5AB2> >B:@KBKE >@45@>2 A 0H8< 038:>< C25;8G8;>AL

//B> =0 7040==>5 2@5<O ?5@5<5==0O relax=false

   bool relaxNow=true;

   if((b+s)!=countOrders)

     {

      if((b+s)>countOrders)

         relax=TimeCurrent()+relaxTime*60;



      countOrders=b+s;

     }

   if(TimeCurrent()<relax)

     {

      relaxNow=false;

     }

   if(PinBar==onPinBar && relaxNow)

     {

      int tick;

      tick=orderOpenPin(b,s);

      b=Counter(OP_BUY); //!G8B05B 108

      s=Counter(OP_SELL); // !G8B05B AB>?K

     }



   if(ZeroDamage==onZeroDamage)

     {

      useZeroDamage();

     }

  }

//+------------------------------------------------------------------+

//|$#&                                                           |

//+------------------------------------------------------------------+

int Counter(int type)// $#&/ !'"   

  {

   int n=0;

   for(int i=0;i<=(OrdersTotal()+1);i++)

      if(OrderSelect(i,SELECT_BY_POS)==true)

         if(OrderMagicNumber()==Magic)

            if(OrderType()==type)

               n++;

   return n;

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+



//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

//$C=:F8O ?@>25@:8 =0?@02;5=8O 7040==>3> :>;8G5AB20 A25G59

//>72@0I05B

//1 -A;8 1KGLO A25G0    2 - A;8 <54256LO   -1 - A;8 =8 B0 =8 4@C30O

int trendCandles(int n)

  {

   int bear=0,bull=0;

   for(int i=0;i<=n;i++)

      if((iClose(_Symbol,period,i)-iOpen(_Symbol,period,i))>0)

        {

         bull++;

        }

   else bear++;



   if(bear == 0 && bull!=0) return 1;

   else if(bear !=0 && bull ==0) return 2;

   return -1;

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+



//" +"       #

int orderOpenPin(int b,int s)

  {

//A;8 >B:@KBKE >@45@>2 <=>3>, B> =5 2K?>;=OBL DC=:F8N

   if(b+s >= maxOpenOrders) return 0;

   int lastCandles=trendCandles(sameBars);

   if(dinamicLot==true)

     {

      LotValue=AccountBalance() *Lot/100;

      if(LotValue<SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)) LotValue=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);

     }

   else LotValue=Lot;



//B:@KB85 Sell->@45@0

   if(lastCandles==1 && iHigh(_Symbol,period,0)-iHigh(_Symbol,period,1)>=difference*_Point && 

      (iHigh(_Symbol,period,0)-Bid)>=distance*_Point)

     {

      double SP = Bid+ stopLoss*_Point;

      double TP = Bid- takeProfit*_Point;



      ticket=OrderSend(_Symbol,OP_SELL,LotValue,Bid,Slip,0,0,"",Magic,0,clrRed);

      if(!ticket) Print("Error open sell order");

      if(!OrderModify(ticket,OrderOpenPrice(),SP,TP,0,clrRed))

         Print("error modify order");

     }

   else

//B:@KB85 Buy->@45@0

      if(lastCandles==2 && iLow(_Symbol,period,1)-iLow(_Symbol,period,0)>=difference*_Point && 

         (Ask-iLow(_Symbol,period,0))>=distance*_Point)

        {

         double SP = Ask- stopLoss*_Point;

         double TP = Ask + takeProfit*_Point;



         ticket=OrderSend(_Symbol,OP_BUY,LotValue,Ask,Slip,0,0,"",Magic,0,clrBlue);

         if(!ticket) Print("Error open buy order");

         if(!OrderModify(ticket,OrderOpenPrice(),SP,TP,0,clrRed))

            Print("error modify order");

        }



   return 0;

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

void useZeroDamage()

  {

   int n=0;

   for(int i=0;i<=(OrdersTotal()+1);i++)

      if(OrderSelect(i,SELECT_BY_POS)==true)

         if(OrderMagicNumber()==Magic && (OrderType()==OP_BUY || OrderType()==OP_SELL))

           {

            if(OrderType()==OP_BUY)

              {

               //"5:CI89 AB>?;>AA 4>;65= 1KBL <5=LH5 AB>?0 ?> C<>;G0=8N

               if(OrderOpenPrice() -(OrderStopLoss()-5*_Point)>=stopLoss*_Point)

                  if((Ask-OrderOpenPrice())>=profit*_Point)

                    {

                     double SP=NormalizeDouble(OrderOpenPrice()+SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)*_Point,Digits);

                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),SP,OrderTakeProfit(),0,clrYellow))

                        Print("H81:0 >48D8:0F88 BUY ?> 57C1KB:C SP=",SP," OrOp =",OrderOpenPrice());

                    }

              }

            else if(OrderType()==OP_SELL)

              {

               //"5:CI89 AB>?;>AA 4>;65= 1KBL <5=LH5 AB>?0 ?> C<>;G0=8N

               if((OrderStopLoss()+5*_Point)-OrderOpenPrice()>=stopLoss*_Point)

                  if((OrderOpenPrice()-Bid)>=profit*_Point)

                    {

                     double SP=NormalizeDouble(OrderOpenPrice()-SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)*_Point,Digits);

                     if(!OrderModify(OrderTicket(),OrderOpenPrice(),SP,OrderTakeProfit(),0,clrYellow))

                        Print("H81:0 >48D8:0F88 SELL ?> 57C1KB:C Sp = ",SP," OrOp =",OrderOpenPrice());

                    }

              }

           }

  }

//+------------------------------------------------------------------+

//|                                                                  |

//+------------------------------------------------------------------+

bool labelCreat(string name,string text,int XDistance,int YDistance,color clr=clrWhite)

  {

   string            font="Arial";             // H@8DB 

   int               font_size=8;             // @07<5@ H@8DB0 

   ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER; // A?>A>1 ?@82O7:8 

   long              chart_ID=0;

   const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER;// C3>; 3@0D8:0 4;O ?@82O7:8 

   const int        sub_window=0;            // =><5@ ?>4>:=0 



   ObjectDelete(chart_ID,name);

   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0)) return(false);

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,XDistance);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,YDistance);

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

//--- CAB0=>28< H@8DB B5:AB0 

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

//--- CAB0=>28< @07<5@ H@8DB0 

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

//--- CAB0=>28< C3>; =0:;>=0 B5:AB0 

//--- CAB0=>28< A?>A>1 ?@82O7:8 

   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);

//--- CAB0=>28< F25B 

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   return(true);

  }



//+------------------------------------------------------------------+

Comments