Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
З.Ы. и это..меня можно и на ТЫ :)
Ок, спасибо за подсказки, буду тоже продолжать бороться с МТ :)
Вариант с переносом в безубыток после преодоления расстояния одного стопа
Исправил ошибку в логике безубытка (безубыток всегда считался от заданного в параметрах стопа внезависимости менялся он или нет).
Просьба проверить работу безубытка кому не сложно.
Ребят, вот еще такая задачка. Нужна функция, считающая количество валютных пар, на которых есть открытые ордера.
Т.е. первое что приходит на ум это при переборе в цикле открытых ордеров создать массив, заполнить его названиями пар с открытыми ордерами, а потом сделать сравнение и выборку с подсчетом (собственно что-то подобное сейчас и пишу). Но может есть более изящный и менее ресурсо-затратный алгоритм?
- создай пустую строку
- ищи название пары в строке
- если нет пиши его туда, добавляй счетчик
- если есть - следующий
- после перебора ордеров количество символов в счетчике.
более простого алгоритма в голову не приходит...
:d перфекционизируем по случаю пятницы?!
Веришь - на ходу придумал, экспромт однако... :d
:d перфекционизируем по случаю пятницы?!
О, спасибо, со строкой пожалуй попроще будет. А то я начал заморачиваться с динамическим массивом, но там начинается каша с его индексами и размерами, слишком громоздко выходит.
Вобщем у меня получилось такая функция (спасибо 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);
}
В тестере работает, на реале проверю в понедельник.
иначе может найти составленный из соседних пар кросс ;)
Сортируй по типу, а то и отложки посчитает...
Контроль риска можно через маржу оценивать (я так обычно делаю), но в мультивалютных совах, возможно, другие задачи...
Изменено 17 октября, 2015 пользователем 0ll
Спасибо за подсказку про разделитель. Отложки я пока не использую, а функция, да, предназначена для мультивалютной торговли.
Молодцы, парни - действительно красивое решение!
Фигня вроде - а летает. :d
Вобщем у меня получилось такая функция (спасибо 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))
Да, все правильно, забыл что у 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);
}Тест на внимательность из всей команды условно прошел только Qj :)
Но всё равно кодик полезный весьма и весьма - скопипастил! :d
Да просто глаза уже замылились когда писал, если бы в рынке проверить - сразу бы заметил, а так жду понедельника.
З.Ы. Я тоже подобные полезные короткие и эффективные функции собираю. Потом все это облегчает создание и проверку разных идей - копипастишь бота из готовых блоков...
Народ, здравия!
Никак не могу решить такую задачку (только начал программить в 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 значения моих МА были равны. Но как эту инфу привязать к количеству баров?
Так тут i и будет количество баров. Код перебирает в цикле значения двух машек на каждом баре от 1-го (0 - текущий) до 1000-го. Как только значения совпадают (машки пересекаются) печается i - на каком баре от 1-го это произошло.
Неа. i не обязательно будет совпадать с количеством баров и пересечение машек тоже не всегда лежит на конкретном баре. i показывает что-то, при котором произошло совпадение значений. А как бар вытащить?
Изменено 19 октября, 2015 пользователем Evilmaker
Вам наверное стоит посмотреть видеоуроки по MQL в блоге.
Если вы исполняете приведенный код в функции OnTick() советника, то весь цикл перебора баров будет проходить за один тик.
И почитайте описание iMA.
Вам наверное стоит посмотреть видеоуроки по MQL в блоге.
Если вы исполняете приведенный код в функции OnTick() советника, то весь цикл перебора баров будет проходить за один тик.
И почитайте описание iMA.
Это не советник. Это пока скрипт.
Народ, здравия!
Никак не могу решить такую задачку (только начал программить в 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 - кол-во свечей с последнего пересечения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем