Уроки по программированию на языке MQL4 от eevviill

eevviill

Заблокирован
а теперь вопросы по типам переменных.
каким образом конвертировать одни в другие.

пример нам надо добавлять 5 пунктов к стоплосу и тп
описываем переменную
int sl_shift = 5
как теперь ее добавить к double (sl=sl+sl_shift)
double sl = 1.3200
так чтобы в результате получилось 1.3205, а не 6.3200
Надо без скобок и объявить sl через int. sl не может быть ценой. Это растояние в пунктах от цены открытия ордера. Так что через int надо объявлять.

int sl_shift = 5;
int sl = 10;
int sl_shift;
sl_shift = sl_shift+sl;
 

SilverKZ

Элитный участник
а теперь вопросы по типам переменных.
каким образом конвертировать одни в другие.

пример нам надо добавлять 5 пунктов к стоплосу и тп
описываем переменную
int sl_shift = 5
как теперь ее добавить к double (sl=sl+sl_shift)
double sl = 1.3200
так чтобы в результате получилось 1.3205, а не 6.3200

sl = sl + sl_shift * Point;

где Point - предопределенная переменная, которая = размеру пункта текущего инструмента в валюте котировки.
 

Beast

Почетный гражданин
Надо без скобок и объявить sl через int. sl не может быть ценой. Это растояние в пунктах от цены открытия ордера. Так что через int надо объявлять.

int sl_shift = 5;
int sl = 10;
int sl_shift;
sl_shift = sl_shift+sl;

дело в том что этот конкретный пример нужно прикрутить к копировщику. он получает тп и сл в формате дабл, определенные значения которые являются ценой.

sl = sl + sl_shift * Point;

где Point - предопределенная переменная, которая = размеру пункта текущего инструмента в валюте котировки.

именно то что нужно. буду копаться в коде дальше :)

о! возник с ходу вопрос.
возмем мои прежние условия. sl=1.3200
а правильно ли будет считаться, если sl_shift будет отрицательным?
т.е. например в условии if/else определяем ордер бай или селл
если бай, то sl_shift=--sl_shift

правильно ли в таком случае отработает sl = sl + sl_shift * Point и мы получим 1.3195?
 
Последнее редактирование:

SilverKZ

Элитный участник
дело в том что этот конкретный пример нужно прикрутить к копировщику. он получает тп и сл в формате дабл, определенные значения которые являются ценой.



именно то что нужно. буду копаться в коде дальше :)

о! возник с ходу вопрос.
возмем мои прежние условия. sl=1.3200
а правильно ли будет считаться, если sl_shift будет отрицательным?
т.е. например в условии if/else определяем ордер бай или селл
если бай, то sl_shift=--sl_shift

правильно ли в таком случае отработает sl = sl + sl_shift * Point и мы получим 1.3195?

Отработает правильно
Арифметика простая 1.3200 + (-5) * 0.0001 = 1.3200 - 0.0005 = 1.3195
но я бы ввел отдельную переменную для итогового значения
 

Beast

Почетный гражданин
Отработает правильно
Арифметика простая 1.3200 + (-5) * 0.0001 = 1.3200 - 0.0005 = 1.3195
но я бы ввел отдельную переменную для итогового значения

ну вот вроде скомпилировался без проблем
tp_shift и sl_shift вынесены в extern

if(invert==1)
{
if(tip==OP_BUY)
{
tip=OP_SELL; sls_shift=sl_shift*(-1); tps_shift=tp_shift;
}
else if(tip==OP_SELL)
{
tip=OP_BUY; sls_shift=sl_shift; tps_shift=tp_shift*(-1);
}
...........

dtp=tp; dsl=sl;
tp=dsl+tps_shift*Point; sl=dtp+sls_shift*Point;
 

Dimentor-spb

Местный житель
Буду почитывать толкование MQL для понимания общей картины происходящего в коде,
если топикстартер не против. Спасибо Вам за старания.
 

eevviill

Заблокирован
Буду почитывать толкование MQL для понимания общей картины происходящего в коде,
если топикстартер не против. Спасибо Вам за старания.
Я не против. Просто когда я открыл стандартный учебник и первый раз увидел как там объясняют, то тогда у меня отпало желание учить MQL4.
 

eevviill

Заблокирован
Урок 4 - написание простейшего скрипта

Добрый вечер. Сегодня будем пробовать создавать простейший скрипт. Как попасть в Meta Editor описано в 2-ом уроке.

РЕКОМЕНДАЦИЯ. После моего объяснения постаратся создать скрипт с другими переменными и их названиями (без подглядывания на форум).

ЗАДАЧИ. Понять что я написал, создать и выложить свой скрипт.

Я напишу скрипт и подробное объяснение к нему. Наш скрипт будет считать суму 2-ух чисел и выводить на экран(сигнал-слева от него колокольчик).
Итак начнём.

Скрипт

PHP:
1)#property copyright "eevviill"
2)#property show_inputs
3)extern double a = 4;
4)extern double b = 7;
5)double c;

6)int start()
7){
8)c=a+b;
  
9)Alert(c);
10)return(0);
11)  }
Пояснение

1)Это не обязательная строка. В ней пишется кому принадлежат авторские права на файл. Пишется #property copyright "" В кавычках тот, кому принадлежат авторские права.

2)Эта функция даёт возможность, при прикреплении скрипта к графику, менять переменные которые в файле имеют приписку extern. В советниках и индикаторах чтобы увидеть, при прикреплении файла к графику, переменные с припиской extern этой функции не надо. Пишется #property show_inputs

3)Первая переменная. Так как она написана, это называется объявлением переменной. Это делается для того чтобы файл знал с какой переменной имеет дело, какого она типа, её значение и выводить ли переменную в свойства файла при прикреплении файла к графику. Желательно, рекомендовано и необходимо объявлять переменные вначале файла(но не обязательно. можно и в самой функции). Итак.
3.1)extern - значит что мы выводим переменную в свойства файла при прикреплении его к графику.
3.2)double - значит что мы указываем тип переменной(урок 2). В нашем случае переменная может быть с дробной частью.
3.3)a значит что мы указываем название переменной.
3.4)= значит что мы присваиваем переменной какое то значение.
3.5)4 значит что мы присвоили переменной число 4.
3.6); значит что мы закончили объявлять переменную(урок 3).
Пишется extern double a = 4;
4)Аналогично с 3)
5)Мы объявили переменную, но не вывели во внешние переменные(прикрепление к графику) и не присвоили ей значения. Тоесть без extern и без =
Пишется double c;
6)После объявления переменных идёт название функции где проходят все вычесления. А именно фунция Старт.
Пишется int start()
7)Левая квадратная скобка. Обязательно должна быть после написания названия функции. Она указывает на начало расчётов в функции.
Пишется {
8)Собственно наш расчёт. Где a и b это нашы переменные которые мы можем менять во внешних переменных(прикрепление к графику).
с у нас будет ровно сумме a и b(значение которых мы укажем).
Пишется c=a+b;
9)Это выхов сигнала при прикрепленни файла к графику. Итак.
9.1)Alert значит что мы указали функцию, которая выведет на екран сообщение.
9.2)(с) значит что мы указали в скобках что нам выводить в сообщении на экран. Если с, то после пересчёта его значения, в сообщении выведется результат.
9.3); значит конец действия(по простому - точка).
Пишется Alert(c);
10)Это оператор. Если расчёты без ошибок он возвращает 0 и работа файла продолжается дальше. Можно не 0 писать в скобках, но в редких случаях.
Пишется return(0);
11)Правая квадратная скобка. Обязательно должна быть после окончания расчётов. Она указывает на конец расчётов в функции.
Пишется }
 
Последнее редактирование модератором:

Mango.

Местный житель
10)Это оператор. Если расчёты без ошибок он возвращает 0 и работа файла продолжается дальше. Можно не 0 писать в скобках, но в редких случаях.
Пишется return(0);

Возвращает 0 куда? А если написать return(с)?
По остальной части кода всё понятно описано.
 

Mango.

Местный житель
Вот мой скрипт: вместо функции Alert() использовал
Comment() - функция выводит комментарий, определенный пользователем, в левый верхний угол графика.

extern double a=20;
extern double b=50;
extern double c;

int start()
{

c=a+b;

Comment(c);

return(0);
}
 

eevviill

Заблокирован
Вот мой скрипт: вместо функции Alert() использовал
Comment() - функция выводит комментарий, определенный пользователем, в левый верхний угол графика.

extern double a=20;
extern double b=50;
extern double c;

int start()
{

c=a+b;

Comment(c);

return(0);
}
10 балов вам. Не поменяли названия переменных. Не выложили файл.

P.S. Забыл добавить. После того как написали, надо скомпилировать. Хотя бы для того чтобы проверить ошибки.
Послезавтра будем писать скрипт по нахождению размера лота для открытия ордера от депо.
 

Ugar

Гуру форума
1)#property copyright "eevviill"
2)#property show_inputs
3)extern double a = 4;
4)extern double b = 7;
5)double c;

6)int start()
7){
8)c=a+b;

9)Alert(c);
10)return(0);
11) }

Пояснение


10)Это оператор. Если расчёты без ошибок он возвращает 0 и работа файла продолжается дальше. Можно не 0 писать в скобках, но в редких случаях.
Пишется return(0);
Я прошу прощения, не вытерпел.
В функциях int init(), int deinit(), int start() если выполняется return(0); это ничего и никуда не возвращает, и тем более не выплняется дальше. Это просто выход из соответствующей функции. Просто нечему возвращать. Конкретно в скрипте выход из функции start() это завершение работы скрипта. Так что, в скрипте, в функции start(), return(0); это значит завершить работу скрипта.
Например:
extern double a = 4;
extern double b = 7;
double c;
int start()
{
//Если здесь вписать return(0); то скрипт работать не будет.
//Он завершит работу сразу после запуска.

c=a+b;
Alert(c);
//выход из функции старт. Завершение работы скрипта.
return(0);
}
return возвращает только в пользовательской функции и только если она не void типа. Там обязательно в скобках должно быть указано что возвращать. Если функция void типа то в конце должно быть return; без скобок. Так как void не подразумевает никаких возвратов. Просто выход.
 
Последнее редактирование:

eevviill

Заблокирован
Вижу только Mango. написал всё ли ему понятно. ОК. Значит буду у него спрашивать всё ли я доступно объяснил.
Сегодня сделаем скрипт калькулятор.
 

eevviill

Заблокирован
Урок 5 - скрипт калькулятор

Добрый день. Судя по тому что после четвёртого урока вопрос был один и на него Ugar ответил разборчиво, можна сделать вывод что можно продолжать дальше.
Сегодня напишем скрипт, который будет выполнять функции калькулятора. Подробно останавливатся на том, что было описано в прошлых уроках не буду.

ЗАДАЧИ. Понять что я написал в скрипте и без помощи форума написать похожий скрипт(с другими названиями и значениями переменных). Указать значение переменной(2-ое объяснение).

Скрипт.
PHP:
#property copyright "eevviill"
#property show_inputs
1)extern double a = 4;
extern double b = 7;
2)extern string Znak;
3)string Plus = "+";
string Minus = "-";
string Umnogenie = "*";
string Delenie = "/";
double  c;
 
 
int start()
  {
4)if(Znak==Plus) c=a+b;
if(Znak==Minus) c=a-b;
if(Znak==Umnogenie) c=a*b;
if(Znak==Delenie) c=a/b;
5)Alert(DoubleToStr(c,8));
6)return(0);
  }

Пояснение.
1)Был выбран тип данных double(урок 2). Посколько у нас скрипт должен выполнять функцию калькулятора, то мы можем вводить не только целые числа.
2)Был выбран тип данных string(урок 2), потому что +-*/ относятся к этому типу данных, а именно "Строковый тип данных". Переменная выведена во внешние свойства файла(прикрепление к графику) и значение этой переменной не указано потому что мы сами будем её выбирать при прикреплению к графику. Но значение можно указать и тогда оно во внешних свойствах будет отображатся по умолчанию.
3)Был выбран тип данных string(урок 2), потому что +-*/ относятся к этому типу данных, а именно "Строковый тип данных". Значения переменных указано.
4)Здесь используется функция if(). Очень необходимая функция. Если дословно озвучить что написано в этой строке, то выйдет так "Если значение переменной Znak равняется значению переменной Plus, то переменной с присваиваится сумма значений 2-ух переменных а и b."
Пишется if(Znak==Plus) c=a+b;
4.1)if() значит что мы в скобках записываем какое то условие. Например Znak==Plus.
4.2)Znak==Plus. == не означает ровно(присвоить значение). Знак проверяет одинаковы ли значения переменных.
4.3)c=a+b значит что если в функции if() то что в скобках истинно, то выполняется действие которое стоит после скобок.
5)Поскольку у нас скрипт-калькулятор, то надо чтобы он выводил нам результат с определённым количеством цифр после запятой.
DoubleToStr(с,8) имеет 2 свойства.
5.1)(с,) первым записывается название переменной(функция бедет брать её значение).
5.2)(,8) вторым записывается количество цифр после запятой которое буде выводится на экран(например 7,88990011).
Пишется DoubleToStr()
6)retutn(0) значит что мы закончили расчёты в функции int start()
 
Последнее редактирование модератором:

eevviill

Заблокирован
Ребятишки. Так дело не пойдёт. Если никто не отпишется всё ли понятно, я продолжать не буду. Если никому не надо, то смысл что я здесь штампую?
 

Beast

Почетный гражданин
Ребятишки. Так дело не пойдёт. Если никто не отпишется всё ли понятно, я продолжать не буду. Если никому не надо, то смысл что я здесь штампую?

ты пиши, пиши :)
возникнут вопросы отпишемся, а пока вопросов нет - зачем тему флудом засорять?
 
Верх