Author: eevviill
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself
Indicators Used
Relative strength index
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
reco
//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "eevviill"
#property link "http://alievtm.blogspot.com/"
#property version "2.2"
#property strict
#property description "M1?"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum po_koefs
  {
   _1=1,/*1*/  _10=10,/*10*/ _100=100,/*100*/ _1000=1000,/*1000*/
  };

extern string oth_set = "///////////////Other settings///////////////////";
extern int Max_orders = 0;
extern int Slippage=0;
extern int Magic=456;
extern string comment="Reco";
extern po_koefs point_multiplier=_10;

extern string sig_set = "///////////////Signal settings///////////////////";
extern int RSI_period = 14;
extern double RSI_sell_zone= 70;
extern double RSI_buy_zone = 30;

extern string lot_set="///////////////Lot settings///////////////////";
extern double Lot=0.01;
extern double Lot_multiplier=2;
extern double max_lot = 0;
extern double min_lot = 0;

extern string dis_set="///////////////Distance settings///////////////////";
extern int start_distance=20;
extern double distance_multiplier=1.5;
extern int max_distance = 0;
extern int min_distance = 0;

extern string prof_set="///////////////Profit/Lose settings///////////////////";
extern bool use_close_profit = true;
extern double profit_1_order = 2;
extern double profit_multiplier=0.7;
extern bool use_close_lose = false;
extern double lose_1_order = 6;
extern double lose_multiplier=1.1;




int Sig_p;
int buys,sells,Orders_Total;
double point=Point*point_multiplier;
int nor_lot=2;
//////////////////////////////////////////////////////////////
int OnInit()
  {

   if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.1) nor_lot=1;



   return(INIT_SUCCEEDED);
  }
////////////////////////////////////
void OnTick()
  {
//close profit
   if(use_close_profit)
     {
      CountOpenedPositions_f();
      if(Profit_f()>=profit_1_order*MathPow(profit_multiplier,Orders_Total-1)) Close_all_f();
     }

//close lose
   if(use_close_lose)
     {
      CountOpenedPositions_f();
      if(Profit_f()<=-(lose_1_order*MathPow(lose_multiplier,Orders_Total-1))) Close_all_f();
     }

//open
   Sig_p=Sig_f();
   if(Sig_p!=0) open_f();

  }
//func
/////////////////////////////////////////////////////////////////////////////////////////////
char Sig_f()
  {
   CountOpenedPositions_f();

   if(Orders_Total==0)
     {
      double rsi=iRSI(Symbol(),0,RSI_period,PRICE_CLOSE,0);
      if(rsi>=RSI_sell_zone) return(-1);
      if(rsi<=RSI_buy_zone) return(1);
     }
   else
     {
      if(Max_orders>0 && Orders_Total>=Max_orders) return(0);

      Select_last_order_f();
      //last buy
      if(OrderType()==OP_BUY)
        {
         double dist=start_distance*point*MathPow(distance_multiplier,Orders_Total-1);
         if(max_distance>0 && dist>max_distance*point) dist=max_distance*point;
         if(min_distance>0 && dist<min_distance*point) dist=min_distance*point;

         if(Bid<=OrderOpenPrice()-dist) return(-1);
        }
      //last sell
      if(OrderType()==OP_SELL)
        {
         double dist=start_distance*point*MathPow(distance_multiplier,Orders_Total-1);
         if(max_distance>0 && dist>max_distance*point) dist=max_distance*point;
         if(min_distance>0 && dist<min_distance*point) dist=min_distance*point;

         if(Ask>=OrderOpenPrice()+dist) return(1);
        }
     }//end else


   return(0);
  }
///////////////////////////////////////////////////////////////////////////////////////////////
void open_f()
  {
///////////// LOT /////////////////
   double Lotss=Lot;
   CountOpenedPositions_f();
   Lotss=Lot*MathPow(Lot_multiplier,Orders_Total);
//user limit
   if(max_lot>0 && Lotss>max_lot) Lotss=max_lot;
   if(min_lot>0 && Lotss<min_lot) Lotss=min_lot;
//broker limit
   double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
   double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
   if(Lotss<Min_Lot) Lotss=Min_Lot;
   if(Lotss>Max_Lot) Lotss=Max_Lot;

//chek free margin
   if(MarketInfo(Symbol(),MODE_MARGINREQUIRED)*Lotss>AccountFreeMargin()) {Alert("Not enouth money to open order "+string(Lotss)+" lots!");return;}



///////////// MAIN /////////////  
   int ticket_op=-1;
   for(int j_op = 0; j_op < 64; j_op++)
     {
      while(IsTradeContextBusy()) Sleep(200);
      RefreshRates();

      if(Sig_p>0) ticket_op=OrderSend(Symbol(),OP_BUY,NormalizeDouble(Lotss,nor_lot),Ask,Slippage,0,0,comment,Magic,0,clrNONE);
      if(Sig_p<0) ticket_op=OrderSend(Symbol(),OP_SELL,NormalizeDouble(Lotss,nor_lot),Bid,Slippage,0,0,comment,Magic,0,clrNONE);

      if(ticket_op>-1)break;
     }


  }
////////////////////////////////////////////////////////////////////////////////////
void CountOpenedPositions_f()
  {
   buys=0;
   sells=0;
   Orders_Total=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==Magic)
           {
            if(OrderSymbol()==Symbol())
              {
               if(OrderType()==OP_BUY)      buys++;
               if(OrderType()==OP_SELL)     sells++;
              }
           }
        }
     }

   Orders_Total=buys+sells;
  }
////////////////////////////////////////////////////////////////////
void Select_last_order_f()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==Magic)
           {
            if(OrderSymbol()==Symbol())
              {
               break;
              }
           }
        }
     }

  }
/////////////////////////////////////////////////////////////////////////////////// 
double Profit_f()
  {
   double prof=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==Magic)
           {
            if(OrderSymbol()==Symbol())
              {
               prof+=OrderProfit()+OrderSwap()+OrderCommission();
              }
           }
        }
     }

   return(prof);
  }
////////////////////////////////////////////////////////////////////////////////
void Close_all_f()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderMagicNumber()==Magic)
           {
            if(OrderSymbol()==Symbol())
              {
               bool ticket_ex=false;
               for(int j_ex=0;j_ex<64; j_ex++)
                 {
                  while(IsTradeContextBusy()) Sleep(200);
                  RefreshRates();

                  if(OrderType()==OP_BUY) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,clrYellow);
                  else
                     if(OrderType()==OP_SELL) ticket_ex=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,clrYellow);
                  else
                     if(OrderType()==OP_SELLSTOP || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_BUYLIMIT) ticket_ex=OrderDelete(OrderTicket(),clrBrown);
                  else
                     break;
                  if(ticket_ex==true)break;
                 }
              }
           }
        }
     }

  } 
//+------------------------------------------------------------------+

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