FXAnalyser_v6

Author: Copyright � 2006, Renato P. dos Santos
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Indicators Used
Movement directional index
Miscellaneous
It issuies visual alerts to the screenIt plays sound alertsUses files from the file systemIt reads information from a fileIt writes information to file
0 Views
0 Downloads
0 Favorites
FXAnalyser_v6
/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                FXAnalyser_v6.mq4 |
//|                           Copyright © 2006, Renato P. dos Santos |
//|                   inspired on 4xtraderCY's and SchaunRSA's ideas |
//|   http://www.strategybuilderfx.com/forums/showthread.php?t=16086 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Renato P. dos Santos"
#property link "http://www.strategybuilderfx.com/forums/showthread.php?t=16086"

extern double Lots = 0;
extern int StopLoss = 30; 
extern int TakeProfit = 200;
extern int TrailingStop = 30;
extern int PipsGoal = 200;
extern int PipsLoss = 40;
extern int TimeFrame = 5;
extern double RiskLevel = 0.004;
extern bool UseSound = True;

color clOpenBuy = DodgerBlue;
color clModiBuy = DodgerBlue;
color clCloseBuy = DodgerBlue;
color clOpenSell = Red;
color clModiSell = Red;
color clCloseSell = Red;
color clDelete = White;
string Name_Expert = "FXAnalyser_v6";
string NameFileSound = "expert.wav";

int MODE_DIV=0;
int MODE_SLOPE=1;

void deinit() {
   Comment("");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() {

   if (Period()!=TimeFrame) {
      Alert("This advisor works better on the M",TimeFrame," chart"); return(0); }
   if (!ExistPositions()) { if (DayOfWeek()==6 && Hour()>=20) {
       CloseAllTrades(); Comment("weekend"); return(0); }}
   if (!ExistPositions()) { if (Hour()<2 || Hour()>18) { 
       CloseAllTrades(); Comment("bad hours.");  return(0); }}
//   if (!(IsTesting() || IsDemo())) { if (GoalCheck()) { CloseAllTrades(); Comment("goal attained"); PlaySound("applause.wav"); return(0); }}
   if (!(IsTesting() || IsDemo())) { if (LossCheck()) { CloseAllTrades(); Comment("excessive loss!"); PlaySound("alert.wav"); return(0); }}

   if (Bars<100) { Comment("bars less than 100!"); PlaySound("alert.wav"); return(0); }
   if (StopLoss<5) { Alert("wrong StopLoss"); PlaySound("alert.wav"); return(0); }
   if (TakeProfit<2*StopLoss) { Alert("wrong TakeProfit!"); PlaySound("alert.wav"); return(0); }
   if (GetSizeLot()<0.1) { Alert("not enough margin!"); PlaySound("alert.wav"); return(0); }

   int EMADiv_OpenLevel,EMADiv_CloseLevel,EMASlope_OpenLevel,EMASlope_CloseLevel;
   if(StringSubstr(Symbol(),0,6)=="EURUSD") {
      EMADiv_OpenLevel=6;
      EMADiv_CloseLevel=1;
      EMASlope_OpenLevel=6;
      EMASlope_CloseLevel=2;
      }
   if(StringSubstr(Symbol(),0,6)=="USDJPY") {
      EMADiv_OpenLevel=6;
      EMADiv_CloseLevel=1;
      EMASlope_OpenLevel=6;
      EMASlope_CloseLevel=2;
      }
   if(StringSubstr(Symbol(),0,6)=="GBPUSD") {
      EMADiv_OpenLevel=7;
      EMADiv_CloseLevel=1;
      EMASlope_OpenLevel=7;
      EMASlope_CloseLevel=2;
      }
   if(StringSubstr(Symbol(),0,6)=="USDCHF") {
      EMADiv_OpenLevel=6;
      EMADiv_CloseLevel=1;
      EMASlope_OpenLevel=6;
      EMASlope_CloseLevel=2;
      }
   if(EMADiv_OpenLevel==0) { Comment("Incorrect pair!"); PlaySound("alert.wav"); return(0); }


//   Comment(EMADiv_OpenLevel,",",EMASlope_OpenLevel,",",EMASlope_CloseLevel);   
   Comment("Lots = ",GetSizeLot());

   if (!ExistPositions()) {
      if (BuyCondition(EMADiv_OpenLevel,EMASlope_OpenLevel)) {
         double BuyPrice=NormalizeDouble(0.8*High[0]+0.2*Low[0],MarketInfo(Symbol(),MODE_DIGITS)); 
         OpenBuy(Ask);
         return(0);
      }
      if (SellCondition(EMADiv_OpenLevel,EMASlope_OpenLevel)) {
         double SellPrice=NormalizeDouble(0.8*Low[0]+0.2*High[0],MarketInfo(Symbol(),MODE_DIGITS)); 
         OpenSell(Bid);
         return(0);
      }
   }

   TrailingPositionsBuy(TrailingStop,EMADiv_CloseLevel,EMASlope_CloseLevel);
   TrailingPositionsSell(TrailingStop,EMADiv_CloseLevel,EMASlope_CloseLevel);

   return (0);
}

bool ExistPositions() {
   for (int i=0; i<OrdersTotal(); i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       if (OrderSymbol()==Symbol() && OrderComment()==GetCommentForOrder()) return(True);
   } 
   Comment("no open trades");
   return(false);
}

bool BuyCondition(int EMADiv_OpenLevel,int EMASlope_OpenLevel) {
   if (((iCustom(NULL,0,"iFXAnalyser_v6",MODE_DIV,0)>EMADiv_OpenLevel*Point
         && iCustom(NULL,0,"iFXAnalyser_v6",MODE_SLOPE,0)>0)
       || (iCustom(NULL,0,"iFXAnalyser_v6",MODE_SLOPE,0)>EMASlope_OpenLevel*Point 
         && iCustom(NULL,0,"iFXAnalyser_v6",MODE_DIV,0)>0))
       && iADX(NULL,0,4,PRICE_CLOSE,MODE_MAIN,0)>50)
      return(True);
   else
      return(False);
}   

bool SellCondition(int EMADiv_OpenLevel,int EMASlope_OpenLevel) {
   if (((iCustom(NULL,0,"iFXAnalyser_v6",MODE_DIV,0)<-EMADiv_OpenLevel*Point
         && iCustom(NULL,0,"iFXAnalyser_v6",MODE_SLOPE,0)<0)
       || (iCustom(NULL,0,"iFXAnalyser_v6",MODE_SLOPE,0)<-EMASlope_OpenLevel*Point 
         && iCustom(NULL,0,"iFXAnalyser_v6",MODE_DIV,0)<0))
       && iADX(NULL,0,4,PRICE_CLOSE,MODE_MAIN,0)>50)
      return(True);
   else
      return(False);
}   

void OpenBuy(double BuyPrice) { 
   double ldLot = GetSizeLot(); 
   double Slippage = GetSlippage();
   double ldStop = GetStopLossBuy(BuyPrice); 
   double ldTake = GetTakeProfitBuy(BuyPrice); 
   string lsComm = GetCommentForOrder(); 
   OrderSend(Symbol(),OP_BUY,ldLot,BuyPrice,Slippage,ldStop,ldTake,lsComm,0,0,clOpenBuy); 
   if (UseSound) PlaySound(NameFileSound);
} 

void OpenSell(double SellPrice) { 
   double ldLot = GetSizeLot(); 
   double Slippage = GetSlippage();
   double ldStop = GetStopLossSell(SellPrice); 
   double ldTake = GetTakeProfitSell(SellPrice); 
   string lsComm = GetCommentForOrder(); 
   OrderSend(Symbol(),OP_SELL,ldLot,SellPrice,Slippage,ldStop,ldTake,lsComm,0,0,clOpenSell); 
   if (UseSound) PlaySound(NameFileSound); 
} 

void TrailingPositionsBuy(int TrailingStop,int EMADiv_CloseLevel,int EMASlope_CloseLevel) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderComment()==GetCommentForOrder()) { 
            if (OrderType()==OP_BUY) { 
               if (CloseBuyCondition(EMADiv_CloseLevel,EMASlope_CloseLevel))
                  OrderClose(OrderTicket(),OrderLots(),Bid,GetSlippage(),clCloseBuy);
               if (Bid-OrderOpenPrice()>TrailingStop*Point && OrderOpenPrice()>OrderStopLoss()) 
                  ModifyStopLoss(OrderOpenPrice(),clModiBuy); 
               if (Bid-OrderOpenPrice()>TrailingStop*Point)  
                  if (OrderStopLoss()<Bid-TrailingStop*Point || OrderStopLoss()==0) 
                     ModifyStopLoss(Bid-TrailingStop*Point,clModiBuy); 
               if (OrderTakeProfit()-Bid<TrailingStop*Point/2) 
                  ModifyStopLoss(Bid-TrailingStop*Point/2,clModiBuy); 
            } 
         } 
      } 
   } 
} 

void TrailingPositionsSell(int trailingStop,int EMADiv_CloseLevel,int EMASlope_CloseLevel) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderComment()==GetCommentForOrder()) { 
            if (OrderType()==OP_SELL) { 
               if (CloseSellCondition(EMADiv_CloseLevel,EMASlope_CloseLevel))
                  OrderClose(OrderTicket(),OrderLots(),Ask,GetSlippage(),clCloseSell);
               if (OrderOpenPrice()-Ask>TrailingStop*Point && OrderOpenPrice()<OrderStopLoss()) 
                  ModifyStopLoss(OrderOpenPrice(),clModiBuy); 
               if (OrderOpenPrice()-Ask>TrailingStop*Point)  
                  if (OrderStopLoss()>Ask+TrailingStop*Point || OrderStopLoss()==0) 
                     ModifyStopLoss(Ask+TrailingStop*Point,clModiBuy); 
               if (Ask-OrderTakeProfit()<TrailingStop*Point/2) 
                  ModifyStopLoss(Ask+TrailingStop*Point/2,clModiSell); 
            } 
         } 
      } 
   } 
} 

void ModifyStopLoss(double ldStopLoss, double clModi) { 
   bool fm;
   fm = OrderModify(OrderTicket(),OrderOpenPrice(),
        ldStopLoss,OrderTakeProfit(),OrderExpiration(),clModi); 
   if (fm && UseSound) PlaySound(NameFileSound); 
} 

bool CloseBuyCondition(int EMADiv_CloseLevel,int EMASlope_CloseLevel) {
   if (iCustom(NULL,0,"iFXAnalyser_v6",MODE_DIV,0)<-EMADiv_CloseLevel*Point)
      return(True);
   else
      return(False);
}   

bool CloseSellCondition(int EMADiv_CloseLevel,int EMASlope_CloseLevel) {
   if (iCustom(NULL,0,"iFXAnalyser_v6",MODE_DIV,0)>EMADiv_CloseLevel*Point)
      return(True);
   else
      return(False);
}   

void CloseAllTrades() {
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderComment()==GetCommentForOrder()) { 
            if (OrderType()==OP_BUY) 
               OrderClose(OrderTicket(),OrderLots(),Bid,GetSlippage(),clCloseBuy);
            if (OrderType()==OP_SELL) 
               OrderClose(OrderTicket(),OrderLots(),Ask,GetSlippage(),clCloseSell);
            if (OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT || 
                OrderType()==OP_BUYSTOP || OrderType()==OP_BUYLIMIT) 
               OrderDelete(OrderTicket());
         }
      }
   }
}

bool GoalCheck() {
   int handle = FileOpen(LogFileName(),FILE_CSV|FILE_READ,";"); 
   if (handle>0) {
      int lsteqty = FileReadNumber(handle);
      FileClose(handle);
   }
   else lsteqty = 0;
   if (lsteqty==0) {  
     handle = FileOpen(LogFileName(),FILE_CSV|FILE_WRITE,";"); 
     FileWrite(handle,AccountEquity()); 
     FileClose(handle);
   }
   else if (AccountEquity()-lsteqty>=PipsGoal*GetSizeLot()) return(True);
        else return(False); 
}

bool LossCheck() {
   int handle = FileOpen(LogFileName(),FILE_CSV|FILE_READ,";"); 
   if (handle>0) {
      int lsteqty = FileReadNumber(handle);
      FileClose(handle);
   }
   else lsteqty = 0;
   if (lsteqty-AccountEquity()>=PipsLoss*GetSizeLot()) return(True);
   else return(False); 
}

string LogFileName() {
    string stryear = DoubleToStr(Year(),0);
    string strmonth = DoubleToStr(Month(),0);
    if (StringLen(strmonth)<2) strmonth = "0"+strmonth;
    string strday = DoubleToStr(Day(),0);
    if (StringLen(strday)<2) strday = "0"+strday;
    return(stryear+strmonth+strday+".log");
}

string GetCommentForOrder() { return(Name_Expert); } 
double GetSizeLot() { if (IsTesting() || IsDemo()) return(1); 
                      else if (Lots > 0) return(Lots); 
                           else return(NormalizeDouble(AccountFreeMargin()/StopLoss*RiskLevel,1)); } 
double GetSlippage() { return((Ask-Bid)/Point); }
double GetStopLossBuy(double BuyPrice) { if (StopLoss==0) return(0); else return(BuyPrice-StopLoss*Point); } 
double GetStopLossSell(double SellPrice) { if (StopLoss==0) return(0); else return(SellPrice+StopLoss*Point); } 
double GetTakeProfitBuy(double BuyPrice) { if (TakeProfit==0) return(0); else return(BuyPrice+TakeProfit*Point); } 
double GetTakeProfitSell(double SellPrice) { if (TakeProfit==0) return(0); else return(SellPrice-TakeProfit*Point); } 


´Ó­7Ó½vß^9ó}z

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