명시
Project overview
I require a custom MetaTrader 4 (MT4 / MQL4) indicator for plotting configurable opening-range boxes for different trading sessions.
The core concept is similar to an opening-range breakout / No Trading Zone methodology.
For each configured session, the indicator must:
-
Observe price during a specified start/end time.
-
Calculate the actual highest high and lowest low during that period.
-
Draw a box representing that range.
-
Calculate the box height in pips.
-
Determine whether the box is valid according to configurable minimum and maximum pip ranges.
-
After the box closes, project configurable TP levels above and below the box based on multiples of the actual box height.
This is an indicator only at this stage. It does NOT need to automatically place or manage trades.
1. Multiple independent session boxes
The indicator must support at least 5 independent boxes per trading day.
Each box must have its own settings.
Example:
Box 1
-
Enabled = True
-
Name = London Opening
-
Start Time = 07:00
-
End Time = 08:00
Box 2
-
Enabled = True
-
Name = New York Pre-Open
-
Start Time = user configurable
-
End Time = user configurable
Box 3
-
Enabled = True
-
Name = New York Cash Open
-
Start Time = user configurable
-
End Time = user configurable
Boxes 4 and 5 must also be completely configurable.
I do not want session names or times hard-coded.
2. Time handling
Accurate time handling is very important.
The indicator should allow either:
Option A — Broker/server time
The user enters all box times according to MT4 broker/server time.
OR preferably:
Option B — Time-zone offset
Provide an input allowing the user to specify an offset between the desired session time and broker/server time.
For example:
TimeOffsetHours = 2
If possible, I would also like support for fractional offsets if required.
The indicator must work correctly when historical charts are loaded.
Please explain clearly how the time handling has been implemented.
3. Box calculation
For every enabled box:
Between:
BoxStartTime
and
BoxEndTime
the indicator calculates:
BoxHigh = highest traded price during the period
BoxLow = lowest traded price during the period
and:
BoxRange = BoxHigh - BoxLow
The indicator must convert this into true pips, correctly accounting for 4/5-digit Forex brokers and 2/3-digit JPY pricing.
Example:
EUR/USD:
High = 1.17550
Low = 1.17380
Range = 17 pips
not 170 pips.
4. Minimum and maximum box size
This is a critical requirement.
Every individual box must have its own independently configurable minimum and maximum range in pips.
For example:
London Opening
MinBoxPips = 10
MaxBoxPips = 30
New York Opening
MinBoxPips = 15
MaxBoxPips = 35
These must NOT be global settings shared between all boxes.
After the box period finishes:
If:
BoxRange >= MinBoxPips
AND
BoxRange <= MaxBoxPips
then:
Box = VALID
Otherwise:
Box = INVALID
5. Valid and invalid boxes
The indicator must visually distinguish valid from invalid boxes.
For example:
ValidBoxColour = user configurable
InvalidBoxColour = user configurable
ShowInvalidBoxes = True/False
The completed box should display a label containing at least:
Session name + range in pips
Example:
London Opening — 18.4 pips
If invalid, preferably:
London Opening — 34.7 pips — INVALID
6. Entry levels
For a valid box, draw:
Long breakout level
LongEntry = BoxHigh + EntryBuffer
Short breakout level
ShortEntry = BoxLow - EntryBuffer
Each box must have a configurable:
EntryBufferPips
Example:
Box High = 1.17550
EntryBuffer = 1 pip
Long Entry = 1.17560
Entry buffer must be independently configurable for each box.
Allow:
EntryBufferPips = 0
if the user wants entry exactly at the box boundary.
7. Stop-loss reference
The indicator should optionally plot an SL reference on the opposite side of the box.
For a long:
LongSL = BoxLow - SLBufferPips
For a short:
ShortSL = BoxHigh + SLBufferPips
Provide:
ShowSL = True/False
and an independently configurable:
SLBufferPips
Again, this indicator does not execute trades. These are visual levels only.
8. Take-profit projections
This is another critical requirement.
The indicator must use the actual height of the completed box to calculate projected TP levels.
If:
BoxRange = R
then for a long breakout:
TP1 Long = BoxHigh + (R × TP1Multiplier)
TP2 Long = BoxHigh + (R × TP2Multiplier)
TP3 Long = BoxHigh + (R × TP3Multiplier)
TP4 Long = BoxHigh + (R × TP4Multiplier)
For a short:
TP1 Short = BoxLow - (R × TP1Multiplier)
TP2 Short = BoxLow - (R × TP2Multiplier)
etc.
Default values:
TP1Multiplier = 1.0
TP2Multiplier = 2.0
TP3Multiplier = 3.0
TP4Multiplier = 4.0
However, all TP multipliers must be configurable.
For example, I may later want:
TP1 = 0.75 × Box
TP2 = 1.50 × Box
TP3 = 2.00 × Box
TP4 = 3.00 × Box
The indicator must support decimal multipliers.
9. TP calculation example
If a completed opening box is:
High = 1.17500
Low = 1.17300
Range = 20 pips
Then the long projections using 1×, 2×, 3× and 4× must be:
TP1 = 1.17700
TP2 = 1.17900
TP3 = 1.18100
TP4 = 1.18300
The corresponding short projections must be calculated below the box low.
This calculation must be completely automatic.
10. TP lines
Each TP level should have a label such as:
London TP1
London TP2
London TP3
London TP4
or:
NY Open TP1
etc.
Line:
-
colour
-
style
-
width
should preferably be user configurable.
11. Level extension
Entry, SL and TP levels should extend to a configurable time.
For example:
LevelsEndTime = 17:00
or preferably:
ExtendHours = X
If practical, provide both options or use whichever implementation is more robust.
The previous day's levels must not interfere visually with today's session.
There should also be an option:
ShowHistoricalDays = X
Example:
ShowHistoricalDays = 20
This would display the boxes and projections for the previous 20 trading days.
12. Historical accuracy
This is extremely important because I intend to visually backtest the strategy.
Historical boxes must be calculated using the actual historical bars within the specified time windows.
A completed historical box must never change/repaint because new price data arrives.
The high, low, range, validity and projected TP levels for a completed historical box must remain fixed.
13. Alerts
Please provide optional alerts.
Box completion alert
Example:
EURUSD London Opening box complete — Range 18.6 pips — VALID
Invalid box alert
Example:
EURUSD London Opening box complete — Range 34.2 pips — INVALID
Long breakout alert
When price first reaches/crosses the Long Entry level:
EURUSD London Opening LONG breakout
Short breakout alert
When price first reaches/crosses the Short Entry level:
EURUSD London Opening SHORT breakout
Alerts should occur once per event, not repeatedly on every tick.
Preferably support:
-
MT4 popup alert
-
sound
-
push notification
with individual True/False controls.
Email alert is optional.
14. Box information displayed on chart
I would like the following information available visually:
Session Name
Box Range: XX.X pips
VALID / INVALID
Optionally:
Box High
Box Low
The display should remain clean and readable.
15. Independent settings are essential
This point is important.
Every session box must be independently configurable.
For example:
| Parameter | London | US Pre-Open | NY Cash Open |
|---|---|---|---|
| Start | 07:00 | 12:30 | 14:30 |
| End | 08:00 | 13:30 | 15:00 |
| Min Range | 10 | 12 | 8 |
| Max Range | 30 | 35 | 25 |
| Entry Buffer | 1 | 1.5 | 1 |
| TP1 | 1× | 1× | 0.75× |
| TP2 | 2× | 2× | 1.5× |
| TP3 | 3× | 3× | 2× |
| TP4 | 4× | 4× | 3× |
The numbers above are examples only and must not be hard-coded.
16. Optional average-range functionality
Please quote this separately if it materially increases development cost.
I would like the indicator optionally to calculate the current box as a percentage of the historical average box size for that same session.
Example:
Previous 20 London opening boxes average = 20 pips.
Today's London box = 14 pips.
Therefore:
CurrentBox / AverageBox = 70%
Display:
London — 14.0 pips — 70% of 20-day average
Input:
AverageLookback = 20
Ideally each session should calculate its own historical average.
This should be switchable:
ShowAverageRange = True/False
17. Optional percentile functionality
Please also quote this separately.
Rather than only comparing the box with its mean, I would eventually like to know where today's range falls within the historical distribution for that session.
For example:
London Box = 16.2 pips — 32nd percentile of previous 100 sessions
Inputs:
PercentileLookback = 100
ShowPercentile = True/False
This is not essential for Version 1 if it significantly increases development time/cost.
18. No automatic trading
For clarity:
This project is NOT an Expert Advisor.
The indicator must NOT:
-
open positions;
-
close positions;
-
change orders;
-
calculate lots;
-
access trading permissions.
It is a visual/research indicator only.
I may commission a separate EA later after the strategy has been properly backtested.
19. Performance requirements
The indicator should:
-
work on standard MT4 Forex charts;
-
work correctly on 4/5-digit brokers;
-
work correctly with JPY pairs;
-
not noticeably slow MT4;
-
avoid excessive chart objects;
-
correctly remove/update its own objects when settings change;
-
not interfere with other indicators;
-
not repaint completed boxes.
It should work regardless of the chart timeframe where reasonably possible.
I will primarily use intraday charts.
20. Source code and ownership
Delivery must include:
1. Compiled .ex4 file
2. Complete editable .mq4 source code
The source code must not be locked, encrypted or intentionally obfuscated.
No external DLL dependencies.
No account-number locking.
No expiry date.
No licence server.
No requirement for an internet connection.
I require the ability to modify or extend the indicator in the future.
21. Testing before completion
Before accepting the project I will test:
-
multiple Forex pairs;
-
5-digit pair such as EURUSD;
-
JPY pair;
-
several chart timeframes;
-
historical boxes;
-
multiple sessions on the same chart;
-
different Min/Max ranges;
-
decimal TP multipliers;
-
different broker/server times;
-
valid and invalid boxes;
-
TP calculations;
-
alerts;
-
historical non-repainting behaviour.
Any calculation or display bugs identified during this testing should be corrected before final acceptance.
22. Acceptance example
A simple test case:
Session:
07:00–08:00
High:
1.15000
Low:
1.14800
Therefore:
Range = 20 pips
Settings:
MinBox = 10
MaxBox = 30
EntryBuffer = 1 pip
TP1 = 1×
TP2 = 2×
TP3 = 3×
TP4 = 4×
The indicator should classify the box:
VALID — 20 pips
Long Entry:
1.15010
Short Entry:
1.14790
Long projections from the box high:
TP1 = 1.15200
TP2 = 1.15400
TP3 = 1.15600
TP4 = 1.15800
Short projections from the box low:
TP1 = 1.14600
TP2 = 1.14400
TP3 = 1.14200
TP4 = 1.14000
If the same session instead produces a 35-pip range with:
MaxBox = 30
it must be marked INVALID and, depending on the setting selected, either display the invalid box without trading levels or hide it.
Deliverables
Please include in your proposal:
-
Fixed price for the project
-
Estimated delivery time
-
Confirmation that you have previous MQL4 indicator development experience
-
Confirmation that the full .mq4 source code is included
-
Confirmation that completed historical boxes will not repaint
-
Confirmation that all 5 boxes can have independent times, Min/Max pip ranges and TP multipliers
-
Cost of adding the 20-session average-range calculation
-
Cost of adding the historical percentile calculation
-
Length of post-delivery bug-fix/support period
Please do not apply if you intend to provide only a compiled EX4 file.
The priority is accuracy, simplicity, historical reliability and clean code, rather than unnecessary graphical features.