//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2012, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
enum po_multips
{
_1=1,_10=10,_100=100,_1000=1000
};
extern string emp0="Lots and Stops settings/";
extern double Lot=0.01;
extern bool use_percent_of_deposit=false;
extern double percent_of_deposit=1;
extern bool use_martini_on_opened_order=true;
extern double Lot_add_opened=0.01;
extern int StopLoss=0;
extern int TakeProfit=0;
extern bool use_auto_tp=true;
extern string emp1="Profitmultipsettings/";
extern bool use_profitAll_multip=false;
extern double profitAll_multip=15;
extern string emp11="Virtual_SL_TP/";
extern bool use_Virtual_Stops=false;
extern int v_StopLoss=42;
extern int v_TakeProfit=28;
extern string emp2="Additionalsettings/";
extern int Max_orders=1000;
extern po_multips point_multip=_10;
extern bool use_reverse_enter_way=false;
extern bool use_opposite_signal_to_exit=true;
extern int Slippage=2;
extern int Magic=74335;
extern string comment="Shabl";
int MaxAttempts=64;
double pause_if_busy=0.2;
extern string emp3="//Work time settings/";
extern bool Use_work_time=false;
extern string start_time_1= "08:00";
extern string stop_time_1 = "16:00";
extern string start_time_2= "";
extern string stop_time_2 = "";
extern string start_time_3= "";
extern string stop_time_3 = "";
extern string emp4="//Martini";
extern bool use_martini=false;
extern double CloseProfit=22;
extern double CloseLose=47;
extern double Lot_multip=1.6;
extern uint step=40;
extern string emp5="//Martini on closed order//";
extern bool use_martini_on_lose_order=false;
extern double Lose_to_on_martini=0;
extern bool use_martini_on_SL=false;
extern double Lot_multip_closed=2.2;
extern string emp6="//BreakEven";
extern bool use_breakEven=false;
extern int breakEven_level= 8;
extern int breakEven_Size = 1;
extern string emp7="//Trailing stop/";
extern bool use_traling_stop=false;
extern int TrailingStart=0;
extern int TrailingStop = 20;
extern int TrailingStep =10;
extern string emp8="";
extern string ind1_name="x_3_semafor";
extern int period1 = 5;
extern int period2 = 12;
extern int period3 = 23;
extern double devi1 = 1.3;
extern double devi2 = 1.3;
extern double devi3 = 1.3;
extern string emp9="/NEWS settings//";
extern bool use_news=false;
extern int no_trade_before_news_minutes= 30;
extern int no_trade_after_news_minutes = 30;
extern int ShowEventsNum=6;
extern bool ReportAllPairs= true;
extern bool IncludeHigh= true;
extern bool IncludeMedium = true;
extern bool IncludeLow = false;
extern bool IncludeSpeaks = true;
extern bool SkipSameNews_Pair_Time_Impact=false;
extern int old_news_time_minute_stay=5;
extern int refresh_minutes=4;
extern bool draw_news=true;
extern int TxtSize=7;
extern color TxtColorOldNews = clrGray;
extern color TxtColorImpactHigh = clrRed;
extern color TxtColorImpactMed = clrOrange;
extern color TxtColorImpactLow = clrKhaki;
extern ENUM_BASE_CORNER TxtCorner=CORNER_LEFT_LOWER;
extern string TxtFont="Arial Bold";
extern int X=10;
extern int Y_start= 10;
extern int Y_step = 13;
extern string site= "http://www.forexfactory.com/ffcal_week_this.xml";
#define TITLE 0
#define COUNTRY 1
#define DATE 2
#define TIME 3
#define IMPACT 4
#define FORECAST 5
#define PREVIOUS 6
#define EVENTMAX 256
datetime mainDataGMT[EVENTMAX];
string mainData[EVENTMAX][7];
//string sTags[7] = { "
", "", "", "", "]]>", "]]>", "]]>", "]]>", "]]>" };
string sTags[7] = { "", "", "", "", "", "", "", "", "", "" };
string identif="mFFCal_evi";
int cou=0;
datetime time_PC;
bool News_ok=true;
datetime last_update_time;
datetime news_times_id[];
//demo
bool use_demo=false;
int buys_,sells_,buys_S,sells_S,buys_L,sells_L,Orders_Total;
int Sig_en;
double point=Point*point_multip;
int nor_lot=2;
int CC;
int prevbars;
double prev_bid;
datetime last_buy_time;
datetime last_sell_time;
//
int OnInit()
{
prevbars=Bars;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) nor_lot=1;
//martini-other off
if(use_martini) {use_breakEven=false;use_traling_stop=false;use_percent_of_deposit=false;use_opposite_signal_to_exit=false;}
//offline chart
if(ChartGetInteger(0,CHART_IS_OFFLINE))
{
prev_bid=Close[0];
while(!IsStopped())
{
RefreshRates();
if(prev_bid!=Close[0]) {prev_bid=Close[0];OnTick();}
Sleep(100);
}
}//end offline chart
if(use_news)
{
EventSetTimer(1);
ArrayResize(news_times_id,ShowEventsNum);
last_update_time=0;
delete_prev_objects_f();
}
return(INIT_SUCCEEDED);
}
//
void OnDeinit(const int reason)
{
delete_prev_objects_f();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTimer()
{
time_PC=TimeLocal();
//no bars
if(Bars<20) return;
//trading is not allowed
if(!IsTradeAllowed() || !IsTradeAllowed(Symbol(),TimeCurrent())) return;
//update news
news_update_f();
//sig
News_ok=News_ok_f();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
//no bars
if(Bars<20) return;
//trading is not allowed
if(!IsTradeAllowed() || !IsTradeAllowed(Symbol(),TimeCurrent())) return;
//martini
if(use_martini)
{
martini_f();
double prof=Profit_f();
if((CloseProfit!=0 && prof>=CloseProfit) || (CloseLose!=0 && prof<=-CloseLose)) Close_all_f();
}
//trailing
if(use_traling_stop) Traling_Stop_f();
//breakeven
if(use_breakEven) BreakEven_f();
//SL && TP
if(StopLoss!=0 || TakeProfit!=0) SL_TP_f();
//
if(use_auto_tp) tp_prev_f();
//virtual stops
if(use_Virtual_Stops) Virtual_stops_chek_f();
//signal to enter
Sig_en=Sig_f();
//revers
if(use_reverse_enter_way)
{
if(Sig_en==1) Sig_en=-1;
else
if(Sig_en==-1) Sig_en=1;
}
//exit
if(use_opposite_signal_to_exit && Sig_en!=0) close_f();
//exit2
if(use_profitAll_multip)
{
if(Profit_f()>=Lots_Total_f()*profitAll_multip) Close_all_f();
}
//time filter
if(Use_work_time && !work_time_f()) return;
//enter
if(Sig_en!=0) open_f();
//new bar
if(Bars==prevbars) return;
prevbars=Bars;
//exit3
if(Profit_f()>0) Close_all_f();
}
//func
char Sig_f()
{
//indicators
double up=iCustom(Symbol(),PERIOD_CURRENT,ind1_name,period1,period2,period3,devi1,devi2,devi3,4,CC);
double down=iCustom(Symbol(),PERIOD_CURRENT,ind1_name,period1,period2,period3,devi1,devi2,devi3,5,CC);
//signal buy
if(up!=0 && last_buy_time!=Time[0]) return(1);
if(down!=0 && last_sell_time!=Time[0]) return(-1);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void open_f()
{
//max orders
CountOpenedPositions_f();
if(Orders_Total>=Max_orders) return;
//news
if(!News_ok) return;
double Lotss=Lot;
//lot from % of depo
if(use_percent_of_deposit) Lotss=GetLot_f();
//martini on last order
if(use_martini_on_lose_order) Lotss=chek_prev_order_f();
//martini on opened order
if(use_martini_on_opened_order) Lotss=Lot*(Orders_Total+1);
//chek lots correct
if(Lotss>MarketInfo(Symbol(),MODE_MAXLOT)) Lotss=MarketInfo(Symbol(),MODE_MAXLOT);
if(LotssAccountFreeMargin()) {Alert("Not enouth money to open order "+string(Lotss)+" lots!");return;}
Lotss=NormalizeDouble(Lotss,nor_lot);
int ticket_op=-1;
for(int j_op = 0; j_op < MaxAttempts; j_op++)
{
while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
RefreshRates();
if(Sig_en>0) ticket_op=OrderSend(Symbol(),OP_BUY,Lotss,Ask,Slippage,0,0,comment,Magic,0,clrNONE);
else
if(Sig_en<0) ticket_op=OrderSend(Symbol(),OP_SELL,Lotss,Bid,Slippage,0,0,comment,Magic,0,clrNONE);
else
break;
if(ticket_op>-1)
{
if(Sig_en>0) last_buy_time=Time[0];
if(Sig_en<0) last_sell_time=Time[0];
break;
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void close_f()
{
int type;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
bool ticket_ex=false;
for(int j_ex=0;j_ex0) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE);
else
break;
if(ticket_ex==true)break;
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double GetLot_f()
{
double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Loto=MathFloor(Free*percent_of_deposit/100/One_Lot/Step)*Step;
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
if(LotoMax_Lot) Loto=Max_Lot;
return(NormalizeDouble(Loto,nor_lot));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void BreakEven_f()
{
int type;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
RefreshRates();
if(type==OP_BUY)
{
if(Bid>=OrderOpenPrice()+breakEven_level*point && (OrderStopLoss()OrderOpenPrice() || OrderStopLoss()==0))
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-NormalizeDouble(breakEven_Size*point,Digits),OrderTakeProfit(),0,clrNONE)) continue;
}
}
}
}
//
void tp_prev_f()
{
int type;
double prev_price=-1;
double prev_tp=-1;
bool first=false;
for(int i=0; i=prev_price && OrderTakeProfit()prev_tp)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),prev_tp,0,clrNONE)) continue;
}
}
}
prev_price=OrderOpenPrice();
prev_tp=OrderTakeProfit();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Traling_Stop_f()
{
int type;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
if(type==OP_BUY)
{
if(Bid>=NormalizeDouble(OrderOpenPrice()+TrailingStart*point+TrailingStop*point,Digits))
{
if(NormalizeDouble(OrderStopLoss(),Digits)NormalizeDouble(Ask+(TrailingStop+TrailingStep)*point,Digits)) || OrderStopLoss()==0)
{
if(NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(Ask+TrailingStop*point,Digits))
{
while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
RefreshRates();
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+TrailingStop*point,Digits),OrderTakeProfit(),0,clrNONE)) continue;
}
}
}
}
}
}
//
void martini_f()
{
CountOpenedPositions_f();
int order_type=-1;
//!83=0; =0 2E>4
Sig_en=Sig_f();
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
order_type=OrderType();
break;
}
if(order_type==OP_BUY)
{
//
if(Ask<=OrderOpenPrice()-step*point)
{
int ticket_op_m=-1;
for(int j_op_b=0; j_op_b0 && buys_>0) ticket_op_m=OrderSend(Symbol(),OP_BUY,NormalizeDouble(OrderLots()*Lot_multip,nor_lot),Ask,Slippage,0,0,comment,Magic,0,clrNONE);
else
break;
if(ticket_op_m>-1)break;
}
}
}
if(order_type==OP_SELL)
{
if(Bid>=OrderOpenPrice()+step*point)
{
ticket_op_m=-1;
for(int j_op_s=0; j_op_s0) ticket_op_m=OrderSend(Symbol(),OP_SELL,NormalizeDouble(OrderLots()*Lot_multip,nor_lot),Bid,Slippage,0,0,comment,Magic,0,clrNONE);
else
break;
if(ticket_op_m>-1)break;
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Profit_f()
{
double prof=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
prof+=OrderProfit()+OrderSwap()+OrderCommission();
}
return(prof);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lots_Total_f()
{
double loto=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
loto+=OrderLots();
}
return(loto);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CountOpenedPositions_f()
{
buys_=0;
sells_=0;
buys_S=0;
sells_S=0;
buys_L=0;
sells_L=0;
Orders_Total=0;
int type=-1;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
if(type==OP_BUY) buys_++;
else
if(type==OP_SELL) sells_++;
else
if(type==OP_BUYSTOP) buys_S++;
else
if(type==OP_SELLSTOP) sells_S++;
else
if(type==OP_BUYLIMIT) buys_L++;
else
if(type==OP_SELLLIMIT) sells_L++;
}
Orders_Total=buys_+sells_+buys_S+sells_S+buys_L+sells_L;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Close_all_f()
{
int type;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
bool ticket_ex=false;
for(int j_ex=0;j_ex=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
RefreshRates();
if(type==OP_BUY)
{
modify_price_SL=OrderOpenPrice()-StopLoss*point;
if(StopLoss==0) modify_price_SL=OrderStopLoss();
modify_price_TP=OrderOpenPrice()+TakeProfit*point;
if(TakeProfit==0) modify_price_TP=OrderTakeProfit();
if(((StopLoss>0 && OrderStopLoss()==0) || StopLoss==0)
&& ((TakeProfit>0 && OrderTakeProfit()==0) || TakeProfit==0))
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(modify_price_SL,Digits),NormalizeDouble(modify_price_TP,Digits),0,clrNONE)) continue;
else
if(OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrNONE)) {Alert("Order "+string(OrderTicket())+" closed via stops are out of price!");continue;}
}
if(type==OP_SELL)
{
modify_price_SL=OrderOpenPrice()+StopLoss*point;
if(StopLoss==0) modify_price_SL=OrderStopLoss();
modify_price_TP=OrderOpenPrice()-TakeProfit*point;
if(TakeProfit==0) modify_price_TP=OrderTakeProfit();
if(((StopLoss>0 && OrderStopLoss()==0) || StopLoss==0)
&& ((TakeProfit>0 && OrderTakeProfit()==0) || TakeProfit==0))
if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(modify_price_SL,Digits),NormalizeDouble(modify_price_TP,Digits),0,clrNONE)) continue;
else
if(OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE)) {Alert("Order "+string(OrderTicket())+" closed via stops are out of price!");continue;}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Virtual_stops_chek_f()
{
int type;
bool ticket_ex;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
ticket_ex=false;
for(int j_ex=0;j_ex=OrderOpenPrice()+v_TakeProfit*point || Bid<=OrderOpenPrice()-v_StopLoss*point)) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrNONE);
else
if(type==OP_SELL && (Ask<=OrderOpenPrice()-v_TakeProfit*point || Ask>=OrderOpenPrice()+v_StopLoss*point)) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrNONE);
else
break;
if(ticket_ex==true)break;
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double chek_prev_order_f()
{
double lt=Lot;
int type;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
type=OrderType();
if(type==OP_SELL)
{
if((!use_martini_on_SL && OrderProfit()+OrderSwap()+OrderCommission()<=-Lose_to_on_martini) || (use_martini_on_SL && OrderClosePrice()>=OrderStopLoss()))
lt=OrderLots()*Lot_multip_closed;
break;
}
if(type==OP_BUY)
{
if((!use_martini_on_SL && OrderProfit()+OrderSwap()+OrderCommission()<=-Lose_to_on_martini) || (use_martini_on_SL && OrderClosePrice()<=OrderStopLoss()))
lt=OrderLots()*Lot_multip_closed;
break;
}
}
return(NormalizeDouble(lt,nor_lot));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool work_time_f()
{
string TC_s=TimeToString(TimeCurrent(),TIME_MINUTES);
if(
(start_time_1+stop_time_1=="" || ((start_time_1=stop_time_1)) || (start_time_1>stop_time_1 && (TC_s=stop_time_1))))
&& (start_time_2+stop_time_2=="" || ((start_time_2=stop_time_2)) || (start_time_2>stop_time_2 && (TC_s=stop_time_2))))
&& (start_time_3+stop_time_3=="" || ((start_time_3=stop_time_3)) || (start_time_3>stop_time_3 && (TC_s=stop_time_3))))
) return(false);
return (true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool News_ok_f()
{
datetime news1_time=news_times_id[0];
if(time_PCnews1_time+no_trade_after_news_minutes*60) return(true);
return(false);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void news_update_f()
{
if(time_PC-last_update_time=time_loca-old_news_time_minute_stay*60) break;
}
//draw
delete_prev_objects_f();
cou=0;
int Y=Y_start;
for(int i=x;i=ShowEventsNum) break;
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OutputToChartTextOneLine(int id,int curY)
{
datetime CurrentGMT=TimeGMT();
datetime timeLoca=time_PC;
string title = mainData[id][TITLE];
string country = mainData[id][COUNTRY];
string impact = mainData[id][IMPACT];
string forecast = mainData[id][FORECAST];
string previous = mainData[id][PREVIOUS];
string times=TimeToStr(mainDataGMT[id]+(timeLoca-CurrentGMT),TIME_MINUTES);
if(mainDataGMT[id]-TimeGMTOffset()>=iTime(Symbol(),PERIOD_D1,0)+60*60*24)
{
times = TimeToStr( mainDataGMT[id] + ( timeLoca - CurrentGMT ), TIME_DATE | TIME_MINUTES );
times = StringSubstr( times, 0 );
}
color TxtColorNews_=clrNONE;
if( impact == "High" ) TxtColorNews_ = TxtColorImpactHigh;
if( impact == "Low" ) TxtColorNews_ = TxtColorImpactLow;
if( impact == "Medium" ) TxtColorNews_ = TxtColorImpactMed;
if(mainDataGMT[id]+(timeLoca-CurrentGMT)0 && mainDataGMT[id]==mainDataGMT[id-1] && mainData[id][COUNTRY]==mainData[id-1][COUNTRY] && mainData[id][IMPACT]==mainData[id-1][IMPACT]) return;
news_times_id[cou]=StringToTime(times); //news times in buff
cou++;
if(draw_news)
{
string name=identif+string(cou);
if(ObjectFind(name)==-1)
{
ObjectCreate(0,name,OBJ_LABEL,0,0,0);
ObjectSetInteger(0,name,OBJPROP_CORNER,TxtCorner);
ObjectSetInteger(0,name,OBJPROP_XDISTANCE,X);
ObjectSetInteger(0,name,OBJPROP_YDISTANCE,curY);
ObjectSetInteger(0,name,OBJPROP_FONTSIZE,TxtSize);
ObjectSetInteger(0,name,OBJPROP_COLOR,TxtColorNews_);
ObjectSetString(0,name,OBJPROP_FONT,TxtFont);
ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER);
ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
ObjectSetInteger(0,name,OBJPROP_ZORDER,false);
ObjectSetString(0,name,OBJPROP_TEXT,times+" "+country+" "+title+MakeForecastPreviousTEXT(forecast,previous));
}
}
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int ParseXML(string sData)
{
//Print("Parse XML");
// Get the currency pair, and split it into the two countries
string pair=Symbol();
string cntry1 = StringSubstr( pair, 0, 3 );
string cntry2 = StringSubstr( pair, 3, 3 );
// -------------------------------------------------
// Parse the XML file looking for an event to report
// -------------------------------------------------
int newsIdx = 0;
int BoEvent = 0;
int begin,next,end;
string PrevNewsTime="";
while(newsIdx",BoEvent);
if(BoEvent==-1) break;
BoEvent+=7;
next=StringFind(sData,"",BoEvent);
if(next==-1) break;
string myEvent=StringSubstr(sData,BoEvent,next-BoEvent);
BoEvent=next;
begin=0;
bool skip=false;
for(int i=0; i<7; i++)
{
mainData[newsIdx][i]="";
next=StringFind(myEvent,sTags[i],begin);
// Within this event, if tag not found, then it must be missing; skip it
if(next==-1)
continue;
else
{
// We must have found the sTag okay...
begin = next + StringLen( sTags[i] ); // Advance past the start tag
end = StringFind( myEvent,eTags[i],begin ); // Find start of end tag
if(end>begin && end!=-1)
{
// Get data between start and end tag
//mainData[newsIdx][i] = StringSubstr(myEvent, begin, end - begin);
// Get data between start and end tag
mainData[newsIdx][i]=StringSubstr(myEvent,begin,end-begin);
//check for CDATA tag - added by euclid
if(StringSubstr(mainData[newsIdx][i],0,9)==""+StringSubstr(mainData[newsIdx][i],4);
}
//also needs to check for HTML entities here... (euclid)
}
}
}
// = - = = - = = - = = - = = - = = - = = - = = - = = - = = - =
// Test against filters that define whether we want to
// skip this particular annoucement
if(cntry1!=mainData[newsIdx][COUNTRY] && cntry2!=mainData[newsIdx][COUNTRY] &&
(!ReportAllPairs))
skip=true;
if( !IncludeHigh && mainData[newsIdx][IMPACT] == "High" ) skip = true;
if( !IncludeMedium && mainData[newsIdx][IMPACT] == "Medium" ) skip = true;
if( !IncludeLow && mainData[newsIdx][IMPACT] == "Low" ) skip = true;
if(mainData[newsIdx][IMPACT]=="Holiday") skip=true;
if(!IncludeSpeaks && (StringFind(mainData[newsIdx][TITLE],"speaks")!=-1 ||
StringFind(mainData[newsIdx][TITLE],"Speaks")!=-1))
skip=true;
if(mainData[newsIdx][TIME]=="All Day" ||
mainData[newsIdx][TIME] == "Tentative" ||
mainData[newsIdx][TIME] == "" )
skip=true;
//if( SkipSameTimeNews && PrevNewsTime == mainData[newsIdx][DATE] + mainData[newsIdx][TIME] )
//skip = true;
PrevNewsTime=mainData[newsIdx][DATE]+mainData[newsIdx][TIME];
// = - = = - = = - = = - = = - = = - = = - = = - = = - = = - =
// If not skipping this event, then log it into the draw buffers
if(!skip)
{
mainDataGMT[newsIdx]=StrToTime(MakeDateTime(mainData[newsIdx][DATE],mainData[newsIdx][TIME]));
newsIdx++;
} else {
// delete skipped data.
mainData[newsIdx][TITLE]="";
}
}//while
return( newsIdx );
}
//=================================================================================================
string MakeForecastPreviousTEXT(string f,string p)
{
if( StringLen( f ) == 0 && StringLen( p ) == 0 ) return( "" );
if( StringLen( f ) > 0 && StringLen( p ) == 0 ) return( " (" + f + "/-.-)" );
if( StringLen( f ) == 0 && StringLen( p ) > 0 ) return( " (-.-/" + p + ")" );
return( " (" + f + "/" + p + ")" );
}
//=================================================================================================
string MakeDateTime(string strDate,string strTime)
{
// Print("Converting Forex Factory Time into Metatrader time..."); //added by MN
// Converts forexfactory time & date into yyyy.mm.dd hh:mm
int n1stDash = StringFind( strDate, "-" );
int n2ndDash = StringFind( strDate, "-", n1stDash + 1 );
string strMonth=StringSubstr(strDate,0,2);
string strDay=StringSubstr(strDate,3,2);
string strYear=StringSubstr(strDate,6,4);
// strYear = "20" + strYear;
int nTimeColonPos=StringFind(strTime,":");
string strHour=StringSubstr(strTime,0,nTimeColonPos);
string strMinute= StringSubstr(strTime,nTimeColonPos+1,2);
string strAM_PM = StringSubstr(strTime,StringLen(strTime)-2);
int nHour24=StrToInteger(strHour);
if((strAM_PM == "pm" || strAM_PM == "PM") && nHour24 != 12) {nHour24 += 12;}
if((strAM_PM == "am" || strAM_PM == "AM") && nHour24 == 12) {nHour24 = 0;}
string strHourPad="";
if(nHour24<10)
strHourPad="0";
return( StringConcatenate( strYear, ".", strMonth, ".", strDay, " ", strHourPad, nHour24, ":", strMinute ) );
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void delete_prev_objects_f()
{
string name_delete;
for(int i=ObjectsTotal()-1;i>=0;i--)
{
name_delete=ObjectName(i);
if(StringFind(name_delete,identif)!=-1) ObjectDelete(name_delete);
}
}
//+------------------------------------------------------------------+