Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Soldat у Вас 1 эксперт торгует по 10 парам - это понятно, при этом использует для поиска сигнала 4 ТФ - это можно понять, но в чём вопрос и сложность - не понятно...
Ваш эксперт будет стоять и получать тики с одного графика (пары), узнать котировку по другой паре можно только специально через запрос, т.е. Вы можете отследить закрытие бара (любого ТФ) только на основной паре, а теперь, как говориться, следите за руками: тик пришел и сова поняла, что по основной паре открылся новый бар, а по другой паре (XXXYYY) тика ещё не было, вопрос что Вам вернёт функция iClose(XXXYYY, 0, 1)?
Если Вы знаете ответ - то Вам должно быть вообще все понятно.
Я точного ответа не знаю, но могу предположить, что эта функция вернёт Вам не то, что Вы ожидали, скажу даже больше, эта функция вернёт Вам не то, даже если Вы сделаете запрос по текущей паре, но с другого ТФ.

Это я к тому, что отслеживать закрытие баров на 4 ТФ надо по той паре, где стоит сова, потом в цикле делать расчёты сигналов по всем парам (предполагая, что и там бары закрыты, или проверяя время открытия 1 бара на основной паре и рабочей паре).


Проблема в том, что он торгует на одном таймфрейме. А 4 таймфрейма, это для большего охвата. Советник торгует по прайс экшену. Считай одной свечной комбинации. Она появляется нечасто. Вот и решил сделать советник мультивалютным и мультитаймфреймовым. Чтобы поставил на один символ, а торговля происходила сразу на куче валют и нескольких таймфреймах. А если делать даже в цикле, то опять возвращаемся к 40 операторам if или for.
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
Soldat, нет никакого смысла делать советник по подобной стратегии, работающий одновременно на разных валютных парах. У разных пар в любом случае будет разная волатильность и как минимум разные СЛ-ТП, поэтому подбирать параметры (оптимизировать) нужно будет на каждую пару в отдельности. С вашей идеей это исключено полностью. Делайте один советник с настраиваемыми параметрами и оптимизируйте для выбранных пар, потом ставьте копию советника с нужным сетом и разными магиками на пары.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Soldat, нет никакого смысла делать советник по подобной стратегии, работающий одновременно на разных валютных парах. У разных пар в любом случае будет разная волатильность и как минимум разные СЛ-ТП, поэтому подбирать параметры (оптимизировать) нужно будет на каждую пару в отдельности. С вашей идеей это исключено полностью. Делайте один советник с настраиваемыми параметрами и оптимизируйте для выбранных пар, потом ставьте копию советника с нужным сетом и разными магиками на пары.



Да один советник сделан. Ну а чего там можно оптимизировать? Профит везде одинаковый, а стоп я вообще не стал ставить. Свечи они везде одинаковые. По крайней мере на основных парах. Стоп не стал ставить, потому что сделки открываются не очень часто. Вроде советник открыл сделку, а я потом посмотрел чего он там наоткрывал и сделал выводы. Вообще мультивалютность мне нужна, чтобы сделать из него алерта на требуемый мне патерн. А то просматривать несколько десятков графиков очень затратно по времени.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Soldat теперь понятно. предлагаю след. алгоритм:

Делаете 4 сигнальные функции на 4 ТФ по основной паре.
После срабатывания сигнальной функции по Х-ТФ идёт вызов функции поиска свечного паттерна с передачей в неё периода (Х-ТФ). Т.е. функция поиска свечного паттерна одна на все пары и ТФ.
Внутри поисковой функции будет цикл по всем парам. (без него ни как).
т.е.
if ( isNewBar_M5() ) f_FindPA( PERIOD_M5 ); // например...

имхо, ну а там как знаете...
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Кто-нибудь знает - есть ли альтернатива стандартному алерту? Хочется поменять дизайн и самое главное - этот ужасный звук.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Кто-нибудь знает - есть ли альтернатива стандартному алерту? Хочется поменять дизайн и самое главное - этот ужасный звук.

Поменяй звук. смотри здесь: C:\Program Files (x86)\MetaTraderХХХХ\Sounds
Поменять дизайн конечно можно, но в 2 словах не описать как создать окно на уровне терминала. да и имхо не нужно это...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



Кто-нибудь знает - есть ли альтернатива стандартному алерту? Хочется поменять дизайн и самое главное - этот ужасный звук.

Поменяй звук. смотри здесь: C:\Program Files (x86)\MetaTraderХХХХ\Sounds
Поменять дизайн конечно можно, но в 2 словах не описать как создать окно на уровне терминала. да и имхо не нужно это...


А я вот думаю воспользоваться MessageBox, только вот возникла загвоздка с отображением временного периода графика. Хотел сделать, чтобы выводилось сообщение наподобие "Образовался сигнал на покупку" Symbol () период графика Period () "
По-моему эта функция более одного параметра не отображает.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано




Кто-нибудь знает - есть ли альтернатива стандартному алерту? Хочется поменять дизайн и самое главное - этот ужасный звук.

Поменяй звук. смотри здесь: C:\Program Files (x86)\MetaTraderХХХХ\Sounds
Поменять дизайн конечно можно, но в 2 словах не описать как создать окно на уровне терминала. да и имхо не нужно это...


А я вот думаю воспользоваться MessageBox, только вот возникла загвоздка с отображением временного периода графика. Хотел сделать, чтобы выводилось сообщение наподобие "Образовался сигнал на покупку" Symbol () период графика Period () "
По-моему эта функция более одного параметра не отображает.


Так и пишите "Образовался сигнал на покупку"+IntegerToString(Symbol ())+"период графика"+IntegerToString(Period ())
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Как найти разницу в пунктах между закрытием первого бара Close[1] и закрытием текущего Close[0]?
В последствии отображать в виде гистограммы.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Коллеги, добрый день,

Есть тралл ТП который работает, но всегда выдает Error 1, а в редких случаях переводить ТП в убыток. Помогите решать проблему пожалуйста.

void TrallTP()
{
double price = 0, lots = 0, avgprice = 0;
for (int i=OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i,SELECT_BY_POS))
{
if (OrderMagicNumber() == Magic && OrderSymbol() == Symbol())
{
price +=OrderOpenPrice() * OrderLots();
lots +=OrderLots();
}
}
}

if (price == 0) return;
avgprice = NormalizeDouble(price / lots, Digits);

if (OrderType() == OP_BUY) TP = NormalizeDouble(avgprice + Takeprofit * Point, Digits);
if (OrderType() == OP_SELL) TP = NormalizeDouble(avgprice - Takeprofit * Point, Digits);

for (int i=OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i,SELECT_BY_POS))
{
if (OrderMagicNumber() == Magic)
{
if (!OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP, OrderExpiration(), clrAliceBlue)) printf("Error: ", GetLastError());
}
}
}
}

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

НУ во первых расчет Средней цены идет для обоих направлений, из-за этого при наличии ордеров как бай так и селл возможен вариант когда ТП выставится в минус.

Error 1 лечится легко. просто добавь перед модификацией дополнительную проверку
if (TP==OrderTakeProfit()) continue;

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Спасибо за помощь.
Ордера советник открывает только в одну сторону, потому такой ситуации не возможно.

Вот сегодня снова в убыток передвинул три ордера (((
не пойму как?

может брокер шаманит?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Парни, подсобите плиз с функцией.
Назначение: загрузка параметров из set файлов при инициализации советника.
Назначаю переменные:

Спойлер

#define OF_READ 0
#define OF_WRITE 1
#define OF_READWRITE 2
#define OF_SHARE_COMPAT 3
#define OF_SHARE_DENY_NONE 4
#define OF_SHARE_DENY_READ 5
#define OF_SHARE_DENY_WRITE 6
#define OF_SHARE_EXCLUSIVE 7


Импортирую функции из библиотеки:
Спойлер

#import "kernel32.dll"
int _lopen (string path, int of);
int _lcreat (string path, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle);
#import



Объявляю текстовый массив
string lines[];

Объявляю путь к сетам
string FilePathSets="\\MQL4\\Presets";

Функция открывает сет файл и переносит значения в массив lines[]
До этого функцией определил значение prefix
Спойлер

//+------------------------------------------------------------------+
//| Function loads set file |
//+------------------------------------------------------------------+
int LoadSet()
{
int presymb=StringLen(prefix);
int result=-1;
string s="";
string NameOfSymbol = StringSubstr(Symbol(),presymb,6);
string name=StringConcatenate("\\",ExpertName,"_",NameOfSymbol,"_",SetVersion);
string filepath=TerminalInfoString(TERMINAL_DATA_PATH)+FilePathSets+name+".set";
// filepath - полный путь к файлу и его название.
// И при открытии файла возвращается хендл -1.... Что я не так сделал?
int handle=_lopen (filepath,OF_READ);
if(handle {
Print("Ошибка открытия файла ",filepath);
return (-1);
}
result=_llseek (handle,0,0);
if(result {
Print("Ошибка установки указателя" );
return (-1);
}
ArrayResize(lines,0);
//загрузка файла set
int i=0;
while(result>0)
{
s=_lread (handle,s,1);
if(s=="" || StringFind(s,",")>0) continue;
ArrayResize(lines,i+1);
lines=s; //сохраним все переменные из файла в массив для последующего поиска и выборки
}
result=_lclose (handle);
if(result Print("Ошибка закрытия файла ",filepath);
return (i);
}



Затем я ищу нужный мне параметр в массиве
Спойлер

//+------------------------------------------------------------------+
//| Function searches for "match" parameter in lines[] massive |
//+------------------------------------------------------------------+
string GetSetFileString(string match)
{


int LinesLength=ArraySize(lines);
int pos=StringLen(match);
for(int i=0;i {
if(StringFind(lines,match,0)!=-1) return (StringSubstr(lines,pos+1));
}
return("");
}



Ну а потом просто перевожу из строки в нужный мне вид. Изменено пользователем Silentspec
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Спойлер


Парни, подсобите плиз с функцией.
Назначение: загрузка параметров из set файлов при инициализации советника.
Назначаю переменные:

Спойлер

#define OF_READ 0
#define OF_WRITE 1
#define OF_READWRITE 2
#define OF_SHARE_COMPAT 3
#define OF_SHARE_DENY_NONE 4
#define OF_SHARE_DENY_READ 5
#define OF_SHARE_DENY_WRITE 6
#define OF_SHARE_EXCLUSIVE 7


Импортирую функции из библиотеки:
Спойлер

#import "kernel32.dll"
int _lopen (string path, int of);
int _lcreat (string path, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle);
#import



Объявляю текстовый массив
string lines[];

Объявляю путь к сетам
string FilePathSets="\\MQL4\\Presets";

Функция открывает сет файл и переносит значения в массив lines[]
До этого функцией определил значение prefix
Спойлер

//+------------------------------------------------------------------+
//| Function loads set file |
//+------------------------------------------------------------------+
int LoadSet()
{
int presymb=StringLen(prefix);
int result=-1;
string s="";
string NameOfSymbol = StringSubstr(Symbol(),presymb,6);
string name=StringConcatenate("\\",ExpertName,"_",NameOfSymbol,"_",SetVersion);
string filepath=TerminalInfoString(TERMINAL_DATA_PATH)+FilePathSets+name+".set";
// filepath - полный путь к файлу и его название.
// И при открытии файла возвращается хендл -1.... Что я не так сделал?
int handle=_lopen (filepath,OF_READ);
if(handle {
Print("Ошибка открытия файла ",filepath);
return (-1);
}
result=_llseek (handle,0,0);
if(result {
Print("Ошибка установки указателя" );
return (-1);
}
ArrayResize(lines,0);
//загрузка файла set
int i=0;
while(result>0)
{
s=_lread (handle,s,1);
if(s=="" || StringFind(s,",")>0) continue;
ArrayResize(lines,i+1);
lines=s; //сохраним все переменные из файла в массив для последующего поиска и выборки
}
result=_lclose (handle);
if(result Print("Ошибка закрытия файла ",filepath);
return (i);
}



Затем я ищу нужный мне параметр в массиве
Спойлер

//+------------------------------------------------------------------+
//| Function searches for "match" parameter in lines[] massive |
//+------------------------------------------------------------------+
string GetSetFileString(string match)
{


int LinesLength=ArraySize(lines);
int pos=StringLen(match);
for(int i=0;i {
if(StringFind(lines,match,0)!=-1) return (StringSubstr(lines,pos+1));
}
return("");
}



Ну а потом просто перевожу из строки в нужный мне вид.

Чем вам не нравится обертка от MQL?


string file_name = get_file_name_by_type ( type );


if ( !FileIsExist ( file_name ) ) {
return result;
}


int handle = FileOpen ( file_name, FILE_READ | FILE_TXT );


if ( handle == INVALID_HANDLE ) {
return result;
}


string val = FileReadString ( handle );
FileClose ( handle );


if ( str_is_empty ( val ) ) {
FileDelete ( file_name );
return result;
}

Попробуйте сначала прописать полный путь руками C:\.... , если все гуд, то что то с относительным путем.. Изменено пользователем Qj
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Парни, подсобите плиз с функцией.


_lread и остальные функции подобного именования оставлены для обратной совместимости и их явное использование - дурной тон. Следует использовать CreateFileW и другие widechar функции
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано



Парни, подсобите плиз с функцией.


_lread и остальные функции подобного именования оставлены для обратной совместимости и их явное использование - дурной тон. Следует использовать CreateFileW и другие widechar функции

Давно хотел спросить, в чем разница между PostMessageA например и PostMessageW?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Знающим любое решение такой задачи прошу откликнуться.

Как сделать так, чтобы по закрытию свечи на заданном ТФ скриптом или индюком делался скрин графика и автоматически отправлялся на почту, думаю это было бы чрезвычайно полезно всем, кому не удобно вытаскивать копм на закрытии каждой свечи

Поделитесь, пожалуйста, любой инфой по этому поводу - софтом, умеющим делать скриншоты, например.
Я так понимаю, что мт4 умеет отсылать только сообщение на мыло и нужен какой то внешний софт, как решить вопрос автоматической отправки скринов? :-/

Изменено пользователем Ленивый Лис
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Silentspec, разница в том что PostMessageA конвертирует строки в уникод вместо нерадивого программиста. Таким образом вызов PostMessageW на несколько команд ассемблера и вызов ф-ции конвертации короче, так как нет оберток вокруг уникода. В наш век быстрых процессоров это не критично но знать об этом стоит. На низком же уровне вызов с обеих ф-ций сводится к NtUserPostMessage
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Мистика какая-то. Выдает, что файла в этой директории нету, а он есть...
2015.11.19 11:47:38 2000.09.01 00:00 Bolvanka v1.00 USDCHF,M15: Такого файла не существует C:\Users\Rjhytd\AppData\Roaming\MetaQuotes\Terminal\FC0DDA156FE31321E58C2060B9D89910\MQL4\Presets\Firestarter v1.21_USDCHF_01.set

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Изучайте
_http://docs.mql4.com/ru/chart_operations/windowscreenshot
_http://docs.mql4.com/ru/chart_operations/chartscreenshot
_http://docs.mql4.com/ru/common/webrequest
_http://docs.mql4.com/ru/common/sendftp

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Silentspec у тебя пробел в названии файла "Firestarter v1.21_USDCHF_01.set". попробуй без пробела...
и поддерживаю Qj - пользуйся mql-функциями, чтоб не заморачиваться с кодировками, массивами и т.д.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...