In your first block of code
int inBar = iBarShift(NULL,TimeFrame,inTime), outBar = iBarShift(NULL,TimeFrame,outTime-1), BarRange = inBar - outBar + 1, MaxShift = iHighest(NULL,TimeFrame,MODE_HIGH,BarRange,outBar), MinShift = iLowest(NULL,TimeFrame, MODE_LOW,BarRange,outBar); double MaxPrice = iHigh(NULL,TimeFrame,MaxShift), MinPrice = iLow(NULL,TimeFrame,MinShift);
should be in OnTick()
- Before submitting code here, make sure that it compiles correctly (or report errors if you are unable to fix them). There were several unbalanced parenthesis and braces.
- Your "start" and "stop" dates are exactly the same, so obviously, it would only work over a single bar, returning the High and Low of that bar.
- Since, there were several other points, I decided to submit my own code for you to analyse and hopefully be able to understand:
EDIT: Removed first code sample, in light of the more recent version (see next post)!
many thanks,
yes. my outTime, would be the next candle and start of next action. in fact min and max checking time is like: intime <= checktime < outtime
am I doing wrong ??
OK! Now that I understand the need for your "one second less" reason, here is my code again corrected for that need:
#property strict input ENUM_TIMEFRAMES enumTimeFrame = PERIOD_M1; input datetime dtBeginTime = D'2016.04.12 08:00:00', dtEndTime = D'2016.04.13 17:30:00'; double dblHighPrice = EMPTY, dblLowPrice = EMPTY; void GetRangeExtremes( datetime dtStartTime, datetime dtStopTime ) { dblHighPrice = EMPTY; dblLowPrice = EMPTY; datetime dtFirstTime = fmin( dtStartTime, dtStopTime ), dtLastTime = fmax( dtStartTime, dtStopTime ) - 1; int intStartShift = iBarShift( NULL, enumTimeFrame, dtFirstTime ), intStopShift = iBarShift( NULL, enumTimeFrame, dtLastTime ); if( ( intStartShift >= intStopShift ) && ( intStopShift >= 0 ) ) { int intRange = intStartShift - intStopShift + 1, intShiftHighest = iHighest( NULL, enumTimeFrame, MODE_HIGH, intRange, intStopShift ), intShiftLowest = iLowest( NULL, enumTimeFrame, MODE_LOW, intRange, intStopShift ); if( intShiftHighest >= 0 ) dblHighPrice = iHigh( NULL, enumTimeFrame, intShiftHighest ); if( intShiftLowest >= 0 ) dblLowPrice = iLow( NULL, enumTimeFrame, intShiftLowest ); } } void OnTick() { static bool boolOnceOnly = true; if( boolOnceOnly ) { GetRangeExtremes( dtBeginTime, dtEndTime ); Comment( "Highest: ", DoubleToString( dblHighPrice, _Digits ), "; Lowest: ", DoubleToString( dblLowPrice, _Digits ) ); boolOnceOnly = false; } }
unbalanced parenthesis and braces was because of cut and paste and editing here, the original code compiles correctly in my meta editor.
because i always change input times, I set them the same.
BUT... with your code I disappoint myself. it is very nice.
thanks
unbalanced parenthesis and braces was because of cut and paste and editing here, the original code compiles correctly in my meta editor.
because i always change input times, I set them the same.
BUT... with your code I disappoint myself. it is very nice.
thanks
Thank you!
Just made I minor bug correction to my code, so consider the latest version now instead of the previous. I previously had "if( intShiftHighest > 0 )" when it should have been "if( intShiftHighest >= 0 )" and the same was done for intShiftLowest.
many thanks,
yes. my outTime, would be the next candle and start of next action. in fact min and max checking time is like: intime <= checktime < outtime
am I doing wrong ??
thank you GumRai and FMIC for your help,
it solved my problem.
Hi
today I tested the EA in two ways;
FMIC code does not work as I expected and just read offline times.
Gumrai solution make it work and change the price along with min and max changes in a separate EA that has just the code related to this part, but I need that variables in the top to use in many functions. what can I do ?
Hi
today I tested the EA in two ways;
FMIC code does not work as I expected and just read offline times.
Gumrai solution make it work and change the price along with min and max changes in a separate EA that has just the code related to this part, but I need that variables in the top to use in many functions. what can I do ?
My code was written specifically for the problem you described with your original example code - That is, the times are given as static input parameters, and thus only gets calculated once.
If you wanted a solution for dynamic dates that change during the course of the EA's workings, then you should have specified that or given a more realistic example in your original post. We cannot guess or anticipate what your final goal is for the code.
In essence, you should always consider code given here on the forum as skeleton code or example code that you then have to adapt to your requirements. In other words, you should read the documentations with regards to each function and then apply that knowledge to your own code.
Here is sample code for just the main function, adapted for dynamic use:
void GetRangeExtremes( string strSymbol, ENUM_TIMEFRAMES enumTimeframe, datetime dtStartTime, datetime dtStopTime, double &dblHighPriceVar, double &dblLowPriceVar ) { dblHighPriceVar = EMPTY; dblLowPriceVar = EMPTY; datetime dtFirstTime = fmin( dtStartTime, dtStopTime ), dtLastTime = fmax( dtStartTime, dtStopTime ) - 1; int intStartShift = iBarShift( strSymbol, enumTimeframe, dtFirstTime ), intStopShift = iBarShift( strSymbol, enumTimeframe, dtLastTime ); if( ( intStartShift >= intStopShift ) && ( intStopShift >= 0 ) ) { int intRange = intStartShift - intStopShift + 1, intShiftHighest = iHighest( strSymbol, enumTimeframe, MODE_HIGH, intRange, intStopShift ), intShiftLowest = iLowest( strSymbol, enumTimeframe, MODE_LOW, intRange, intStopShift ); if( intShiftHighest > 0 ) dblHighPriceVar = iHigh( strSymbol, enumTimeframe, intShiftHighest ); if( intShiftLowest > 0 ) dblLowPriceVar = iLow( strSymbol, enumTimeframe, intShiftLowest ); } }

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
hi
i am new in mql4 an i need to make an EA that get the Max and Min price in a period of time and as it goes. for example now it is 12:00 o'clock, and i need to check the highest price between 14:00 and 16:00 and if we would be in 15:00 , comment the max price in every tick.
i write this, but it works only if the the period time is passed. please help. thanks.
I also make it as a function but it doesn't work.