Exp - Templates #8 Tester Light
|
|
Дата: Четверг, 22.11.2012, 21:05 | Сообщение # 1
Написал:
Администратор
expforex
|
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн
|
Программирование советников, для проверки своей стратегии по каким либо индикаторам - достаточно простое дело. И особых познаний в области программирования не нужны. Я расскажу Вам, как сделать советника за 5 минут на основе каких либо индикаторов.
|
|
Дата: Понедельник, 02.11.2015, 10:30 | Сообщение # 101
Написал:
viktorosyka_
|
Группа: Удаленные
|
Здравствуйте уважаемый Влад! Не могли-бы вы на примере вложенного индикатора показать как вставить в шаблон советника10 не сам
индикатор, а исполняемый код сигналов.
Код #property link "http://www.forex-instruments.info" //+------------------------------------------------------------------+ //| SHI_SilverTrendSig.mq4 | //| Copyright © 2003, VIAC.RU, OlegVS, GOODMAN, 2005 Shurka | //| shforex@narod.ru | //| | //| | //| Пишу программы на заказ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, Shurka" #property link "http://shforex.narod.ru"
#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue #define SH_BUY 1 #define SH_SELL -1
//---- Входные параметры extern int AllBars=0;//How many bars should be counted. 0 - all the bars. extern int Otstup=30;//Step back. extern double Per=9;//Period. int SH,NB,i,UD; double R,SHMax,SHMin; double BufD[]; double BufU[]; //+------------------------------------------------------------------+ //| Функция инициализации | //+------------------------------------------------------------------+ int init() { //We will write the number of the bars for which we are counting to the NB if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars; IndicatorBuffers(2); IndicatorShortName("SHI_SilverTrendSig"); SetIndexStyle(0,DRAW_ARROW,0,1); SetIndexStyle(1,DRAW_ARROW,0,1); SetIndexArrow(0,159); SetIndexArrow(1,159); SetIndexBuffer(0,BufU); SetIndexBuffer(1,BufD); SetIndexDrawBegin(0,Bars-NB);//This indicator will be shown for NB bar only SetIndexDrawBegin(1,Bars-NB); ArrayInitialize(BufD,0.0);//Give a lot of "zero" to the buffe. Otherwise it will be garbage during the changing of
time frame. ArrayInitialize(BufU,0.0); return(0); } //+------------------------------------------------------------------+ //| Функция деинициализации | //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ //| Собсна индикатор | //+------------------------------------------------------------------+ int start() { int CB=IndicatorCounted(); /* It is the optimization option. We have the function here which restore/return the number of counted bars in
very special way. During the first indicator's call we have 0: it is normal because it was not counted anything, and then we receive the number of bars minus 1. For example, if the number of bars equal 100, we will have 99. I did it especially, you may see that NB is the number of bars whioch should be counted. You know we may throw out this parameter. But for the people who understand we may keep it. So, during
the first call of indicator this NB is the same one but during the 2dn etc calls - reducing the value up to the last bar, That is 1 or 2 for example*/ if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB; for (SH=1;SH<NB;SH++)//comb out the chart from 1 to NB { for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55;
SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)]; SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)]; if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5;
UD=SH_SELL; } if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5;
UD=SH_BUY; } } return(0); } С уважением Виктор.
|
|
Дата: Понедельник, 02.11.2015, 10:32 | Сообщение # 102
Написал:
Администратор
expforex
|
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн
|
Приветствую, да смогу сделать, только немного позже. закончу заказ и помогу
|
|
Дата: Понедельник, 02.11.2015, 10:39 | Сообщение # 103
Написал:
viktorosyka_
|
Группа: Удаленные
|
Спасибо! Буду ждать.
|
|
Дата: Среда, 04.11.2015, 11:50 | Сообщение # 104
Написал:
viktorosyka_
|
Группа: Удаленные
|
Подскажите пожалуйста когда у вас появится окно что-бы и я был на сайте?
|
|
Дата: Пятница, 06.11.2015, 13:59 | Сообщение # 105
Написал:
Администратор
expforex
|
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн
|
viktorosyka_,
Код double ExampleCustomDN=iCustom(Symbol(),0,"SHI_SilverTrendSig",0,1); // Пример вызова пользовательского индикатора double ExampleCustomUP=iCustom(Symbol(),0,"SHI_SilverTrendSig",1,1); // Пример вызова пользовательского индикатора
//Указываем Сигналы на открытие: if( ExampleCustomUP!= EMPTY_VALUE)Sig=1; if( ExampleCustomDN!= EMPTY_VALUE)Sig=2; почему то индикатор не дает больше одного сигнала за раз
|
|
Дата: Пятница, 06.11.2015, 19:59 | Сообщение # 106
Написал:
viktorosyka_
|
Группа: Удаленные
|
Цитата expforex (  ) double ExampleCustomDN=iCustom(Symbol(),0,"SHI_SilverTrendSig",0,1); // Пример вызова пользовательского индикатора double ExampleCustomUP=iCustom(Symbol(),0,"SHI_SilverTrendSig",1,1); // Пример вызова пользовательского индикатора//Указываем Сигналы на открытие: if( ExampleCustomUP!= EMPTY_VALUE)Sig=1; if( ExampleCustomDN!= EMPTY_VALUE)Sig=2; Здравствуйте! Возможно я не правильно сформулировал вопрос, но меня интересует не вызов индикатора (это я делал и все получилось). А как в тело шаблона вставить код самого индикатора. Что-бы советник сам прсчитывал, а именно затруднения с функцией int CB=IndicatorCounted();
|
|
Дата: Пятница, 06.11.2015, 20:12 | Сообщение # 107
Написал:
Администратор
expforex
|
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн
|
а... ну тут в принципе можно поставить int CB=0; и ограничить расчет например по 100 последним барам
Код NB=100; for (SH=1;SH<NB;SH++)//comb out the chart from 1 to NB { for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55;
SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)]; SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)]; if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5;
UD=SH_SELL; } if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5;
UD=SH_BUY; } }
|
|
Дата: Суббота, 07.11.2015, 06:58 | Сообщение # 108
Написал:
viktorosyka_
|
Группа: Удаленные
|
Как я понял участки кода Код for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55; BufU[SH]=Low[SH]-R*0.5; BufD[SH]=High[SH]+R*0.5; отвечают за место-расположение сигнальной точки Правильно-ли будет если в тело шаблона я перенесу Код NB=100; for (SH=1;SH<NB;SH++) { SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)]; SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)]; if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { UD=SH_SELL; } if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { UD=SH_BUY; } } Не нарушится ли логика индикатора
|
|
Дата: Суббота, 07.11.2015, 10:07 | Сообщение # 109
Написал:
Администратор
expforex
|
Группа: Администраторы
Сообщений: 9910
Награды: 42
Статус: Оффлайн
|
Код extern int Otstup=30;//Step back. extern double Per=9;//Period. int SH,NB,i,UD; double R,SHMax,SHMin; double BufD[]; double BufU[]; #define SH_BUY 1 #define SH_SELL 2 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { //---
ArrayResize(BufD,99); ArrayResize(BufU,99);
int SH=1; for(SH=1;SH<100;SH++)//comb out the chart from 1 to NB { for(R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);} R/=55;
SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)]; SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)]; if(Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5;
UD=SH_SELL; break; } if(Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5;
UD=SH_BUY; break; } }
/* Блок сигналов */
if(UD==SH_SELL) // SELL if(UD==SH_BUY) // BUY
} //+------------------------------------------------------------------+ сигналы формируются здесь: /* Блок сигналов */
if(UD==SH_SELL) // SELL if(UD==SH_BUY) // BUY
|
|
Дата: Воскресенье, 08.11.2015, 06:37 | Сообщение # 110
Написал:
viktorosyka_
|
Группа: Удаленные
|
Ни чего не получается, логика совершенно другая, Помогите добавить код что-бы не изменилась логикаКод #define SH_BUY 1 #define SH_SELL -1 int NB,SH,STr,UD; //int NB=100; double R,SHMax,SHMin; double BufD[]; double BufU[]; /* Блок управления сигналом от Вашего индикатора Создаем переменные для сигналов индикатора */ int IndicatorSignal() { int Sig=0;
if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars; for (SH=1;SH<NB;SH++) { for (R=0,STr=SH;STr<SH+10;STr++) {R+=(10+SH-STr)*(High[STr]-Low[STr]);} R/=55; SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)]; SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)]; if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) {BufU[SH]=Low[SH]-R*0.5; UD=SH_SELL;} if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) {BufD[SH]=High[SH]+R*0.5; UD=SH_BUY;} }
//Указываем Сигналы на закрытие: if(UD==SH_BUY)Sig=4; // закрываем в селл if(UD==SH_SELL)Sig=3; // закрываем в бай if(Sig==3 && EPs(Symbol(),OP_BUY,Magic))CPD(Symbol(),OP_BUY,Magic); if(Sig==4 && EPs(Symbol(),OP_SELL,Magic))CPD(Symbol(),OP_SELL,Magic);
//Указываем Сигналы на открытие: if (UD==SH_SELL) Sig=2; if (UD==SH_BUY) Sig=1;
// 1 - бай 2 - селл, 3 - закрытие бай, 4 - закрытие селл return(Sig); }
|
|