Author: 2SI-08 Rudenko
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself It automatically opens orders when conditions are reached
Indicators Used
Stochastic oscillatorParabolic Stop and Reverse system
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
macd_v3
//+-------------------------------------------------------------------------+
//|                       		                                     Курсач.mq4 |
//|                     Copyright © 2011, MetaQuotes Software Corp. |
//|                                             		   2SI-08 Rudenko |
//|	                                          http://www.metaquotes.net |
//+-------------------------------------------------------------------------+
#property strict
#property copyright "2SI-08 Rudenko"
#property link      "http://www.metaquotes.net"

/*
1	GBPUSD, 4h	Виконує купівлю при перетині осцилятора Стохастики(17, 9) знизу догори в 25% зоні.
- депозит 1000$;
- 0.1 лот;
- комісія 0 за лот;
- спред відповідно до інструмента;
- модель тестування OHLC points (fast).

double iStochastic( string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method, int price_field, int mode, int shift)
Расчет Stochastic Oscillator.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
%Kperiod - Период(количество баров) для вычисления линии %K.
%Dperiod - Период усреднения для вычисления линии %D.
slowing - Значение замедления.
method - Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).
price_field - Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close.
mode - Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). 
*/
extern double Distance= 0.0001;

extern double SL=50,TP=50,Level=50,TRAILING=10;
//extern double LOTS=0.1;
int profitOrders = 0, ordersTotal = 0;
double percents;


extern double startLot=0.01;
extern int Sl_Tp_level=50;
double Lot;
double account;
bool isOp=false;
int ticket;


void Size(bool isProfit)
{	
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);
   double minPrice=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
   Lot=startLot;
   if(isProfit)
   {
      if(Lot*2*minPrice>AccountFreeMargin())
      {  
         Lot*=2;
         Comment("Profit. Cannot double lot because of lack of money. Current Lot ",Lot);//Comment("The current volume of operations is ",Lot);  
      }
      else
      {
         if(Lot<=MarketInfo(Symbol(),MODE_MAXLOT)&&GetLastError()!=131)
            Lot=minLot;
         Comment("Profit. Lot doubled. Current Lot ",Lot);
      }
   }
   else
   {
      Lot=startLot;
      if(Lot*minPrice>AccountFreeMargin())
      {
        if(minLot*minPrice>AccountFreeMargin())
        {
            Lot=0;
            Comment("Loss. There is no money for minimal lot. Current Lot ",Lot); 
        }
        else
         {
            Lot=minLot;
            Comment("Loss. Lot returned to its minimal size. Current Lot ",Lot);
         }
      }
      else
      {
         Comment("Loss. Lot returned to its starting size. Current Lot ",Lot);
      }
   }
}


//--------------------------------------------------------
void ParabolStop()
{
double StopCurrent=0;
   double StopRequired=0;
   double StopAllowed=0;
   double Spread=0;
   double Minimum_Distance=0;
   
   Spread=MarketInfo(Symbol(), MODE_SPREAD)*Point;
   Minimum_Distance=MarketInfo(Symbol(), MODE_STOPLEVEL)*Point;
   
    for(int i=0;i<OrdersTotal();i++)
      {
       if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==FALSE) break;
       if (OrderSymbol()==Symbol())
         {
          StopCurrent=OrderStopLoss();
          if ((OrderType()==OP_BUY) && (Close[0]>iSAR(NULL,0,0.02,0.2,0)))
            {
             StopRequired=iSAR(NULL,0,0.02,0.2,0)-Distance;
             StopAllowed=Close[0]-Minimum_Distance;
             if (StopAllowed < StopRequired) StopRequired=StopAllowed;
             if ((StopRequired > StopCurrent) && (StopRequired >= OrderOpenPrice()))
               OrderModify(OrderTicket(),OrderOpenPrice(),StopRequired,OrderTakeProfit(),0);            
            }
          if ((OrderType()==OP_SELL) && (Close[0]<iSAR(NULL,0,0.02,0.2,0)))
            {
             StopRequired=iSAR(NULL,0,0.02,0.2,0)+Spread+Distance;
             StopAllowed=Close[0]+Spread+Minimum_Distance;
             if (StopAllowed > StopRequired) StopRequired=StopAllowed;
             if (((StopRequired < StopCurrent) || (StopCurrent == 0)) && (StopRequired <= OrderOpenPrice()))
               OrderModify(OrderTicket(),OrderOpenPrice(),StopRequired,OrderTakeProfit(),0);
            }
         }
      }
}

int init()
{
  Lot=startLot;
  Comment("The starting volume of operations is ",Lot);
  return(0);

   return(0);
}

int deinit()
{
   return(0);
}

bool ok()
{
   if(OrdersTotal()>0){return (false);}
   if(iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_MAIN, 0)>iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_SIGNAL, 0) 
   && iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_MAIN, 1)<=iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_SIGNAL, 1) 
   && iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_SIGNAL, 0)<25)
   {
        Alert("Good market situation for open position");
         Alert("Level=",Level, " SL=",SL," TP=",TP);
         return(true);
   }
   return(false);
}

bool obr()
{
   if(iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_MAIN, 0)<=iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_SIGNAL, 0) 
   && iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_MAIN, 1)>iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_SIGNAL, 1)
   && iStochastic(Symbol(), 0, 17, 9, 3, MODE_SMA, 0, MODE_SIGNAL, 0)>75)
   {
        Alert("Good market situation for closing position");
         Alert("Level=",Level, "\tSL=",SL,"\tTP=",TP);
         return(true);
   }
   return(false);
}

int start()
{
   if (Symbol() != "GBPUSD")
   {
      Alert("This expert works only with GBPUSD");
      return(0);
   }
   
   if (Period()!=PERIOD_H4)
   {  
      Alert("This expert for h4 period only!");
      return(0);
   }
   if (AccountFreeMargin()<120)
   {
      Alert("You must have more then 120 FreeMargin!");
      return(0);
   } 
   if (Bars < 100)
   {
      Alert("Must be more then 100 bars!!!");
      return(0);
   }
   GlobalVariableSet( "vGrafEquity" , AccountEquity());
   GlobalVariableSet( "vGrafBalance" , AccountBalance());
     
   Level=MarketInfo("GBPUSD",MODE_STOPLEVEL);
   double SLB=Ask-(3.0*Level)*Point;
   double TPB=Bid+(22.0*Level)*Point;
   double SLS=Bid-(3.0*Level)*Point;
   double TPS=Ask+(22.0*Level)*Point;
   
   if (OrdersTotal()>0)
   {
         OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
         if (OrderType()== OP_BUY)
         {
            if (OrderOpenPrice()-Ask <= TRAILING*Point)
            {      
                  OrderModify(OrderTicket(),OrderOpenPrice(),SL+TRAILING*Point,OrderTakeProfit(),0,Yellow);
                  Alert("СтопЛосс был перемещён ТрейлингСтопом");
                  return(0);      
            } 
         }
         
         if (OrderType()== OP_BUY)
         {
            if (Bid-OrderOpenPrice() <= TRAILING*Point)
            {
                  OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TP+TRAILING*Point,0,Red);
                  Alert("СтопЛосс был перемещён ТрейлингСтопом");
                  return(0);
               
            }
         }
         
         if (obr())
         {
            if(OrdersTotal()>0)
            {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
               Alert("Получен обратный сигнал от заданного индикатора.");
            }
            else
            {
               OrderSend(Symbol(),OP_SELL,Lot,Bid,3,TPS,SLS,"Expert order",0,0,Green);
               ordersTotal ++;
               account=AccountBalance();
               isOp=true;
               Alert("По показаниям указанного индикатора открыта новая позиция");
            }
               
         }
   }
         if (ok())
         {
            OrderSend(Symbol(),OP_BUY,Lot,Ask,3,SLB,TPB,"Expert order",0,0,Green);
            ordersTotal ++;
            account=AccountBalance();
            isOp=true;
            Alert("По показаниям указанного индикатора открыта новая позиция");
         }
   ParabolStop(); 
   if(isOp)
      {     if(AccountBalance()>account)
               Size(true);
            if(AccountBalance()<account)
               Size(false);
            if(AccountBalance()!=account)
               isOp=false;
      }  

	  return (0);}

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