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

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

#2476


mark4431 эта торговая панель по сути - обычный советник, поэтому можно пихать туда всё, что угодно (всё, что понапихано в другие советники).


Ништяк! Спасибо! Буду изучать "работу с кнопками" \M/

Добавлено: 19-08-2015 17:29:46

Пишу сеточник, при выставлении неограниченного числа ордеров, в конце выскакивает ошибка 4107, при этом ордера ставятся как положено и все значения нормализованы, есть предположение, что это из-за границ графика. Подскажите как ограничить выставление отложек макс и мин значениями графика, точнее как получить эти значения, например как с лотом "MarketInfo(Symbol(),MODE_MAXLOT)"? Или может есть другие предположения по данной ошибке?

И еще в журнале периодически бывает "1.#INF"

Изменено 19 августа, 2015 пользователем mark4431

#2477
mark4431 это не из-за границ графика. Перед ОрдерСэнд() вставьте принт со всеми параметрами ордера и потом по логам изучайте.
Такого "1.#INF" мне не встречалось...
#2478


mark4431 это не из-за границ графика. Перед ОрдерСэнд() вставьте принт со всеми параметрами ордера и потом по логам изучайте.
Такого "1.#INF" мне не встречалось...


Ок. Спасибо, будем разбираться)

Добавлено: 21-08-2015 18:56:50

Ребят, подскажите пожалуйста, как реализовать функцию, чтобы выводилось в журнал последнее максимальное значение AccountProfit(). Т.е. например, было 1000$, открыли сделки, профит вышел к 120и и затем откатил на 105, как реализовать чтобы после n-го условия вышел принт 120. Закрылись-обнулились, открылись-повтор.

Изменено 21 августа, 2015 пользователем mark4431

#2479

JR, Konstebl, mark4431, 0ll спасибо за коменты (форум живой).
Книгу я читал несколько раз "Учебник по MQL 4" автор Сергей Ковалёв, а так же все найденные в интернете книги, брошюры и видео по данной теме, очень надеялся что видео поможет как нибудь понять что написано в книгах - результат 0. Шуточки что это не мое это не ко мне : ). Точно знаю что перепишу всех программистов но меня этому нужно научить.

#2480
mark4431 что-то Вы очень простые вещи спрашиваете...
1. введите переменную и в ините или при открытии первого ордера (я не понял Вашего замысла): Мах_Эквити = АккЭквити()
2. если (АккЭквити() > Мах_Эквити) Мах_Эквити = АккЭквити()
Вот у Вас есть мах эквити - делайте что хотите.
#2481

Подскажите, как правильно задать выполнение одного из двух условий.


open1 = NormalizeDouble(iOpen(Symbol(), Period(), 1), Digits);
open2 = NormalizeDouble(iOpen(Symbol(), Period(), 2), Digits);
close1 = NormalizeDouble(iClose(Symbol(), Period(), 1), Digits);
close2 = NormalizeDouble(iClose(Symbol(), Period(), 2), Digits);
low1 = NormalizeDouble(iLow(Symbol(), Period(), 1), Digits);
low2 = NormalizeDouble(iLow(Symbol(), Period(), 2), Digits);
high1 = NormalizeDouble(iHigh(Symbol(), Period(), 1), Digits);
high2 = NormalizeDouble(iHigh(Symbol(), Period(), 2), Digits);

if (open2 > close2 && close1 > open1 && open2 > close1 && close2 if (close2 > open2 && open1 > close1 && close2 > open1 && open2

Сравниваю 2 свечи, нужно, чтобы при совпадении одного из If продолжилось выполнение действия. Как я понимаю через || это не сделать
#2482
Rever27 почему через или не сделать? - делай. только 1 и 2 условие: if ( (1) || (2) ) { ... }
#2483


Rever27 почему через или не сделать? - делай. только 1 и 2 условие: if ( (1) || (2) ) { ... }



Вот вчера так и делал - писал предупреждение. Сегодня сделал - все заработало, мистика ))

Народ, возможно, этот вопрос уже задавался тут сто раз, но подскажите сайты, где есть подробные уроки MQL для чайников, без видео, достаточно текста и доступного описания. Пол года назад пытался выучить MQL, так и не вышло, зато взамен выучил VBA для Excel, хоть опыт в программировании получил, теперь попытка №2 )
#2484

Парни, хочу уточнить такой нубский момент:
MarketInfo(Symbol(), MODE_STOPLEVEL) - Минимально допустимый уровень стоп-лосса/тейк-профита в пунктах

Это уровень от текущей цены или от открытого ордера? Вроде на открытом ордере, если цена не не мешает мы можем любые значения стоплосса ставить, хоть по цене открытия, правильно?

#2485
JR от текущей цены.
#2486

Еще вопрос: что за природа ошибки Invalid slippage for OrderSend function? Возникает периодически, непонятно отчего. Slippage у меня в данном случае равен 3п (старыми), тип int.

#2487

Подскажите.
Использую такую конструкцию, чтобы выполнять дальнейшие действия только 1 раз за бар, не мучая Эксперта каждый тик:

if (timeBarInside == iTime(Symbol(),Period(),1)) return;


Как мне написать доп. условие, чтобы дальнейшие действия повторялись не раньше, чем через 10 секунд?
#2488
JR впервые узнал о такой ошибке... понятия не имею что не так...
Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]
функция таймера:

bool f_TimeChange(int dSek)
{
static datetime last_DT;
if (last_DT > TimeCurrent() - dSek) return(false);
last_DT = TimeCurrent(); return(true);
}
#2489


Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]


Кстати, почему?
#2490


Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]
функция таймера:


Сделал, вроде работает )
if (timeBarInside == Time[1]) return;
timeBarInside = Time[1];

Цитата


bool f_TimeChange(int dSek)
{
static datetime last_DT;
if (last_DT > TimeCurrent() - dSek) return(false);
last_DT = TimeCurrent(); return(true);
}


Для самых тугих, можно написать пример запуска этой функции, где dSek указывать? )
#2491



Rever27 старайся не использовать функции типа iTime(Symbol(),Period(),1), лучше просто Time[1]

Кстати, почему?
Как я понял эти функции берут инфу из разных источников. Попадающие в МТ тики формируют свечи текущего ТФ в массиве в оперативке - это Time[х], а потом МТ сбрасывает массивы в базу котировок на диск, а iTime() читает с диска. Всё имхо...

Rever27 то, что Вы сделали будет работать по открытию бара. Моя ф-ция будет работать по секундам. Использовать:
if ( f_TimeChange(10) ) //- для 10 секунд.
{
... код исполняемый 1/10 сек.
}

Изменено 31 августа, 2015 пользователем 0ll

#2492

При

timeBarInside == Time[1];
,
если тестируешь с даты самого начала котировок, то терминал выдает критическую ошибку EA, ибо нет бара до текущего. Как я понимаю, я могу и Time[0] писать, разницы то нет, все равно 1 раз в бар будет выполняться действие?
С 10 секундами я погорячился, f_TimeChange(60) работает отлично, чаще и не нужно нагружать терминал. Благодарю
#2493
Rever27 можно Time[0], но в любом случае нельзя тестировать с самого начала котировок - ибо для работы индюков тоже нужна история...
#2494

Приветствую! Есть ли такая функция которая позволяет не округлять а отбрасывать часть знаков после запятой? Или есть способ это как то реализовать?

#2495

Так а NormalizeDouble чем не годится?

#2496

Есть ли такая функция которая позволяет не округлять а отбрасывать часть знаков после запятой? Или есть способ это как то реализовать?

Правильно сделать так, как написал JR, но можно и так:
double x = 123,456;
int y = (int)x; // результат: y = 123
#2497

Хочу еще раз поднять вопрос по ошибке Invalid slippage for OrderSend function, которую отдавал сервер при попытке открыть ордер. Я так и не понял ее природу, а когда я не могу до конца разобраться, я остаюсь неудовлетворен :)
Собственно изначально у меня стоял slippage равный 3 старым пунктам (тип Int), для 5-ти знака шел пересчет с умножением на 10. Ставлю сову на демо счет робофорекса (5-ти знак) - периодически вылазит данная ошибка. Не системно, как попало - то открывает ордера, то нет. Увеличил slippage до 4-х, потом до 5-ти пунктов, не помогло. Я уже даже в поддержку робо написал, может у них ограничения какие - но там отморозились.
Потом поставил slippage обратно в 3п и... убрал умножение на 10 для 5-ти знака. Странно, но с таким параметром пока работает без ошибок, наблюдаю дальше.

Собственно вопрос - а надо ли slippage для 5-ти знака умножать на 10? И какие вообще оптимальные значения для этого параметра и как их вычислять.

З.Ы. В гугле по ошибке Invalid slippage for OrderSend function практически нет результатов, а те что есть - ответа не дают.

#2498
JR имхо причуды брокера, или что-то с типом/умножением не так... Ваш "тип Int" вместо "тип int" как-то подозрительно выглядит...
#2499


Ваш "тип Int" вместо "тип int" как-то подозрительно выглядит...


Сорри, привычка все писать с заглавной :) Там все просто было:

int Slippage = 3;
if (Digits == 3 || Digits == 5) {
Slippage *= 10;
}

#2500
JR по коду замечаний нет.
В своих ботах 4-5 знак не перевожу (из принципа - считаю не своим делом), слиппаж у меня почти всегда = 20, на робо счетов нет, ошибок не было...

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

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