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

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


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

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

Исправлено :).



Я конечно извиняюсь, но после такой правки индикатор не только посторонние объекты не будет удалять, но и сам себя :) Думаю это не очень удобно. Вот такой вариант будет правильней все-же....

MultiInstrument.mq4

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

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

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

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

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

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

Перейти

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

Перейти

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

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


Цитата

Исправлено :).



Я конечно извиняюсь, но после такой правки индикатор не только посторонние объекты не будет удалять, но и сам себя :) Думаю это не очень удобно. Вот такой вариант будет правильней все-же....


Огромное СПАСИБО!!! Работает отлично!

Добавлено: 19-02-2017 08:11:44



Уважаемые специалисты. При переключении ТФ, индикатор стирает построенные мной наклонные линии /горизонтальные не трогает/.
Большая просьба - устраните пожалуйста этот недостаток.



Исправлено :).


Спасибо за труд! Но он не стирает ни сое,не мое... Изменено пользователем Скобарь
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите пожалуйста как научить советник определять, что наступил новый день (не на Д1) и выполнить такое условие:
если наступил новый день и цена побывала выше/ниже заданного уровня, то сегодня не торгуем?

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

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



Индикатор Williams percent Range, надо чтобы сова продавала на ВЫХОДЕ из зоны перекупленности и покупала на ВЫХОДЕ из перепроданности. Хотя бы логически как это сделать, не понимаю. Ну и если не лень то кодом)


Сваял на скорую руку :).


Извините, вы сделали не то( Кстати , то что вы сделали - это даже я смогу:D).
Спойлер





На картинке он открывает просто в состояние перепроданности, а мне надо было при выходе из нее .

Спасибо за сову, я немного её допилил. Теперь работает как надо.

WilliamsPercentRange_BOT.mq4

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

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

Подскажите пожалуйста как научить советник определять, что наступил новый день (не на Д1) и выполнить такое условие:
если наступил новый день и цена побывала выше/ниже заданного уровня, то сегодня не торгуем?


Запоминайте сегодняшний день какого-либо периода (недели, месяца, года), а потом проверяйте равен ли текущий день периода тому, что запомнили. Если не равен, значит новый день настал. Ну а дальше смотрите минимум/максиму цены за интересующий период и проверяйте была она там где надо/не надо, ну и дальше либо разрешайте торговлю, либо запрещайте. После всех процедур не забудьте снова запомнить текущий день периода для следующей идентификации наступления нового дня.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые програмисты, как передавать свет (color) из эксперта в индикатор?

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

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

Приветствую Всех.
Правильно я написал структуру?
//кол-во ордеров по типам
struct TQtyOrder
{
int ArrOrd[6];//6 типов ордеров
int QtyTotal; //всего ордеров
};
//ордер
struct TOrder
{
string Comm; //комментарий
double OpenPrice; //курс открытия ордера
double StopLoss; //стоп лосс
double TakeProfit; //тейк профит
double Lots; //кол-во лотов
double Profit; //текущий профит
int Ticket; //номер ордера
int Type; //тип ордера
int MagicNumber;//магическое число
};
//ордера
struct TAllOrder
{
TOrder ArrOrder[31];//все ордера максимум 31
TQtyOrder QtyOrder; //кол-во ордеров по типам
};
Нужно выравнивания элементов структур с помощью #pragma pack(1) ?

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

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

Приветствую Вас господа. Прошу помощи в программировании, как правильно написать условие в советнике, точнее проверку на «срабатывание» отложенного ордера. Алгоритм следующий, выставляются отложенные ордера. При активировании заданной переменной MaxTrades количество ордеров и более одинакового направления, для этой группы ордеров выставляются ТП и СЛ. Я написал так:
.........

void OnTick()
{
int countBUY=CountOrders(OP_BUY); // количество открытых ордеров бай
int countSELL=CountOrders(OP_SELL); // количество открытых ордеров селл

if(countBUY>=MaxTrades) // проверка на количество открытых ордеров бай
{
SetTakeProfitBuy(); // выставляем для группы ордеров бай ТП и СЛ
}
if(countSELL>=MaxTrades) // проверка на количество открытых ордеров селл
{
SetTakeProfitSell(); // выставляем для группы ордеров селл ТП и СЛ
}
………
Соответственно, программа на каждом тике проходит проверку, забивает логи ошибкой 1 (Нет ошибки, но результат неизвестен). Подскажите как это можно исправить?
Благодарю за Ваше внимание и время!

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Ruslan S., в функциях SetTakeProfitBuy() и SetTakeProfitSell() - OrderModify пытается изменить уже установленные значения такими же значениями, нормализуйте цены в операциях сравнения.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

SilverKZ


Так в этом то и была просьба о помощи. Если можно подробней. Я не программист, только пытаюсь осваивать эту чудо-магию.
На примере этой переменной:
//+------------------------------------------------------------------+
void SetTakeProfitBuy()
{
double avgPrice = 0;
double sumLots = 0;
for(int order=OrdersTotal()-1; order>=0; order--)
{
returnvalue=OrderSelect(order,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
{
avgPrice += OrderTakeProfit()*OrderLots();
sumLots += OrderLots();
}
}
double newTakeProfit=avgPrice/sumLots;
newTakeProfit=NormalizeDouble(newTakeProfit,Digits);

for(order=OrdersTotal()-1; order>=0; order--)
{
returnvalue=OrderSelect(order,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
{
returnvalue=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newTakeProfit,0,clrYellow);
}
}
}
//+------------------------------------------------------------------+
Если возможно, покажите на пальцах пожалуйста, Где? и Что? и Как надо? Изменено пользователем Ruslan S.
Ссылка на сообщение
Поделиться на другие сайты

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

//+------------------------------------------------------------------+
void SetTakeProfitBuy()
{
double avgPrice = 0;
double sumLots = 0;
for(int order=OrdersTotal()-1; order>=0; order--)
{
returnvalue=OrderSelect(order,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
{
avgPrice += OrderTakeProfit()*OrderLots();
sumLots += OrderLots();
}
}
double newTakeProfit=avgPrice/sumLots;
newTakeProfit=NormalizeDouble(newTakeProfit,Digits);

for(order=OrdersTotal()-1; order>=0; order--)
{
returnvalue=OrderSelect(order,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY && OrderTakeProfit()!=newTakeProfit)
{
returnvalue=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),newTakeProfit,0,clrYellow);
}
}
}
//+------------------------------------------------------------------+



Устранение ошибки 1.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Ruslan S. Вам бы алгоритм до конца продумать... Количество ордеров меньше не становится и на каждом тике сова ходит ТП и СЛ устанавливать заново, может ввести переменную, что ТПСЛ выставлен и больше не выставлять?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, согласен, что сова будет на каждом тике сравнивать ТП, в данном случае мы избавляемся только от ошибки. В моем алгоритме это такая сетка и одного ТП и СЛ не получается, они будут плавающие. В лучшем варианте конечно же надо придумать как определить что сработал отложенный ордер. Но как это исполнить - незнаю. Если у кого еще предложения есть - было бы замечательно.
Ссылка на сообщение
Поделиться на другие сайты

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

Нужно выравнивания элементов структур с помощью #pragma pack(1) ?

Только если будете передавать во внешнюю длл. Но тогда строку надо исключать... Вообще со строками геморрой я не включаю коммент в структуру ордера, а использую отдельной переменной, это связано с простотой присваивания структур. Пример:

struct ORDER
{
int ticket, type, magic;
datetime time, timeClose, timeExpir;
double price, prcClose, lots, PL, SL, TP;
};
ORDER ord, o0 = {-1,-1,0,0,0,0,0,0,0,0,0,0}; // o0 - пустая структура для сброса параметров.

ord = o0;

Если будет строка, то так просто поставить = не получится.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

придумать как определить что сработал отложенный ордер

только рыночные считать и сравнивать, типа было 5 стало 6 - значит сработала отложка.
если шаг сетки позволяет, то пропускать тики если цена топчется на месте. Типа:
bool isPriceChange(int dPrice)
{
static double last_PR = Bid;
if ( MathAbs( last_PR - Bid ) last_PR = Bid; return(true);
}

задаёте dPrice = 20(пипс) и сова пропустит все тики внутри этой дельты - терминал не так загружен будет.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, для меня это очень сложно :-?
Определенного шага как такового нет. Его определяет сам рынок, вернее сама цена и у каждой отложки свой тейк. А при срабатывании отложек они формируют сетку, и я их пытаюсь упорядочить в общий ТП.
спасибо!

Добавлено: 25-02-2017 12:42:18

SilverKZ, спасибо большое за помощь! Изменено пользователем Ruslan S.
Ссылка на сообщение
Поделиться на другие сайты

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

А при срабатывании отложек они формируют сетку, и я их пытаюсь упорядочить в общий ТП.



Тема называется Обучение языку MQL4 и в первом посте есть курс, который можно скачать и изучить. Если его изучить многие вопросы сами собой отпадают.

Ruslan S. если я правильно вас понял, то решение вашей проблемы подробно разбирается в 4 уроке курса "Создаем советника на мартингейле". В нем Сергей ака xbms объясняет как сделать тейк и стоп для сетки ордеров.

Тейк для сетки выглядит примерно так (код взят из урока):

//- функция модификации ордера (выставление тейка для сетки)

void ModifyOrders(int otype)
{
double avg_price, order_lots=0;
price=0;
//- ищем в цикле последний открытый ордер
for(int i=OrdersTotal()-1; i>=0; i--)
{
//- выбираем ордера
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
//- проверяем наш ли это ордер (по паре и меджику)
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
//- пересчитываем цену с учетом объемов
price += OrderOpenPrice() * OrderLots();
//- считаем суммарный объем
order_lots += OrderLots();
}
}
}
//- вычисляем среднюю цену и приводи к нормальному виду
avg_price = NormalizeDouble(price / order_lots, Digits);
//- в зависимости от типа ордера вычисляем тейк
if(otype == OP_BUY) tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits);
if(otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits);

//- модификация ордеров
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
//-модифицируем ордер
if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
Print("Ордера успешно модифицированы");
else Print("Ошибка модификации ордеров");
}
}
}
}
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Alexandrkas, Вы не поняли моего вопроса. Все равно спасибо за Ваш ответ. Но! как выставить ТП и СЛ в сетке меня не интересовал, посмотрите выше, я указывал свой код ТП для сетки, который Вы мне процитировали из урока.
Еще раз слова благодарности Господину SilverKZ за самое оптимальное решение возникшей у меня проблемы. Изменено пользователем Ruslan S.
Ссылка на сообщение
Поделиться на другие сайты

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

Да, я все понял, спасибо...
Только в книге по MQL написано, что сначала в структуре нужно объявлять большие данные, т.е.
double = 8 байт
datetime, тоже 8 байт
а уже потом
int = 4 байта...
т.е. выравнивания элементов.
или это касается только если я буду передавать во внешнюю dll?

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

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

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

Помогите добавить на панель кнопки переключения TF, так чтобы они могли в тестере переключать TF на графике. Если это возможно конечно, спасибо.

Screenshot_12.png
TradePanel.mq4

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

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

Помогите добавить на панель кнопки переключения TF, так чтобы они могли в тестере переключать TF на графике. Если это возможно конечно, спасибо.


В процессе тестирования невозможно менять ТФ.
Ссылка на сообщение
Поделиться на другие сайты

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

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

Есть разные представления о правильности... у структур нет никаких глюков с выравниванием ( если пользоваться внутри МТ ).
ПС: я считаю не правильным создавать дублирующий массив данных ордеров, поддерживать его в актуальном состоянии - зачем? У МТ это нормально организовано и работает эффективно. имхо.
Ссылка на сообщение
Поделиться на другие сайты

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

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



Ну это смотря какие задачи решаются. Порой, без объединения данных ордеров в массивах структур, сложно представить реализацию некоторых моментов. Вот недавно выполнял работу, так там одновременно в рынке бывало более 50 ордеров. При этом ордера объединялись в группы по 3 штуки по определенному признаку, т.е. были взаимосвязаны между собой. Плюс у каждого ордера индивидуальный трейлингстоп и еще всякие примочки. И как тут без массивов структур? Допустим можно было как-то увязывать ордера между собой магиками, комментариями и пр., а потом на каждом тике проводить выборку, группировать их, высчитывать где у каждого ордера сейчас д.б. стоплосс.... Но зачем? Если есть такая замечательная вещь как структура?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
DreamWorks я знаю, что заказчики могут ставить совершенно фантастические ТЗ и там без особого учёта ордеров не обойтись. Когда пишу для себя, то принципиально стараюсь обходится без этого: проще стол - легче стул. :d
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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