ao2_v1





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                           ao.mq4 |
//|                                       Copyright © 2005, tageiger |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, tageiger aka fxid10t"
#property link      "http://www.metaquotes.net"
#include <WinUser32.mqh>
 
extern int        slip              =2;
extern double     MaximumRisk       =0.02;   //%account balance to risk per position
extern double     DecreaseFactor    =3;      //lot size divisor(reducer) during loss streak   
extern string     comment           ="m ao";
extern int        magic             =1965;

int ticket,b,s,c;

int init(){return(0);}
int deinit(){return(0);}
int start(){

if(!IsTesting()){

if(Period()!=15 && c<=0) {
int ret=MessageBox("The AO expert was designed for 15m\n charts,do you wish to continue?","ao expert advisor",MB_YESNO|MB_ICONQUESTION);
c++;
if(ret==IDNO) return(0);}}

double mafc=iMA(Symbol(),0,5,0,MODE_SMA,PRICE_MEDIAN,0);
double masc=iMA(Symbol(),0,34,0,MODE_SMA,PRICE_MEDIAN,0);
double mafp=iMA(Symbol(),0,5,0,MODE_SMA,PRICE_MEDIAN,1);
double masp=iMA(Symbol(),0,34,0,MODE_SMA,PRICE_MEDIAN,1);


PosCounter();
double aoc=mafc-masc;
double aop=mafp-masp;
//double AO=iCustom(Symbol(),0,"Awesome",0,0,0);

if((aop<aoc)/* && (aop<(0.0000))*/ && b==0) {
   ticket=OrderSend(Symbol(),
                     OP_BUY,
                     LotsOptimized(),
                     Ask,
                     slip,
                     bsl(),
                     0,//tp
                     Period()+comment,
                     magic,
                     0,//OrderExpiration
                     Blue);
                     if(ticket>0)   {
                        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                           {  Print(ticket); }
                        else Print("Error Opening Buy Order: ",GetLastError());
                        return(0);  }}//buy
             
if((aoc<aop)/* && (aop>(0.0000))*/ && s==0) {
   ticket=OrderSend(Symbol(),
                     OP_SELL,
                     LotsOptimized(),
                     Bid,
                     slip,
                     ssl(),
                     0,//tp
                     Period()+comment,
                     magic,
                     0,//OrderExpiration
                     DeepPink);
                     if(ticket>0)   {
                        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                           {  Print(ticket); }
                     else Print("Error Opening Sell Order: ",GetLastError());
                     return(0);  }}//sell

for(int i=0;i<OrdersTotal();i++) {
   OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
   if(OrderSymbol()==Symbol() && OrderComment()==Period()+comment && 
      OrderType()==OP_BUY && (aoc<aop) && (aop>(0.0000)) && OrderProfit()>0)  {
      OrderClose(OrderTicket(),OrderLots(),Bid,slip,Red);}
   if(OrderSymbol()==Symbol() && OrderComment()==Period()+comment && 
      OrderType()==OP_SELL && (aoc>aop) && (aop<(0.0000)) && OrderProfit()>0) {
      OrderClose(OrderTicket(),OrderLots(),Ask,slip,Green);}   }
      
if(!IsTesting()) {Comment("AO Last:",AOC()," ",aoc,"\n"," AO Prev:",AOP()," ",aop);}

return(0);
}
//+------------------------------------------------------------------+
double LotsOptimized()  {
   double lot;
   int    orders=HistoryTotal();
   int    losses=0;
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,2);
   if(DecreaseFactor>0) {
      for(int i=orders-1;i>=0;i--)  {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++; }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,2);   }
   if(lot<0.05) lot=0.05;
return(lot);   }//end LotsOptimized

double bsl()   {
   double Lval;
   Lval=Low[Lowest(Symbol(),0,MODE_LOW,34,0)];
   if(Ask-Lval<Point*150) {Lval=Ask+Point*150;}
   return(Lval);}

double ssl()   {
   double Hval;
   Hval=High[Highest(Symbol(),0,MODE_HIGH,34,0)];
   if(Hval-Bid<Point*150) {Hval=Bid-Point*150;}
   return(Hval);}

void PosCounter() {
   b=0;s=0;
   for(int cnt=0;cnt<=OrdersTotal();cnt++)   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&
         OrderComment()==Period()+comment) {
         if(OrderType() == OP_SELL) s++;
         if(OrderType() == OP_BUY ) b++;}}}

double AOC()   {
return(iMA(Symbol(),0,5,0,MODE_SMA,PRICE_MEDIAN,0)-iMA(Symbol(),0,34,0,MODE_SMA,PRICE_MEDIAN,0));}

double AOP()   {
return(iMA(Symbol(),0,5,0,MODE_SMA,PRICE_MEDIAN,1)-iMA(Symbol(),0,34,0,MODE_SMA,PRICE_MEDIAN,1));}





Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:


Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Checks for the total of open orders
It Closes Orders by itself

Other Features:

It opens Message Boxes to the user