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

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


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

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

Здравствуйте! Подскажите как в программе приостановить торговлю, при достижении профита до следующего дня?

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Здравствуйте. Возник вопрос с советником мартингейлом. По урокам написал советник, точнее сваял его из кусочков чужих кодов.
Блок мартина из вашего урока. В тестере торгует нормально. Но вопрос в увеличении лота - при коэффициенте 1.5 или 2 всё нормально умножает, но как только ставлю коэффициент ниже 1.5, то перестаёт увеличивать лоты и торгует только минимальным лотом 0.01. Подскажите, как привести это в порядок.

ADR5_SL_TP_Sovetnik.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
alex202 можете сделать так:
int stopday = 0; // на глобальном уровне

OnTick()... // где-то в основной программе
if ( Day() == stopday ) return; else stopday = 0; // если торговля выключена - выход, иначе чистим переменную
...
if ( TodayProfit >= TargetProfit ) stopday = Day(); // выключаем торги сегодня

vening всё дело в способе расчёта лота и округлении. В тестере попробуйте мин лот 0,1 и всё будет вычисляться нормально. Если хотите исправить ошибку, то надо по другому вычислять лот - не от предыдущего ордера!
Самое простое: объявите ещё переменную double lottmp;
и вычисляйте лот в ней, типа: lottmp *= Martin;
потом округляйте до 2 знака: lot = ((int)(lottmp*100))/100; // NormalizeDouble - лучше не использовать
проверяем на мин лот: lot = MathMax( lot, 0.01 );
Конечно может не работать на некоторых счетах или инструментах - это для общего понимания, есть и другие методы расчёта, более сложные. Если будет интерес то и это обсудим.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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


//+------------------------------------------------------------------+
//| Event.mqh |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property strict

#include

//+------------------------------------------------------------------+
//| *************************************************************** |
//| CEvent |
//+------------------------------------------------------------------+
enum EEventState {
esSuspended,
esActive,
esWaitConditions
};
//+------------------------------------------------------------------+
class CEvent : public CObject
{
private:
protected:
EEventState m_state;
bool m_signal;
datetime m_signal_time;
datetime m_bar_time;
virtual void Set() { m_signal=true; m_signal_time=TimeCurrent(); m_bar_time=Time[0]; }
public:
CEvent(const EEventState state=esSuspended) :
m_state(state),
m_signal(false),
m_signal_time(0),
m_bar_time(0) {}
~CEvent() {}

virtual void Refresh(void) {}

EEventState State(void) const { return(m_state); }
virtual void State(const EEventState state) { if (m_state != state) return; m_state=state; Reset(); }
bool Signal(void) const { return(m_state == esActive && m_signal); }
virtual void Reset(void) { m_signal=false; m_signal_time=0; m_bar_time=0; }
datetime SignalTime(void) const { return(m_state == esActive ? m_signal_time : 0); }
datetime BarTime(void) const { return(m_state == esActive ? m_bar_time : 0); }
};
//+------------------------------------------------------------------+
enum EOnPriceMode {
opmCheckAsk,
opmCheckBid
};
//+------------------------------------------------------------------+
class COnPrice : public CEvent
{
private:
double m_last_ask;
double m_last_bid;
protected:
double m_price;
double m_deviation;
EOnPriceMode m_mode;
double m_pt_scale;
public:
COnPrice(const EEventState state=esSuspended) :
CEvent(state),
m_last_ask(Ask),
m_last_bid(Bid),
m_price(0),
m_deviation(0),
m_mode(opmCheckBid),
m_pt_scale(((Digits == 5) || (Digits == 3)) ? 10 : 1)
{}
~COnPrice() {}

virtual void Refresh(void);

double Price(void) const { return(m_price); }
virtual void Price(const double price) { m_price=price; Reset(); }
double Deviation(void) const { return(m_deviation); }
virtual void Deviation(const double deviation) { m_deviation=deviation; Reset(); }
EOnPriceMode Mode(void) const { return(m_mode); }
virtual void Mode(const EOnPriceMode mode) { m_mode=mode; Reset(); }
};
//+------------------------------------------------------------------+
void COnPrice::Refresh(void)
{
do
{
if (m_state != esActive)
break;;
double old_price=m_mode == opmCheckAsk ? m_last_ask : m_last_bid;
double new_price=m_mode == opmCheckAsk ? Ask : Bid;
if (MathAbs(m_price-new_price) {
Set();
break;
}
if (((new_price ((new_price >= m_price) && (m_price >= old_price)))
{
if (MathAbs(new_price-m_price) {
Set();
break;
}
}
Reset();
}
while (false);
m_last_ask=Ask;
m_last_bid=Bid;
CEvent::Refresh();
}
//+------------------------------------------------------------------+
//| / CEvent / |
//| *************************************************************** |
//+------------------------------------------------------------------+
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте! Подскажите как считать показание цены стрелки индикатора с окна графика (буфер цену не возвращает)? Например в этом индикаторе. Можно даже ссылку, где посмотреть решение.


Добавлено: 20-11-2017 17:47:48

Сам дам на свой вопрос ответ: В индикаторе был параметр при выставление стрелы SetIndexEmptyValue(1,0.0); - просто удалил его и всё за работало #:-s

21_iZZSR.mq4

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

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

Здравствуйте трейдеры. У меня вопрос касательно языка MQL4 для бинарных опционов. Суть заключается в том что-бы написать функцию мартингейла, но, отображая значение int вместо doble (Т.к. торговля идет в валюте депозита, а не в лоте). Но, функция изложенная ниже попросту не хочет работать, возможны, вы видите причину(
//+------------------------------------------------------------------+
extern int Lots= 1;
extern int LotExponent = 2;
//в настройках советника добавляем:
input bool Martin=true; // использовать увеличения лота если были убытки
input int MaxMartin=4; // макс. кол-во применения Мартингейл

int Lots()
{
int ret=Lots; // размер лота по-умолчанию
if (Martin) // если включен мартингейл
{
// инициализация переменных
int trade = OrdersHistoryTotal()-1; // количество сделок в истории
int i=0; // счетчик перебора истории сделок
int n=0; // количество непрерывных убыточных сделок
// рассматриваем исторические сделки от последней к первой
for (i=trade; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OrderType()==OP_SELL))
{
// считаем кол-во непрерывных убытков
if (OrderProfit()+OrderSwap()+OrderCommission() else break; // сделка в "+" или в ноль - выходим
}
}
// если были убытки и количество случаев не больше MaxMartin - пересчитать размер лота
if (n>0 && n {
ret=(Lots*MathPow(LotExponent, n));
}
}
return(ret);
}
//+------------------------------------------------------------------+

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

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

Не помогло
//+------------------------------------------------------------------+
extern int Lots= 1;
extern int LotExponent = 2;
//в настройках советника добавляем:
input bool Martin=true; // использовать увеличения лота если были убытки
input int MaxMartin=4; // макс. кол-во применения Мартингейл

int Lots()
{
int ret=Lots; // размер лота по-умолчанию
if (Martin) // если включен мартингейл
{
// инициализация переменных
int trade = OrdersHistoryTotal()-1; // количество сделок в истории
int i=0; // счетчик перебора истории сделок
int n=0; // количество непрерывных убыточных сделок
// рассматриваем исторические сделки от последней к первой
for (i=trade; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol() && OrderMagicNumber()==Magic && (OrderType() == OP_BUY || OrderType()==OP_SELL))
{
// считаем кол-во непрерывных убытков
if (OrderProfit() else break; // сделка в "+" или в ноль - выходим
}
}
// если были убытки и количество случаев не больше MaxMartin - пересчитать размер лота
if (n>=0 && n {
ret=(int)(Lots*MathPow(LotExponent, n));
}

}
return(ret);
}
//+------------------------------------------------------------------+

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

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

Т.е. код должен выглядеть следующим образом?

if (n>=0 && n {
ret=(int)(Lots*LotExponent);
}


Добавлено: 21-11-2017 22:45:10

В принципе, есть еще один вариант использовать мартингейл. Через функцию поиска последнего убыточного ордера в истории, а уже потом прописать новые условия на открытие сделки. Т.е.
//+------------------------------------------------------------------+ Ищем последний убыточный ордер в истории (Почему-то не работает ~x( ~x( ~x()
int Count_H()
{
int LossCount = 0;
int total = OrdersHistoryTotal();
for (int i = 0; i {
OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderProfit() {
LossCount++;
}
}
}
return(LossCount);
}
//+------------------------------------------------------------------+

И уже прописываем условия
if (Count_H() == 1)
{
if (OrderSend (Symbol(), OP_SELL, Lots_2, Bid, Slippage, 0, 0, IntegerToString (Expiration), Magic, 0, clrRed) {
Print ("Ошибка открытия ордер на продажу");
}
}
Где сейчас ошибка??? Буду Очень благодарен любому совету Изменено пользователем Александр_F
Ссылка на сообщение
Поделиться на другие сайты

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


Ребят открыл счет в альпари , и в терминале , при сделках стали выводиться комментарии типо таких 1[0] . Советники ни какие не висят , а счет стал комментироваться , что за ерунда , не отслеживает ли или не копирует ли сделки брокер ? хрень какая то ...



Няшный альпари таким образом пишет тебе проскальзывания в комент. Я туда еще и размер спреда добавляю. Жаль редактировать нельзя.
Ссылка на сообщение
Поделиться на другие сайты

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



Ребят открыл счет в альпари , и в терминале , при сделках стали выводиться комментарии типо таких 1[0] . Советники ни какие не висят , а счет стал комментироваться , что за ерунда , не отслеживает ли или не копирует ли сделки брокер ? хрень какая то ...



Няшный альпари таким образом пишет тебе проскальзывания в комент. Я туда еще и размер спреда добавляю. Жаль редактировать нельзя.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Александр_F пишите точнее, что именно не работает. сделки открывает, хоть одну? если идут лоси, а лот не увеличивается, то проверьте всю цепочку расчёта лота - пишите Print("№N - значение=", хз); и потом смотрите логи, ищите место где возникает баг.
В последнем фрагменте Вы считаете количество лосей с начала, а не с конца списка, хотя пишите о поиске последнего ордера... Там должна быть логика такая: рыночных ордеров нет, цикл по истории с конца, нашли последний свой ордер, выход через брейк, если профит 0 - начальный лот.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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




Ребят открыл счет в альпари , и в терминале , при сделках стали выводиться комментарии типо таких 1[0] . Советники ни какие не висят , а счет стал комментироваться , что за ерунда , не отслеживает ли или не копирует ли сделки брокер ? хрень какая то ...



Няшный альпари таким образом пишет тебе проскальзывания в комент. Я туда еще и размер спреда добавляю. Жаль редактировать нельзя.

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


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

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

Удалено


Добавлено: 23-11-2017 09:42:04

Если вам надо в валюте депозита то всё делается через AccountBalance(). Изменено пользователем alex202
Ссылка на сообщение
Поделиться на другие сайты

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

Функция, делающая активным последний закрытый ордер:
void activ_last_ord()
{
for ( int i = OrdersHistoryTotal()-1; i >= 0; i-- )
{
if ( OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )
&& OrderSymbol() == _Symbol && OrderMagicNumber() == Magic ) break;
}
}

Далее можно анализировать параметры ордера, типа:
if ( OrderProfit()

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

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

Всем привет! Просмотрел первых пять уроков по программированию и я понял что ничего не понял :). Все разжевывается хорошо, но открываю я код советника и ступор. Хрен знает с чего начинать и чем заканчивать, а мысль автоматизировать работу все свербит и свербит. Знаю как должен советник работать, а как это прописать не знаю. Хотел скопировать из уроков, так индюки разные и задачи разные.
Короче ребята помогите никак не соображу я что впихнуть и как впихнуть в прикрепленный советник (советник составлял естественно не сам).
Советник основан на индикаторе Parabolic SAR, работает для моей ТС идеально за исключением отсутствия ММ и взятия профита.
Сперва хотел спросить по профиту. Профит хотел бы чтоб устанавливался не ТР, а просто советник закрывал бы сделку при достижении определенной суммы. Расстояние, которое должна пройти цена для закрытия сделки в плюс должно равняться расстоянию от открытия ордера (бай или сел) до первой перескочившей точки параболика (см. приложение).

Надеюсь на помощь. Если кого заинтересовало готов вместе поработать чтоб довести робота до ума по моей ТС. В благодарность за проделанную работу робот заработает очень много денег :))



Добавлено: 27-11-2017 06:43:58

Забыл прикрепить пример расчета входа.

EA_Parabolic_SAR.mq4
Пример_расчета_входа.jpg

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

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

Доброго всем, подскажите пожалуйста где ошибка при написании советника, рисования линий с помощью фракталов.

линии.mq4

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

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

Добрый день! Хотел попробовать написать советник по дивергенциям по OsMa. И даже че-то сварганил по урокам на сайте. Минимум, максимум вроде нашел на истории, только вот свечку которая на минимуме или максимуме найти не могу. Объясните новичку пжл.

Спойлер

int j = 0;
int m = 0;
int k = 0;
ArrayResize(Hyst, 300);
ArrayInitialize(Hyst, 0);
ArrayResize(NewHyst, 300);
ArrayInitialize(NewHyst, 0);
ArrayResize(NewHystMax, 300);
ArrayInitialize(NewHystMax, 0);

for (int i = 0; i {
double Osma = iOsMA(NULL, 0, 24, 26, 9, PRICE_CLOSE, i);
Hyst[j] = Osma;
j++;
}

for(int i=0; i {
if ( Hyst[ i ] != 0) m++;
}

ArrayResize(Hyst, m);

for(int i=0; i {
NewHyst[k] = Hyst[ArrayMinimum(Hyst, WHOLE_ARRAY, 0)];
k++;
}

m = 0;
for(int i=0; i {
if(NewHyst != 0) m++;
}

ArrayResize(NewHyst, m);


for(int i=0; i {
Print("Osma Minimum " + DoubleToStr(NewHyst [ i ], 7));
}

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

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





Ребят открыл счет в альпари , и в терминале , при сделках стали выводиться комментарии типо таких 1[0] . Советники ни какие не висят , а счет стал комментироваться , что за ерунда , не отслеживает ли или не копирует ли сделки брокер ? хрень какая то ...



Няшный альпари таким образом пишет тебе проскальзывания в комент. Я туда еще и размер спреда добавляю. Жаль редактировать нельзя.

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


Да , звонил в альпари , проскальзывание комментируется , исправляется путем убирания галочки в настройках счета . Имхо -лишняя муть . Еще сделали кучу настроек по проскальзыванию , активировать объем дробно или целиком , вообщем лишний засер мозга .


Этот лишний засер иногда неплохо помогает. Да и собственно какая разница что там в коменты валится, лишь бы толк был.
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день! Хотел попробовать написать советник по дивергенциям по OsMa. И даже че-то сварганил по урокам на сайте. Минимум, максимум вроде нашел на истории, только вот свечку которая на минимуме или максимуме найти не могу. Объясните новичку пжл.

Сожалею, но здесь ни кто свечку не найдёт...
Значения индюка пишите в массив и индекс массива совпадает с номером свечи, потом считаете не нулевые значения и обрезаете массив, затем заполняете второй массив одним и тем-же минимумом, затем и его обрезаете - в этом нет логики, я не знаю как Вы хотите найти дивер, но это явно не то.
Попробуйте так:
- переписали индюк в массив
- ищите индекс минимума (= номеру свечки), типа: int nom = ArrayMinimum(Hyst, WHOLE_ARRAY, 0);
- сохраняете минимум double min = Hyst[nom];
- выводим результат Print("Minimum = ", min," in bar #", nom);
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый вечер коллеги трейдеры!

Подскажите пожалуйста - можно ли написать индикатор отображения вот этого параметра

Спойлер

с сайта investing для инструмента EUR/USD в терминале МТ4? Если да, то как это реализуется?
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Господа программисты, при определенном размере массива если он полностью заполнен и поступает новое значение - выдаст ошибку или перепишет самое старое?

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

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

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

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

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

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

Войти

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

Войти

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


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

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