Перейти к содержанию

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


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
axwellweb 1. Есть брокеры и типы счетов которые не принимают в функции OrderSend ровни СЛ и ТП, поэтому надо их устанавливать после открытия ордера.
2. Функция OrderSend возвращает либо номер тикета, либо -1 в случае ошибки открытия, другого не дано. Если номер тикета получен, значит ордер прописан везде и обязан находится и модифицироваться.

Иван В повторяю: если ордер не модифицирован, то это ошибка, она записывается в журнал. Надо открыть журнал, найти код ошибки и посмотреть по справочнику в чём дело. Мы за Вас это не сделаем.
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Уважаемые программисты, вопрос. Висит сетка ордеров длительное время. Как можно модифицировать общий TP учитывая накопившийся своп ? Уже голову сломал. Может это уже где-то обсуждалось - дайте ссылку.

Ссылка на сообщение
Поделиться на другие сайты

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


Уважаемые программисты, вопрос. Висит сетка ордеров длительное время. Как можно модифицировать общий TP учитывая накопившийся своп ? Уже голову сломал. Может это уже где-то обсуждалось - дайте ссылку.

Своп это деньги. Делите деньги на стоимость пункта получаете пункты для объёма 1 лот. Затем увеличиваете или уменьшаете пропорционально объёму ордеров своей сетки.
Единственная проблема - надо сохранять своп до следующих суток. чтоб вычислить коррекцию именно за текущий день.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Иван В повторяю: если ордер не модифицирован, то это ошибка, она записывается в журнал. Надо открыть журнал, найти код ошибки и посмотреть по справочнику в чём дело. Мы за Вас это не сделаем.


Добрый день! Вот мой журнал, последняя строчка горит красным, типо ошибка, но код ошибки не пишет, а вечером работает все нормально советник выставляет ордер по нужной цене, а с ним ТП и СЛ. Косяки только днем. Как я понимаю это ошибка из-за сервера альпари, днем даже руками не сразу выставишь.
2017.10.16 11:18:09.084 '1738043': order was opened : #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000
2017.10.16 11:18:09.084 '1738043': modify order #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000 -> sl: 1.2096 tp: 1.1795
2017.10.16 11:18:09.256 '1738043': modification of order #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000 -> sl: 1.2096 tp: 1.1795 failed [Off quotes]
Ссылка на сообщение
Поделиться на другие сайты

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


2017.10.16 11:18:09.256 '1738043': modification of order #1782315834 sell 1.00 EURUSD at 1.1796 sl: 0.0000 tp: 0.0000 -> sl: 1.2096 tp: 1.1795 failed [Off quotes]

Нет цен, попробуйте перед модификацией ордера обновить цены RefreshRates();
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте подскажите как сделать, что бы лот закрывался частично например, половина лота закрылось на расстоянии 200 пунктов от открытия, а остальная часть по пересечению средних. Спасибо.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Roman 13 просто в функцию закрытия ордера вставляете нужный размер лота.

alex202 делаете цикл по ордерам, такой-же как при пересчёте и там добавляете строку:
if ( OrderProfit() как добавить переменную double знаете?
Ссылка на сообщение
Поделиться на другие сайты

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

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


Добавлено: 26-10-2017 09:07:10


Вот такой вариант вы предлагаете или что то др. ?

void BuyOrderLotsMgmall63()
{
double Loss= 0 ; // переменная
double SLBS = iATR(NULL, 0, InpAtrPeriod, 0);
double TPBS = iATR(NULL, 0, InpAtrPeriod, 0);
SLBS *= ATR_MultiplierSL;
TPBS *= ATR_MultiplierTP * TPBSOn;
double profit= 0;
datetime lastCloseTime = 0;
int cnt = OrdersHistoryTotal();
for (int i=0; i {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == OrderId && lastCloseTime {
lastCloseTime = OrderCloseTime();
profit = OrderProfit(); // переменная
CurrentBuyLots63 = OrderLots();
}
}

if ((profit >= KFUp)||((profit > KFDn ) && (profit {
CurrentBuyLots63 = CurrentBuyLots63 * KP + 0;
if (true)
CurrentBuyLots63 = lot;
}
else if (profit // убыточные ордера
{
CurrentBuyLots63 = NormalizeDouble(0.01 * OrderProfit() * KF, 2);
Изменено пользователем alex202
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
alex202 я Вам такого предложить не мог :d
в Вашем примере фрагмент функции расчёта лота от последнего закрытого ордера (кстати с ошибкой), а Вы спрашивали про сумму нескольких убыточных ордеров.

Pioner_rus про DynamicBreakoutBox впервые слышу.
Ссылка на сообщение
Поделиться на другие сайты

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

А не подскажете в чём ошибка? :-/

Ошибочно использование функции OrderProfit() вне цикла перебора ордеров. Вы можете указать какой ордер будет активен после завершения цикла? я вот не смогу и советую найти ордер и сохранить нужные параметры во внешние переменные и потом их использовать.
Ссылка на сообщение
Поделиться на другие сайты

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

Привет , всем , сначала хотел по благодарить Сергея , что сделал видео уроки . Учебник не все могут понять , я среди них . А тут все подробно и с пониманием дела .
Только что начал изучать MQL4 . И сразу на втором уроке нашел ошибку , точнее не до чет : советник находит макс и мин цену на заданном кол-ве баров скажем 10 баров , но проходя дальше , он не изменяет эти величины в этом диапазоне 10 баров , а считает все больше и больше новые экстремумы . Просьба добавить с подробными комментариями нужный код чтобы советник обновлял на каждых 10 барах макс и мин значение . MQL обновился поэтому на всякий случай выкладываю версию второго урока Test2 по новому .

Вот функция которая определяет максимальную цену за заданное кол-во баров(total_candle) :
void GetMaxPrice()
{
//задаем цикл i-бар , перечисляем их от 0 до 10
for(int i=0; i
//находим макс цену
{
mp = iHigh(Symbol() ,PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
}
return;
}


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

урок_2_циклы.mq4

Изменено пользователем 4er58
Ссылка на сообщение
Поделиться на другие сайты

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

сразу на втором уроке нашел ошибку

Перед вызовом функции GetMaxPrice() нужно обнулить maxprice = 0, для минимума - наоборот сделать максимальным.
Ссылка на сообщение
Поделиться на другие сайты

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

Перед вызовом функции GetMaxPrice() нужно обнулить maxprice = 0, для минимума - наоборот сделать максимальным.



Спасибо , но куда и как правильно вставить не пойму ? У нас в глобальных переменных уже присвоено :
double minprice = 99999, maxprice=-99999 ; Как правильно обнулить записать, не научил Сергей на втором уроке обнулять :)
void OnTick()
{
minprice =0 , maxprice= 0; // Здесь вписываем ?


// Сначала получаем макс и мин цены
GetMaxPrice();
GetMinPrice();
Изменено пользователем 4er58
Ссылка на сообщение
Поделиться на другие сайты

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

Как правильно обнулить записать, не научил Сергей

Обнулить это значит присвоить значение "0" :)
ВНИМАНИЕ, ещё раз повторяю: минимальное значение обнулять не надо! наоборот сделать его максимальным, т.е. minprice = 99999; (например)
Вставили правильно.
Ссылка на сообщение
Поделиться на другие сайты

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

Обнулить это значит присвоить значение "0"
ВНИМАНИЕ, ещё раз повторяю: минимальное значение обнулять не надо! наоборот сделать его максимальным, т.е. minprice = 99999; (например)
Вставили правильно.


Так не работает алгоритм как надо , значения были присвоены еще на уроке ( максимальные и минимальные значения min и max price ). Посмотрите пожалуйста весь код в первом моем сообщении и поправьте пожалуйста с комментариями, что бы мог разобраться . Тяжело учиться когда и так все туго дается , так еще Сэнсэй не видит и не исправляет недочеты :( . Сергей , ты где ? Изменено пользователем 4er58
Ссылка на сообщение
Поделиться на другие сайты

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

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




Тут я! :)
Всё просто, нужно лишь, как уже писали выше, обнулить переменные maxprice, minprice, а лучше присвоить им какие-то экстремальные значения :
maxprice=-99999;
minprice = 99999;

т.е. будет так:

void GetMaxPrice()
{
maxprice=-99999;
//задаем цикл i-бар , перечисляем их от 0 до 10
for(int i=0; i
//находим макс цену
{
mp = iHigh(Symbol() ,PERIOD_CURRENT,i);
if(mp > maxprice)
maxprice = mp;
}
return;
}
// создаем функция мин цены
void GetMinPrice()
{
minprice = 99999;

for(int i=0; i {
mp = iLow(Symbol(),PERIOD_CURRENT,i);//iLow функция нахожд мин цены, (Symbol()-тек график,PERIOD_CURRENT- тек период
if(mp minprice = mp;
}
return;
}
Ссылка на сообщение
Поделиться на другие сайты

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

Тут я!
Всё просто, нужно лишь, как уже писали выше, обнулить переменные maxprice, minprice, а лучше присвоить им какие-то экстремальные значения :
maxprice=-99999;
minprice = 99999;

т.е. будет так:




Ну мы ведь в глобальных переменных уже присваивали им такие значения для сравнения с mp . Значит с глобальных эти переменные можно удалить и вписать не посредственно в функцию и какой толк ? Ни чего не изменилось . На каждом тике функция возвращает новые значения , но только эти значения не уменьшаются когда бары становятся все меньше и меньше и мы смотрим скажем последние 3 бара и видим что макс и мин цены на этих последних трех барах не СУЩУСТВУЕТ ! Как мне еще донести что код надо доработать ? Изменено пользователем 4er58
Ссылка на сообщение
Поделиться на другие сайты

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

На каждом тике функция возвращает новые значения , но только эти значения не уменьшаются когда бары становятся все меньше и меньше и мы смотрим скажем последние 3 бара и видим что макс и мин цены на этих последних трех барах не СУЩУСТВУЕТ ! Как мне еще донести что код надо доработать ?



Пойми, дружище, что мы лишь сравниваем то значение, которое мы получаем с функции iLow, к примеру, с тем, что у нас было получено ранее.

Для сравнения можно воспользоваться ещё одним вариантом:

void GetMinPrice()
{
int index = iLowest(NULL, 0, MODE_LOW, 10, 0);
if(index!=-1) minprice = Low[index];
else Print("Ошибка iLowest. Код ошибки = %d" + IntegerToString(GetLastError()));
return;
}
Ссылка на сообщение
Поделиться на другие сайты

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

Пойми, дружище, что мы лишь сравниваем то значение, которое мы получаем с функции iLow, к примеру, с тем, что у нас было получено ранее.

Для сравнения можно воспользоваться ещё одним вариантом:
Код: [Выделить]




Спасибо , кое как разобрался , с новой функцией ,было бы понятнее сразу с комментариями :) .

Но все равно происходит тоже самое , советник не обновляет уменьшения мах и мин цены за данное кол-во баров . Мы когда нибудь решим эту задачу ? Изменено пользователем 4er58
Ссылка на сообщение
Поделиться на другие сайты

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

Но все равно происходит тоже самое , советник не обновляет уменьшения мах и мин цены за данное кол-во баров . Мы когда нибудь решим эту задачу ?



Может глюк терминала?
Я перепроверил сейчас на минутках GBPUSD.
Как Low[0], так и High[0] работают без всяких проблем.


void OnTick()
{

Comment(DoubleToStr(High[0]));
}


Ссылка на сообщение
Поделиться на другие сайты

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


Может глюк терминала?
Я перепроверил сейчас на минутках GBPUSD.
Как Low[0], так и High[0] работают без всяких проблем.




Спасибо Шеф , да действительно на другом терминале с новой функцией работает как надо .

Пошел на третий урок ) Изменено пользователем 4er58
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...