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

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


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

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

раздвигаются обе цены или только Аск подпрыгивает?

Это как повезёт, может и в оба конца прыгнуть...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

Всем привет!

Ребята подскажите пожалуйста.

Я хочу чтобы ордер открывался по условиям. MA1>MA2.

И закрывался по условиям MA1
Пример-

Спойлер

if(kolpos==0)
{
//-покупка
if(MA>MA2 &&Volume[0] if(OrderSend(Symbol(),OP_BUY,iLot,Ask,Slip,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,CLR_NONE)) //а это если условия позволяют то это самма операция по открытию ордера.
return;
}

if(kolpos==1) //-закрытие ордера по условиям
{

if(MA if(OrderClose(OrderTicket(),iLot,Bid,100,Blue))
return;
}

//-

return;
}



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

Весь код если нужен.
Спойлер



//+------------------------------------------------------------------+
//| Простой РСИ.mq4 |
//| BW |
//| https://www.mql5.com |
//+------------------------------------------------------------------+

extern int Magic = 070517; // майджик
extern int SL = 80; // стоплосс
extern int TP = 80; // тайкпрофит
extern int Slip = 3; // проскальзывание
extern double Lot = 0.01; // лот
extern double Martin = 1; // множитель

extern double PerMA = 15; // период МА
extern double PerMA2 = 18; // Период МА2
extern double ModeMA = 2; // Стиль МА

extern double RSIper = 14; // Период РСИ







//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits==3 || Digits==5) // пересчитал торговлю для
{
TP*=10; // трехзнака и пятизнака,
SL*=10; // или для более корректной
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//+------------------------------------------------------------------+
//объявление переменных
double iLot =0,
Ordprofit =0,
lott =0,
MA =iMA(Symbol(),PERIOD_CURRENT,PerMA, 0,ModeMA,PRICE_CLOSE,1),
MA2 =iMA(Symbol(),PERIOD_CURRENT,PerMA2,0,ModeMA,PRICE_CLOSE,1),
RSI =iRSI(Symbol(), PERIOD_CURRENT,RSIper,PRICE_CLOSE,0);


if(OrdersHistoryTotal()>0)
{
for(int i=OrdersHistoryTotal(); i>=0; i--) //цикл подсчета ордеров
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
if( (OrderType()==OP_SELL || OrderType()==OP_BUY) && OrderSymbol()== Symbol() && OrderMagicNumber() == Magic)
{
Ordprofit=OrderProfit();
lott=OrderLots();
break;
}
}
}
if (Ordprofit>=0)iLot=Lot;//получили прибыль, уменьшили лот
if (Ordprofit//+-------------------------------------------------------------------+ //Объявление переменных Машки итд
//+------------------------------------------------------------------+
int kolpos=0;



for(int pos=0; pos
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)) // из всех торговых ордеров, выбрать один. Проверить, а есть ли он вообще.
{

if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) //проверил чей выбранный ордер
kolpos++; //-- и посчитал его
}
}
//+------------------------------------------------------------------+

Comment("\nЛот = ",iLot, "\nTP = ",TP, "\nSL = ",SL); // принт в углу экрана Следующий лот


//+------------------------------------------------------------------+
//функция открытия ордеров
if(kolpos==0)
{
//-покупка
if(MA>MA2 &&Volume[0] if(OrderSend(Symbol(),OP_BUY,iLot,Ask,Slip,Ask-SL*Point,Ask+TP*Point,NULL,Magic,0,CLR_NONE)) //а это если условия позволяют то это самма операция по открытию ордера.
return;
}

if(kolpos==1) //-закрытие ордера по условиям
{

if(MA if(OrderClose(OrderTicket(),iLot,Bid,100,Blue))
return;
}

//-

return;
}
//+------------------------------------------------------------------+-------+



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

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

А что возвращает Вам OrderTicket() в функции закрытия? если Вы ордер не выбрали?
"Пересечения" средних у Вас на каждом тике срабатывать будут, ибо МА1 > МА2 может пол-дня сохраняться.
Короче: факт пересечения МА устанавливается на 2 барах текущего ТФ, а именно -
if ( MA1[1] > MA2[1] && MA1[2] После срабатывания условия пересечения надо закрывать СЕЛЛ и открывать БАЙ, для другого пересечения - наоборот.
При закрытии ордера делайте цикл по открытым ордерам (например СЕЛЛ) и закрывайте все так:
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),100,Blue);

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

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

Интересует правильное написание функции OrderSend() для торговли бинарными опционами.
Брокер: GoMarkets. Для торговли бинарными опционами использует дополнительное ПО для МТ4. Когда нажимаешь в МТ4 открыть новый ордер, то появляется такое окно:


после открытия ордера в комментариях такая запись:


В тех.поддержке GoMarkets сказали, что никаких инструкций не дают по торговле советниками на бинарных опционах, и что торговля советниками на бинарных опционах возможна только на реальных счетах. Вот пытаюсь разобраться если я укажу в функции OrderSend() комментарий для ордера типа "UP/1 h 0 min/70%", сработает ли? И если сработает, то где брать программным путем информацию сколько процентов выплаты "..../70%" по конкретной валютной паре?

PO_GoMarkets.png
BO_EURUSD.png

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

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



Короче: факт пересечения МА устанавливается на 2 барах текущего ТФ, а именно -
if ( MA1[1] > MA2[1] && MA1[2]


Пробую переписать условия покупки как вы сказали! Но что-то пошло не так.
Когда к МА1 добавляю [1] компилятор ругается.
Вот скрин с примером.
Спойлер

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

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

Когда к МА1 добавляю [1] компилятор ругается.

Понятно, я думал Вы знакомы с mql...
Вам нужно объявить переменные double ma11, ma12, ma21, ma22;
В основном коде отслеживать закрытие свечи, и как свеча закрылась, делать так:
ma12 = ma11; ma11 = iMA(...period1...); // точки ... - то сокращения, в код писать не надо.
ma22 = ma21; ma21 = iMA(...period2...);
А после этого можно писать условия по машкам.
ПС: код, определяющий закрытие свечи найди сам.

Добавлено: 08-09-2017 06:11:19

если я укажу в функции OrderSend() комментарий для ордера типа "UP/1 h 0 min/70%", сработает ли?

Сработает! - комментарий запишется, но брокер добавит свой с 70%, а Ваш коммент со 120% брокеру пофигу...
Программно можно читать размер % из коммента с помощью строковых операторов. Изменено пользователем 0ll
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Сработает! - комментарий запишется, но брокер добавит свой с 70%, а Ваш коммент со 120% брокеру пофигу...
Программно можно читать размер % из коммента с помощью строковых операторов.



У другого брокера в поддержке подсказали, что в комментариях к ордеру надо добавлять:
"BO exp:900", где 900 - это время истечения ордера в секундах.
Создал скрипт для открытия ордера, сработало.
Такая запись в комментариях сработала для демо счетов NoaFX и GDMFX, других брокеров не проверял.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Всем привет!
Господа знающие, подскажите, пожалуйста, как ограничить работу советника по торговым сессиям? Например, чтоб начинал торговать в европейскую и американскую сессию. Какие команды используются?
Ссылка на сообщение
Поделиться на другие сайты

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

"BO exp:900", где 900 - это время истечения ордера в секундах.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Здравствуйте, коллеги. Нужна помощь! :(

Спойлер



Есть некий советник. Прикреплён ниже. Работает он следующим образом:

- Если цена выше машки - открывается покупка. Если ниже - продажа.
- ТП = 200. СЛ = процент средней волатильности за последние 10 свечей.
- Максимум открытых ордеров - только один.
- На каждой свече - максимум один ордер.
- Торговля начинается только с новой свечи (минуя свечу, на которой запустился советник).

(Вышеизложенное описание не являться ключевым. Просто, что бы советник хоть как-то работал.)

В настройках можно указать направление торгов (только бай, либо только селл, либо в оба направления).




Также можно указать, отдельно, для покупок и продаж рассчёт лота.
Если вкл. автоматический расчёт - лот будес расссчитываться, исходя из параматра Risk.

Лот ордеров считается для бай и селл отдельно.
Лот покупок - из функции Lot_b().
Лот продаж - из функции Lot_s().




В настройках можно дать возможность работать системе Парлай (удвоение лота следующего ордера, после прибыльной сделки):

- переключатель вкл\выкл "Parlay".
- максимальное кол-во ордеров в "сетке".




Парлай правильно работает, если разрешить работу только на покупку, либо только на продажу.
Так как, в этом случае работает только одна функция рассчёта лота.
С этим проблем не возникает.

Другой вопрос, если вести торговлю в обе стороны, с режимом Парлай.

Здравый разум даёт мне понять, что суть в том что лот считается для бай и селл отдельно.

Постараюсь на примере объяснить :
(буду рассчитывать пример из фиксированного лота, то есть 0.01.
Включённого Парлая, и Максимальным кол-вом ордеров в сетке равном трём.)

1й ордер - бай (0.01) - убыток. (следующий значит опять с 0.01)
2й ордер - селл (0.01) - прибыль. (следующий ордер - удвоенный.)
3й ордер - бай (0.02) - прибыль. (всё хорошо. прибыль. Значит следующий опять с удвоенным.)
4й ордер - бай (0.04) - прибыль. (третий подряд ордер с удвоенным лотом (0.01-0.02-0.04), значит следующий ордер - только с 0.01)
5й ордер - селл (0.08) - не важно. (но ордер почему-то открылся опять с увеличенным лотом. Так как ордер открылся не бай, а селл.)
6й ордер - бай (0.01) (и вновь всё нормально.)

Ситуация может неоднократно повторяться.

Вопрос: Как реализовать правильный расчёт Парлая, независимо от направления открытия ордеров.
При этом имея возможность отдельно выбирать расчёт лота.
То есть, по прежнему иметь две разных функции для расчёта лота на бай и селл отдельно.





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

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

Извиняюсь за тавтологию. Очень сложно письменно перенести суть проблемы.

Nekiy_Sovetnik.mq4

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

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

Как сделать что б индикатор работал только по закрытию свечи?
Типа вот так?
Или там надо prevtime нормализовать?

Спойлер


if(Time[0] == prevtime) return(0);//ждём появления нового бара
prevtime = Time[0];//если появился новый бар , включаемся

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

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

Или там надо prevtime нормализовать?

prevtime объявлена на глобальном уровне? если нет то её надо объявить как static datetime prevtime;
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте, коллеги. Нужна помощь!



В функциях "Lot_b()" и "Lot_s()" упоминалась одна и таже статистическая переменная - "static int c=1".
Поэтому кол-во ордеров в сетке считалось отдельно.
Достаточно было удалить из функций эту переменную и записать её в начале кода во внешний блок.
И тогда обе функции, работающие независимо друг от друга - обращаются к одному счётчику.
Что и влечёт за собой правильную лотность при построение сеточки ордеров.

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

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

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


Или там надо prevtime нормализовать?

prevtime объявлена на глобальном уровне? если нет то её надо объявить как static datetime prevtime;

Да, все верно
static int prevtime = 0; // В глобальных
Но выдает ошибку:
possible loss of data due to type conversion
Из неё индикатор ваще пропадает с графика.
Как это решить?
Ссылка на сообщение
Поделиться на другие сайты

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

static int prevtime = 0; // В глобальных

Вы внимательно читали? я про datetime писал - тогда не будет ошибок конвертации.
Ссылка на сообщение
Поделиться на другие сайты

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

Как заставить терминал подавать звуковой сигнал после закрытия 5ти минутного бара, если цена за этот период касалась уровней, которые нацело делятся на 2.5?

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

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

Привет! Как я уже писал тебе в личку, закрытие бара можно определить по времени.

В входных параметрах объявляем переменную
datetime new_bar;

if(Time[0]!=new_bar)//новый бар, значит старый секунд назад закрылся что тебе и нужно
{
if(тарам пам пам условие твоего деления)//это может быть функция или что то еще. Если целое число то заходим в скобки если нет то Alert не сработает.
{
Alert();
}
new_bar=Time[0];
}

P.S. я думаю стоит переименовать заголовок темы. Главная проблема это как узнать, что после деления получилось целое число, а не дробное.

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

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

Думаю проще будет вписывать уровни в код советника, а тот просто будет оповещать, если этот уровень пересекался предыдущим баром. На первое время и так сойдёт, хоть в голове место освободится. А для деления отдельную тему заведу

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

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

Главная проблема это как узнать, что после деления получилось целое число, а не дробное.

Это не проблема: MathMod();
Ссылка на сообщение
Поделиться на другие сайты

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

Она выдаёт остаток от деления. Если остаток = 0, то поделилось нацело, например:
if ( MathMod ( 100, 10 ) = 0 ) Alert ( "Поделилось нацело!" ) ;
MathMod ( 102, 10 ) = 2 - это остаток от деления нацело.

Не знаю что имел в виду t11001, если точное касание (не пересечение!), то исследуем Хай и Лоу закрывшейся свечи:
if ( MathMod ( High[1], 2.5 ) = 0 ) Alert ( "коснулось уровня 2.5 хаем!" ) ;

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

  • 2 weeks later...

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

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

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

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

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

Войти

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

Войти

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


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

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