Files
All-MQL5-code/Experts/Downloads/RobotPowerM5 meta4V12.mq5
2018-03-14 11:26:36 +01:00

300 lines
24 KiB
Plaintext

//+------------------------------------------------------------------+
//| RobotPowerM5_meta4V12 (RobotBB)(barabashkakvn's edition).mq5 |
//| Copyright © 2005, Company |
//| http://www.funds.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005"
#property link "http://www.funds.com"
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\AccountInfo.mqh>
CSymbolInfo m_symbol; // symbol info object
CPositionInfo m_position; // trade position object
CTrade m_trade; // trading object
CAccountInfo m_account; // account info wrapper
//--- A reliable expert,use it on 5 min charts(GBP is best) with
// 150/pips profit limit.
// No worries, check the results.
input int BullBearPeriod =5;
input double m_lots = 0.01;
input ushort m_trailingStep = 10; // trail step. minimum 10
input ushort m_takeProfit = 150; // take profit. recomended no more than 150
input ushort m_stopLoss = 105; // stop loss
ulong m_slippage=30;
// EA identifier. Allows for several co-existing EA with different values.
input string nameEA="Soultrading";
//----
double bull,bear;
double realTP,realSL,b,s,m_sl,m_tp;
bool isBuying=false,isSelling=false,isClosing=false;
ulong m_ticket;
//---
int handle_iBullsPower; // variable for storing the handle of the iBullsPower indicator
int handle_iBearsPower; // variable for storing the handle of the iBearsPower indicator
int handle_iATR; // variable for storing the handle of the iATR indicator
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(m_lots<=0.0)
{
Print("The \"volume transaction\" can't be smaller or equal to zero");
return(INIT_PARAMETERS_INCORRECT);
}
if(m_trailingStep<10.0)
{
Print("The \"trail step\" can't be smaller 10.0");
return(INIT_PARAMETERS_INCORRECT);
}
m_symbol.Name(Symbol()); // sets symbol name
m_trade.SetDeviationInPoints(m_slippage); // sets deviation
RefreshRates();
//--- create handle of the indicator iBullsPower
handle_iBullsPower=iBullsPower(Symbol(),Period(),BullBearPeriod);
//--- if the handle is not created
if(handle_iBullsPower==INVALID_HANDLE)
{
//--- tell about the failure and output the error code
PrintFormat("Failed to create handle of the iBullsPower indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError());
//--- the indicator is stopped early
return(INIT_FAILED);
}
//--- create handle of the indicator iBearsPower
handle_iBearsPower=iBearsPower(Symbol(),Period(),BullBearPeriod);
//--- if the handle is not created
if(handle_iBearsPower==INVALID_HANDLE)
{
//--- tell about the failure and output the error code
PrintFormat("Failed to create handle of the iBearsPower indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError());
//--- the indicator is stopped early
return(INIT_FAILED);
}
//--- create handle of the indicator iATR
handle_iATR=iATR(Symbol(),Period(),5);
//--- if the handle is not created
if(handle_iATR==INVALID_HANDLE)
{
//--- tell about the failure and output the error code
PrintFormat("Failed to create handle of the iATR indicator for the symbol %s/%s, error code %d",
Symbol(),
EnumToString(Period()),
GetLastError());
//--- the indicator is stopped early
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- check for invalid bars and takeprofit
if(Bars(Symbol(),Period())<200)
{
Print("Not enough bars for this strategy - ",nameEA);
return;
}
//--- calculate indicators' value
calculateIndicators();
//--- control open trades
int totalPositions=PositionsTotal();
int numPos=0;
//--- scan all positions...
for(int cnt=totalPositions-1; cnt>=0; cnt--)
{
//--- the next line will check for ONLY market trades, not entry orders
if(!m_position.SelectByIndex(cnt))
return;
//--- only look for this symbol, and only orders from this EA
if(m_position.Symbol()==Symbol())
{
numPos++;
//--- check for close signal for bought trade
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
//--- control trailing step
if(!RefreshRates())
return;
if(m_symbol.Bid()-m_position.StopLoss()>(2*m_trailingStep*Point()))
{
m_trade.PositionModify(m_position.Ticket(),
m_symbol.Bid()-m_trailingStep*Point(),m_position.TakeProfit());
}
}
else // check sold trade for close signal
{
//--- control trailing step
if(!RefreshRates())
return;
if(m_position.StopLoss()-m_symbol.Ask()>(2*m_trailingStep*Point()))
{
m_trade.PositionModify(m_position.Ticket(),
m_symbol.Ask()+m_trailingStep*Point(),m_position.TakeProfit());
}
}
}
}
//--- if there is no open trade for this pair and this EA
if(numPos<1)
{
if(m_account.FreeMargin()<1000*m_lots)
{
Print("Not enough money to trade ",m_lots," m_lots. Strategy:",nameEA);
return;
}
//--- check for BUY entry signal
if(isBuying && !isSelling && !isClosing)
{
if(!RefreshRates())
return;
m_sl = m_symbol.Ask() - m_stopLoss * Point();
m_tp = m_symbol.Ask() + m_takeProfit * Point();
if(m_trade.Buy(m_lots,Symbol(),m_symbol.Ask(),m_sl,m_tp,nameEA+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES)))
{
m_ticket=m_trade.ResultDeal();
}
Comment(m_sl);
if(m_ticket==0)
{
Print("Buy (",nameEA,") -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription(),
", ticket of deal: ",m_trade.ResultDeal());
}
prtAlert("Day Trading: Buying");
}
//--- check for SELL entry signal
if(isSelling && !isBuying && !isClosing)
{
if(!RefreshRates())
return;
m_sl = m_symbol.Bid() + m_stopLoss * Point();
m_tp = m_symbol.Bid() - m_takeProfit * Point();
if(m_trade.Sell(m_lots,Symbol(),m_symbol.Bid(),m_sl,m_tp,nameEA+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES)))
{
m_ticket=m_trade.ResultDeal();
}
if(m_ticket==0)
{
Print("Sell (",nameEA,") -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription(),
", ticket of deal: ",m_trade.ResultDeal());
}
prtAlert("Day Trading: Selling");
}
}
return;
}
//+------------------------------------------------------------------+
//| Calculate indicators' value |
//+------------------------------------------------------------------+
void calculateIndicators()
{
bull = iBullsPowerGet(1);
bear = iBearsPowerGet(1);
Comment("bull+bear= ",bull+bear);
//b = 1 * Point() + iATRGet(1)*1.5;
//s = 1 * Point() + iATRGet(1)*1.5;
isBuying = (bull+bear > 0);
isSelling = (bull+bear < 0);
isClosing = false;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void prtAlert(string str="")
{
Print(str);
Alert(str);
}
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data |
//+------------------------------------------------------------------+
bool RefreshRates()
{
//--- refresh rates
if(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"
if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| Get value of buffers for the iBullsPower |
//+------------------------------------------------------------------+
double iBullsPowerGet(const int index)
{
double BullsPower[];
ArraySetAsSeries(BullsPower,true);
//--- reset error code
ResetLastError();
//--- fill a part of the iBullsPower array with values from the indicator buffer that has 0 index
if(CopyBuffer(handle_iBullsPower,0,0,index+1,BullsPower)<0)
{
//--- if the copying fails, tell the error code
PrintFormat("Failed to copy data from the iBullsPower indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculated
return(0.0);
}
return(BullsPower[index]);
}
//+------------------------------------------------------------------+
//| Get value of buffers for the iBearsPower |
//+------------------------------------------------------------------+
double iBearsPowerGet(const int index)
{
double BearsPower[];
ArraySetAsSeries(BearsPower,true);
//--- reset error code
ResetLastError();
//--- fill a part of the iBearsPower array with values from the indicator buffer that has 0 index
if(CopyBuffer(handle_iBearsPower,0,0,index+1,BearsPower)<0)
{
//--- if the copying fails, tell the error code
PrintFormat("Failed to copy data from the iBearsPower indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculated
return(0.0);
}
return(BearsPower[index]);
}
//+------------------------------------------------------------------+
//| Get value of buffers for the iATR |
//+------------------------------------------------------------------+
double iATRGet(const int index)
{
double ATR[];
ArraySetAsSeries(ATR,true);
//--- reset error code
ResetLastError();
//--- fill a part of the iATR array with values from the indicator buffer that has 0 index
if(CopyBuffer(handle_iATR,0,0,index+1,ATR)<0)
{
//--- if the copying fails, tell the error code
PrintFormat("Failed to copy data from the iATR indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculated
return(0.0);
}
return(ATR[index]);
}
//+------------------------------------------------------------------+