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

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

#2626
JR заметил этот косяк и вообще перестал пользоваться функциями, обращающимися к данным другого ТФ - тупо считаю значения баров из текущего ТФ. У Вас тиковая история М1 присутствует?
#2627
0ll, да, конечно присутствует - экспорт всех таймфреймов делаю. Я бы тоже не пользовался другими ТФ, но как быть, если к примеру в сове рассчитываются входы на м15, а данные по тренду берутся, ну пусть даже с машки с H4? Или например хотел получить размер свечи с другого ТФ как доп фильтр... Ну и таких ситуевин может быть много. А в обычном терминале с котирами брокера это вроде работает, в тикстори - нет.

З.Ы. и это..меня можно и на ТЫ :)
#2628
JR с машкой проблем меньше всего - нужно пропорционально ТФ изменить период. А свечи другого ТФ пересчитываю. В общем борюсь с МТ по всякому... Заметил, что это даёт результат - совы меньше глючить на реале стали.
#2629

Ок, спасибо за подсказки, буду тоже продолжать бороться с МТ :)

#2630

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

TPSLHelper.mq413 скач.

#2631

Исправил ошибку в логике безубытка (безубыток всегда считался от заданного в параметрах стопа внезависимости менялся он или нет).

Просьба проверить работу безубытка кому не сложно.

TPSLHelper02.ex415 скач.

#2632

Ребят, вот еще такая задачка. Нужна функция, считающая количество валютных пар, на которых есть открытые ордера.
Т.е. первое что приходит на ум это при переборе в цикле открытых ордеров создать массив, заполнить его названиями пар с открытыми ордерами, а потом сделать сравнение и выборку с подсчетом (собственно что-то подобное сейчас и пишу). Но может есть более изящный и менее ресурсо-затратный алгоритм?

#2633
JR
- создай пустую строку
- ищи название пары в строке
- если нет пиши его туда, добавляй счетчик
- если есть - следующий
- после перебора ордеров количество символов в счетчике.

более простого алгоритма в голову не приходит...
#2634

:d перфекционизируем по случаю пятницы?!

#2635


:d перфекционизируем по случаю пятницы?!

Веришь - на ходу придумал, экспромт однако... :d
#2636

О, спасибо, со строкой пожалуй попроще будет. А то я начал заморачиваться с динамическим массивом, но там начинается каша с его индексами и размерами, слишком громоздко выходит.

#2637

Вобщем у меня получилось такая функция (спасибо Oll), возможно кому пригодится. Зачем она нужна? Как многие уже догадались, для контроля рисков - если открыты ордера по определенному количеству пар (задаем в настройках), то дальше ставим запрет на открытие.

int CountTradesSymbol() //Считаем количество пар с открытыми ордерами 
{
if (OrdersTotal() == 0)
return(0);
int count = 0;
string sym = "";
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (StringFind(sym, OrderSymbol(), 0)) {
sym += OrderSymbol();
count++;
}
}
}
return (count);
}

В тестере работает, на реале проверю в понедельник.
#2638
JR обязательно добавь разделитель сюда: sym += OrderSymbol() + ","; !
иначе может найти составленный из соседних пар кросс ;)
Сортируй по типу, а то и отложки посчитает...
Контроль риска можно через маржу оценивать (я так обычно делаю), но в мультивалютных совах, возможно, другие задачи...

Изменено 17 октября, 2015 пользователем 0ll

#2639

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

#2640

Молодцы, парни - действительно красивое решение!
Фигня вроде - а летает. :d

#2641


Вобщем у меня получилось такая функция (спасибо Oll), возможно кому пригодится. Зачем она нужна? Как многие уже догадались, для контроля рисков - если открыты ордера по определенному количеству пар (задаем в настройках), то дальше ставим запрет на открытие.

int CountTradesSymbol() //Считаем количество пар с открытыми ордерами 
{
if (OrdersTotal() == 0)
return(0);
int count = 0;
string sym = "";
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (StringFind(sym, OrderSymbol(), 0)) {
sym += OrderSymbol();
count++;
}
}
}
return (count);
}

В тестере работает, на реале проверю в понедельник.

Мне кажется или тут ошибка? if (StringFind(sym, OrderSymbol(), 0)) => if (!StringFind(sym, OrderSymbol(), 0))
#2642

Да, все правильно, забыл что у StringFind возвращаемое значение типа int ( -1 если не найдено). Вот так сейчас оставил:

int CountTradesSymbol() //Считаем количество пар с открытыми ордерами 
{
if (OrdersTotal() == 0)
return(0);
int count = 0;
string sym = "";
for (int i = OrdersTotal() - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType() == OP_BUY || OrderType() == OP_SELL) {
if (StringFind(sym, OrderSymbol(), 0) sym += OrderSymbol() + ",";
count++;
}
}
}
}
return(count);
}
#2643

Тест на внимательность из всей команды условно прошел только Qj :)

Но всё равно кодик полезный весьма и весьма - скопипастил! :d

#2644

Да просто глаза уже замылились когда писал, если бы в рынке проверить - сразу бы заметил, а так жду понедельника.

З.Ы. Я тоже подобные полезные короткие и эффективные функции собираю. Потом все это облегчает создание и проверку разных идей - копипастишь бота из готовых блоков...

#2645

Народ, здравия!
Никак не могу решить такую задачку (только начал программить в MQL4):
Есть две МА. Надо найти количество баров с момента их последнего пересечения.
Я округляю их до Digits(через NormolizeDouble), сравниваю их, а вот как посчитать количество баров - фиг его знает. И до конца непонятно, как работают сдвиги в этих МА.

double aa, bb;
int counted_candles = 0;

for ( int i=1; i {
aa = iMA(Symbol(), 0, 13, 0, MODE_SMA, PRICE_CLOSE, i);
bb = iMA(Symbol(), 0, 26, 0, MODE_SMA, PRICE_CLOSE, i);

if ( NormalizeDouble(aa, Digits) == NormalizeDouble(bb, Digits
{
counted_candles++;
Print ("i=", i, "; aa=", NormalizeDouble(aa, Digits), "; bb=", NormalizeDouble(bb, Digits));
break;
}
}


Он мне выводит i какой-то и показывает, что при этом i значения моих МА были равны. Но как эту инфу привязать к количеству баров?

#2646

Так тут i и будет количество баров. Код перебирает в цикле значения двух машек на каждом баре от 1-го (0 - текущий) до 1000-го. Как только значения совпадают (машки пересекаются) печается i - на каком баре от 1-го это произошло.

#2647

Неа. i не обязательно будет совпадать с количеством баров и пересечение машек тоже не всегда лежит на конкретном баре. i показывает что-то, при котором произошло совпадение значений. А как бар вытащить?

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

#2648

Вам наверное стоит посмотреть видеоуроки по MQL в блоге.
Если вы исполняете приведенный код в функции OnTick() советника, то весь цикл перебора баров будет проходить за один тик.
И почитайте описание iMA.

#2649


Вам наверное стоит посмотреть видеоуроки по MQL в блоге.
Если вы исполняете приведенный код в функции OnTick() советника, то весь цикл перебора баров будет проходить за один тик.
И почитайте описание iMA.


Это не советник. Это пока скрипт.
#2650
Спойлер



Народ, здравия!
Никак не могу решить такую задачку (только начал программить в MQL4):
Есть две МА. Надо найти количество баров с момента их последнего пересечения.
Я округляю их до Digits(через NormolizeDouble), сравниваю их, а вот как посчитать количество баров - фиг его знает. И до конца непонятно, как работают сдвиги в этих МА.

double aa, bb;
int counted_candles = 0;

for ( int i=1; i {
aa = iMA(Symbol(), 0, 13, 0, MODE_SMA, PRICE_CLOSE, i);
bb = iMA(Symbol(), 0, 26, 0, MODE_SMA, PRICE_CLOSE, i);

if ( NormalizeDouble(aa, Digits) == NormalizeDouble(bb, Digits
{
counted_candles++;
Print ("i=", i, "; aa=", NormalizeDouble(aa, Digits), "; bb=", NormalizeDouble(bb, Digits));
break;
}
}


Он мне выводит i какой-то и показывает, что при этом i значения моих МА были равны. Но как эту инфу привязать к количеству баров?


Не уверен конечно, но попробуйте это
Спойлер



double aa, bb;
int counted_candles = 0;

for ( int i=1; i {
aa = iMA(Symbol(), 0, 13, 0, MODE_SMA, PRICE_CLOSE, i);
bb = iMA(Symbol(), 0, 26, 0, MODE_SMA, PRICE_CLOSE, i);

if ( NormalizeDouble(aa, Digits) != NormalizeDouble(bb, Digits))
{
counted_candles++;
break;
}
}


counted_candles - кол-во свечей с последнего пересечения

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

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