This script is designed to automatically trade on the Forex market using the MetaTrader platform. Here's how it works, explained in a way that's easy to understand:
Overall Strategy:
The script aims to identify potential trading opportunities at the start of each trading day based on the previous days' price movements. It calculates expected high and low price ranges and places pending "buy stop" and "sell stop" orders accordingly. The ultimate goal is to enter trades that capitalize on anticipated price breakouts. It also implements money management and risk mitigation strategies.
Key Steps:
-
Initialization: When the script starts, it sets up its basic parameters, like an identification number for its trades, acceptable price slippage, default trade sizes and imports external libraries.
-
Money Management (Optional): It can optionally adjust the trade size ("Lots") based on your account balance and a risk percentage. If activated it determines the trade size based on how much of your account you're willing to risk losing on a single trade, and a maximum loss amount.
-
Determining Trading Opportunities:
- Daily Range Calculation: The script looks back at the previous few days (defined by "TradersPeriod") to calculate the average price movement ("range") for both buying and selling. It does this by calculating the average "bullish" (price increase) and "bearish" (price decrease) movements.
- Opening Price: It determines the current day's opening price using hourly data.
- Buy/Sell Levels: It calculates potential "Buy Stop" and "Sell Stop" order prices. These prices are based on the day's opening price, plus or minus a percentage (defined by "BuyPercent" and "SellPercent") of the average daily range (calculated previously). The calculation also takes into account the current spread (the difference between the buy and sell price).
-
Order Placement:
- Pending Orders: The script places pending orders to either buy if the price goes up to the calculated "Buy Stop" level, or sell if the price drops to the calculated "Sell Stop" level.
- Stop Loss: It also sets an initial stop-loss order to limit potential losses if the price moves against the trade. The stop-loss level is determined as a percentage ("StopPercent") of the average daily range.
-
Trade Management:
- Time-Based Closing: The script can be configured to automatically close any open trades after a certain number of days ("TradePeriod") have passed, or when a profit is detected, useful for preventing trades from staying open indefinitely.
- Break-Even Stop (Optional): If enabled, this feature automatically moves the stop-loss order to the trade's entry price (plus a small buffer) after the trade has reached a certain profit level ("BreakEven"). This guarantees that the trade will not result in a loss.
- Trailing Stop (Optional): If enabled, this feature continuously adjusts the stop-loss order as the price moves in a favorable direction, locking in profits. The stop-loss will 'trail' the price.
- Deleting Extra Orders: It checks for and deletes any extra pending orders that might have been left over from a previous day if a trade has already been triggered in the opposite direction.
-
Day-of-Week Control: The script allows you to specify which days of the week it should be active (Monday through Friday).
In Summary:
This script is an automated trading system that attempts to profit from daily price fluctuations. It uses past price data to predict likely breakout levels, places pending orders at those levels, and manages the trades with stop-loss and profit-taking features. It is customizable with parameters to control risk, trade timing, and money management.
//+------------------------------------------------------------------+
//| TradersPowerExpert_v1.mq4 |
//| Copyright © 2006, Forex-TSD.com |
//| Written by IgorAD,igorad2003@yahoo.co.uk |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link "http://www.forex-tsd.com/"
#include <stdlib.mqh>
//#include <Tracert.mqh>
//---- input parameters
extern string Expert_Name = "---- TradersPowerExpert_v1 ----";
extern int Magic=1007;
extern int Slippage=6;
extern bool Trace = false; // Trace Switch
extern string Main_Parameters = " Trade Volume & Trade Method";
extern double Lots = 1;
extern bool TrailingStop = false; // Trailing Stop Switch
extern bool InitialStop = true; // Initial Stop Switch
extern int TimeZone = 1;
extern string Data = " Input Data ";
extern int TradersPeriod = 4;
extern double BuyPercent = 160; // Percent from Daily Range for BUY
extern double SellPercent = 160; // Percent from Daily Range for SELL
extern double StopPercent = 100; // Percent from Daily Range for StopLoss
extern int TradePeriod = 5; // Max days in trade
extern double BreakEven = 85; // BreakEven Level in pips
extern double BreakEvenGap = 8; // Pips when BreakEven will be reached
extern string Trade = " Trade Days of Week";
extern int Monday = 1; // Day of the Week for Trade
extern int Tuesday = 1;
extern int Wednesday = 1;
extern int Thursday = 1;
extern int Friday = 1;
extern string MM_Parameters = " MoneyManagement by L.Williams ";
extern bool MM=false; // ÌÌ Switch
extern double MMRisk=0.1; // Risk Factor
extern double LossMax=1466; // Maximum Loss by 1 Lot
int i,k,cnt=0, ticket, mode=0, digit=0, wenum=0, OrderOpenDay, Kz;
double high,low, close[], open, range, Bulls,Bears,
AvgBulls,AvgBears, SumBulls,SumBears,TodayOpen,spread=0, Profit=0;
double smin=0, smax=0, BuyStop=0, SellStop=0, Lotsi=0, rates_h1[][6];
bool BuyInTrade=false, SellInTrade=false;
datetime StartTime, prevwe=0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
// ---- Money Management
double MoneyManagement ( bool flag, double Lots, double risk, double maxloss)
{
double Lotsi=Lots;
if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*risk/maxloss,1);
if (Lotsi<0.1) Lotsi=0.1;
return(Lotsi);
}
// Closing of Pending Orders
void PendOrdDel()
{
int total=OrdersTotal();
for (int cnt=total-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);
if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
{
int mode=OrderType();
bool result = false;
switch(mode)
{
case OP_BUYSTOP : {result = OrderDelete( OrderTicket() ); Print(" PendBUY"); }
case OP_SELLSTOP : {result = OrderDelete( OrderTicket() ); Print(" PendSELL"); }
if(!result)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
//Print(" cnt=",cnt, " total=",total," MODE = ",mode," Ticket=",OrderTicket() );
}
}
}
return;
}
//
void CloseOrdbyTime()
{
int total=OrdersTotal();
for (cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
mode=OrderType();
if ( mode <= OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
datetime OpenTime=StrToTime(TimeToStr(OrderOpenTime(),TIME_DATE));
datetime CurnTime=StrToTime(TimeToStr(CurTime(),TIME_DATE));
int weekday=TimeDayOfWeek(OrderOpenTime());
if (weekday <=5 && DayOfWeek()==1 && CurnTime > prevwe && CurnTime > OpenTime) {wenum =wenum + 1; prevwe = CurnTime;}
//if (OrderOpenDay <= 5 && DayOfWeek()>0)
int CalcBars=TradePeriod+2*wenum;
//else CalcBars=TradePeriod;
if ((CurTime()-OpenTime)>=PERIOD_D1*CalcBars*60 || OrderProfit()>0)
{
if (mode==OP_BUY )
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
if (mode==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
}
}
}
}
// ----
void TrailStops()
{
int total=OrdersTotal();
for (cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
mode=OrderType();
if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
{
if ( mode==OP_BUY && smin > OrderStopLoss() )
{
Profit=0;
OrderModify(OrderTicket(),OrderOpenPrice(),smin,Profit,0,LightGreen);
return(0);
}
if ( mode==OP_SELL && smax < OrderStopLoss())
{
Profit=0;
OrderModify(OrderTicket(),OrderOpenPrice(),smax,Profit,0,Yellow);
return(0);
}
}
}
}
void SellOrdOpen()
{
double SellPrice=TodayOpen - AvgBears * SellPercent/100.0 - spread;
if (InitialStop) SellStop=SellPrice + StopPercent*AvgBears/100.0; else SellStop=0;
Profit=0;
ticket = OrderSend(Symbol(),OP_SELLSTOP,Lotsi,
NormalizeDouble(SellPrice,digit),
Slippage,
NormalizeDouble(SellStop,digit),
Profit,"SELL",Magic,0,Red);
OrderOpenDay = DayOfWeek();
SellInTrade=false;
Kz=1;
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
}
void BuyOrdOpen()
{
double BuyPrice =TodayOpen + AvgBulls*BuyPercent/100.0 + spread;
if (InitialStop) BuyStop = BuyPrice - StopPercent*AvgBulls/100.0; else BuyStop=0;
Profit=0;
ticket = OrderSend(Symbol(),OP_BUYSTOP ,Lotsi,
NormalizeDouble(BuyPrice ,digit),
Slippage,
NormalizeDouble(BuyStop ,digit),
Profit,"BUY",Magic,0,Blue);
OrderOpenDay = DayOfWeek();
BuyInTrade=false;
Kz=1;
if(ticket<0)
{
Print("OrderSend failed with error #",GetLastError());
return(0);
}
}
void ExtraOrdDel()
{
int total = OrdersTotal();
for (cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
mode=OrderType();
if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
{
if (mode==OP_BUY && !BuyInTrade ) BuyInTrade =true;
if (mode==OP_SELL && !SellInTrade) SellInTrade=true;
if (mode == OP_SELLSTOP && BuyInTrade )
{ OrderDelete(OrderTicket()); SellInTrade=false; Print(" ExtraSell"); }
if (mode == OP_BUYSTOP && SellInTrade )
{ OrderDelete(OrderTicket()); BuyInTrade=false; Print(" ExtraBuy"); }
}
}
}
// ---- Scan Trades
int ScanTrades()
{
int total = OrdersTotal();
int numords = 0;
for(cnt=0; cnt<total; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderType()>=OP_BUY && OrderMagicNumber() == Magic)
numords++;
}
return(numords);
}
datetime OrderOpenDate()
{
int total = OrdersTotal();
datetime date;
for(cnt=0; cnt<total; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderType()>=OP_BUY && OrderMagicNumber() == Magic)
date = StrToTime(TimeToStr(OrderOpenTime(),TIME_DATE));
}
return(date);
}
void BreakEvenStop()
{
for (cnt=0;cnt<OrdersTotal();cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
int mode=OrderType();
if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if ( mode==OP_BUY )
{
if ( Bid-OrderOpenPrice() > 0 )
{Kz = MathFloor((Bid-OrderOpenPrice())/(BreakEven*Point));
if (Kz < 1) Kz=1;}
else Kz = 1;
// Print(" Buy Kz=",Kz);
//BuyStop = OrderStopLoss();
if (Bid-OrderOpenPrice() > Kz*BreakEven*Point)
{
BuyStop=OrderOpenPrice()+((Kz-1)*BreakEven+BreakEvenGap)*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),
NormalizeDouble(BuyStop, digit),
OrderTakeProfit(),0,LightBlue);
//Kz=Kz+1;
return(0);
}
}
if ( mode==OP_SELL )
{
if ( OrderOpenPrice()-Ask > 0 )
{Kz = MathFloor((OrderOpenPrice()-Ask)/(BreakEven*Point));
if (Kz < 1) Kz=1;}
else Kz = 1;
// Print(" Sell Kz=",Kz);
//SellStop = OrderStopLoss();
if (OrderOpenPrice()-Ask > Kz*BreakEven*Point)
{
SellStop=OrderOpenPrice()-((Kz-1)*BreakEven+BreakEvenGap)*Point;
OrderModify(OrderTicket(),OrderOpenPrice(),
NormalizeDouble(SellStop, digit),
OrderTakeProfit(),0,Orange);
//DrawStops("SellStop",SellStop,Orange);
//Kz=Kz+1;
return(0);
}
}
}
}
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(Bars < 1) {Print("Not enough bars for this strategy"); return(0);}
//if ( Trace ) SetTrace();
string TimeTrade = "00:00";
StartTime = StrToTime(TimeTrade) + TimeZone*3600;
if(Hour() >= TimeZone && Hour() <= TimeZone+1)
{
if ( OrderOpenDate() < StrToTime(TimeToStr( StartTime,TIME_DATE)))
{ PendOrdDel(); if( TradePeriod > 0 )CloseOrdbyTime(); }
if(ScanTrades()<1)
{
spread= MarketInfo(Symbol(),MODE_SPREAD)*Point;
digit = MarketInfo(Symbol(),MODE_DIGITS);
Lotsi = MoneyManagement ( MM, Lots, MMRisk, LossMax);
if (TrailingStop) InitialStop=true;
ArrayCopyRates(rates_h1, Symbol(), PERIOD_H1);
TodayOpen = rates_h1[0][1];
SumBulls=0;SumBears=0;
for (k=TradersPeriod;k>=1;k--)
{
open = rates_h1[k*24][1];
high=0; low=10000000;
for (i=24;i>=1;i--)
{
high = MathMax( high, rates_h1[i+(k-1)*24][3]);
low = MathMin( low , rates_h1[i+(k-1)*24][2]);
}
range =(high-low);
Bulls = high - open;
Bears = open - low;
SumBulls += Bulls;
SumBears += Bears;
//Print(" Bulls=",high,"Bears=",low);
}
AvgBulls = SumBulls/TradersPeriod;
AvgBears = SumBears/TradersPeriod;
//Print(" high=",AvgBulls,"low=",AvgBears);
smin = Bid - StopPercent*AvgBears/100.0;
smax = Ask + StopPercent*AvgBulls/100.0;
if ( Monday == 1 ) if(DayOfWeek()==1){BuyOrdOpen(); SellOrdOpen();}
if ( Tuesday == 1 ) if(DayOfWeek()==2){BuyOrdOpen(); SellOrdOpen();}
if ( Wednesday== 1 ) if(DayOfWeek()==3){BuyOrdOpen(); SellOrdOpen();}
if ( Thursday == 1 ) if(DayOfWeek()==4){BuyOrdOpen(); SellOrdOpen();}
if ( Friday == 1 ) if(DayOfWeek()==5){BuyOrdOpen(); SellOrdOpen();}
}
}
ExtraOrdDel();
if (BreakEven > 0) BreakEvenStop();
if (TrailingStop) TrailStops();
return(0);
}//int start
//+------------------------------------------------------------------+
Comments