TradersPowerExpert_v1.2_eurusd
Download scriptTradersPowerExpert_v1 Logic Overview
This document provides a non-technical explanation of the logic used by the TradersPowerExpert_v1 automated trading script. The system is designed to identify trading opportunities based on historical price ranges and manage active trades through several safety and profit-taking mechanisms.
1. Core Strategy: Price Range Analysis
The robot determines its entry points by analyzing the "bullish" and "bearish" behavior of the market over a specific number of previous days (defined by the TradersPeriod parameter).
- Data Collection: It looks back at the high, low, and opening prices of recent days to calculate how much the market moved in favor of buyers (Bulls) versus sellers (Bears).
- Averaging: It calculates the average move for both Bulls and Bears over that period.
- Entry Logic:
- Buy Orders: The script places a "Buy Stop" order at a specific distance above today's opening price, based on the average bullish movement.
- Sell Orders: The script places a "Sell Stop" order at a specific distance below today's opening price, based on the average bearish movement.
- Spread Adjustment: The system automatically accounts for the "spread" (the difference between the buy and sell price offered by the broker) to ensure the orders are placed accurately.
2. Trade Management & Safety Features
The script includes several automated functions to protect capital and manage active positions:
- Money Management: If enabled, the script automatically calculates the trade size (Lot size). It looks at your account balance, a chosen risk factor, and the maximum allowed loss per lot to determine how much you should trade.
- Time Filters: You can specify which days of the week the robot is allowed to open new trades.
- Automatic Closures:
- Time-Based: The script can automatically close trades after a certain number of days have passed since they were opened (unless they are already in profit).
- Cleanup: At the start of a new trading day, it is designed to delete any leftover pending orders from the previous session.
- Trade Conflict Prevention: The system monitors active trades. If you have a Buy position open, it will automatically cancel any "Sell Stop" orders (and vice versa) to prevent contradictory positions from being taken simultaneously.
3. Profit Protection Mechanisms
The script uses three distinct methods to secure profits:
- Break-Even: This moves the Stop Loss of an active trade to the entry price (or slightly beyond it into profit) once the trade reaches a specific milestone. It does this in "steps"—as the price moves further in your favor, the stop loss follows it upward/downward.
- Trailing Stop: If enabled, the script will move the Stop Loss automatically behind the price as it moves in your favor. This allows the trade to run as long as possible while locking in gains if the market suddenly reverses.
- Initial Stop Loss: The script can calculate and place an initial safety net (Stop Loss) at the moment a trade is opened, based on a percentage of the average daily range.
4. Execution Summary
The robot operates by scanning the market during specific hours to check if it should enter a trade. If no trades are currently open, it performs its calculations on historical data and places Buy/Sell Stop orders. Once a trade is triggered, it continuously monitors that trade to adjust stop losses (Break-Even or Trailing) and ensures that the position is closed according to your pre-defined time limits or profit targets.
//+------------------------------------------------------------------+
//| 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 = 200; // Percent from Daily Range for SELL
extern double StopPercent = 200; // 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
//+------------------------------------------------------------------+
Profitability Reports
Expected payoff
Average expected payoff across the available backtests for each symbol.
Comments