Вопросы начинающих знакомиться с языком MQL4
|
|
xrust | Дата: Среда, 13.08.2008, 03:16 | Сообщение # 1 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| прошу
"Телефон - это проклятье человечества!" масяня.
|
|
| |
wik | Дата: Суббота, 16.08.2008, 21:29 | Сообщение # 2 |
Майор
Группа: Проверенные
Сообщений: 83
Статус: Offline
| Страшно
|
|
| |
xrust | Дата: Суббота, 16.08.2008, 21:44 | Сообщение # 3 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| Учиться - никогда не поздно, и совсем не страшно ! еще "Тяжело в учении - легко в бою" я ведь и сам только учусь, так что давайте учиться вместе
"Телефон - это проклятье человечества!" масяня.
|
|
| |
wik | Дата: Воскресенье, 17.08.2008, 11:54 | Сообщение # 4 |
Майор
Группа: Проверенные
Сообщений: 83
Статус: Offline
| Quote (xrust) Учиться - никогда не поздно, и совсем не страшно ! еще "Тяжело в учении - легко в бою" я ведь и сам только учусь, так что давайте учиться вместе Ну тогда командуйте. Для начала, насколько я понимаю, всем срочно изучить "азбуку"? Чтоб хотя-бы понимать о чём идет речь?
|
|
| |
xrust | Дата: Понедельник, 18.08.2008, 02:33 | Сообщение # 5 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| Конечно! Азбука находиться Здесь доступная для скачки Здесь посмотреть онлайн я лично предпочитаю это
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Понедельник, 18.08.2008, 02:47 | Сообщение # 6 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| Язык достаточно простой, я бы сказал урезанный, так, как предназначен только для работы в среде платформы Метатрейдер, но этого вполне достаточно. Так как в этой среде возможны всего лищь три конструкции, начнем с их описания. Итак:
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Понедельник, 18.08.2008, 05:33 | Сообщение # 7 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| Конструкция первая - Пользовательский индикатор, блок схема : //+------------------------------------------------------------------+ //| Primer.mq4 | //| Copyright © 2008, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ // Заголовок , или описательная часть,здесь описываем все элементы // которые будут включены в программу #property copyright "#Copyright © 2008, XrustSolution.#" #property link "#xrust.ucoz.net#" #property show_inputs // Показывать окно с переменными при старте #include <stdlib.mqh> // #include - "включено"- то что будет добавленно //в код программы, в данном случае это библиотека с описанием ст.ошибок #property indicator_separate_window // индикатор в отдельном окне #property indicator_buffers 4 //кол во буферов инд или линий, значков, и пр. #property indicator_color1 Red // цвет первого буфера #property indicator_color2 Blue // #property indicator_color3 Lime // #property indicator_color4 Yellow // //---- input parameters внешние переменные индикатора, которые мозно менять через "свойства" extern bool ExtParam1=0; // Внешние переменные extern int ExtParam2=0; // extern double ExtParam3=0; // extern color ExtParam4=Red; // extern string ExtParam5="Privet! :)"; // //---- buffers double ExtMapBuffer1[]; // описание буферов индикатора double ExtMapBuffer2[]; // буфер- массив, значение которого double ExtMapBuffer3[]; // будет выводиться на дисплей double ExtMapBuffer4[]; // в окне индикатора //---- Glibal variables bool a;//переменная булевого типа , принимает значения ложь\истина int x,y,asd[100];//тип целого числа //asd[100]-так обьявляються массивы в данном примере одномерный массив на 100 знач double n,m;//пер. с плавающей точкой 0,1 0,258 и т.д. string str="Пример";//строковые переменные datetime Time_Of;//переменые даты, и времени описание читать в учебнике //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ // инициализирующая часть, выполняется однократно при установке на график, // или смены таймфрейма. int init() { //---- indicators SetIndexStyle(0,DRAW_LINE);//первый буфф.рис линию SetIndexBuffer(0,ExtMapBuffer1);// SetIndexStyle(1,DRAW_HISTOGRAM);//второй гистограмму SetIndexBuffer(1,ExtMapBuffer2);// SetIndexStyle(2,DRAW_SECTION);//третий секциями как в зигзаге SetIndexBuffer(2,ExtMapBuffer3); SetIndexEmptyValue(2,0.0); SetIndexStyle(3,DRAW_ARROW);//четвертый рис. стрелочки SetIndexArrow(3,217);//код стрелочек см. в хелпе SetIndexBuffer(3,ExtMapBuffer4); SetIndexEmptyValue(3,0.0); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- // Деинициализационная часть, вып при завершении программы // //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- // Собственно тело программы выпоняеться по кольцу, с приходом новогог тика //---- return(0); } //+------------------------------------------------------------------+ // продолжение следует
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Пятница, 22.08.2008, 19:50 | Сообщение # 8 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| Ответ на вопрос по стохастику: Вариан первый курочим пользовательские индикаторы 1)В терминале открываем пользовательские индикаторы, и находим там Stochastic? вот он //+------------------------------------------------------------------+ //| Stochastic.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_buffers 2 #property indicator_color1 LightSeaGreen #property indicator_color2 Red //---- input parameters extern int KPeriod=5; extern int DPeriod=3; extern int Slowing=3; //---- buffers double MainBuffer[]; double SignalBuffer[]; double HighesBuffer[]; double LowesBuffer[]; //---- int draw_begin1=0; int draw_begin2=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 2 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(2, HighesBuffer); SetIndexBuffer(3, LowesBuffer); //---- indicator lines SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0, MainBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1, SignalBuffer); //---- name for DataWindow and indicator subwindow label short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); SetIndexLabel(1,"Signal"); //---- draw_begin1=KPeriod+Slowing; draw_begin2=draw_begin1+DPeriod; SetIndexDrawBegin(0,draw_begin1); SetIndexDrawBegin(1,draw_begin2); //---- return(0); } //+------------------------------------------------------------------+ //| Stochastic oscillator | //+------------------------------------------------------------------+ int start() { int i,k; int counted_bars=IndicatorCounted(); double price; //---- if(Bars<=draw_begin2) return(0); //---- initial zero if(counted_bars<1) { for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0; for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0; } //---- minimums counting i=Bars-KPeriod; if(counted_bars>KPeriod) i=Bars-counted_bars-1; while(i>=0) { double min=1000000; k=i+KPeriod-1; while(k>=i) { price=Low[k]; if(min>price) min=price; k--; } LowesBuffer[i]=min; i--; } //---- maximums counting i=Bars-KPeriod; if(counted_bars>KPeriod) i=Bars-counted_bars-1; while(i>=0) { double max=-1000000; k=i+KPeriod-1; while(k>=i) { price=High[k]; if(max<price) max=price; k--; } HighesBuffer[i]=max; i--; } //---- %K line i=Bars-draw_begin1; if(counted_bars>draw_begin1) i=Bars-counted_bars-1; while(i>=0) { double sumlow=0.0; double sumhigh=0.0; for(k=(i+Slowing-1);k>=i;k--) { sumlow+=Close[k]-LowesBuffer[k]; sumhigh+=HighesBuffer[k]-LowesBuffer[k]; } if(sumhigh==0.0) MainBuffer[i]=100.0; else MainBuffer[i]=sumlow/sumhigh*100; i--; } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; int limit=Bars-counted_bars; //---- signal line is simple movimg average for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i); //---- return(0); } //+------------------------------------------------------------------+ Задача - научить его читать с других символов,
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Пятница, 22.08.2008, 19:59 | Сообщение # 9 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| За данные в нем отвечают такие предопределенные переменные как Bars[] Close[] Open[] Low[] High[] Как видите плосле переменной стоятквадратные скобочки, что означает , что это массив данных, в них мы указываем номер бара на основном чарте к которому будем обращаться Так как задача стояла читать с других символов, значит надо к ним обратиться,и тут нам поможеттакая конструкция: iBars(_Symbol,0) iLow(_Symbol,0,k) iHigh(_Symbol,0,k) iClose(_Symbol,0,k) Как видите здесь присутствует переменная "_Symbol" которую мы запишем в глобальные переменные, и будем в нее записывать рабочий символ extern string _Symbol=""; extern int KPeriod=5; extern int DPeriod=3; extern int Slowing=3; после чего в блоке "инит()" мы ее проинициализируем : if(_Symbol==""){_Symbol=Symbol();} в этой строке мы указываем ей , что если строка пустая , то должен использоваться текущий символ после чего меняем Close[k] на iClose(_Symbol,0,k) High[k] на iHigh(_Symbol,0,k) и так далее, компилим смотрим что у нас получилось:
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Пятница, 22.08.2008, 20:11 | Сообщение # 10 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| //+------------------------------------------------------------------+ //| Stochastic.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_buffers 2 #property indicator_color1 LightSeaGreen #property indicator_color2 Red //---- input parameters extern string _Symbol=""; extern int KPeriod=5; extern int DPeriod=3; extern int Slowing=3; //---- buffers double MainBuffer[]; double SignalBuffer[]; double HighesBuffer[]; double LowesBuffer[]; //---- int draw_begin1=0; int draw_begin2=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 2 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(2, HighesBuffer); SetIndexBuffer(3, LowesBuffer); //---- indicator lines SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0, MainBuffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1, SignalBuffer); //---- name for DataWindow and indicator subwindow label short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")"; IndicatorShortName(short_name); SetIndexLabel(0,short_name); SetIndexLabel(1,"Signal"); //---- draw_begin1=KPeriod+Slowing; draw_begin2=draw_begin1+DPeriod; SetIndexDrawBegin(0,draw_begin1); SetIndexDrawBegin(1,draw_begin2); //---- if(_Symbol==""){_Symbol=Symbol();}// return(0); } //+------------------------------------------------------------------+ //| Stochastic oscillator | //+------------------------------------------------------------------+ int start() { int i,k; int counted_bars=IndicatorCounted(); double price; //---- if(iBars(_Symbol,0)<=draw_begin2) return(0); //---- initial zero if(counted_bars<1) { for(i=1;i<=draw_begin1;i++) MainBuffer[iBars(_Symbol,0)-i]=0; for(i=1;i<=draw_begin2;i++) SignalBuffer[iBars(_Symbol,0)-i]=0; } //---- minimums counting i=iBars(_Symbol,0)-KPeriod; if(counted_bars>KPeriod) i=iBars(_Symbol,0)-counted_bars-1; while(i>=0) { double min=1000000; k=i+KPeriod-1; while(k>=i) { price=iLow(_Symbol,0,k); if(min>price) min=price; k--; } LowesBuffer[i]=min; i--; } //---- maximums counting i=iBars(_Symbol,0)-KPeriod; if(counted_bars>KPeriod) i=iBars(_Symbol,0)-counted_bars-1; while(i>=0) { double max=-1000000; k=i+KPeriod-1; while(k>=i) { price=iHigh(_Symbol,0,k); if(max<price) max=price; k--; } HighesBuffer[i]=max; i--; } //---- %K line i=iBars(_Symbol,0)-draw_begin1; if(counted_bars>draw_begin1) i=iBars(_Symbol,0)-counted_bars-1; while(i>=0) { double sumlow=0.0; double sumhigh=0.0; for(k=(i+Slowing-1);k>=i;k--) { sumlow+=iClose(_Symbol,0,k)-LowesBuffer[k]; sumhigh+=HighesBuffer[k]-LowesBuffer[k]; } if(sumhigh==0.0) MainBuffer[i]=100.0; else MainBuffer[i]=sumlow/sumhigh*100; i--; } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; int limit=iBars(_Symbol,0)-counted_bars; //---- signal line is simple movimg average for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MainBuffer,iBars(_Symbol,0),DPeriod,0,MODE_SMA,i); //---- return(0); } //+------------------------------------------------------------------+
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Пятница, 22.08.2008, 20:14 | Сообщение # 11 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| Закидываем на чарт, комп дико тормозит, что и понятно ему надо подкачивать инфу с другого символа, да код не оптимизирован,заходим в свойства индикатора, и вместо пустого значения строки символа записываем нужный, жмем ОК опять ждем, любуемся на свою работу!
"Телефон - это проклятье человечества!" масяня.
|
|
| |
xrust | Дата: Пятница, 22.08.2008, 20:15 | Сообщение # 12 |
Admin
Группа: Администраторы
Сообщений: 489
Статус: Offline
| В следующий раз, сделаем это по другому, через вызов пользовательского индикатора
"Телефон - это проклятье человечества!" масяня.
|
|
| |
MaxVel | Дата: Четверг, 09.10.2008, 19:16 | Сообщение # 13 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| ...мда..., давно меня тут не было..., вот теперь точно займусь языком..., тем более учитель есть....))))
...то, что не убило тебя, сделало тебя сильнее...
|
|
| |