gurooex01_v1

Author: Copyright � 2010, Marketing Dreams Ltd.
Price Data Components
Miscellaneous
It opens Message Boxes to the user
0 Views
0 Downloads
0 Favorites
gurooex01_v1
//+------------------------------------------------------------------+
//|                                                    GurooEx01.mq5 |
//|     Copyright © 2010, Marketing Dreams Ltd. All Rights Reserved. |
//|                     http://community.trading-gurus.com/threads/9 |
//|                                                                  |
//| GuruTrader™ example 1                                            |
//| Object Oriented MQL5 Version 1.0                                 |
//|                                                                  |
//| A quick port of our MQL4 robot example 1 to MQL5 for use with    |
//| the public beta test version of MetaTrader 5. It is written      |
//| using MetaQuotes object oriented framework for MQL5.             |
//|                                                                  |
//| Uses a random number generator to simulate tossing a coin.       |
//| It can be amazingly profitable given that it uses random entries!|                                                                  |
//|                                                                  |
//| Wealth Warning! This expert is for educational purposes only.    |
//| It should NEVER be used on a live account. Past performance is   |
//| in no way indicative of future results!                          |
//+------------------------------------------------------------------+
#property copyright   "Copyright © 2010, Marketing Dreams Ltd."
#property link        "http://community.trading-gurus.com/threads/9"
#property version     "1.00"
#property description "An example of an OOP random entry system"

//---- include object oriented framework
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Indicators\Indicators.mqh>

//---- input parameters
input  int     Magic=12345;
input  int     Slippage=30;
input  int     ProfitTarget=1000;
input  int     StopLoss=10000;
input  double  Lots=0.1;
input  bool    ReallyRandom=true;
//+------------------------------------------------------------------+
//| MA crossover example expert class                                |
//+------------------------------------------------------------------+
class CGuruEx01
  {
private:
   int               Dig;
   double            Points;
   bool              Initialized;
   bool              Running;
   ulong             OrderNumber;
   double            GetSize();

protected:
   string            m_Pair;                    // Currency pair to trade 
   CTrade            m_Trade;                   // Trading object
   CSymbolInfo       m_Symbol;                  // Symbol info object
   CPositionInfo     m_Position;                // Position info object
   void              InitSystem();
   bool              CheckEntry();
   bool              CheckExit();

public:
                     CGuruEx01();               // Constructor
                    ~CGuruEx01() { Deinit(); }  // Destructor
   bool              Init(string Pair);
   void              Deinit();
   bool              Validated();
   bool              Execute();
  };

CGuruEx01 GuruEx01;
//+------------------------------------------------------------------+
//| Constructor                                                      |
//+------------------------------------------------------------------+
CGuruEx01::CGuruEx01()
  {
   Initialized=false;
  }
//+------------------------------------------------------------------+
//| Performs system initialisation                                   |
//+------------------------------------------------------------------+
bool CGuruEx01::Init(string Pair)
  {
   m_Pair=Pair;
   m_Symbol.Name(m_Pair);                // Symbol
   m_Trade.SetExpertMagicNumber(Magic);  // Magic number

   Dig=m_Symbol.Digits();
   Points=m_Symbol.Point();
   m_Trade.SetDeviationInPoints(Slippage);

   Print("Digits = ",Dig,", Points = ",DoubleToString(Points,Dig));

   if(ReallyRandom)
      MathSrand(int(TimeLocal())); // Initialize random number generator
   else
      MathSrand(1);           // Same every time

   Initialized=true;

   return(true);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
CGuruEx01::Deinit()
  {
   Initialized=false;

   Print("DeInitialized OK");
  }
//+------------------------------------------------------------------+
//| Returns trade size based on money management system (if any!)    |
//+------------------------------------------------------------------+
double CGuruEx01::GetSize()
  {
   return(Lots);
  }
//+------------------------------------------------------------------+
//| Checks if everything initialized successfully                    |
//+------------------------------------------------------------------+
bool CGuruEx01::Validated()
  {
   return(Initialized);
  }
//+------------------------------------------------------------------+
//| Performs system reinitialisation                                 |
//+------------------------------------------------------------------+
void CGuruEx01::InitSystem()
  {
   Running=false;
   Initialized=true;
  }
//+------------------------------------------------------------------+
//| Performs system logic. Called on every tick                      |
//+------------------------------------------------------------------+
bool CGuruEx01::Execute()
  {
   if(Running) 
     {                   // Are we in a trade at the moment?
      if(CheckExit() > 0) 
        {        // Yes - Last trade complete?
         Initialized = false;       // Yes - Indicate we need to reinitialise
         InitSystem();              //  and start all over again!
        }
     }
   else 
     {
      if(CheckEntry()>0) 
        {       // Entered a trade?
         Running=true;            // Yes - Indicate that we're in a trade
        }
     }
   return(true);
  }
//+------------------------------------------------------------------+
//| Checks for entry to a trade                                      |
//+------------------------------------------------------------------+
bool CGuruEx01::CheckEntry()
  {
   int CoinToss;

   m_Symbol.RefreshRates();
   CoinToss=MathRand();
   Print("CoinToss = ",CoinToss,", Bid = ",m_Symbol.Bid(),", Ask = ",m_Symbol.Ask());

   if(CoinToss<16384) 
     {               // Coin came up heads, so GO LONG!
      if(m_Trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,GetSize(),m_Symbol.Ask(),
         m_Symbol.Bid() - (Points * StopLoss),
         m_Symbol.Ask()+(Points*ProfitTarget))) 
        {
         OrderNumber=m_Trade.ResultOrder();
         Print("Entered LONG at ",TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         return(true);
        }
      else 
        {
         OrderNumber=0;
        }
     }
   else  
     {                                // Coin came up tails, so GO SHORT!
      if(m_Trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,GetSize(),m_Symbol.Bid(),
         m_Symbol.Ask() + (Points * StopLoss),
         m_Symbol.Bid() -(Points*ProfitTarget))) 
        {
         OrderNumber=m_Trade.ResultOrder();
         Print("Entered SHORT at ",TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         return(true);
        }
      else 
        {
         OrderNumber=0;
        }
     }

   return(false);
  }
//+------------------------------------------------------------------+
//| Checks for exit from a trade                                     |
//+------------------------------------------------------------------+
bool CGuruEx01::CheckExit()
  {
   double PositionSize;

   if(m_Position.Select(m_Pair)!=true) 
     {
      Print("Position flat at ",TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
      return(true);
     }
   else 
     {
      m_Position.InfoDouble(POSITION_VOLUME,PositionSize);
      if(PositionSize<=0) 
        {
         Print("Position closed at ",TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
         return(true);
        }
      else 
        {
         return(false);
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL) 
     {
      MessageBox("Wealth Warning! This expert is for educational purposes only."+
                 " It should NEVER be used on a live account."+
                 " Past performance is in no way indicative of future results!");
      Print("Initialization Failure");
      return(-1);
     }

   if(!GuruEx01.Init(Symbol())) 
     {
      GuruEx01.Deinit();
      return(-1);
     }

   Print("Initialized OK");

   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   GuruEx01.Deinit();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(!GuruEx01.Validated()) 
     {
      return;
     }

   GuruEx01.Execute();
  }
//+------------------------------------------------------------------+

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