Trade_EA_Template_for_News.FF

Author: Copyright 2017, Tor
Price Data Components
Series array that contains open prices of each barSeries array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reached
Miscellaneous
Uses files from the file systemIt writes information to fileIt reads information from a file
0 Views
0 Downloads
0 Favorites
Trade_EA_Template_for_News.FF
ÿþ//+------------------------------------------------------------------+

//|                                   Trade EA Template for News.mq4 |

//|                                              Copyright 2017, Tor |

//|                                             http://einvestor.ru/ |

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

#property copyright "Copyright 2017, Tor"

#property link      "http://einvestor.ru/"

#property version   "2.00"

#property strict



extern bool     LowNews             = true;

extern int      LowIndentBefore     = 15;

extern int      LowIndentAfter      = 15;

extern bool     MidleNews           = true;

extern int      MidleIndentBefore   = 30;

extern int      MidleIndentAfter    = 30;

extern bool     HighNews            = true;

extern int      HighIndentBefore    = 60;

extern int      HighIndentAfter     = 60;

extern bool     NFPNews             = true;

extern int      NFPIndentBefore     = 180;

extern int      NFPIndentAfter      = 180;



extern bool    DrawNewsLines        = true;

extern color   LowColor             = clrGreen;

extern color   MidleColor           = clrBlue;

extern color   HighColor            = clrRed;

extern int     LineWidth            = 1;

extern ENUM_LINE_STYLE LineStyle    = STYLE_DOT;



extern string  NewsSymb="";//List of all currencies



extern int  GMTplus=3;     // Your Time Zone, GMT (for news)



int NomNews=0,Now=0,MinBefore=0,MinAfter=0;

string NewsArr[4][1000];

datetime LastUpd=0;

string ValStr;

int   Upd            = 86400;      // Period news updates in seconds

bool  Next           = false;      // Draw only the future of news line

bool  Signal         = false;      // Signals on the upcoming news

datetime TimeNews[300];

string Valuta[300],News[300],Vazn[300];

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---

   string v1=StringSubstr(_Symbol,0,3);

   string v2=StringSubstr(_Symbol,3,3);

   if(NewsSymb=="")

     {

      ValStr=v1+","+v2;

        }else{

      ValStr=NewsSymb;

     }

   LastUpd=0;

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

   Comment("");

   del("NS_");

  }

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

//| Expert tick function    OnTick()                                 |

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

void OnTick()

  {

//---

   string TextDisplay="";



/*  Check News   */

   bool trade=true; string nstxt=""; int NewsPWR=0; datetime nextSigTime=0;

   if(LowNews || MidleNews || HighNews || NFPNews)

     {

      //Forexfactory.com

      if(CheckFXFactoryNews(NewsPWR,nextSigTime)){ trade=false; } // news time

     }

   if(trade)

     {// No News, Trade enabled

      nstxt="No News";

      if(ObjectFind(0,"NS_Label")!=-1){ ObjectDelete(0,"NS_Label"); }



        }else{// waiting news , check news power

      color clrT=LowColor;

      if(NewsPWR>3)

        {

         nstxt= "Waiting Non-farm Payrolls News";

         clrT = HighColor;

           }else{

         if(NewsPWR>2)

           {

            nstxt= "Waiting High News";

            clrT = HighColor;

              }else{

            if(NewsPWR>1)

              {

               nstxt= "Waiting Midle News";

               clrT = MidleColor;

                 }else{

               nstxt= "Waiting Low News";

               clrT = LowColor;

              }

           }

        }

      // Make Text Label

      if(nextSigTime>0){ nstxt=nstxt+" "+TimeToString(nextSigTime,TIME_MINUTES); }

      if(ObjectFind(0,"NS_Label")==-1)

        {

         Print("NS_Label");

         LabelCreate(StringConcatenate(nstxt),clrT);

        }

      if(ObjectGetInteger(0,"NS_Label",OBJPROP_COLOR)!=clrT)

        {

         ObjectDelete(0,"NS_Label");

         LabelCreate(StringConcatenate(nstxt),clrT);

        }

     }

   nstxt="\n"+nstxt;

/*  End Check News   */



   if(IsTradeAllowed() && trade)

     {// No news and Trade Allowed

      ManageTrade(); // Your trade functions

     }



   TextDisplay=TextDisplay+nstxt;

   Comment(TextDisplay);



   return;

  }

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

void ManageTrade()

  {

   int tkt=0;

   if(iOpen(_Symbol,PERIOD_H1,1)<iClose(_Symbol,PERIOD_H1,0) && OrdersTotal()<1)

     {

      tkt=OrderSend(Symbol(),OP_BUY,0.01,Ask,2,Ask-100*_Point,Ask+100*_Point,"",0,0,clrBlue);

     }

   if(iOpen(_Symbol,PERIOD_H1,1)>iClose(_Symbol,PERIOD_H1,0) && OrdersTotal()<1)

     {

      tkt=OrderSend(Symbol(),OP_SELL,0.01,Bid,2,Bid+100*_Point,Bid-100*_Point,"",0,0,clrRed);

     }

   return;

  }

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

datetime TimeNewsFunck(int nomf)

  {

   string s=NewsArr[0][nomf];

   string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

   return((datetime)(StringToTime(time) + GMTplus*3600));

  }

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

int del(string name) // !?5F. D-8O deinit()

  {

   for(int n=ObjectsTotal()-1; n>=0; n--)

     {

      string Obj_Name=ObjectName(n);

      if(StringFind(Obj_Name,name,0)!=-1)

        {

         ObjectDelete(Obj_Name);

        }

     }

   return 0;                                      // KE>4 87 deinit()

  }

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

bool LabelCreate(const string text="Label",const color clr=clrRed)

  {

   long x_distance;  long y_distance; long chart_ID=0;  string name="NS_Label"; int sub_window=0;

   ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER;

   string font="Arial"; int font_size=28; double angle=0.0; ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER;

   bool back=false; bool selection=false;  bool hidden=true;  long z_order=0;

//--- 

   ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,x_distance);

   ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,0,y_distance);

   ResetLastError();

   if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0))

     {

      Print(__FUNCTION__,

            ": failed to create text label! Error code = ",GetLastError());

      return(false);

     }

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(x_distance/2.7));

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(y_distance/1.5));

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

   ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);

   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

   return(true);

  }

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

bool CheckFXFactoryNews(int &pwr,datetime &mintime)

  {

   bool CheckNews=false; pwr=0; int maxPower=0;

   if(LowNews || MidleNews || HighNews || NFPNews)

     {

      if(LastUpd==0 || TimeCurrent()-LastUpd>=Upd){Print("News FXFactory Loading...");UpdateFXFact();LastUpd=TimeCurrent();Comment("");}

      WindowRedraw();

      //---Draw a line on the chart news--------------------------------------------

      if(DrawNewsLines)

        {

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

           {

            if(StringLen(NewsArr[3][i])<1){ continue; } //Print(i+"  "+StringLen(NewsArr[3][i])+"`"+NewsArr[0][i]+"`  "+NewsArr[1][i]+"  "+NewsArr[2][i]+"  "+NewsArr[3][i]+"  "+ValStr);

            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);

            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;

            if(StringFind(ValStr,NewsArr[1][i])<0)continue;

            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;



            color clrf=clrNONE;

            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;

            if(MidleNews && StringFind(NewsArr[2][i],"Medium")>=0)clrf=MidleColor;

            if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;



            if(clrf==clrNONE)continue;



            if(NewsArr[3][i]!="")

              {

               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);

               ObjectSet(Name,OBJPROP_COLOR,clrf);

               ObjectSet(Name,OBJPROP_STYLE,LineStyle);

               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);

               ObjectSetInteger(0,Name,OBJPROP_BACK,true);

              }

           }

        }

      //---------------event Processing------------------------------------

      int ii;

      CheckNews=false;

      for(ii=0;ii<999;ii++)

        {

         int power=0;

         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }

         if(MidleNews && StringFind(NewsArr[2][ii],"Medium")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }

         if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }

         if(NFPNews && StringFind(NewsArr[3][ii],"Non-Farm")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }

         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && StringFind(ValStr,NewsArr[1][ii])>=0)

           {

            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }

              }else{

            CheckNews=false;

           }

        }

      if(maxPower>0){ CheckNews=true; }

     }

   pwr=maxPower;

   return(CheckNews);

  }

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

void UpdateFXFact()

  {

   string DF=""; string MF="",fstr;

   int DeltaGMT=GMTplus;

   int ChasPoyasServera=DeltaGMT;

   datetime NowTimeD1=Time[0];

   string FileName="fxfactorynews-"+(string)Month()+"-"+(string)Day()+".xml";

   int handle; char post[],result[]; string TXT=""; int res; string text="";



   if(!FileIsExist(FileName))

     {

      string url="http://www.forexfactory.com/ffcal_week_this.xml";

      string cookie=NULL,headers;

      ResetLastError();

      int timeout=5000;

      res=WebRequest("GET",url,cookie,NULL,timeout,post,0,result,headers);

      if(res==-1)

        {

         Print("WebRequest error, err.code  =",GetLastError());

         MessageBox("You must add the address 'http://www.forexfactory.com/' in the list of allowed URL tab 'Advisors' "," Error ",MB_ICONINFORMATION);

        }

      else

        {

         int filehandle=FileOpen(FileName,FILE_WRITE|FILE_BIN);

         if(filehandle!=INVALID_HANDLE)

           {

            FileWriteArray(filehandle,result,0,ArraySize(result));

            FileClose(filehandle);

              }else{

            Print("Error in FileOpen. Error code =",GetLastError());

           }

        }

      handle=FileOpen(FileName,FILE_READ|FILE_BIN);

      fstr=FileReadString(handle,ArraySize(result));

        }else{

      handle=FileOpen(FileName,FILE_READ|FILE_BIN);

      fstr=FileReadString(handle,(int)FileSize(handle));

     }

   FileClose(handle);

   string data,time,valuta,events,TEXT,sila;

   int startStr=0; NomNews=0;

   if(handle!=INVALID_HANDLE)

     {

      int sh=0,sh2=0;

      while(!IsStopped())

        {

         sh = StringFind(fstr,"<event>",sh)+7;

         sh2= StringFind(fstr,"</event>",sh);

         if(sh2<0){ continue; }



         events = StringSubstr(fstr, sh, sh2-sh);

         int rp = StringReplace(events,"<![CDATA","");

         rp=StringReplace(events,"]]>","]");



         int shd=StringFind(events,"<date>[",0)+7;

         int shd2=StringFind(events,"]</date>",0);

         data=StringSubstr(events,shd,shd2-shd);

         string rdata[];

         int k=StringSplit(data,StringGetCharacter("-",0),rdata);



         int shch=StringFind(events,"<time>[",0)+7;

         int shch2=StringFind(events,"]</time>",0);

         time=StringSubstr(events,shch,shch2-shch);

         string rtime[];

         k=StringSplit(time,StringGetCharacter(":",0),rtime);

         if(StringSubstr(rtime[1],StringLen(rtime[1])-2,2)=="pm")

           {

            rtime[0]=IntegerToString(StringToInteger(rtime[0])+12);

           }

         rtime[1]=StringSubstr(rtime[1],0,StringLen(rtime[1])-2);

         data=rdata[2]+"."+rdata[0]+"."+rdata[1]+" "+rtime[0]+":"+rtime[1]+"";



         int shv=StringFind(events,"<country>",0)+9;

         int shv2=StringFind(events,"</country>",0);

         valuta=StringSubstr(events,shv,shv2-shv);



         int shl=StringFind(events,"<impact>[",0)+9;

         int shl2=StringFind(events,"]</impact>",0);

         sila=StringSubstr(events,shl,shl2-shl);



         int sht=StringFind(events,"<title>",0)+7;

         int sht2=StringFind(events,"</title>",0);

         TEXT=StringSubstr(events,sht,sht2-sht);



         NewsArr[0][NomNews] = data;

         NewsArr[1][NomNews] = valuta;

         NewsArr[2][NomNews] = sila;

         NewsArr[3][NomNews] = TEXT;

         if(StringFind(ValStr,NewsArr[1][NomNews])<0)continue;

         if(StringFind(NewsArr[2][NomNews],"High")>=0 && !HighNews)continue;

         if(StringFind(NewsArr[2][NomNews],"Medium")>=0 && !MidleNews)continue;

         if(StringFind(NewsArr[2][NomNews],"Low")>=0 && !LowNews)continue;



         NomNews++;

         if(NomNews==1000)break;

        }

        }else{

      PrintFormat("Error in FileOpen = %s. Error code= %d",FileName,GetLastError());

     }

   NomNews=startStr-1;

   FileClose(handle);

  }

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

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