//+------------------------------------------------------------------+
//| |
//| Psychological Indicator (Ported from FXAccucharts) |
//| Version 1.0 |
//| Copyright © 2007, Bruce Hellstrom (brucehvn) |
//| bhweb@speakeasy.net |
//| http://www.metaquotes.ru |
//+------------------------------------------------------------------+
//+--------------------------------------------------------------------------------+
//| This indicator is ported from the FXAccuCharts platform to MT4. The formula |
//| used here has been tested on FXAccuCharts to insure it displays the same as |
//| their default psychological indicator. |
//| |
//| Input Parameters: |
//| PsychPeriod - Lookback periods for the indicator (25 default) |
//| |
//| Revision History |
//| Version 1.0 |
//| * Initial Revision |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright © 2007, Bruce Hellstrom (brucehvn)"
#property link "http: //www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_style1 STYLE_SOLID
//----
#property indicator_level1 50.0
#property indicator_level2 75.0
#property indicator_level3 25.0
#property indicator_levelcolor Silver
#property indicator_levelwidth 1
#property indicator_levelstyle STYLE_DOT
#define INDICATOR_VERSION "v1.0"
// Input Parameters
extern int PsychPeriod=25;
// Buffers
double PsychBuffer[];
// Other Variables
string ShortName;
int CountBuf[];
// Custom indicator initialization function
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers( 1 );
SetIndexStyle( 0, DRAW_LINE, STYLE_SOLID, 1 );
SetIndexBuffer( 0, PsychBuffer );
SetIndexDrawBegin( 0, PsychPeriod );
ArraySetAsSeries( CountBuf, true );
ShortName="Psychological-" + INDICATOR_VERSION + "(" + PsychPeriod + ")";
IndicatorShortName( ShortName );
SetIndexLabel( 0, ShortName );
Print( ShortName );
Print( "Copyright (c) 2007 - Bruce Hellstrom, bhweb@speakeasy.net" );
//----
return( 0 );
}
// Custom indicator deinitialization function
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
return( 0 );
}
// Indicator Logic run on every tick
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
// Check for errors
if(counted_bars < 0)
{
return( -1 );
}
// Last bar will be recounted
if(counted_bars > 0)
{
counted_bars--;
}
// Resize the non-buffer array if necessary
if(ArraySize( CountBuf)!= ArraySize( PsychBuffer))
{
ArraySetAsSeries( CountBuf, false );
ArrayResize( CountBuf, ArraySize( PsychBuffer));
ArraySetAsSeries( CountBuf, true );
}
// Get the upper limit
int limit=Bars - counted_bars;
for( int ictr=0; ictr < limit; ictr++)
{
int Count=0;
int endctr=ictr + 1 + PsychPeriod;
for( int jctr=ictr + 1; jctr < endctr; jctr++)
{
if(Close[jctr] > Close[jctr + 1])
{
Count++;
}
}
if(Close[ictr] > Close[ictr + 1])
{
Count++;
}
if(Close[ictr + PsychPeriod] > Close[ictr + PsychPeriod + 1])
{
Count--;
}
double dCount=Count;
PsychBuffer[ictr] =(dCount/PsychPeriod)* 100.0;
}
//----
return( 0 );
}
//+------------------------------------------------------------------+
Comments