Помощь в кодировании - страница 321

 

Вот что я сделал, пытаясь применить MA к SSA напрямую, как в примере на моем рисунке.

Конечно, я полный профан в кодировании...

Поэтому, если кто-нибудь подскажет мне, что я должен изменить, я буду очень благодарен.

Я люблю решать проблемы, даже если я ноб в этом деле, но если человек не пытается решить свои проблемы, он навсегда останется нобом ...

//+------------------------------------------------------------------+

//| FullSSA.mq4 |

//| Copyright © 2007,klot |

//| klot@mail.ru |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, klot"

#property link "klot@mail.ru"

#import "libSSA.dll"

void fastSingular(double& a[],int n,int lag,int s,double&b[]);

#import

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 White

#property indicator_color2 DeepPink

#property indicator_width1 3

#property indicator_level1 0.0

#property indicator_levelstyle STYLE_DASH

#property indicator_levelcolor Magenta

extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";

extern string TimeFrame = "Текущий таймфрейм";

extern int Lag = 10;

extern int NumComps = 2;

extern int PeriodNorm = 10;

extern int N = 1000;

extern int SSAMa_Mode = 3;

extern int MaPeriod = 5;

extern int Ma_Mode = 3;

extern bool Interpolate = true;

double SSA[];

double ssaWork[];

double SSAma[];

double arryTimeSeries[];

string indicatorFileName;

bool returnBars;

bool calculateValue;

int timeFrame;

int init()

{

SetIndexBuffer(0,SSA); SetIndexBuffer(1,SSAma);SetIndexStyle(0,DRAW_LINE); SetIndexDrawBegin(0,Bars-N);

indicatorFileName = WindowExpertName();

calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);

timeFrame = stringToTimeFrame(TimeFrame);

IndicatorShortName(timeFrameToString(timeFrame)+ " FullSSA normalize correct");

return(0);

}

int deinit(){return(0);}

int start()

{

double dev,ma;

int nmax, nmin;

int size = N;

if (size>Bars) size = Bars;

if (ArraySize(arryTimeSeries) != size)

{

ArrayResize(arryTimeSeries,size);

ArrayResize(ssaWork,size);

}

int limit, i;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=MathMin(Bars-counted_bars,Bars-1);

if (returnBars) { SSA[0] = limit+1; return(0); }

if (calculateValue || timeFrame==Period())

{

for( i=size-1; i>=0; i--)

{

ma=iMA(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

dev=3*iStdDev(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

if(dev==0) dev=0.1;

arryTimeSeries=(Close-ma)/dev;//iDeMarker(NULL,0,PeriodNorm,i);

ObjectDelete("Sell "+Time);

ObjectDelete("Buy "+Time);

}

fastSingular(arryTimeSeries,size,Lag,NumComps,ssaWork);

ArrayCopy(SSA,ssaWork);

nmax=ArrayMaximum(SSA,3,1);

nmin=ArrayMinimum(SSA,3,1);

if(nmax==2) {

ObjectCreate("Sell "+Time[0],OBJ_ARROW,0,Time[0],Open[0]);

ObjectSet("Sell "+Time[0],OBJPROP_ARROWCODE,226);

}

if(nmin==2) {

ObjectCreate("Buy "+Time[0],OBJ_ARROW,0,Time[0],Open[0]);

ObjectSet("Buy "+Time[0],OBJPROP_ARROWCODE,225);

}

//----

return(0);

}

limit =MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"", "returnBars",0,0)*timeFrame/Period()));

for (i=limit; i>=0; i--)

for (i=limit; i>=0; i--) SSAma = iMAOnArray(SSA,Bars,MaPeriod,0,Ma_Mode,i);

{

int y = iBarShift(NULL,timeFrame,Time);

SSA =iCustom(NULL,timeFrame,indicatorFileName,"", "calculateValue",Lag,NumComps,PeriodNorm,N,0,y);

if (timeFrame <= Period() ||y==iBarShift(NULL,timeFrame,Time)) continue;

if (!Interpolate) continue;

datetime time = iTime(NULL,timeFrame,y);

for(int n = 1; i+n =time; n++) continue;

double factor = 1.0 / n;

for(int x = 1; x < n; x++)

{

SSA= x*фактор*SSA + (1.0-x*фактор)*SSA;

}

}

return(0);

}

//+------------------------------------------------------------------+

string sTfTable[] ={"M1","M5","M15","M30","H1","H4","D1","W1","MN"};

int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//

//

//

//

//

int stringToTimeFrame(string tfs)

{

tfs = StringUpperCase(tfs);

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tfs==sTfTable || tfs==""+iTfTable)return(MathMax(iTfTable,Period()));

return(Period());

}

string timeFrameToString(int tf)

{

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tf==iTfTable) return(sTfTable);

return("");

}

//

//

//

//

//

string StringUpperCase(string str)

{

string s = str;

for (int length=StringLen(str)-1; length>=0; length--)

{

int tchar = StringGetChar(s, length);

if((tchar > 96 && tchar 223 && tchar < 256))

s = StringSetChar(s, length, tchar - 32);

else if(tchar > -33 && tchar < 0)

s = StringSetChar(s, length, tchar + 224);

}

return(s);

}

 
mladen:
Для изменения наклона попробуйте что-нибудь вроде этого :[PHP]double current = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,0);double previous1 = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,1);double previous2 = iCustom(Symbol(),0, "HMA_Russian_Color",20,3,0,2);if (current>previous1 && previous1

Спасибо Mladen!!!, теперь я понял, что забыл добавить Extmapbuffer, номер 2 к условиям.

Как будет условие для "while is Uptrend" покупать или "while is Dntrend" продавать, так как у меня уже есть условия исполнения для ордеров, а не для изменения наклона?

Еще раз спасибо

Даниэль

 

Уважаемый Младен,

Мне нужно, чтобы условие было "при тренде", а не при точном изменении наклона, поэтому я написал это, но у меня проблема с нисходящим трендом, правильны ли эти условия? Для восходящего тренда вроде все работает хорошо... а вот с нисходящим трендом у меня проблемы... Надеюсь, вы сможете мне помочь, спасибо.

if (current>previous1)

{

// восходящий тренд

}

if(current<previous1)

{

// нисходящий тренд ЭТО НЕ РАБОТАЕТ НЕ ТРЕБУЕТ НИКАКОГО ОРДЕРА ПРОДАЖИ...

}

 
Wulong10:
Вот что я сделал, пытаясь применить MA к SSA напрямую, как пример на моей картинке.

Конечно, я полный профан в кодировании...

Поэтому, если кто-то может сказать мне, что я должен изменить, я был бы очень благодарен.

Я люблю решать проблемы, даже если я профан в этом деле, но если человек не пытается решить свои проблемы, он навсегда останется профаном...

//+------------------------------------------------------------------+

//| FullSSA.mq4 |

//| Copyright © 2007,klot |

//| klot@mail.ru |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2007, klot"

#property link "klot@mail.ru"

#import "libSSA.dll"

void fastSingular(double& a[],int n,int lag,int s,double&b[]);

#import

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 White

#property indicator_color2 DeepPink

#property indicator_width1 3

#property indicator_level1 0.0

#property indicator_levelstyle STYLE_DASH

#property indicator_levelcolor Magenta

extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN|0-CurrentTF";

extern string TimeFrame = "Текущий таймфрейм";

extern int Lag = 10;

extern int NumComps = 2;

extern int PeriodNorm = 10;

extern int N = 1000;

extern int SSAMa_Mode = 3;

extern int MaPeriod = 5;

extern int Ma_Mode = 3;

extern bool Interpolate = true;

double SSA[];

double ssaWork[];

double SSAma[];

double arryTimeSeries[];

string indicatorFileName;

bool returnBars;

bool calculateValue;

int timeFrame;

int init()

{

SetIndexBuffer(0,SSA); SetIndexBuffer(1,SSAma);SetIndexStyle(0,DRAW_LINE); SetIndexDrawBegin(0,Bars-N);

indicatorFileName = WindowExpertName();

calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);

timeFrame = stringToTimeFrame(TimeFrame);

IndicatorShortName(timeFrameToString(timeFrame)+ " FullSSA normalize correct");

return(0);

}

int deinit(){return(0);}

int start()

{

double dev,ma;

int nmax, nmin;

int size = N;

if (size>Bars) size = Bars;

if (ArraySize(arryTimeSeries) != size)

{

ArrayResize(arryTimeSeries,size);

ArrayResize(ssaWork,size);

}

int limit, i;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=MathMin(Bars-counted_bars,Bars-1);

if (returnBars) { SSA[0] = limit+1; return(0); }

if (calculateValue || timeFrame==Period())

{

for( i=size-1; i>=0; i--)

{

ma=iMA(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

dev=3*iStdDev(NULL,0,PeriodNorm,0,MODE_SMA,PRICE_CLOSE,i);

if(dev==0) dev=0.1;

arryTimeSeries=(Close-ma)/dev;//iDeMarker(NULL,0,PeriodNorm,i);

ObjectDelete("Sell "+Time);

ObjectDelete("Buy "+Time);

}

fastSingular(arryTimeSeries,size,Lag,NumComps,ssaWork);

ArrayCopy(SSA,ssaWork);

nmax=ArrayMaximum(SSA,3,1);

nmin=ArrayMinimum(SSA,3,1);

if(nmax==2) {

ObjectCreate("Sell "+Time[0],OBJ_ARROW,0,Time[0],Open[0]);

ObjectSet("Sell "+Time[0],OBJPROP_ARROWCODE,226);

}

if(nmin==2) {

ObjectCreate("Buy "+Time[0],OBJ_ARROW,0,Time[0],Open[0]);

ObjectSet("Buy "+Time[0],OBJPROP_ARROWCODE,225);

}

//----

return(0);

}

limit =MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"", "returnBars",0,0)*timeFrame/Period()));

for (i=limit; i>=0; i--)

for (i=limit; i>=0; i--) SSAma = iMAOnArray(SSA,Bars,MaPeriod,0,Ma_Mode,i);

{

int y = iBarShift(NULL,timeFrame,Time);

SSA =iCustom(NULL,timeFrame,indicatorFileName,"", "calculateValue",Lag,NumComps,PeriodNorm,N,0,y);

if (timeFrame <= Period() ||y==iBarShift(NULL,timeFrame,Time)) continue;

if (!Interpolate) continue;

datetime time = iTime(NULL,timeFrame,y);

for(int n = 1; i+n =time; n++) continue;

double factor = 1.0 / n;

for(int x = 1; x < n; x++)

{

SSA= x*фактор*SSA + (1.0-x*фактор)*SSA;

}

}

return(0);

}

//+------------------------------------------------------------------+

string sTfTable[] ={"M1","M5","M15","M30","H1","H4","D1","W1","MN"};

int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};

//

//

//

//

//

int stringToTimeFrame(string tfs)

{

tfs = StringUpperCase(tfs);

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tfs==sTfTable || tfs==""+iTfTable)return(MathMax(iTfTable,Period()));

return(Period());

}

string timeFrameToString(int tf)

{

for (int i=ArraySize(iTfTable)-1; i>=0; i--)

if (tf==iTfTable) return(sTfTable);

return("");

}

//

//

//

//

//

string StringUpperCase(string str)

{

string s = str;

for (int length=StringLen(str)-1; length>=0; length--)

{

int tchar = StringGetChar(s, length);

if((tchar > 96 && tchar 223 && tchar < 256))

s = StringSetChar(s, length, tchar - 32);

else if(tchar > -33 && tchar < 0)

s = StringSetChar(s, length, tchar + 224);

}

return(s);

}

Wulong10

Я не вижу картинку.

Не могли бы вы прикрепить его?

 

Я уже выкладывал картинку, но вот она снова.

Итак, когда я беру MA из MT4 и применяю ее к SSA (применяю к первым инд. данным), MA выглядит нормально, когда я открываю MT4, но когда она работает в реальном времени, она больше не следует за SSA.

Это происходит только на M1, на M5 все работает без проблем.

Картинка должна объяснить это визуально.

Спасибо.

Файлы:
ssa.png  72 kb
 
Wulong10:
Я уже размещал картинку, но вот она снова.

Итак, когда я беру MA из MT4 и применяю ее к SSA (применяю к первым инд. данным), MA выглядит нормально, когда я открываю MT4, но когда она работает в реальном времени, она больше не следует за SSA.

Это происходит только на M1, на M5 все работает без проблем.

Картинка должна объяснить это визуально.

Спасибо.

Не забывайте, что SSA пересчитывается. Если вы не рассчитаете MA всех баров SSA, которые пересчитываются, то он перестанет следовать SSA.

 

Хорошо, теперь я понимаю, почему это работает на M5, это потому, что я установил период MA там на 1, а на M1 я установил его на 2 .... Это должно решить проблему. Я протестировал это на своем торговом симуляторе, это не идеально, но гораздо лучше!

С периодом 1 МА должна следовать за SSA.

Но как я могу встроить MA непосредственно в код SSA? И она также должна пересчитывать все бары SSA.... или это невозможно?

 
Wulong10:
Хорошо, теперь я понимаю, почему это работает на M5, это потому, что я установил период MA там на 1, а на M1 я установил его на 2 .... Это должно решить проблему. Я протестировал это на своем торговом симуляторе, это не идеально, но гораздо лучше!

С периодом 1 ОУ должен следовать SSA.

Но как я могу включить MA непосредственно в код SSA? И она также должна пересчитывать все бары SSA.... или это невозможно?

Wulong10

Не могли бы вы выложить ваш файл mq4 (копирование текста в mql почти всегда вызывает некоторые проблемы)?

 

Не обращайте внимания на последний запрос.

Вот версия с добавленной скользящей средней: ssa__ma.mq4

Файлы:
ssa__ma.mq4  5 kb
ssa__ma.gif  75 kb
 

Хорошо, спасибо Младен, ты лучший!

У меня нет времени проверить это сейчас, это нога сегодня вечером, я дам вам знать результат ... когда будет время.

Теперь я также вижу, как я должен был это сделать, так что я буду на 0,5 % менее бестолковым после того, как изучу это.