//+------------------------------------------------------------------+ //| FBCI EA Beta.mq4 | //| Copyright © 2008, MyJunkBiotch | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" // magic number extern int Magic = 12345; extern double TrailingStop = 15; #include #include int GetOrdersCount(int Type = -1) { int count = 0; for(int i = 0; i < OrdersTotal(); i++) { // already closed if(OrderSelect(i, SELECT_BY_POS) == false) continue; // not current symbol if(OrderSymbol() != Symbol()) continue; if(OrderType() == Type || Type == -1) { count++; } } string textfile=StringConcatenate(Symbol(),"_logging.txt"); int logging=FileOpen(textfile,FILE_READ|FILE_WRITE); if(logging>0) { FileSeek(logging, 0, SEEK_END); FileWrite(logging,"---------------------------------------"); FileWrite(logging,"Iteration beginning.."); FileWrite(logging,"---------------------------------------"); if(count==0) { FileWrite(logging,"No open orders for pair.."); FileWrite(logging,"Why not?.."); FileWrite(logging," "); FileClose(logging); logging=0; } else { FileWrite(logging,"Order in progress.."); FileWrite(logging,"What are we doing with this order?.."); FileWrite(logging," "); FileClose(logging); logging=0; } } else { Print("File issue"); } return (count); } int ReturnFirstTicket(int Magic) { // Takes an input of MagicNumber int icnt, itotal, iTicket; itotal=OrdersTotal(); for(icnt=0;icntSMA50normal) { FileWrite(logging,"SMA50 line is below the current price level.."); FileWrite(logging," "); FileClose(logging); logging=0; return(1); } else { FileWrite(logging,"SMA50 line is above the current price level.."); FileWrite(logging," "); FileClose(logging); logging=0; return(2); } } int CheckBars() { double bar0=Close[1]-Open[1]; double bar1=Close[2]-Open[2]; string textfile=StringConcatenate(Symbol(),"_logging.txt"); int logging=FileOpen(textfile,FILE_READ|FILE_WRITE); FileSeek(logging, 0, SEEK_END); if(bar0>0 && bar1>0) { FileWrite(logging,"Two consecutive green bars...Pending close"); FileWrite(logging," "); FileClose(logging); logging=0; return(1); } if(bar0<0 && bar1<0) { FileWrite(logging,"Two consecutive red bars...Pending close"); FileWrite(logging," "); FileClose(logging); logging=0; return(0); } } int CheckCurrency() { //Compensate for pip difference string symbol=Symbol(); if(symbol=="EURJPYm") { return (100); } else { return (10000); } } int FibRetracement(int trend, int factor) { //Check current price //Go back max of 15 bars for min/max double sellmin, // Minimal price buymax; // Maximal price int Quant_Bars=15; string textfile=StringConcatenate(Symbol(),"_logging.txt"); int logging=FileOpen(textfile,FILE_READ|FILE_WRITE); FileSeek(logging, 0, SEEK_END); string numberofbarstotest=StringConcatenate("Number of bars to test ",Quant_Bars); FileWrite(logging,numberofbarstotest); int Ind_max =ArrayMaximum(High,Quant_Bars,1);// Bar index of max. price int Ind_min =ArrayMinimum(Low, Quant_Bars,1);// Bar index of min. price buymax=High[Ind_max]; // Desired max. price sellmin=Low[Ind_min]; // Desired min. price if(trend==1) { double bprice=Ask; //subtract bar price from current price and get pips double bdifference=(buymax - bprice)*factor; if(bprice>buymax) { FileWrite(logging,"Invalid retracement..defaulting to trend TP of 50 pips"); FileWrite(logging," "); FileClose(logging); logging=0; return (50); } else { FileWrite(logging,"Valid retracement..TP set to ",bdifference," pips"); FileWrite(logging," "); FileClose(logging); logging=0; return (bdifference); } } if(trend==2) { double sprice=Bid; double sdifference=(sprice - sellmin)*factor; if(sprice50) { //FileWrite(logging,"Lots out of threshold"); } int bticket=OrderSend(Symbol(),OP_BUY,MLots,Ask,3,0,Ask+TP*Point,"FBCI Buy",Magic,0,Green); if(bticket<1) { int error=GetLastError(); Print("Error = ",ErrorDescription(error)); return; } OrderPrint(); return(0); } void fsell (double MLots, int TP) { //string textfile=StringConcatenate(Symbol(),"_logging.txt"); //string lotsconfirm=StringConcatenate("Lots= ",MLots); //int logging=FileOpen(textfile,FILE_READ || FILE_WRITE); //FileSeek(logging, 0, SEEK_END); //FileWrite(logging,lotsconfirm); if(MLots>50) { //FileWrite(logging,"Lots out of threshold"); } int sticket=OrderSend(Symbol(),OP_SELL,MLots,Bid,3,0,Bid-TP*Point,"FBCI Sell",Magic,0,Red); if(sticket<1) { int error=GetLastError(); Print("Error = ",ErrorDescription(error)); return; } OrderPrint(); return(0); } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- double Margin; Margin = AccountFreeMargin( ) ; double Hasil; double MLots ; Hasil = Margin/10000; //Seeing Max Lots of 50 for IBFX Mini MLots = MathFloor(Hasil); //string textfile=StringConcatenate(Symbol(),"_logging.txt"); //int logging=FileOpen(textfile,FILE_READ|FILE_WRITE); //FileSeek(logging, 0, SEEK_END); //FileWrite(logging,"FBCI Time from BUY Request: ",CheckComment("BUY")); //FileWrite(logging,"FBCI Time from SELL Request: ",CheckComment("SELL")); //FileWrite(logging,"Broker Threshold: ",CheckTime()); //FileWrite(logging,"SMA50 position: ",wherami(GetSL())); //FileWrite(logging," "); //FileClose(logging); //logging=0; if (GetOrdersCount() == 0) { if (CheckComment("BUY") > CheckTime()) { //FileWrite(logging,"Buy Order Set.."); //FileWrite(logging," "); //FileClose(logging); //logging=0; if(wherami(GetSL())==1) { fbuy(MLots,FibRetracement(1,CheckCurrency())); } } else { if(CheckComment("BUY")!=0) { Print("Buy Order Revoked"); } } if (CheckComment("SELL") > CheckTime()) { //FileWrite(logging,"Sell Order Set.."); //FileWrite(logging," "); //FileClose(logging); //logging=0; if(wherami(GetSL())==2) { fsell(MLots,FibRetracement(2,CheckCurrency())); } } else { if(CheckComment("SELL")!=0) { Print("Sell Order Revoked"); } } } if (GetOrdersCount()>0) { int ticket=ReturnFirstTicket(Magic); OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES); if(OrderType()==OP_BUY) { if(Bid0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()GetSL() && Close[1]>GetSL()) { if(CheckBars()==1) { OrderClose(ticket,MLots,Bid,3,Blue); } } if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(ticket,OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } return(0); } //+------------------------------------------------------------------+