Jump to content
RickD

MQL-4: некоторые полезные функции

Recommended Posts

RickD
RickD

При работе одновременно на нескольких валютах эксперт, призванный ловить резкие изменения на М1, дает сигнал на проведение операции сразу по нескольким валютам. Даже на Демо успевает отработать одна-две пары. Как можно заставить эксперта дублировать сигнал до срабатывания в течении заданного отрезка времени?

И еще, где нибудь можно протестировать на М1 период больший чем последний месяц? На МТ4, даже при наличии истории за год , у меня не получается!

 

Можно зациклить открытие ордера. Но я так не стал бы делать.

Неизвестно - по какой причине сервер дает отбой. Если это неправильные цены например, то можно сильно рассердить брокера.

 

Касаемо тестирования - попробуйте принудительно установить дату начала теста.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
allogin

Сообщение от RickD

 

Можно зациклить открытие ордера. Но я так не стал бы делать.

Неизвестно - по какой причине сервер дает отбой. Если это неправильные цены например, то можно сильно рассердить брокера.

 

Открытие ордеров идет по текущей цене, а ордера не открываются потому что просто не успевают поступить на сервер. Например по тестеру (открытие в реале совпадает с тестером 1:1, ни 0-ой, ни 1-ый - не успевший сформироваться бары не использую ) 19.07.06 в 16:03 должны были открыться 4 позиции по разным парам , открылось 2, т.к. в 16:04 эксперт команду на открытие уже не давал.

Касаемо тестирования - попробуйте принудительно установить дату начала теста

Ставлю самые разные: бесполезно, с течением времени, даже те периоды что тестировались - перестают, сдвигаясь на более поздние. Может какой-то нюанс не учитываю?

Работаю я по этому шаблону:

1min-USDJPY.mq4


сакрамат

Share this post


Link to post
Share on other sites
RickD
Открытие ордеров идет по текущей цене, а ордера не открываются потому что просто не успевают поступить на сервер. Например по тестеру (открытие в реале совпадает с тестером 1:1, ни 0-ой, ни 1-ый - не успевший сформироваться бары не использую ) 19.07.06 в 16:03 должны были открыться 4 позиции по разным парам , открылось 2, т.к. в 16:04 эксперт команду на открытие уже не давал.

 

Ну тут все просто. Нужно увеличить время на отправку ордеров. Сделать от 2 минут.

 

Ставлю самые разные: бесполезно, с течением времени, даже те периоды что тестировались - перестают, сдвигаясь на более поздние. Может какой-то нюанс не учитываю?

Работаю я по этому шаблону:

 

Попробуйте обратиться в FAQ по МТ4: http://forum.alpari-idc.ru/thread24603-24.html

 

Rosh в таких делах стопудово разбирается.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
allogin
Ну тут все просто. Нужно увеличить время на отправку ордеров. Сделать от 2 минут.

В том-то и нюанс, что с моим образованием (один семестр по фортрану 20 лет назад, остальное самоучкой из нета) не могу в этом пока разобраться, а за совет , конечно, спасибо. Буду пытаться.


сакрамат

Share this post


Link to post
Share on other sites
MW

Созрела нужда в решении одного вычисления, как можно осуществить? К примеру, имеем число 51121102 и тут заданы параметры индикаторов, при помощи какой функции можно разбить это число по переменным : цена= функция(5), период=функция (11) и т. д.

Заранее благодарю…


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
RickD
Созрела нужда в решении одного вычисления, как можно осуществить? К примеру, имеем число 51121102 и тут заданы параметры индикаторов, при помощи какой функции можно разбить это число по переменным : цена= функция(5), период=функция (11) и т. д.

Заранее благодарю…

 

StringSubstr должна подойти.

 

string StringSubstr( string text, int start, int length=0) 

 

Извлекает подстроку из текстовой строки, начинающейся c указанной позиции.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
KimIV
Созрела нужда в решении одного вычисления, как можно осуществить? К примеру, имеем число 51121102 и тут заданы параметры индикаторов, при помощи какой функции можно разбить это число по переменным : цена= функция(5), период=функция (11) и т. д.

Заранее благодарю…

int a=[font=Times New Roman][size=3]51121102;[/size][/font]
[font=Times New Roman][size=3]string b=DoubleToStr(a, 0);[/size][/font]
[font=Times New Roman][size=3]int цена=StrToInteger(StringSubstr(b, 0, 1));[/size][/font]
[font=Times New Roman][size=3]int период=StrToInteger(StringSubstr(b, 1, 2));[/size][/font]


Ещё вчера я себе казался умным и пытался изменить мир, а сегодня я стал мудрым и пытаюсь изменить себя...

Share this post


Link to post
Share on other sites
RickD
В том-то и нюанс, что с моим образованием (один семестр по фортрану 20 лет назад, остальное самоучкой из нета) не могу в этом пока разобраться, а за совет , конечно, спасибо. Буду пытаться.

 

Как вариант, при появлении сигнала выставляете флаг.

Например signal = true;

Далее

 

if (signal) {
 int ticket = OrdseSend(...
 if (ticket > 0) signal = false;
}

 

Т.е. гарантированно по открытии ордера сигнал сбросится.

Пока флаг выставлен, эксперт будет пытаться открыть позицию.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
MW

Нет ничего невозможного … вояим дальше ;)


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
allogin

RickD

Спасибо, попробую. Мне почему-то казалось что при таком варианте можно работать только с одним ордером на счете, а не с несколькими, нужными мне .


сакрамат

Share this post


Link to post
Share on other sites
Khron

Не кто не встречал часть эксперта определение тренда по фракталам .Чтоб выдавал сигналы bay sell .


Kron

 

Не потерять бы то, что есть....

Share this post


Link to post
Share on other sites
Юг

Может кто знает как ограничить колличество лоссов подряд в течнии дня :roll: Допустим если сегодня 2 лосса подряд - то больше сегодня не открываемся, никак придмать не могу :roll:


С уважением, Юг

Обсуждаем...

ФА...

Share this post


Link to post
Share on other sites
RickD
Не кто не встречал часть эксперта определение тренда по фракталам .Чтоб выдавал сигналы bay sell .

 

Это через последовательность понижающихся максимумов и минимумов вероятно?


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
RickD
Может кто знает как ограничить колличество лоссов подряд в течнии дня :roll: Допустим если сегодня 2 лосса подряд - то больше сегодня не открываемся, никак придмать не могу :roll:

 

Тут все просто.

Идем в цикле по истории.

Берем ордера только за сегодня.

Считаем количество закрывшихся по sl.

Если количество более заданного, не открываем новых.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Юг
Тут все просто.

Идем в цикле по истории.

Берем ордера только за сегодня.

Считаем количество закрывшихся по sl.

Если количество более заданного, не открываем новых.

 

Кому просто, а кому совсем не просто :roll: А как в цикле истории искать и как ограничить ордера только за сегодня? Закрывшихся по sl не пойдёт нужно именно убыточные, а по sl часто прибыльные кроются (позиции тралятся).


С уважением, Юг

Обсуждаем...

ФА...

Share this post


Link to post
Share on other sites
RickD
Кому просто, а кому совсем не просто :roll: А как в цикле истории искать и как ограничить ордера только за сегодня? Закрывшихся по sl не пойдёт нужно именно убыточные, а по sl часто прибыльные кроются (позиции тралятся).

 

 int orders = 0;

 int cnt = HistoryTotal();
 for (int i=0; i < cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

   //if (OrderSymbol() != Symbol()) continue;
   //if (OrderMagicNumber() != Magic) continue;

   if (CurTime() - OrderCloseTime() > 24*60*60) continue;

   int type = OrderType();
   if (type == OP_BUY || type == OP_SELL) 
   {
     if (OrderProfit() < 0) orders++;  
   }
 }

 if (orders > 2) return;

 

Т.е. смотрим ордера за последние 24 часа с отрицательным профитом.


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Юг
 int orders = 0;

 int cnt = HistoryTotal();
 for (int i=0; i < cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

   //if (OrderSymbol() != Symbol()) continue;
   //if (OrderMagicNumber() != Magic) continue;

   if (CurTime() - OrderCloseTime() > 24*60*60) continue;

   int type = OrderType();
   if (type == OP_BUY || type == OP_SELL) 
   {
     if (OrderProfit() < 0) orders++;  
   }
 }

 if (orders > 2) return;

 

Т.е. смотрим ордера за последние 24 часа с отрицательным профитом.

 

RickD, спасибо попробую прикрутить и покрутить, я бы до такого точно не додумался:roll: , по идее нужно будет переделать пункт проверки по времени, т.к. за последние 24 часа не прокатит нужно именно по текущему дню, но есть мысли как это дело подправить, буду экспериментировать :)


С уважением, Юг

Обсуждаем...

ФА...

Share this post


Link to post
Share on other sites
RickD
RickD, спасибо попробую прикрутить и покрутить, я бы до такого точно не додумался:roll: , по идее нужно будет переделать пункт проверки по времени, т.к. за последние 24 часа не прокатит нужно именно по текущему дню, но есть мысли как это дело подправить, буду экспериментировать :)

 

Тогда можно написать так:

if (TimeYear(OrderCloseTime()) != Year()) continue;
if (TimeDayOfYear(OrderCloseTime()) != DayOfYear()) continue;


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
Юг
Тогда можно написать так:

if (TimeYear(OrderCloseTime()) != Year()) continue;
if (TimeDayOfYear(OrderCloseTime()) != DayOfYear()) continue;

 

RickD, спасибо, я немного правда покорявее сделал :roll:

 

 
if (TimeDay(CurTime())!=TimeDay(OrderCloseTime()) 
|| TimeMonth(CurTime())!=TimeMonth(OrderCloseTime()) 
|| TimeYear(CurTime())!=TimeYear(OrderCloseTime())) continue;


С уважением, Юг

Обсуждаем...

ФА...

Share this post


Link to post
Share on other sites
RickD
Кто может написать прогу для советника, автоматически выставляющего стопы по всем ордерам на 15 пунктов.

 

void start() {

 int type;
 double sl;

 int cnt = OrdersTotal();
 for (int i=0; i < cnt; i++) {
   if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; 
   if (OrderSymbol() != Symbol()) continue;

   if (OrderStopLoss() > 0) continue;

   type = OrderType();
   if (type == OP_BUY) {
     sl = Bid - 15*Point;
     OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);
   }

   if (type == OP_SELL) {
     sl = Ask + 15*Point;
     OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0);
   }
 }
}


MQL4: идея * опыт + творческий подход

:agree:

Share this post


Link to post
Share on other sites
MW

Нужна формула для вычисления углов в треугольнике, какую функцию можно использовать в МТ4? Спасибо за ответ.


Жми быка! Дави медведя!

Share this post


Link to post
Share on other sites
Rosh

Нужно вспомнить векторную алгебру, тогда скалярное произведение векторов А и В равно произведению их модулей на косинус угла между ними.

 

http://www.academiaxxi.ru/WWW_Books/HM/Ag/01/03/t.htm

 

Здесь нагляднее - http://www.college.ru/mathematics/courses/planimetry/content/models/scalmult.html

Share this post


Link to post
Share on other sites
Khron

Можно ли написать советника чтоб он определял направление тренда на часовом графике а момент открытия сделки на 15 минутном или на 5 минутном?


Kron

 

Не потерять бы то, что есть....

Share this post


Link to post
Share on other sites
shtik
Теперь более полезный пример.

Предположим советник должен открывать позицию в указанный промежуток времени. Этот промежуток удобно записать в следующем виде: "12:00-12:03".

 

[/code]

 

А как вставить эту функцию в советник? попробовал просто вставить в текст советника - выдал 19 ошибок и 9 предупреждений ...

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×