3.3 Перевірка якості прогнозування
Щоб перевірити якість прогнозування простежимо поведінку крос-курсу EUR/JPY в минулому, підставляємо в формулу (2.2) деякий період.
Нехай у нас є 10-ть проміжків часу – ми беремо 9-ть, прогнозуємо і спів ставляємо історію крос-курсу з виданим прогнозом кібернетичної моделі (рис. 3.4.).
Рис. 3.4. – Співставлення математичного прогнозу з історією
графіка крос-курса
Бачимо, що математичний прогноз справдився. Для статистичних підрахунків довірчої ймовірності пропрацюємо перевірку прогнозу ще близько 100-а разів.
Так після перевірки прогнозування були виведені такі результати:
86,8% прогнозів, які робились за допомогою нового математично методу – справдились. Це на 40,2% краще ніж давно відомі методи мат. аналізу (Williams' Percent Range, Stochastic Oscillator, Bollinger Bands)
4. РОЗРОБКА ІНФОРМАЦІЙНОЇ СИСТЕМИ
Для продуктивної торгівлі на міжнародному валютному ринку потрібно мати мобільну систему інформаційно-технічних методів. Швидкість подачі новин, швидкість реакції індикаторів, осциляторів, реакція брокера на фундаментальні фактори – все це є невід’ємною частиною успішної торгівлі.
Сьогодні, коли інформаційні системи, комп’ютеризація набирають обертів з галопуючим темпом, всі нововведення, науково-дослідні випробування потрібно представляти у вигляді інформаційної, автоматизованої системи.
Новий метод прогнозування періодичних процесів, створений для крос-курсів конвертованих валют, – не є виключенням.
Для практичного застосування запропонованого мною математичного методу, потрібно завантажити архів котирувань, перетворення Фур‘є краще всього робити за допомогою прикладної програми «Statistica 6.0», потім отримані дані необхідно імпортувати в MS Excel і вже там за допомогою «Пошуку рішень» знайти необхідні коефіцієнти. З таким широким алгоритмом майже неможливо вести внутриденну торгівлю. Тому необхідно розробити інформаційну систему.
Краще всього, новорозроблена математична модель автоматизується в торговому терміналі «Meta Trader 4» на основі вбудованого редактора «Meta Editor», мова якого нагадує мову програмування «С++». Дамо новому математичному індикатору назву «SV-Trend», - після компіляції повна назва індикатора буде: «SV-Trend.mq4»
Програмний структурний код виглядає так:
//+------------------------------------------------------------------+
//| SV-Trend.mq4 |
//| Copyright © 2005-2007, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright
#property link
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double SV-TrendBuffer[];
double HighMapBuffer[];
double LowMapBuffer[];
int level=3; // recounting's depth
bool downloadhistory=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(3);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,SV-TrendBuffer);
SetIndexBuffer(1,HighMapBuffer);
SetIndexBuffer(2,LowMapBuffer);
SetIndexEmptyValue(0,0.0);
//---- indicator short name
IndicatorShortName("SV-Trend("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int i, counted_bars = IndicatorCounted();
int limit,counterZ,whatlookfor;
int shift,back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;
if (counted_bars==0 && downloadhistory) // history was downloaded
{
ArrayInitialize(SV-TrendBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
if (counted_bars==0)
{
limit=Bars-ExtDepth;
downloadhistory=true;
}
if (counted_bars>0)
{
while (counterZ<level && i<100)
{
res=SV-TrendBuffer[i];
if (res!=0) counterZ++;
i++;
}
i--;
limit=i;
if (LowMapBuffer[i]!=0)
{
curlow=LowMapBuffer[i];
whatlookfor=1;
}
else
{
curhigh=HighMapBuffer[i];
whatlookfor=-1;
}
for (i=limit-1;i>=0;i--)
{
SV-TrendBuffer[i]=0.0;
LowMapBuffer[i]=0.0;
HighMapBuffer[i]=0.0;
}
}
for(shift=limit; shift>=0; shift--)
{
val=Low[iLowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=LowMapBuffer[shift+back];
if((res!=0)&&(res>val)) LowMapBuffer[shift+back]=0.0;
}
}
}
if (Low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]=0.0;
//--- high
val=High[iHighest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=HighMapBuffer[shift+back];
if((res!=0)&&(res<val)) HighMapBuffer[shift+back]=0.0;
}
}
}
if (High[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]=0.0;
}
// final cutting
if (whatlookfor==0)
{
lastlow=0;
lasthigh=0;
}
else
{
lastlow=curlow;
lasthigh=curhigh;
}
for (shift=limit;shift>=0;shift--)
{
res=0.0;
switch(whatlookfor)
{
case 0: // look for peak or lawn
if (lastlow==0 && lasthigh==0)
{
if (HighMapBuffer[shift]!=0)
{
lasthigh=High[shift];
lasthighpos=shift;
whatlookfor=-1;
SV-TrendBuffer[shift]=lasthigh;
res=1;
}
if (LowMapBuffer[shift]!=0)
{
lastlow=Low[shift];
lastlowpos=shift;
whatlookfor=1;
SV-TrendBuffer[shift]=lastlow;
res=1;
}
}
break;
case 1: // look for peak
if (LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)
{
SV-TrendBuffer[lastlowpos]=0.0;
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
SV-TrendBuffer[shift]=lastlow;
res=1;
}
if (HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
SV-TrendBuffer[shift]=lasthigh;
whatlookfor=-1;
res=1;
}
break;
case -1: // look for lawn
if (HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
{
SV-TrendBuffer[lasthighpos]=0.0;
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
SV-TrendBuffer[shift]=lasthigh;
}
if (LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
SV-TrendBuffer[shift]=lastlow;
whatlookfor=1;
}
break;
default: return;
}
}
return(0);
}
//+------------------------------------------------------------------+
0 комментариев