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

От xbms, 13 апреля, 2013 в Уголок Программиста

#2751


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

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


Проблема в том, что он торгует на одном таймфрейме. А 4 таймфрейма, это для большего охвата. Советник торгует по прайс экшену. Считай одной свечной комбинации. Она появляется нечасто. Вот и решил сделать советник мультивалютным и мультитаймфреймовым. Чтобы поставил на один символ, а торговля происходила сразу на куче валют и нескольких таймфреймах. А если делать даже в цикле, то опять возвращаемся к 40 операторам if или for.
#2752
Soldat, нет никакого смысла делать советник по подобной стратегии, работающий одновременно на разных валютных парах. У разных пар в любом случае будет разная волатильность и как минимум разные СЛ-ТП, поэтому подбирать параметры (оптимизировать) нужно будет на каждую пару в отдельности. С вашей идеей это исключено полностью. Делайте один советник с настраиваемыми параметрами и оптимизируйте для выбранных пар, потом ставьте копию советника с нужным сетом и разными магиками на пары.
#2753


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



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

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

имхо, ну а там как знаете...
#2755

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

#2756


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

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



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

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


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




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

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


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


Так и пишите "Образовался сигнал на покупку"+IntegerToString(Symbol ())+"период графика"+IntegerToString(Period ())
#2760


+IntegerToString(Symbol ())

Чёт ты перегнул... :d
#2761

Сгоряча =))

#2762

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

#2764

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

Есть тралл ТП который работает, но всегда выдает 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());
}
}
}
}

#2765

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

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

#2766

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

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

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

#2767

Парни, подсобите плиз с функцией.
Назначение: загрузка параметров из 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("");
}



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

Изменено 19 ноября, 2015 пользователем Silentspec

#2768
Спойлер


Парни, подсобите плиз с функцией.
Назначение: загрузка параметров из 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:\.... , если все гуд, то что то с относительным путем..

Изменено 19 ноября, 2015 пользователем Qj

#2769


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


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



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


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

Давно хотел спросить, в чем разница между PostMessageA например и PostMessageW?
#2771

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

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

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

Изменено 19 ноября, 2015 пользователем Ленивый Лис

#2772
Silentspec, разница в том что PostMessageA конвертирует строки в уникод вместо нерадивого программиста. Таким образом вызов PostMessageW на несколько команд ассемблера и вызов ф-ции конвертации короче, так как нет оберток вокруг уникода. В наш век быстрых процессоров это не критично но знать об этом стоит. На низком же уровне вызов с обеих ф-ций сводится к NtUserPostMessage
#2773

Мистика какая-то. Выдает, что файла в этой директории нету, а он есть...
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

#2774

Изучайте
_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

#2775
Silentspec у тебя пробел в названии файла "Firestarter v1.21_USDCHF_01.set". попробуй без пробела...
и поддерживаю Qj - пользуйся mql-функциями, чтоб не заморачиваться с кодировками, массивами и т.д.

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

Перейти к списку тем
Форум · 2.0.20260627.0025