skalp4frame

Author: Copyright 2016, MetaQuotes Software Corp.
Profit factor:
0.00
2 Views
0 Downloads
0 Favorites
skalp4frame
ÿþ//+------------------------------------------------------------------+

//|                                                  skalp4frame.mq4 |

//|                        Copyright 2016, MetaQuotes Software Corp. |

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

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

#property copyright "Copyright 2016, MetaQuotes Software Corp."

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

#property version   "2.01"

#property strict

//--- input parameters

input double            inLot          = 1;     //>B

input int               inTakeProfit   = 300;   //"59:@>D8B

input int               inStopLoss     = 100;   //!B>?>AA

extern color            clText         = White; //Font color





//---- ;>10;L=K5 ?5@5<5==K5 A>25B=8:0 -------------------------------

int    prevBar;                  //%@0=8B :>;8G5AB2> A25G59 2 8AB>@88

int    gMG         = 87346538;   //Magic

string gsAddToText = "4Frame";   //"5:AB :><<5=B0@8O

ENUM_TIMEFRAMES   gsTimeFrame    = 60;    //"09<D@59< 





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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---

   prevBar=iBars(NULL,gsTimeFrame); //>;8G5AB2> 10@>2

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

   

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//---

   if (prevBar!=iBars(NULL,gsTimeFrame))  //A;8 >B:@K;0AL =>20O A25G0

   {

     

         int iTT=fnTypeTrend(); //"8? B@5=40 

         double minstoplevel=(int)MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;

         double tSL = inStopLoss;

         double tTP = inTakeProfit;

         if (inTakeProfit>0 &&  inTakeProfit<minstoplevel)   tTP=minstoplevel;

         if (inStopLoss>0 && inStopLoss<minstoplevel)   tSL=minstoplevel;

               

            if (iTT==0 && fnTrend(gsTimeFrame)==1)//BUY

            {  

               CloseOrder(gMG,1);            

               if (tTP>0) tTP=NormalizeDouble(Bid+tTP*Point,Digits);

               if (tSL>0) tSL=NormalizeDouble(Bid-tSL*Point,Digits);                  

               if (!ExistPosition(gMG)) SetOrder(iTT,Ask,tSL,tTP,gMG);

            }

         

            if (iTT==1 && fnTrend(gsTimeFrame)==0)//SELL 

            { 

               CloseOrder(gMG,0); 

               if (tTP>0) tTP=NormalizeDouble(Bid-tTP*Point,Digits);

               if (tSL>0) tSL=NormalizeDouble(Bid+tSL*Point,Digits);      

               if (!ExistPosition(gMG)) SetOrder(iTT,Bid,tSL,tTP,gMG);       

            }

      

      

      prevBar=iBars(NULL,gsTimeFrame);

   }

   //funTrailingPositions(); //"@0;8=3

   

   fnAddText(); //>102;5=85 B5:AB0

  }

  

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

  

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

//|>1028BL B5:AB                                                    |                                                      |

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

void fnAddText() 

  {  

   string tsNameTypeBar = "";

   ENUM_TIMEFRAMES TFtiTB;

   int tiTB;  

   //---------------

   TFtiTB = 5;

   tiTB=fnTypeBar(TFtiTB,1);

   if (tiTB==1) tsNameTypeBar = "SELL";

   else 

      if (tiTB==0) tsNameTypeBar = "BUY";

      else tsNameTypeBar = "NONE";   

   funAddText(1,"Time Frame "+DoubleToString(TFtiTB,0)+": "+tsNameTypeBar,clText);

   //---------------

   TFtiTB = 15;

   tiTB=fnTypeBar(TFtiTB,1);

   if (tiTB==1) tsNameTypeBar = "SELL";

   else 

      if (tiTB==0) tsNameTypeBar = "BUY";

      else tsNameTypeBar = "NONE";   

   funAddText(2,"Time Frame "+DoubleToString(TFtiTB,0)+": "+tsNameTypeBar,clText);

   //------------------

   TFtiTB = 30;

   tiTB=fnTypeBar(TFtiTB,1);

   if (tiTB==1) tsNameTypeBar = "SELL";

   else 

      if (tiTB==0) tsNameTypeBar = "BUY";

      else tsNameTypeBar = "NONE";   

   funAddText(3,"Time Frame "+DoubleToString(TFtiTB,0)+": "+tsNameTypeBar,clText);

   //-------------------

   TFtiTB = 60;

   tiTB=fnTypeBar(TFtiTB,1);

   if (tiTB==1) tsNameTypeBar = "SELL";

   else 

      if (tiTB==0) tsNameTypeBar = "BUY";

      else tsNameTypeBar = "NONE";   

   funAddText(4,"Time Frame "+DoubleToString(TFtiTB,0)+": "+tsNameTypeBar,clText);

   //-------------------

   tsNameTypeBar = "NONE";

   if (fnTrend(gsTimeFrame)==1) tsNameTypeBar = "SELL"; 

   if (fnTrend(gsTimeFrame)==0) tsNameTypeBar = "BUY";   

   funAddText(5,"Trend: "+tsNameTypeBar,clText);

   

 }  

 

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

//|"8? B@5=40 =0 4 B09<D@59<0E                                                  |

//|>72@0I05<K5 7=0G5=8O:                                            |

//|-1 - CA;>285 =5 2K?>;=5=>                                         |

//|0 - @0ABCI89 B@5=4                                                       |

//|1 - =8AE>4OI89 B@5=4                                                       |

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

int fnTypeTrend() 

  {

    if (fnTypeBar(5,1)==0 && fnTypeBar(15,1)==0 && fnTypeBar(30,1)==0 && fnTypeBar(60,1)==0) return(0);

    if (fnTypeBar(5,1)==1 && fnTypeBar(15,1)==1 && fnTypeBar(30,1)==1 && fnTypeBar(60,1)==1) return(1);

   

    return(-1);

  } 

  

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

//|0?@02;5=85 B@5=40                                                |

//|>72@0I05<K5 7=0G5=8O:                                            |

//|-1 - =5B =0?@02;5=8O                                              |

//|0 - @0ABCI89 B@5=4                                                |

//|1 - =8AE>4OI89 B@5=4                                              |

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

int fnTrend(ENUM_TIMEFRAMES tf, int p=20) 

  {

    int rt=-1; 

    int tmacd=0;

    int tema=0;

    for(int i=1;i<=p; i++)

    { 

      double macd1=iMACD(NULL,tf,12,26,9,PRICE_CLOSE,MODE_MAIN,i);

      double macd2=iMACD(NULL,tf,12,26,9,PRICE_CLOSE,MODE_MAIN,i+1);

    

      double EMA1=iMA(NULL,tf,13,0,MODE_EMA,PRICE_CLOSE,i); 

      double EMA2=iMA(NULL,tf,13,0,MODE_EMA,PRICE_CLOSE,i+1);  

    

      if (macd1>macd2) tmacd++; else tmacd--;

      if (EMA1>EMA2) tema++; else tema--;

    }

    if (tema>0 && tmacd>0) rt=0;

    if (tema<0 && tmacd<0) rt=1;

    

    return(rt);

  } 

   

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

//|"8? A25G8

//|-1 - =5B B@5=40                                                   |

//| 0 - @0ABCI0O A25G0                                               |

//| 1 - =87E>4OI0O A25G0                                             |

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

int fnTypeBar(

                ENUM_TIMEFRAMES tf, //5@8>4                

                int nBar=1 //><5@ A25G8

               ) 

  {

  if (iClose(NULL,tf,nBar)>iOpen(NULL,tf,nBar)) return(0);

  if (iClose(NULL,tf,nBar)<iOpen(NULL,tf,nBar)) return(1);

  return(-1);

  }



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

//| #AB0=>2:0 >@45@0                                                 |

//| 0@0<5B@K:                                                       |

//|   op     - >?5@0F8O                                              |

//|   pp     - F5=0                                                  |

//|   ldStop - AB>?                                                  |

//|   ldTake - B59:                                                  |

//|   mn     - MAGIC                                                 |

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

void SetOrder(int op,double pp,double ldStop,double ldTake,int mn) 

  {

   //color  clOpen;

   string lsComm="Skalp";



   pp=NormalizeDouble(pp,Digits);

   ldStop=NormalizeDouble(ldStop,Digits);

   ldTake=NormalizeDouble(ldTake,Digits);

   double sfm=MarketInfo(Symbol(), MODE_MARGINREQUIRED)*inLot;

   if (sfm<AccountInfoDouble(ACCOUNT_MARGIN_FREE))

   {

      int ticket = OrderSend(Symbol(),op,inLot,pp,0,ldStop,ldTake,lsComm,mn,0,clrGreen);

      if(ticket<0)

      {

         Print("OrderSend 7025@H8;0AL A >H81:>9 #",GetLastError());

         Print("?5@0F8O:",op," TP:",ldTake," SL:",ldStop);

      }

      else 

      {

       Print("$C=:F8O OrderSend CA?5H=> 2K?>;=5=0");      

      }

   } else Print("54>AB0B>G=> A@54AB2! 5>1E>48<> = "+DoubleToStr(sfm,0));

  }

  

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

//| 0:@KB85 ?>78F88                                                  |

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

void CloseOrder(int mn, int or=-1) 

  {

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

     {

      if(OrderSelect(i,SELECT_BY_POS)) 

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn) 

           {

            bool oc=false;

            if (OrderType()==OP_BUY && (or==0 || or==-1))   oc=OrderClose(OrderTicket(),OrderLots(),Bid,0);  

            if (OrderType()==OP_SELL && (or==1 || or==-1))  oc=OrderClose(OrderTicket(),OrderLots(),Ask,0);              

           }

        }

     }

  }  

  

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

//| >72@0I05B D;03 ACI5AB2>20=8O ?>78F88 ?> =><5@C                  |

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

bool ExistPosition(int mn) 

  {

   bool Exist=False;

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

     {

      if(OrderSelect(i,SELECT_BY_POS)) 

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==mn) 

           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 

              {

               Exist=True; break;

              }

           }

        }

     }

   return(Exist);

  }

  

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

//| !>?@>2>645=85 ?>78F88 B@0;><                                     |

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

void funTrailingPositions(int TralingP)

  {

   double tdPrStLs;

   int minstoplevel=(int)MarketInfo(Symbol(),MODE_STOPLEVEL);

//---

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

     {

      bool tbBezUb=false;

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         if(OrderSymbol()==Symbol() && OrderMagicNumber()==gMG)

           {

            //-----------------------------------------------------------------------------------------------------------------



            if(OrderType()==OP_BUY)

              {

               tdPrStLs=NormalizeDouble(Bid-TralingP*Point,Digits);

               if(tdPrStLs>OrderStopLoss())

                  if(tdPrStLs>=OrderOpenPrice())

                     funModifyStopLoss(OrderTicket(),OrderOpenPrice(),OrderTakeProfit(),tdPrStLs);

              }



            if(OrderType()==OP_SELL)

              {

               tdPrStLs=NormalizeDouble(Ask+TralingP*Point,Digits);

               if(tdPrStLs<OrderStopLoss())

                  if(tdPrStLs<=OrderOpenPrice())

                     funModifyStopLoss(OrderTicket(),OrderOpenPrice(),OrderTakeProfit(),tdPrStLs);

              }

            //-----------------------------------------------------------------------------------------------------------------

           }

        }

     }

  }

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

//| 5@5=>A C@>2=O StopLoss                                          |

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

void funModifyStopLoss(

                       int    ldTicket,//- ><5@ >@45@0

                       double ldOpen, //- &5=0 >B:@KB8O

                       double ldTake, //- #@>25=L TakeProfit

                       double ldStop, //- C@>25=L StopLoss  

                       )

  {

   bool   fm;

   fm=OrderModify(ldTicket,ldOpen,ldStop,ldTake,0,Blue);

  }

  

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

//| >102;5=85 B5:AB0 =0 3@0D8:                                      |

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

void funAddText(

                int     iNumLine, //><5@ AB@>:8

                string  sText,    //"5:AB AB@>:8

                color   cTextColor=White,//&25B H@8DB0       

                int     iSizeFont=8,// 07<5@ H@8DB0

                string  sTypeFont="Times New Roman" //"8? H@8DB0

                )

  {

//---?5@5<5==K5

   long   chart_ID= 0;

   string sNumLine=gsAddToText+(string)iNumLine;//><5@ AB@>:8 2 AB@>:>2K9 B8?

                                                //string name2     = "lblSpred";    

   int    lblX     = 10;

   int    lblY     = iSizeFont*2;

//-------------------------------------

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

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

//-------------------------------------

   if(ObjectFind(chart_ID,sNumLine)==-1)

     {

      ObjectCreate(sNumLine,OBJ_LABEL,0,0,0);

      ObjectSet(sNumLine,OBJPROP_XDISTANCE,lblX);

      ObjectSet(sNumLine,OBJPROP_YDISTANCE,lblY+(iNumLine*15));

      ObjectSetInteger(chart_ID,sNumLine,OBJPROP_CORNER,corner);

      ObjectSetInteger(chart_ID,sNumLine,OBJPROP_ANCHOR,anchor);

     }

//---

   ObjectSetText(sNumLine,sText,iSizeFont,sTypeFont,cTextColor);

   ChartRedraw(chart_ID);



  }

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

//| #40;5=85 2A53> B5:AB0 =0 3@0D8:5                                 |

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

void funDelALLText()

  {

//--- C40;5=85 2A5E A>740==KE >1J5:B>2

   int obj_total=ObjectsTotal();



   for(int i=obj_total-1;i>=0;i--)

     {

      string name=ObjectName(i);



      if(StringFind(name,gsAddToText)!=-1)

         ObjectDelete(name);

     }

//return(0);

  }

Comments