Price Data Components
Orders Execution
Indicators Used
0
Views
0
Downloads
0
Favorites
Breakout_TR_0.8
//+------------------------------------------------------------------+
//| Hans123 testing version.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "If AdjustDSTwhenBacktesting is true, expert assumes when backtesting that times are non-DST and adjusts by -1 for Apr-Oct."
//---- input parameters
extern double Lots=2.0;
extern int blOneTradeOnly=0;
extern bool AdjustDSTwhenBacktesting?=true;
extern bool Skip1stFriOfMonthIfBacktesting?=true;
extern int ClosedBarLowTrailAfterBE=0;
extern int Multiplier15mATR3TrailAfterBE=0;
extern int OrderHoursExpiry=0;
extern int blTakePartialProfitAtBEtime=0;
extern bool TakeRemainingSettingsFromCode?=true;
extern int TradeOpenTime=8;
extern int LookBackHrs=4;
extern int EOD=21;
extern int blCloseAtEOD=1;
extern int PipsAddedToRange=5;
extern int StopLossMax=35;
extern int BreakEven=30;
extern int TakeProfit=115;
extern int RangeMax=999;
extern int blIfRangeMaxStillOpenFarTrade=0;
extern double riskPerTrade = 0.05;
extern bool moneyManagement = true;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int i,Ticket,LastOrderTime,StartTime,EODTime,CloseUnhitOrdersTime,Bought=0,Sold=0,PeriodToReference=0,ErrTemp=0;
int PendingTicket,OpenTicket,Last15mATRTrailBarTime;
double EntryLong,EntryShort,SLLong,SLShort,TPLong,TPShort,CurrH1BarTime,LookbackBars,ATRtrail,LotsLong, LotsShort;
//Settings
if (TakeRemainingSettingsFromCode?){
if (Symbol()=="EURUSD"){
TradeOpenTime=10;
LookBackHrs=4;
EOD=24;
blCloseAtEOD=1;
PipsAddedToRange=5;
StopLossMax=50;
BreakEven=30;
TakeProfit=80;
RangeMax=70;
blIfRangeMaxStillOpenFarTrade=0;
}
else if (Symbol()=="GBPUSD"){
TradeOpenTime=10;
LookBackHrs=4;
EOD=24;
blCloseAtEOD=1;
PipsAddedToRange=5;
StopLossMax=70;
BreakEven=40;
TakeProfit=120;
RangeMax=0;
blIfRangeMaxStillOpenFarTrade=0;
}
else {
TradeOpenTime=10;
LookBackHrs=4;
EOD=24;
blCloseAtEOD=1;
PipsAddedToRange=5;
StopLossMax=50;
BreakEven=30;
TakeProfit=80;
RangeMax=999;
blIfRangeMaxStillOpenFarTrade=0;
}
}
PeriodToReference=0; //I.e. whatever timeframe the chart/backtest is in
CurrH1BarTime=iTime(NULL,PERIOD_H1,0);
//Count time
if(IsTesting() && AdjustDSTwhenBacktesting? && TimeMonth(CurrH1BarTime)>=4 && TimeMonth(CurrH1BarTime)<=10)
{
StartTime= StrToTime(TradeOpenTime-1+":00");
CloseUnhitOrdersTime= StrToTime(TradeOpenTime+OrderHoursExpiry-1+":00");
if(DayOfWeek()==5) EODTime = MathMin(StrToTime("22:00"),StrToTime(EOD-1+":00"));
else EODTime = StrToTime(EOD-1+":00");
}
else
{
StartTime= StrToTime(TradeOpenTime+":00");
CloseUnhitOrdersTime= StrToTime(TradeOpenTime+OrderHoursExpiry+":00");
if(DayOfWeek()==5) EODTime = MathMin(StrToTime("22:00"),StrToTime(EOD+":00"));
else EODTime = StrToTime(EOD+":00");
}
//Set orders
if(CurrH1BarTime>= StartTime && CurrH1BarTime<StartTime+60*60){
//Determine range
LookbackBars=0;
for (i=0;i<Bars;i++){
if (iTime(NULL,PeriodToReference,i) < CurrH1BarTime-(LookBackHrs*60*60)) {
LookbackBars=i+1;
break;
}
}
if (LookbackBars==0) return(0); //exit if not enough bars on current timeframe
EntryLong =iHigh(NULL,PeriodToReference,Highest(NULL,PeriodToReference,MODE_HIGH,LookbackBars,1))+(PipsAddedToRange+MarketInfo(Symbol(),MODE_SPREAD))*Point;
EntryShort =iLow (NULL,PeriodToReference,Lowest (NULL,PeriodToReference,MODE_LOW, LookbackBars,1))-PipsAddedToRange*Point;
//if (EntryLong-EntryShort<=RangeMax*Point)
//{
SLLong =MathMax(EntryLong-StopLossMax*Point,EntryShort);
SLShort =MathMin(EntryShort+StopLossMax*Point,EntryLong);
TPLong =EntryLong+TakeProfit*Point;
TPShort =EntryShort-TakeProfit*Point;
//Check Orders
for (i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_BUY)) Bought++;
if(Bought>1){ //more than 1 buy order
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket());
}
if(OrderSymbol()==Symbol() && (OrderType()==OP_SELLSTOP || OrderType()==OP_SELL)) Sold++;
if(Sold>1){ //more than 1 sell order
//if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
}
}
if (RangeMax != 0 && EntryLong-EntryShort>=RangeMax*Point) { //So we can filter out large ranges
if (blIfRangeMaxStillOpenFarTrade==1) {
//Ensures that only the trigger furthest from the current price will be set. If price moves back to the other side of the range within the hour, the second trade will also be set.
if (iClose(NULL,PeriodToReference,1)-EntryShort < EntryLong-iClose(NULL,PeriodToReference,1)) {
Sold=1;
//Print("HERE");
}
else
{
Bought=1;
}
}
else
{
// Ensures that no trades will be opened
Bought=1;
Sold=1;
}
}
//Do money management calculation to determine how many lots will be traded
if (moneyManagement == true){
LotsLong=function_getLots(EntryLong, SLLong,1);
LotsShort=function_getLots(EntryShort, SLShort,2);
}else{
LotsLong=Lots;
LotsShort=Lots;
}
if (! (IsTesting() && Skip1stFriOfMonthIfBacktesting? && DayOfWeek()==5 && Day()<8)) {
if(Bought==0 && EntryLong>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point){ //no buy order and price not right at the top of the range
//if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
ErrTemp=GetLastError(); //In order to clear any previous error
Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotsLong,EntryLong,3,SLLong,TPLong,NULL,0,0,Green);
}
if(Sold==0 && EntryShort<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point){ //no sell order and price not right at the bottom of the range
//if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
ErrTemp=GetLastError(); //In order to clear any previous error
Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotsShort,EntryShort,3,SLShort,TPShort,NULL,0,0,Green);
}
}
//}
}
//Manage opened orders
if (blOneTradeOnly==1 && CurrH1BarTime>=StartTime+60*60) //Delete the second pending trade if the other has been hit and new orders are no longer being placed
{
OpenTicket=0;
PendingTicket=0;
for (i=0;i<OrdersTotal();i++)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {OpenTicket=OrderTicket();}
if(OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)) {PendingTicket=OrderTicket();}
}
if (OpenTicket != 0 && PendingTicket != 0) //This assumes that there will only be two trades set at any given time
{
OrderDelete(PendingTicket);
}
}
for (i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
//if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
//uzavøení otevøených pozic na konci dne
if(OrderHoursExpiry>0 && CurrH1BarTime>=CloseUnhitOrdersTime){
if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket());
if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
}
if(blCloseAtEOD==1 && CurrH1BarTime>=EODTime){
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP) OrderDelete(OrderTicket());
if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
}
//move at BE if profit>BE
else {
if(BreakEven>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY){
if(OrderStopLoss()<OrderOpenPrice() && iHigh(NULL,PeriodToReference,1)-OrderOpenPrice() >= BreakEven*Point){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
if (blTakePartialProfitAtBEtime==1) OrderClose(OrderTicket(),OrderLots()/2,Bid,3,Green);
}
}
if(BreakEven>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL){
if(OrderStopLoss()>OrderOpenPrice() && OrderOpenPrice()-(iLow(NULL,PeriodToReference,1)+MarketInfo(Symbol(),MODE_SPREAD)*Point) >= BreakEven*Point){
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
if (blTakePartialProfitAtBEtime==1) OrderClose(OrderTicket(),OrderLots()/2,Ask,3,Green);
}
}
}
}
if (ClosedBarLowTrailAfterBE>0) {
for (i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY){
if(OrderStopLoss()>=OrderOpenPrice() && iLow(NULL,PeriodToReference,1)-OrderStopLoss() > ClosedBarLowTrailAfterBE*Point){
OrderModify(OrderTicket(),OrderOpenPrice(),iLow(NULL,PeriodToReference,1)-ClosedBarLowTrailAfterBE*Point,OrderTakeProfit(),0,Green);
}
}
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL){
if(OrderStopLoss()<=OrderOpenPrice() && OrderStopLoss()-((iHigh(NULL,PeriodToReference,1)+MarketInfo(Symbol(),MODE_SPREAD)*Point)) > ClosedBarLowTrailAfterBE*Point){
OrderModify(OrderTicket(),OrderOpenPrice(),((iHigh(NULL,PeriodToReference,1)+MarketInfo(Symbol(),MODE_SPREAD)*Point))+ClosedBarLowTrailAfterBE*Point,OrderTakeProfit(),0,Green);
}
}
}
}
if (Multiplier15mATR3TrailAfterBE>0 && iTime(Symbol(),PERIOD_M15,0)> Last15mATRTrailBarTime) {
Last15mATRTrailBarTime=iTime(Symbol(),PERIOD_M15,0);
for (i=0;i<OrdersTotal();i++){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY){
ATRtrail=iATR(Symbol(),PERIOD_M15,3,1)*Multiplier15mATR3TrailAfterBE;
if(OrderStopLoss()>=OrderOpenPrice() && iOpen(NULL,PeriodToReference,1)-OrderStopLoss() > ATRtrail){
OrderModify(OrderTicket(),OrderOpenPrice(),iOpen(NULL,PeriodToReference,1)-ATRtrail,OrderTakeProfit(),0,Green);
}
}
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL){
ATRtrail=iATR(Symbol(),PERIOD_M15,3,1)*Multiplier15mATR3TrailAfterBE;
if(OrderStopLoss()<=OrderOpenPrice() && OrderStopLoss()-((iOpen(NULL,PeriodToReference,1)+MarketInfo(Symbol(),MODE_SPREAD)*Point)) > ATRtrail){
OrderModify(OrderTicket(),OrderOpenPrice(),((iOpen(NULL,PeriodToReference,1)+MarketInfo(Symbol(),MODE_SPREAD)*Point))+ATRtrail,OrderTakeProfit(),0,Green);
}
}
}
}
return(0);
}
double function_getLots(double Entry, double SL, int orderType){
double trade_risk=0;
double renormalization_coeficient=0;
if (orderType == 1){
trade_risk=NormalizeDouble(((Entry-SL)/Entry),4);
renormalization_coeficient=NormalizeDouble((riskPerTrade/trade_risk),4);
return(NormalizeDouble((((renormalization_coeficient*AccountBalance())/Entry)/100000),2));
}else if (orderType == 2){
trade_risk=NormalizeDouble(((SL-Entry)/Entry),4);
renormalization_coeficient=NormalizeDouble((riskPerTrade/trade_risk),4);
return(NormalizeDouble((((renormalization_coeficient*AccountBalance())/Entry)/100000),2));
}
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---