//+------------------------------------------------------------------+ //| Fundamental Trader DailyFX.mq4 | //| Fundamental Trader Freeware | //| | //+------------------------------------------------------------------+ //v0.04 | Fixed Risk/Reward //v0.04 | Fixed Invalid Lots Issue //v0.04 | Fixed to download calendar only when event is released, and not every minute of the Day //v0.04 | Implemented to close position after an X amount of minutes //v0.04 | Fixed, NZD order direction #property copyright "Fundamental Trader Freeware" #property link "" //extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv"; //extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv?currentWeek=/events-calendar/2008/0921/&direction=none&collector=allInFolderDateDesc&view=week&timezone=GMT¤cyFilter=|&importanceFilter=|"; extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv?currentcalendar.csv"; extern string GetrightAdress = "c:\progra~1\getright\getright.exe"; extern int xTime=27; //time for EA to wait for news to be released extern int MagicNumber=815; //order magicnumber extern bool enable_close_time=false; //set to true to enable the function to close orders after certain amount of time has passed extern int wait_time=20; //time the EA waits after the orders were executed, to close orders based on a time frame //Risk and Reward Setup extern int risk=20; //20 pip risk extern int reward=3;//reward ratio multiplier, if risk is 20pip, then reward is 60pip //external specification of minimim lots to trade and maximum lots to trade when news events are released extern double lot1=0.01;extern double lot2=0.02;extern double lot3=0.03;extern double lot4=0.04; extern double lot5=0.05;extern double lot6=0.06;extern double lot7=0.07;extern double lot8=0.08; extern double lot9=0.09;extern double lot10=0.1;extern double lot11=0.11;extern double lot12=0.12; extern double lot13=0.13;extern double lot14=0.14;extern double lot15=0.15;extern double lot16=0.16; extern double lot17=0.17;extern double lot18=0.17; //end of lots specification #include <Time.mqh> #import "kernel32.dll" int WinExec(string NameEx, int dwFlags); #import #import "str2double.dll" double StringToDouble(string str); #import int Max = 0; datetime LastTimeDownloading = 0; datetime OrderTime=0; bool down_flag; void DownloadCalendar() { Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv"); //FileDelete("\Html\Calendar.csv"); if(down_flag!=true){WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0);} down_flag=true; } void CloseOrders()//function which closes opened orders after x amount of time has passed! { int opened_orders=OrdersTotal(); for (int fe=0;fe<opened_orders;fe++) { OrderSelect(fe, SELECT_BY_POS, MODE_TRADES); //check opened orders if(enable_close_time==true && OrderMagicNumber()==MagicNumber && TimeCurrent()>OrderTime+wait_time*60 && OrderType()==OP_BUY) { double order_bid=MarketInfo(OrderSymbol(),MODE_BID); OrderClose(OrderTicket(),OrderLots(),order_bid,3,Violet); } if(enable_close_time==true && OrderMagicNumber()==MagicNumber && TimeCurrent()>OrderTime+wait_time*60 && OrderType()==OP_SELL) { double order_ask=MarketInfo(OrderSymbol(),MODE_ASK); OrderClose(OrderTicket(),OrderLots(),order_ask,3,Violet); } } return; } void DownloadCal_prior_to_event() { int file1 = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); while (!FileIsEnding(file1)) { string stDate1=""; while (!FileIsEnding(file1) && stDate1=="") stDate1 = FileReadString(file1); string stTime1 = FileReadString(file1); string stTimeZone1 = FileReadString(file1); string stCurrency1 = FileReadString(file1); string stDescription1 = FileReadString(file1); string stImportance1 = FileReadString(file1); string stActual1 = FileReadString(file1); string stForecast1 = FileReadString(file1); string stPrevious1 = FileReadString(file1); //Alert(stDate1,stTime1,stTimeZone1,stCurrency1,stDescription1,stImportance1,stActual1,stForecast1,stPrevious1); datetime Date1 = ToDate(stDate1,stTime1); if(Date1>(TimeCurrent()-(xTime*60))) { if(TimeCurrent()>Date1 && stTime1!="Time") { //Alert("time before event"+stTime1); FileClose(file1); WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0); return; } } } //WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0); FileClose(file1); } datetime PerviousMonday(datetime d) { datetime res = d - (TimeDayOfWeek(d)-1)*24*60*60; return(res); } datetime ToDate(string stDate,string stTime) { string WeekDay = StringSubstr(stDate,0,3); int WeekPlus = 0; if (WeekDay=="Mon") WeekPlus=0; if (WeekDay=="Tue") WeekPlus=1; if (WeekDay=="Wed") WeekPlus=2; if (WeekDay=="Thu") WeekPlus=3; if (WeekDay=="Fri") WeekPlus=4; if (WeekDay=="Sat") WeekPlus=5; if (WeekDay=="Sun") WeekPlus=-1; datetime Res = PerviousMonday(GetTimeGMT())+WeekPlus*24*60*60; datetime Tm = StrToTime(stTime); Res=Res+TimeHour(Tm )*60*60+TimeMinute(Tm )*60+TimeSeconds(Tm ) -TimeHour(Res)*60*60-TimeMinute(Res)*60-TimeSeconds(Res); if((StringFind(stTime,"12"))>=0 && (StringFind(stTime,"AM"))>=0){Res=Res-(TimeHour(Tm )*60*60)-(TimeMinute(Tm )*60);} if (StringFind(stTime,"PM")>=0) Res+=12*60*60; Res=Res-GetShiftGMT(); if((StringFind(stTime,"12"))>=0 && (StringFind(stTime,"PM"))>=0){Res=Res-(TimeHour(Tm )*60*60)-(TimeMinute(Tm )*60);} //if(stTime=="12:15 PM" || stTime=="12:30 PM" || stTime=="12:45 PM"){Res=Res-(TimeHour(Tm )*60*60)-(TimeMinute(Tm )*60);} return (Res); } void GrabNews() { int file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); if (file==-1||FileSize(file)==0) return; int i=0; while (!FileIsEnding(file)) { string stDate=""; while (!FileIsEnding(file) && stDate=="") stDate = FileReadString(file); string stTime = FileReadString(file); string stTimeZone = FileReadString(file); string stCurrency = FileReadString(file); string stDescription = FileReadString(file); string stImportance = FileReadString(file); string stActual = FileReadString(file); string stForecast = FileReadString(file); string stPrevious = FileReadString(file); //Alert(stDate,stTime,stTimeZone,stCurrency,stDescription,stImportance,stActual,stForecast,stPrevious); datetime Date = ToDate(stDate,stTime); //Alert(TimeCurrent()+" "+(TimeCurrent()-(15*60))); if(Date>(TimeCurrent()-(xTime*60)))//give xTime minutes to the EA to wait for news to be released { //Alert(Date+" "+(TimeCurrent()));//-(15*60))); Comment("Date: ",stDate, "\n","Time: ",stTime, "\n","TimeZone: ",stTimeZone, "\n","Currency: ",stCurrency, "\n","Description: ",stDescription, "\n","Importance: ",stImportance, "\n","Actual: ",stActual, "\n","Forecast: ",stForecast, "\n","Previous: ",stPrevious); //double myvalue = StringToDouble("-$610"); //Alert("My value: " + myvalue);//DoubleToStr(myvalue, 2)); //Alert(Date+" "+TimeCurrent()); string ordercurrency=""; if(stCurrency=="EUR" ){ordercurrency="EURUSD";} //trading eurusd if(stCurrency=="USD" ){ordercurrency="EURUSD";} //trading eurusd if(stCurrency=="JPY" ){ordercurrency="USDJPY";} //trading usdjpy if(stCurrency=="GBP" ){ordercurrency="GBPUSD";} //trading usdgbp if(stCurrency=="CHF" ){ordercurrency="USDCHF";} //trading usdchf if(stCurrency=="AUD" ){ordercurrency="AUDUSD";} //trading audusd if(stCurrency=="CAD" ){ordercurrency="USDCAD";} //trading usdcad if(stCurrency=="NZD" ){ordercurrency="NZDUSD";} //trading nzdusd double atr=iATR(ordercurrency, 0, 14, 0); //evaluation of SAR as stoploss and takeprofit //double SAR=iSAR(ordercurrency,0,0.02,0.2,0); //double close_price=iClose(ordercurrency,0,0); //double diff=MathAbs(close_price-SAR); //double cbid=MarketInfo(ordercurrency,MODE_BID); //buy is ask, sell is bid //double cask=MarketInfo(ordercurrency,MODE_ASK); //Alert("currentprice:"+close_price+" "+"Takeprofit: "+(cbid+diff)+" "+"Stoploss: "+(cask-diff)); //(2) states to enter the MarketInfo //(1) when actual data is released, and it is compared to forecast, and make sure not to trade if event contains a symbol before integers, e.g. $56, the "$" causes the EA to stop if(StringLen(stActual)>0 && StringLen(stForecast)>0 && stTime!="Time" && stImportance=="High")//&& StrToDouble(stActual)!=0 && StrToDouble(stForecast)!=0) //not zero, takes care of the symbol in front of event { //int percent_d_AF=MathAbs((MathAbs(StrToDouble(stActual)-StrToDouble(stForecast))/StrToDouble(stForecast))*100);//percent difference actual to forecast double percent_d_AF=MathAbs((MathAbs(StringToDouble(stActual)-StringToDouble(stForecast))/StringToDouble(stForecast))*100);//percent difference actual to forecast double lot_p=0; if((percent_d_AF>0 && percent_d_AF<=3)){lot_p=lot1;}//0.1 lot if((percent_d_AF>3 && percent_d_AF<=6)){lot_p=lot2;}//0.2 lots if((percent_d_AF>6 && percent_d_AF<=9)){lot_p=lot3;}//0.3 lots if((percent_d_AF>9 && percent_d_AF<=12)){lot_p=lot4;}//0.4 lots if((percent_d_AF>12 && percent_d_AF<=15)){lot_p=lot5;}//0.5 lots if((percent_d_AF>15 && percent_d_AF<=18)){lot_p=lot6;}//0.6 lots if((percent_d_AF>18 && percent_d_AF<=21)){lot_p=lot7;}//0.7 lots if((percent_d_AF>21 && percent_d_AF<=24)){lot_p=lot8;}//0.8 lots if((percent_d_AF>24 && percent_d_AF<=27)){lot_p=lot9;}//0.9 lots if((percent_d_AF>27 && percent_d_AF<=30)){lot_p=lot10;}//1 lots if((percent_d_AF>30 && percent_d_AF<=40)){lot_p=lot11;}//2 lots if((percent_d_AF>40 && percent_d_AF<=50)){lot_p=lot12;}//3 lots if((percent_d_AF>50 && percent_d_AF<=60)){lot_p=lot13;}//4 lots if((percent_d_AF>60 && percent_d_AF<=70)){lot_p=lot14;}//5 lots if((percent_d_AF>70 && percent_d_AF<=80)){lot_p=lot15;}//6 lots if((percent_d_AF>80 && percent_d_AF<=90)){lot_p=lot16;}//7 lots if((percent_d_AF>90 && percent_d_AF<=100)){lot_p=lot17;}//8 lots if((percent_d_AF>100)) {lot_p=lot18;}//8 lots if(StringToDouble(stActual)>StringToDouble(stForecast)) { Alert("Stronger(actual vs forecast): "+stCurrency+" "+"Time: "+stTime); int total=OrdersTotal(); for(int cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //check opened orders if(OrderComment()==stCurrency+stActual+stForecast+"BUY" || OrderComment()==stCurrency+stActual+stForecast+"SELL"){FileClose(file);Comment("\n"+"Live Trade Open"+OrderTicket());return(0);} } int historytotal=OrdersHistoryTotal(); for(cnt=0;cnt<historytotal;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); //check opened orders if(OrderComment()==stCurrency+stActual+stForecast+"BUY" || OrderComment()==stCurrency+stActual+stForecast+"SELL" || OrderComment()==stCurrency+stActual+stForecast+"BUY[sl]" || OrderComment()==stCurrency+stActual+stForecast+"SELL[sl]" ||OrderComment()==stCurrency+stActual+stForecast+"BUY[tp]" || OrderComment()==stCurrency+stActual+stForecast+"SELL[tp]"){FileClose(file);Comment("\n"+"Trade Executed"+OrderTicket());return(0);} } if(stCurrency=="EUR"||stCurrency=="GBP"||stCurrency=="AUD"||stCurrency=="NZD"){double ask=MarketInfo(ordercurrency,MODE_ASK);double point1=MarketInfo(ordercurrency,MODE_POINT); OrderSend(ordercurrency,OP_BUY,lot_p,ask,3,ask-(risk*point1),ask+(reward*risk*point1),stCurrency+stActual+stForecast+"BUY",MagicNumber);OrderTime=TimeCurrent();} if(stCurrency=="CHF"||stCurrency=="CAD"||stCurrency=="JPY"||stCurrency=="USD"){double bid=MarketInfo(ordercurrency,MODE_BID); double point2=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_SELL,lot_p,bid,3,bid+(risk*point2),bid-(reward*risk*point2),stCurrency+stActual+stForecast+"SELL",MagicNumber);OrderTime=TimeCurrent();} } if(StringToDouble(stActual)<StringToDouble(stForecast)) { int total1=OrdersTotal(); for(cnt=0;cnt<total1;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //check opened orders if(OrderComment()==stCurrency+stActual+stForecast+"BUY" || OrderComment()==stCurrency+stActual+stForecast+"SELL"){FileClose(file);Comment("\n"+"Live Trade Open"+OrderTicket());return(0);} } int historytotal1=OrdersHistoryTotal(); for(cnt=0;cnt<historytotal1;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); //check opened orders if(OrderComment()==stCurrency+stActual+stForecast+"BUY" || OrderComment()==stCurrency+stActual+stForecast+"SELL" || OrderComment()==stCurrency+stActual+stForecast+"BUY[sl]" || OrderComment()==stCurrency+stActual+stForecast+"SELL[sl]" || OrderComment()==stCurrency+stActual+stForecast+"BUY[tp]" || OrderComment()==stCurrency+stActual+stForecast+"SELL[tp]"){FileClose(file);Comment("\n"+"Trade Executed"+OrderTicket());return(0);} } Alert("Weaker(actual vs forecast): "+stCurrency+" "+"Time: "+stTime); if(stCurrency=="EUR"||stCurrency=="GBP"||stCurrency=="AUD"||stCurrency=="NZD"){double bidd=MarketInfo(ordercurrency,MODE_BID); double point3=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_SELL,lot_p,bidd,3,bidd+(risk*point3),bidd-(reward*risk*point3),stCurrency+stActual+stForecast+"SELL",MagicNumber);OrderTime=TimeCurrent();} if(stCurrency=="CHF"||stCurrency=="CAD"||stCurrency=="JPY"||stCurrency=="USD"){double askk=MarketInfo(ordercurrency,MODE_ASK); double point4=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_BUY,lot_p,askk,3,askk-(risk*point4),askk+(reward*risk*point4),stCurrency+stActual+stForecast+"BUY",MagicNumber);OrderTime=TimeCurrent();} } FileClose(file); return(0); } //(2) when actual data is released, and it is compared to the previous(string length of forecast==0) if(StringLen(stActual)>0 && StringLen(stForecast)==0 && StringLen(stPrevious)>0 && stTime!="Time" && stImportance=="High")// && StrToDouble(stActual)!=0 && StrToDouble(stPrevious)!=0) { //int percent_d_AP=MathAbs((MathAbs(StrToDouble(stActual)-StrToDouble(stPrevious))/StrToDouble(stPrevious))*100);//percent difference actual to previous double percent_d_AP=MathAbs((MathAbs(StringToDouble(stActual)-StringToDouble(stPrevious))/StringToDouble(stPrevious))*100);//percent difference actual to previous double lot_pp=0; if((percent_d_AP>0 && percent_d_AP<=3)){lot_pp=lot1;}//0.1 lot if((percent_d_AP>3 && percent_d_AP<=6)){lot_pp=lot2;}//0.2 lots if((percent_d_AP>6 && percent_d_AP<=9)){lot_pp=lot3;}//0.3 lots if((percent_d_AP>9 && percent_d_AP<=12)){lot_pp=lot4;}//0.4 lots if((percent_d_AP>12 && percent_d_AP<=15)){lot_pp=lot5;}//0.5 lots if((percent_d_AP>15 && percent_d_AP<=18)){lot_pp=lot6;}//0.6 lots if((percent_d_AP>18 && percent_d_AP<=21)){lot_pp=lot7;}//0.7 lots if((percent_d_AP>21 && percent_d_AP<=24)){lot_pp=lot8;}//0.8 lots if((percent_d_AP>24 && percent_d_AP<=27)){lot_pp=lot9;}//0.9 lots if((percent_d_AP>27 && percent_d_AP<=30)){lot_pp=lot10;}//1 lots if((percent_d_AP>30 && percent_d_AP<=40)){lot_pp=lot11;}//2 lots if((percent_d_AP>40 && percent_d_AP<=50)){lot_pp=lot12;}//3 lots if((percent_d_AP>50 && percent_d_AP<=60)){lot_pp=lot13;}//4 lots if((percent_d_AP>60 && percent_d_AP<=70)){lot_pp=lot14;}//5 lots if((percent_d_AP>70 && percent_d_AP<=80)){lot_pp=lot15;}//6 lots if((percent_d_AP>80 && percent_d_AP<=90)){lot_pp=lot16;}//7 lots if((percent_d_AP>90 && percent_d_AP<=100)){lot_pp=lot17;}//8 lots if((percent_d_AP>100)) {lot_pp=lot18;}//8 lots if(StringToDouble(stActual)>StringToDouble(stPrevious)) { Alert("Stronger(actual vs previous): "+stCurrency+" "+"Time: "+stTime); int total2=OrdersTotal(); for(cnt=0;cnt<total2;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //check opened orders if(OrderComment()==stCurrency+stActual+stPrevious+"BUY" || OrderComment()==stCurrency+stActual+stPrevious+"SELL"){FileClose(file);Comment("\n"+"Live Trade Open"+OrderTicket());return(0);} } int historytotal2=OrdersHistoryTotal(); for(cnt=0;cnt<historytotal2;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); //check opened orders if(OrderComment()==stCurrency+stActual+stPrevious+"BUY" || OrderComment()==stCurrency+stActual+stPrevious+"SELL" || OrderComment()==stCurrency+stActual+stPrevious+"BUY[sl]" || OrderComment()==stCurrency+stActual+stPrevious+"SELL[sl]" || OrderComment()==stCurrency+stActual+stPrevious+"BUY[tp]" || OrderComment()==stCurrency+stActual+stPrevious+"SELL[tp]"){FileClose(file);Comment("\n"+"Trade Executed"+OrderTicket());return(0);} } if(stCurrency=="EUR"||stCurrency=="GBP"||stCurrency=="AUD"||stCurrency=="NZD"){double askz=MarketInfo(ordercurrency,MODE_ASK);double point5=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_BUY,lot_pp,askz,3,askz-(risk*point5),askz+(reward*risk*point5),stCurrency+stActual+stPrevious+"BUY",MagicNumber);OrderTime=TimeCurrent();} if(stCurrency=="CHF"||stCurrency=="CAD"||stCurrency=="JPY"||stCurrency=="USD"){double bidz=MarketInfo(ordercurrency,MODE_BID); double point6=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_SELL,lot_pp,bidz,3,bidz+(risk*point6),bidz-(reward*risk*point6),stCurrency+stActual+stPrevious+"SELL",MagicNumber);OrderTime=TimeCurrent();} } if(StringToDouble(stActual)<StringToDouble(stPrevious)) { Alert("Weaker(actual vs previous): "+stCurrency+" "+"Time: "+stTime); int total3=OrdersTotal(); for(cnt=0;cnt<total3;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //check opened orders if(OrderComment()==stCurrency+stActual+stPrevious+"BUY" || OrderComment()==stCurrency+stActual+stPrevious+"SELL"){FileClose(file);Comment("\n"+"Live Trade Open"+OrderTicket());return(0);} } int historytotal3=OrdersHistoryTotal(); for(cnt=0;cnt<historytotal3;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY); //check opened orders if(OrderComment()==stCurrency+stActual+stPrevious+"BUY" || OrderComment()==stCurrency+stActual+stPrevious+"SELL" || OrderComment()==stCurrency+stActual+stPrevious+"BUY[sl]" || OrderComment()==stCurrency+stActual+stPrevious+"SELL[sl]" || OrderComment()==stCurrency+stActual+stPrevious+"BUY[tp]" || OrderComment()==stCurrency+stActual+stPrevious+"SELL[tp]"){FileClose(file);Comment("\n"+"Trade Executed"+OrderTicket());return(0);} } if(stCurrency=="EUR"||stCurrency=="GBP"||stCurrency=="AUD"||stCurrency=="NZD"){double bidx=MarketInfo(ordercurrency,MODE_BID); double point7=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_SELL,lot_pp,bidx,3,bidx+(risk*point7),bidx-(reward*risk*point7),stCurrency+stActual+stPrevious+"BUY",MagicNumber);OrderTime=TimeCurrent();} if(stCurrency=="CHF"||stCurrency=="CAD"||stCurrency=="JPY"||stCurrency=="USD"){double askx=MarketInfo(ordercurrency,MODE_ASK); double point8=MarketInfo(ordercurrency,MODE_POINT);OrderSend(ordercurrency,OP_BUY,lot_pp,askx,3,askx-(risk*point8),askx+(reward*risk*point8),stCurrency+stActual+stPrevious+"SELL",MagicNumber);OrderTime=TimeCurrent();} } FileClose(file); return(0); } //Alert(stDate,stTime,stTimeZone,stCurrency,stDescription,stImportance,stActual,stForecast,stPrevious); FileClose(file); break; } //FileClose(file); i++; } Max = i; //if (file!=-1) FileClose(file);} //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if (TimeCurrent()>LastTimeDownloading+1*60) { DownloadCalendar(); //this function, only downloads the calendar once, to find next event DownloadCal_prior_to_event(); //function to download the calendar, starting from when the news event is released! LastTimeDownloading = TimeCurrent(); CloseOrders(); //function to close orders at a certain time after the order is executed int file=-1; while (file==-1) file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); GrabNews(); FileClose(file); } //FileClose(file); return(0); }
Sample
Analysis
Market Information Used:
Indicator Curves created:
Indicators Used:
Indicator of the average true range
Custom Indicators Used:
kernel32
str2double
Order Management characteristics:
Checks for the total of open orders
It Closes Orders by itself
Checks for the total of closed orders
It automatically opens orders when conditions are reached
Other Features:
Uses files from the file system
It reads information from a file
It issuies visual alerts to the screen