← К каталогу
Исходный код · ID 3228

VSA Signals

vsa signals v1.mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

VSA Signals — это пользовательский индикатор для MetaTrader 4, который анализирует свечные бары на предмет паттернов объёмно-ценового анализа (Volume Spread Analysis). Индикатор оценивает соотношение объёма, диапазона цены и характера закрытия свечей, чтобы определить сигналы слабости и силы рынка.

Результаты отображаются в виде стрелок-объектов на графике: сигналы слабости окрашиваются в красный цвет, сигналы силы — в синий. Если фон (общая тенденция) не совпадает с сигналом, отметки отображаются серым цветом. Индикатор поддерживает настройку цветовой схемы и сессионных параметров.

Индикатор работает в цикле по барам в функции start(), перебирая ограниченное количество последних баров и определяя для каждого его характеристики, тип свечи, категорию объёма и спреда, а затем классифицируя сигнал. Встроенная отладочная функция позволяет выводить промежуточные значения в комментарий для проверки расчётов.

Индикатор не выполняет торговых операций и не использует торговые API. Он является чисто аналитическим инструментом, предоставляющим визуальные сигналы на графике цен.

Настройки программы

НастройкаОписание
these determine what period to use for measuring average volume and spread (settings) Настройки периода — Текстовый параметр, определяющий период для расчёта среднего объёма и спреда
vollbf Коэффициент периода объёма — Коэффициент для расчёта периода среднего объёма
spdlbf Коэффициент периода спреда — Коэффициент для расчёта периода среднего спреда
lookbackbars Количество баров для анализа — Количество баров для анализа при определении сигналов
colors Цвета символов — Групповой заголовок для параметров цветовой схемы
strength_color Цвет силы — Цвет отображения сигналов силы на графике
weakness_color Цвет слабости — Цвет отображения сигналов слабости на графике
wrong_background Цвет при неподходящем фоне — Цвет отображения сигнала при несоответствии фону (сигнал показывается серым)
UseSessionAverage Использовать сессионное среднее — Переключатель использования сессионного среднего объёма вместо общего среднего
Start time of Asian session in brokers time (AsiaBegin) Начало азиатской сессии — Начало азиатской сессии в часовом поясу брокера (используется при включённой сессионной средней)
End time of Asian session in brokers time (AsiaEnd) Окончание азиатской сессии — Окончание азиатской сессии в часовом поясу брокера
Start time of European session in brokers time (EurBegin) Начало европейской сессии — Начало европейской сессии в часовом поясу брокера
End time of European session in brokers time (EurEnd) Окончание европейской сессии — Окончание европейской сессии в часовом поясу брокера
Start time of New York session in brokers time (USABegin) Начало нью-йоркской сессии — Начало нью-йоркской сессии в часовом поясу брокера
Endtime of New York session in brokers time (USAEnd) Окончание нью-йоркской сессии — Окончание нью-йоркской сессии в часовом поясу брокера
Получить полный код

Поиск по коду файла

/*
-------------------------------------------------------------------------
Version v1.23, Date: 26/07/2010

changed the display signal function to place symbols better.

signals: weakness marked in red, strength marked in blue. signals with 
relevant background marked in gray

Currently this has not been optimised for CPU usage, or to prevent 
signals appearing without appropriate background 
(i.e. looking for polar bears in haiwaii), though they should be marked 
in gray rather than red or blue. 

VSA bar determination is sensitive to spread and volume look back factors
vollbf and spdlbf - I have optimised these by time period and "feel".  
I don't recommend changing them but you can if you wish.
-------------------------------------------------------------------------
*/

/*

SIGNAL NAME 	 			                BAR	CLOSE		VOLUME	SPREAD	CONFIRMED BY

UP-THRUST - Basic				      	    up	low		(v)high	vwide		N/A
UP-THRUST - Basic					          up	low		high		avg		N/A
UP-THRUST - Basic					          up	low		low		avg		N/A
UP-THRUST - Trap up move 	 			    down low 		avg 		(v)wide 	N/A
UP-THRUST - Trap up move				    down	low		(v)high	(v)wide	N/A

2-BAR REVERSAL (UPTHRUST)

NO DEMAND						             up	low/mid  (v)low	narrow	next bar closes down
NO DEMAND						             up	low/mid  v0<v1&v2	narrow	next bar closes down
NO DEMAND						             up	low/mid  (v)low	average	next bar closes down

EFFORT TO RISE						          up	high		high		(v)wide	N/A
BUYING CLIMAX						          up	high	   vhigh		vwide		N/A
END OF A RISING MARKET			          up	mid/high	high		narrow	N/A (previous spread wide or vwide)
HIDDEN POTENTIAL SELLING 		          up	mid/low	vhigh		avg/wide	N/A (previous spread wide or vwide)
SQUAT (UP)                              up	high     (v)high	narrow	N/A

STOPPING VOLUME					          down	high		high		narrow	N/A
STOPPING VOLUME					          down	high		vhigh	   (v)wide  N/A
STOPPING VOLUME					          down	mid		vhigh		vwide  	N/A
(ABSORPTION VOLUME					       down	high		uhigh		uwide		N/A)

2-BAR REVERSAL (STOPPING VOLUME)

SHAKE OUT						             up	high		high		wide		N/A
(REVERSE UP-THRUST					       up	high		high		wide		N/A)

NO SUPPLY						             down	mid/high (v)low	narrow	next bar closes up
NO SUPPLY						             down high		low		average	next bar closes up

TEST OF SUPPLY						          down	mid/high	v0<v1&v2	narrow	next bar closes up

(FALLING PRESSURE					          down	low		low		wide		N/A)

EFFORT TO FALL						          down	low		high		(v)wide	N/A
SELLING CLIMAX						          down low	   vhigh	   vwide	   N/A
BAG HOLDING						             down	low		(v)high	narrow	N/A
SQUAT (DOWN)                            down	high  	(v)high	narrow	N/A

the other way to determine weakness or stength is to use a meter based on wether the high average volume is occuring on down bars, or up bars, with factoring for spread

*/

#property indicator_chart_window

extern string settings = "Lookback Factors"; // these determine what period to use for measuring average volume and spread
extern double vollbf = 1.0; 
extern double spdlbf = 1.0;
extern int lookbackbars = 500;
extern string colors = "Symbol Colors";
extern color strength_color = CornflowerBlue;
extern color weakness_color = IndianRed;
extern color wrong_background;

extern bool    UseSessionAverage = false;
extern int     AsiaBegin  = 17;   // Start time of Asian session in brokers time 
extern int     AsiaEnd    = 5;   // End time of Asian session in brokers time
extern int     EurBegin   = 3;   // Start time of European session in brokers time
extern int     EurEnd     = 12;   // End time of European session in brokers time
extern int     USABegin   = 8;   // Start time of New York session in brokers time
extern int     USAEnd     = 17;   // Endtime of New York session in brokers time

int UPTHRUST                  = 0;
int TWO_BAR_REV_UT            = 1;
int NO_DEMAND                 = 2;
int EFFORT_TO_RISE            = 3;
int BUYING_CLIMAX             = 4;
int FAILED_FALL               = 5;
int HIDDEN_POTENTIAL_SELLING  = 6;
int END_OF_RISING_MARKET      = 7;
int SQUAT_UP                  = 8;

int STOPPING_VOLUME           = 9; 
int SHAKEOUT                  = 10; 
int TWO_BAR_REV_SV            = 11; 
int NO_SUPPLY                 = 12; 
int TEST_OF_SUPPLY            = 13; 
int EFFORT_TO_FALL            = 14; 
int SELLING_CLIMAX            = 15; 
int BAG_HOLDING               = 16;
int HIDDEN_POTENTIAL_BUYING   = 17;
int SQUAT_DOWN                = 18; 
int FAILED_RISE               = 19; 
int HIDDEN_TEST               = 20; 

bool upbar, downbar, upclose, midclose, downclose;

bool narrowsp, avgsp, widesp,vwidesp, uwidesp;

bool vlowv, lowv, avgv, highv, vhighv; 

bool pbarup, pbardown;

int signal, prevsignal = EMPTY_VALUE;

int code[20] = {167,167,250,159,108,111,108,108,159,  178,167,167,250,83,159,108,108,108,250,119,250};
string text[20] = {"UPTHRUST","2-BAR REVERSAL UPTHRUST","NO DEMAND","EFFORT TO RISE","BUYING CLIMAX", "EFFORT TO FALL WITH NO RESULT", "HIDDEN POTENTIAL SELLING", "END OF A RISING MARKET", "SQUAT (UP)",  
                  "STOPPING VOLUME", "SHAKEOUT", "2-BAR REVERSAL STOPPING VOLUME", "NO SUPPLY", "TEST OF SUPPLY", "EFFORT TO FALL", "SELLING CLIMAX", "BAG HOLDING", "HIDDEN POTENTIAL BUYING", "SQUAT (DOWN)", "EFFORT TO RISE WITH NO RESULT", "HIDDEN TEST"};

double pts, dprice, last_dprice;
int sctr, icolor = 0;

int strength = 1;
int weakness = -1;
int up = 1;
int down = -1;
int vperiod, speriod = 0;
int background, meter = 0;

int min2bar_reversal_length = 0;
double mid_body_ratio = 0.60;
double long_body_ratio = 0.80;

double shift=0;

double v0,v1,v2, spread, closelow, avgspread, avgvol, stdvol, stspread; 
bool testmode = false;
string objprefix = "[VSA]";

int init()
{
      // код доступен только после оплаты
   }

int deinit()
{

  for(int i=ObjectsTotal();i >= 0;i--)
  {
    if(StringSubstr(ObjectName(i),0,StringLen(objprefix))==objprefix)
    { ObjectDelete(ObjectName(i)); }
  }

   return(0);
}

int start()
{
      // код доступен только после оплаты
   }

double CalcRange(int bar, bool verify=false)
{
   int counter, n=0;
   double Range, AvgRange; 
   if (verify) n=1;
   AvgRange=0;
   for (counter=bar-n; counter<=bar+1;counter++)
   {
      AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
   }
   Range=AvgRange/2;
   return(Range);
}

void SetConstants()
{
   shift =(WindowPriceMax()-WindowPriceMin())/30;
   meter = 0;
   background = 0;
   switch (Period()) {
      case PERIOD_M1:
         vperiod = 40*vollbf;
         speriod = 40*spdlbf; 
         min2bar_reversal_length = 10;
         break;
      case PERIOD_M5:
         vperiod = 30*vollbf;
         speriod = 30*spdlbf; 
         min2bar_reversal_length = 10;
         break;
      case PERIOD_M15:
         vperiod = 25*vollbf;
         speriod = 25*spdlbf; 
         min2bar_reversal_length = 10;
         break;
      case PERIOD_M30:
         vperiod = 24*vollbf;
         speriod = 24*spdlbf; 
         min2bar_reversal_length = 15;
         break;      
      case PERIOD_H1:
         vperiod = 20*vollbf;
         speriod = 20*spdlbf;
         min2bar_reversal_length = 25;
         break;
      case PERIOD_H4:
         vperiod = 20*vollbf;
         speriod = 20*spdlbf;
         min2bar_reversal_length = 20;
         break;
      case PERIOD_D1:
         vperiod = 20*vollbf;
         speriod = 20*spdlbf;
         min2bar_reversal_length = 30;
         break;
      case PERIOD_W1:
         vperiod = 20*vollbf;
         speriod = 20*spdlbf;
         min2bar_reversal_length = 40;
         break;
      case PERIOD_MN1:
         vperiod = 20*vollbf;
         speriod = 20*spdlbf;
         min2bar_reversal_length = 50;
         break;
   }
   if (testmode)
      Comment("vl=",vperiod," sl=",speriod);
}

int Session(datetime dt )
{
   int session = 0;
   int hour = TimeHour(dt);
   if ( (hour >=AsiaBegin) || ( (AsiaBegin>AsiaEnd) && (hour <= AsiaEnd)) )
   { 
      session = 1;
   }
   if ( hour >=EurBegin || ( (EurBegin>EurEnd) && ( hour <= EurEnd)) )
   {
      session = 2;
   }
   if ( (hour>=USABegin && hour>EurEnd) || ( (USABegin>USAEnd) && (hour <= USAEnd)) )
   { 
      session = 3;
   }
   return (session);

}

double CalculateAverageSpread(int cbar)
{
   double as, s = 0;
   for (int i=cbar+speriod; i>=cbar; i--)
   {
      s = High[i]-Low[i];
      as = as+s;
   }   
   return(as/speriod);
}

double CalculateSpdStdDev(double av, int cbar) 
{
   double s, sd, sumspd = 0;
   for (int i=cbar+speriod; i>=cbar; i--)
   {
      s = (High[cbar]-Low[cbar]) - av;
      sumspd = sumspd+MathPow(s,2);
   }   
   sd = MathSqrt(sumspd/speriod);
   return(sd);
}

double CalculateAverageVolume(int cbar)
{
   double av, v = 0;
   for (int i=cbar+vperiod; i>=cbar; i--)
   {
      v = iVolume(NULL,Period(),i);
      av = av+v;
   }   
   return(av/vperiod);
}

double CalculateSessionAverageVolume(int bar)
{
   double av, v = 0;
   int i, c = 0;
   i = bar;
   while (c<vperiod)
   {
      if ( Session(iTime(NULL,Period(),i)) == Session(iTime(NULL,Period(),bar)) )
      {
         v = iVolume(NULL,Period(),i);
         av = av+v;
         c++;
      }
      i++;
      if (i>2*lookbackbars) { break;}
   }   
   return(av/vperiod);
}

double CalculateVolStdDev(double av, int cbar) 
{
   double v, sd, sumv2 = 0;
   for (int i=cbar+vperiod; i>=cbar; i--)
   {
      v = iVolume(NULL,Period(),i) - av;
      sumv2 = sumv2+MathPow(v,2);
   }   
   sd = MathSqrt(sumv2/vperiod);
   return(sd);
}

bool LocalHigh(int bar, int back)
{
   if (bar == iHighest(NULL,0, MODE_HIGH,back,bar))
   { return(true); }
   return(false);
}

Показано первые 50% кода (символов: 15276)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 527,60₽ ≈ $18.67