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

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


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

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


Значит я не въехал... Я думал, что а и б это значения индикатора (может на разных барах). Если из них что-то является ценой и нуждается в проверке на каждом тике, то, естественно, эту проверку надо выносить из блока if (Н4).



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

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

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

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

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

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

Перейти

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

Перейти

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

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

Я немного не понял!!!А суть-то вопроса в чём?Ну высчитали мы раз в 4-е часа индикаторы и что дальше?
Нам надо их запоминать или нет?

Если надо то:

static double a = 0;
double a1 = Ваш индикатор №1;
static double b = 0;
double a1 = Ваш индикатор №2;
static datetime newbar = 0;
datetime t = iTime(NULL,PERIOD_H4,0);
if(newbar != t)
{
newbar = t;
if(a != a1) a = a1;
if(b != b1) b = b1;
if(a > b)
{
Ваш ордер
}
}

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

double a = 0;
double b = 0;

static datetime newbar = 0;
datetime t = iTime(NULL,PERIOD_H4,0);
if(newbar != t)
{
newbar = t;
if(a > b)
{
Ваш ордер
}
}

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

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

Задумка такая - открывается ордер при условии отсутствия открытых ордеров и закрытых ордеров по истории, закрывается по стоп лосу или тейк профиту. после этого в истории появляется запись о закрытом ордере и ордера больше не открываются.
Вроде все сделал по мануалу, ордер открывается, после его закрытия открывается новый!
Уважаемые гуру, помогите разобраться чайнику.
Вот мое "изобретение"

#property copyright ""
#property link ""
#property version ""
#property strict

extern double Lots = 0.1;
extern int TakeProfit = 30;
extern int StopLoss = 30;
extern int Slippage = 2;
extern int Magic = 12345;


int ticket;
double TP, SL;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{

Comment(" колличество закрытых ордеров ",CountTradesHistory(),"\n"
" колличество открытых ордеров ",CountTrades());
Sleep (4000);
if (CountTradesHistory() == 0 && CountTrades() == 0)
{
ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Buy", Magic, 0, Blue);
if (ticket > 0)
{
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble (Bid - StopLoss * Point, Digits);
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0);
}
}
}
//+------------------------------------------------------------------+
//| Expert function |
//+------------------------------------------------------------------+
int CountTradesHistory()
{
int counthistory = 0;
for (int i = OrdersTotal() - 1; i >= 0; i --)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
counthistory++;
}
}
return (counthistory);
}
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0;
for (int i = OrdersTotal() - 1; i >= 0; i --)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count++;
}
}
return (count);
}


Буду благодарен за помощь!
Влад

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

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


Задумка такая - открывается ордер при условии отсутствия открытых ордеров и закрытых ордеров по истории, закрывается по стоп лосу или тейк профиту. после этого в истории появляется запись о закрытом ордере и ордера больше не открываются.
Вроде все сделал по мануалу, ордер открывается, после его закрытия открывается новый!
Уважаемые гуру, помогите разобраться чайнику.

У берите из этой строки if (CountTradesHistory() == 0 && CountTrades() == 0)
это: "CountTradesHistory() == 0 && "
это лишнее. В реальном терминале ордера в истории всегда есть. Первый раз вижу такое...
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте 0ll ! Спасибо за отклик!
В том то и дело, мне надо чтоб при условии не верности "CountTradesHistory() == 0 && " ордера переставали открываться.
я проверял в тестере МТ4 на истории. обнуляю журнал и запускаю, выставляется первый ордер ( if (CountTradesHistory() == 0 && CountTrades() == 0) условие выполняется, ордер открылся)
после закрытия ордера не важно как, в Comment(CountTradesHistory=1,CountTrades=0) прописываются на терминале кратковременно, а ордер открывается снова, т.е. получается как будто условие "if (CountTradesHistory() == 0 && CountTrades() == 0" соблюдено. Не могу понять как так получается!? (по факту CountTradesHistory=1 и CountTrades=0, по условию открытия CountTradesHistory() == 0 && CountTrades() == 0, а ордер открывается)
Если я по Вашему совету удаляю "CountTradesHistory() == 0 && " получается следующее, ордер открывается, после его закрытия открывается новый т.е. тоже что и было, а мне надо, чтоб при наличии ордера в истории именно этого ( скажем "советника") ордера перестали выставляться.

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

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

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

bool flOpenNew = true;
void OnTick()
{
...
if (flOpenNew && CountTrades() == 0)
{
ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Buy", Magic, 0, Blue);
if (ticket > 0)
{
flOpenNew = false;
.... далее Ваш код

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

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

Спасибо, наверно так и сделаю.
Просто хотел далее использовать информацию по крайнему закрытому ордеру в основном алгоритме при, скажем обрыве связи.
Я только начал изучать MQL, хотел набросать простенький советник, в кратце алгоритм таков: открытие первого ордера по индикатору, пусть это БАЙ с лотом 0,1, сработал ТП открывается опять БАЙ с начальным лотом, если первый БАЙ ордер закрылся по СЛ, то открывается СЕЛЛ с удвоенным лотом. СЕЛЛ закрылся по ТП, открывается СЕЛЛ с начальным лотом, а если СЕЛЛ закрылся по СЛ, открывается БАЙ и опять удваивается лот и т.д.
Как то так, может что порекомендуете, как лучше реализовать данный алгоритм. Я хотел использовать данные из истории о крайнем закрытом ордере, но если Вы говорите это не будет работать, то пока не знаю чего делать, буду думать.
А по предыдущему моему описанию проблемы, есть какое либо объяснение поведения написанного мной кода?

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

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

1. По Вашему алгоритму: это самый простой вид мартингейла. Реализаций множество. На флёте сливает - несколько заходов в (-) и лот становится космическим.
2. Данные из истории нужно использовать в ОнИнит - при запуске/перезапуске советника (в случае проблем с терминалом). В остальных случаях копить данные в переменных. Количество лосей последний тикет и может лот последнего ордера.
3. По Вашему коду - не разбирался. по-идее должен был работать. Надо принты ставить и отслеживать ошибку.

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

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

В коде уже стоят "коменты", просто запустить и посмотреть, хотелось бы понять проблему.
Я понимаю, что это будет не граль, да и не пытаюсь его создать, это так для набития руки!
По Лосям я думал, ввести счетчик и по мере накопления поступательно изменять положение ТП на увеличение, чтоб выйти из канала флета, или ввести остановку работы советника (по накоплению определенного количества ЛОСЕЙ) с последующей ручной оптимизацией и повторным запуском, может еще ввести трал СЛ с выводом в безубыток и далее в ПРОФИТ, ну это еще только задумки,а реализация впереди.
Скорей всего по мере погружения еще будут вопросы, буду признателен, если в дальнейшем поможете мудрым советом в освоении MQL!
С уважением,
Влад

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

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

Доброго времени суток! Нужна помощь в создании, как мне кажется, несложного индикатора.
Суть вопроса:
Возможно ли сделать индикатор, который бы мог подхватывать на графике нарисованную вручную фигуру: прямоугольник, и растягивать его вслед за графиком, даже желательно чтоб он был впереди графика на свечей 20, пока я его не удалю? а то надоедает каждый раз вручную это делать :)

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

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

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

.PNG
OsMA_Divergence_v1.mq4

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

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

Я думал что в плане графических построений, я самый ленивый трейдер этого форума.....как я ошибался.....браво коллега =d> :))

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

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

Пришлось поиграться.
1. В Вашем индюке 2 сигнала + отдельно по хаям и лоям.
2. Сигнал появляется на 0-баре, но может исчезнуть (звенит несколько раз, а в итоге пусто) - поэтому съём сигнала сделал с 1-бара. поэтому у Вас будет ощущение, что алерт запаздывает
Пробуйте.

OsMA_Divergence_v1.mq4

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

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


Пришлось поиграться.
1. В Вашем индюке 2 сигнала + отдельно по хаям и лоям.
2. Сигнал появляется на 0-баре, но может исчезнуть (звенит несколько раз, а в итоге пусто) - поэтому съём сигнала сделал с 1-бара. поэтому у Вас будет ощущение, что алерт запаздывает
Пробуйте.



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

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

Помогите пожалуйста убрать алерт в индикаторе!Не могу выключить его!

atrzq.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, если вас не затруднит, не могли бы вы переделать трал советник e-movinginwl2? Нужно лишь добавить 5 уровней/шагов Б/У за ценой. На данном советнике имеется значения лишь LevelProfit (уровень после которого активируется Б/У) и LevelWLoss (уровень без убытка). Хочу чтобы таких уровней было 5. Искал подобные моему описанию тралы, но ничего толкового и работающего не нашел :( Закинул на 5 разных окон графиков, но получился по спартанский, хочется чтобы было удобно :d Скрин чего я хочу прилагается.

Безымянный.PNG
1.PNG
e-movinginwl2.mq4
e-movinginwl2.ex4

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

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

Уважаемые трейдеры!! возникла проблема, и никак не могу ее решить...гдето на сайте уважаемый XBMS выкладывал свой сов HA-EXPERT для таких как я...я его вроде бы от и до прочесал...и решил просто изменить условия входа в сделку...сделки вроде открываются в тестере, а вот закрываются только покупки, продажа закрывается по завершении тестирования...в чем может быть проблема...в журнале иногда пишет OrderModify Error 1

ATR-2.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.
Ссылка на сообщение
Поделиться на другие сайты

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


kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.


void OpenSellOrder()
{
mlots = GetLots();

if (AutoSL) sl = CalcSL(OP_SELL);
else sl = ND(Bid - StopLoss*Point);

tp = ND(Bid - TakeProfit*Point);

ticket = OrderSendReliable(Symbol(), OP_SELL, mlots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if(ticket > 0)
OrderModifyReliable(OrderTicket(), OrderOpenPrice(), sl, tp, 0);

все дело в Bid/Ask???


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

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



kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.


все дело в Bid/Ask???
Я бы сказал больше в + / -
Ссылка на сообщение
Поделиться на другие сайты

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




kempo У Вас ордера закрываются по СЛ или ТР. в расчёте СЛ есть ошибки. проверьте.


все дело в Bid/Ask???
Я бы сказал больше в + / -

да я разобрался)))спасибо и удачи Вам)))

Добавлено: 16-01-2015 05:02:57

Возник еще один вопрос...а как можно сделать ограничение сделок в день...По идее нужно немного переделать функцию CountSell/CountBuy...я правильно понял??? Изменено пользователем kempo
Ссылка на сообщение
Поделиться на другие сайты

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


Возник еще один вопрос...а как можно сделать ограничение сделок в день...По идее нужно немного переделать функцию CountSell/CountBuy...я правильно понял???

Нет. надо делать отдельный счётчик и сброс счётчика. ф-ции CountSell считают открытые ордера, а Вам надо считать закрытые, или я не правильно понял?
Ссылка на сообщение
Поделиться на другие сайты

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



Возник еще один вопрос...а как можно сделать ограничение сделок в день...По идее нужно немного переделать функцию CountSell/CountBuy...я правильно понял???

Нет. надо делать отдельный счётчик и сброс счётчика. ф-ции CountSell считают открытые ордера, а Вам надо считать закрытые, или я не правильно понял?

я наверно неправильно задал вопрос...по идее в функции CountSell нужно поменять OrdersTotal на OrdersHistoryTotal и MODE_TRADES на MODE_HISTORY...ведь так???
а вот как это связать с датой я не знаю...не могли бы вы подсказать как это делать...
С ув.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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