skalp4frame

Author: Copyright 2016, MetaQuotes Software Corp.
Price Data Components
Series array that contains open prices of each barSeries array that contains close prices for each bar
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Indicators Used
MACD HistogramMoving average indicator
0 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

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