Gravity_expert

Author: Inkov Evgeni
Profit factor:
0.00
Price Data Components
Series array that contains the highest prices of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reached
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
Gravity_expert
ÿþ//+------------------------------------------------------------------+

//|                                               Gravity_expert.mq4 |

//|  =0G. 25/08/2018                                                 |

//+------------------------------------------------------------------+

#property copyright "Inkov Evgeni"

#property link      "ew123@mail.ru"

//+------------------------------------------------------------------+

#property version   "1.00"

#property strict

//+------------------------------------------------------------------+

input double     Lots                 = 0;

input double     Proc_Lot             = 10;

input string     s1_______________="------------------------------------";//------------------------------------

input int        shift_Start          = 20;

input int        TP                   = 240;

input int        SL                   = 480;

input string     s2_______________="------------------------------------";//------------------------------------

input int        Magic                = 12378;

input int        Slippage             = 50;

input string     s4_______________="------------------------------------";//------------------------------------

input bool       Sound                = true;

input color      clr_txt              = clrMagenta;

//+------------------------------------------------------------------+

ENUM_TIMEFRAMES TF=PERIOD_M1;

bool        Risk_from_Balance=true;// true - AG8B05< @8A: >B 10;0=A0, false - >B A2>1.A@54AB2

string      pref="GE_";

double      min_l,max_l;

double      lot,lot_step;

int         mas_ord[6];

int         kol_ord;

int         kol_ord_play,kol_ord_play_pred;

int         stop_level;

bool        out_obj;

int         usl_open_ord;

double      poi;

int    step_net;

int    dig_net;

double urov_Buy;

double urov_Sell;

double urov_start_Buy;

double urov_start_Sell;

bool   find_urov;

//+------------------------------------------------------------------+

int OnInit()

  {

   if(Digits==5 || Digits==3)

     {

      step_net=1000;

      dig_net=3;

     }

   else

     {

      step_net=100;

      dig_net=2;

     }



   find_urov=false;

   kol_ord_play_pred=-1;



   out_obj=true;

   if(IsTesting() && !IsVisualMode())out_obj=false;

//.............................................

   min_l=MarketInfo(Symbol(),MODE_MINLOT);

   max_l=MarketInfo(Symbol(),MODE_MAXLOT);

//.............................................

   lot_step=MarketInfo(Symbol(),MODE_LOTSTEP);

//.............................................

   poi=Point;

   if(ND(poi)==0.0)poi=1.0;

//.............................................

   OnTick();



   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   if(UninitializeReason()==REASON_REMOVE)

     {

      ObjectsDeleteAll(0,pref);

      Comment("");

     }

  }

//+------------------------------------------------------------------+

void OnTick()

  {

   if(Bid==0)return;

//........................................................

   Orders_Total();   // >?@545;8BL, :0:85 >@45@0 2 @K=:5

                     //........................................................

   lot=opred_lot();

//........................................................

   if(!find_urov || ND(Ask)>=ND(urov_Buy) || ND(Bid)<=ND(urov_Sell))

      find_urov=find_urov_start(urov_Buy,urov_Sell,urov_start_Buy,urov_start_Sell);

//...................

   usl_open_ord=find_usl_open_ord(urov_start_Buy,urov_start_Sell);

   if(find_urov && out_obj)

     {

      out_HLine("1",OP_BUY,urov_start_Buy,STYLE_DOT);

      out_HLine("1",OP_SELL,urov_start_Sell,STYLE_DOT);

     }

//........................................................

   if(find_urov) // >B:@KBL/70:@KBL >@45@0

      if(usl_open_ord>0)

        {

         if(mas_ord[OP_BUY]==0 && mas_ord[OP_BUYSTOP]==0)

            if(Open_Buy(lot,urov_Buy))Orders_Total();

        }

   else

   if(usl_open_ord<0)

   if(mas_ord[OP_SELL]==0 && mas_ord[OP_SELLSTOP]==0)

      if(Open_Sell(lot,urov_Sell))Orders_Total();

//........................................................

   if(out_obj)Out_Comm();

  }

//+------------------------------------------------------------------+

void out_HLine(string n,int type,double pr,int st)

  {

   color clr=clrRed;

   string name=pref+"SELL_"+n;

   if(type==OP_BUY)

     {

      clr=clrGreen;

      name=pref+"BUY_"+n;

     }

   ObjectCreate(0,name,OBJ_HLINE,0,0,pr);

   ObjectSet(name,OBJPROP_PRICE1,pr);

   ObjectSet(name,OBJPROP_STYLE,st);

   ObjectSet(name,OBJPROP_WIDTH,1);

   ObjectSet(name,OBJPROP_COLOR,clr);

  }

//---------------------------

bool find_urov_start(double &urov_buy,double &urov_sell,double &urov_st_buy,double &urov_st_sell)

  {

   int cel_urov=find_begin_nul_urov();

   if(cel_urov==0)return(0);

//......................................

   double urov_0=1.0*cel_urov*step_net*poi;



   urov_buy   =1.0*(cel_urov+1)*step_net*poi;

   urov_st_buy=urov_buy-shift_Start*poi;



   urov_sell   =1.0*(cel_urov-1)*step_net*poi;

   urov_st_sell=urov_sell+shift_Start*poi;



   return(1);

  }

//----------------------

int find_begin_nul_urov()

  {   // =09B8 1;8609H89 =C;L-C@>25=L

   int i=0;

   int cel_urov=0;

   for(i=1;i<iBars(NULL,TF);i++)

      if(find_null_level(i,cel_urov))break; // =09B8 ?5@5A5G5=85 A =C;L-C@>2=5<



   return(cel_urov);

  }

//---------------------------

bool find_null_level(int i,int &cel_urov)

  { // =09B8 ?5@5A5G5=85 A =C;L-C@>2=5<

   double lo=ND(iLow (NULL,TF,i));

   double hi=ND(iHigh(NULL,TF,i));



   int cel_l,drob_l;

   int cel_h,drob_h;



   double lo_1=preobr_pr(lo,cel_l,drob_l);

   double hi_1=preobr_pr(hi,cel_h,drob_h);



   if(cel_h==cel_l+1 || (cel_h==cel_l && drob_h>0 && drob_l==0))

     {

      cel_urov=cel_h;

      return(1);

     }



   return(0);

  }

//---------------------------

double preobr_pr(double pr,int &cel,int &drob)

  {  // ?@5>1@07>20BL F5=C 2 F5;CN G0ABL

// A 4@>1=>9 G0ABLN 87 3-E ?>A;54=8E F8D@ (out_pr)

   double out_pr=NormalizeDouble(pr/poi/step_net,dig_net);

   cel=(int)MathFloor(out_pr); // F5;0O G0ABL

   drob=(int)MathRound((out_pr-cel)*step_net); // 3 ?>A;54=85 F8D@K



   return(out_pr);

  }

//--------------------

int find_usl_open_ord(double urov_st_buy,double urov_st_sell)

  {

   if(urov_st_buy >0 && ND(Ask)>=ND(urov_st_buy ))return(1);

   if(urov_st_sell>0 && ND(Bid)<=ND(urov_st_sell))return(-1);



   return(0);

  }

//-----------------------

void Orders_Total()

  {

   kol_ord=0;

   ArrayInitialize(mas_ord,0);



   for(int i=0;i<OrdersTotal();i++)

     {

      if(!Good_ord(i,MODE_TRADES))continue;



      mas_ord[OrderType()]++;

      kol_ord++;

     }

//..........................

   if(Sound)

     {

      kol_ord_play=0;

      for(int i=0;i<OrdersTotal();i++)

        {

         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;

         kol_ord_play++;

        }

      //.............................

      if(kol_ord_play_pred>=0)

         if(kol_ord_play>kol_ord_play_pred)

            PlaySound("connect.wav");

      else

      if(kol_ord_play<kol_ord_play_pred)

         PlaySound("timeout.wav");

      kol_ord_play_pred=kol_ord_play;

     }

  }

//---------------------

double Ogran_min_lot(double lot1)

  {

   if(lot1<min_l)lot1=min_l;

   return(lot1);

  }

//---------------------------------------------------------------

double Ogran_max_lot(double lot1)

  {

   if(lot1>max_l)lot1=max_l;

   return(lot1);

  }

//---------------------------------------------------------------

bool Good_ord(int i,int mode)

  {

   if(!OrderSelect(i,SELECT_BY_POS,mode))return(0);

   if(OrderSymbol()!=Symbol())return(0);

   if(OrderMagicNumber()!=Magic)return(0);



   return(1);

  }

//---------------------------------------------------------------

double ND(double n)

  {

   return(NormalizeDouble(n,Digits));

  }

//---------------------------------------------------------------

double NDL(double n)

  {

   return(MathRound(n/lot_step)*lot_step);

  }

//---------------------------------------------------------------

bool Open_Buy(double l,double urov)

  {

   RefreshRates();

   int tik=ust_order(Symbol(),OP_BUY,NDL(l),ND(Ask),Slippage,ND(Ask-SL*poi),ND(Ask+TP*poi),"",Magic,clrBlue);



   return(tik>0);

  }

//-------------------------------------------

bool Open_Sell(double l,double urov)

  {

   RefreshRates();

   int tik=ust_order(Symbol(),OP_SELL,NDL(l),ND(Bid),Slippage,ND(Bid+SL*poi),ND(Bid-TP*poi),"",Magic,clrRed);



   return(tik>0);

  }

//-------------------------------------------

int ust_order(string sym,int Tip,double lot1,double pr,int slippage,double sl,double tp,string com2,int mag,color col=clrNONE,int dt=0)

  {

   double tek_lot;

   double ust_lot=lot1;

   int tik=0;

   while(ust_lot>0)

     {

      tek_lot=Ogran_max_lot(ust_lot);

      tik=OrderSend(sym,Tip,tek_lot,pr,slippage,sl,tp,com2,mag,dt,col);

      if(tik<0)break;

      ust_lot-=tek_lot;

     }



   return(tik);

  }

//-----------------------------------------------

void Out_Comm()

  {

   string s4="Lot= "+DoubleToStr(lot,2);

   put_txt(pref+"s1",s4,20,20,clr_txt,12);

  }

//----------------------------------

void put_txt(string name,string vol,int X,int Y,color col1,int shr,int corn=1,string font="Arial Black")

  {

   if(ObjectFind(name)<0)ObjectCreate(name,OBJ_LABEL,0,0,0);

   ObjectSet(name,OBJPROP_CORNER,corn);

   ObjectSet(name,OBJPROP_XDISTANCE,X);

   ObjectSet(name,OBJPROP_YDISTANCE,Y);

   ObjectSetText(name,vol,shr,font,col1);

  }

//==================================================

double opred_lot()

  {

   double L=0;

   if(Lots>0) // >?@545;8BLAO A =0G0;L=K< ;>B><

      L=Ogran_min_lot(Lots);

   else

      L=Ogran_min_lot(GetLot(Proc_Lot));

   return(L);

  }

//-------------------------------

double GetLot(double proc)

  {

   double free_magrin;



   if(Risk_from_Balance)

      free_magrin=AccountBalance();

   else

      free_magrin=AccountFreeMargin();



   double lot1=MathFloor(free_magrin*proc/100000.0/lot_step)*lot_step;



   return (lot1);

  }

//---------------------------------------------------------------

Comments