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

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


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

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


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

У индикатора есть буфер в виде массива. на 0-баре значение индикатора записывается в буфер[0], на 1-баре в буфер[1] и т.д. Это понятно?, тогда пересечение линии индикатора снизу вверх определяется так:
if ( Open[0] = bufer[0] )
т.к. 0-свеча не закрыта сигналить может часто, поэтому чаще всего определяют на 1-баре. Для пересечения сверху вниз зеркально.


Спасибо за ответ, но я все равно не пойму как это реализовать, не догоняю я до конца. ~x( Посмотрел советники под индикаторы МА и ничего разобрать не могу , по идее смысл тот же...1 линия, надо что бы когда была цена под ней продавал, на покупку в точности до на оборот , у меня же открывает одну сделку и держит ее до конца года (с 02.01.2016 до 29.12.2017)....
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
КонстантинYO ну не всё сразу, потихоньку одолеешь.
Вам надо научиться пользоваться оператором принт и смотреть торги в журнале. Что нужно сделать:
1. Подключить индюк и получить данные с 1-бара
ind = iCustom(..., 0, 1);
2. if ( Open[1] = ind ) // это условие для BUY
{
Print("-- Условие Бай: ind=",ind);
OrderSend(...);
}
3. if ( Open[1] > ind && Close[1] {
Print("-- Условие Селл: ind=",ind);
OrderSend(...);
}
Ссылка на сообщение
Поделиться на другие сайты

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


КонстантинYO ну не всё сразу, потихоньку одолеешь.
Вам надо научиться пользоваться оператором принт и смотреть торги в журнале. Что нужно сделать:
1. Подключить индюк и получить данные с 1-бара
ind = iCustom(..., 0, 1);
2. if ( Open[1] = ind ) // это условие для BUY
{
Print("-- Условие Бай: ind=",ind);
OrderSend(...);
}
3. if ( Open[1] > ind && Close[1] {
Print("-- Условие Селл: ind=",ind);
OrderSend(...);
}



По скольку я только начал изучать делал по уроку вот так

if (CountBuy () == 0 && Bid > PriceByu)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, 0, 0, "Tren robot", Magic, 0, Blue);
if(ticket > 0)
{
TP = NormalizeDouble(Ask+TakeProfit*Point, Digits);
SL = NormalizeDouble(Ask-StopLoss*Point, Digits);
С буфером немного разобрался открывает закрывает сливает депо по тестеру , когда смотришь визуально то открывает сделки совсем не по индикатору ,так вот вопрос мне в место того что я переписал так сказать , нужно вставить 3.пункт который Вы написали, но я не пойму как это сделать без ошибок ?

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

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

Всем привет.
Подскажите как правильно реализовать ограничение всех(открытых /закрытых) ордеров в день?
Я так понимаю надо проверить по дате открытия в списке открытых/закрытых ордеров, но как?Моих знаний не хватает.
Помогите с функцией перебора по ордерам истории ( и открытых уже ордеров ) с запросом времени и сравнения, заранее спасибо.

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

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

объявляете следующую функцию, а в основном коде пишете:
int cntO = 0
cntO = ord_count ( MODE_TRADES, Magic || -1, Type || -1, D'2018.03.14' );
cntO += ord_count ( MODE_HISTORY, Magic || -1, Type || -1, D'2018.03.14' );
далее по своему плану...
ПС: Magic || -1 - означает: либо магик, либо -1, но не всё сразу

Спойлер

int ord_count ( int mode, int magic, int type, datetime start )
{
int res = 0;
for ( int no = ( mode == MODE_TRADES ? OrdersTotal() : OrdersHistoryTotal() ) - 1; no >= 0; no-- )
{
if ( !OrderSelect ( no, SELECT_BY_POS, mode) || OrderSymbol() != _Symbol
|| !( sel.magik || !( OrderType() == type || type || OrderOpenTime() if ( ( mode == MODE_TRADES ? OrderOpenTime() : OrderCloseTime()) res++;
}
return( res );
}

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

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

MODE_HISTORY


спасибо, а можете поподробнее объяснить про дату в конце, а то я так понимаю что привязка будет к ней или нет?или это начальная дата
Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

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

Вы функцию под спойлером посмотрели? это дата старта, даты конца нет. В качестве даты старта можно использовать любую переменную datetime

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

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


Вы функцию под спойлером посмотрели? это дата старта, даты конца нет. В качестве даты старта можно использовать любую переменную datetime


Спасибо) я это и уточнял)просто никогда не сталкивался с таким уровнем, буду очень благодарен , если вы объясните как теперь правильно, задать макс количество ордеров
И оч Вас прошу обьясните функцию?Я не оч понимаю как что и за чем там работает...зарание извиняюсь Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

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

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

Я просто не догадываюсь что Вы хотите получить... ну например так:
extern int MaxOrdcount = 200;
далее в тексте, где вычисляется количество ордеров:
if ( cntO >= MaxOrdcount ) { Print("Stop trade - order count over limits."); return; }
Это условие должно быть до модуля открытия новых ордеров, но после модуля закрытия и сопровождения ранее открытых.
Ссылка на сообщение
Поделиться на другие сайты

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

Ага)ну я правильно все написал тогда. Спасибо, проверил себя
Задача, чтобы в день сова открывала например только 2 ордера(это и закрытые и открытые), новый день опять 2 ордера и тд
И это кол во могло меняться в глоб переменной!


Добавлено: 15-03-2018 08:27:38

Если есть более простое решение чем перебор открыт/закрыт ордеров, я Вам точно бутылку должен буду Изменено пользователем d1w4m3
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день!
Начал я осваивать это нелегкое дело. но очень интересное!
Спасибо Автору за то что есть такие уроки!
Очень много дают, а главное дают возможность напрягать мозги что мне очень интересно!
но вот, я решая задачку #4 от урока 4, столкнулся с проблемой.
советник не удваивает позиции. упорно.
Что только не делал, прочитал первые 100 страниц данной темы, перерыл интернет, анализировал каждую буковку функций FindLastLots, описанной в уроке, и функции повторного открытия позиции по условиям при движении цены против.
Переписывал с нуля раза три, пробовал перебор с последнего лота и с первого, пробовал что только не провал.... все по идее правильно. но не работает. укажите пожалуйста на ошибку?
файл прикладываю.

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

test4_MARTIN.mq4

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

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

Если есть более простое решение чем перебор открыт/закрыт ордеров

Конечно есть. Нужны дополнительно две глобальные переменные:
int dayNom=-1, dayCount=0;
в тексте программы:
- в самом начале: if ( Day() != dayNom ) { dayCount = 0; dayNom = Day(); }
- там где сделки открываются: if ( dayCount = 0 ) dayCount++;

Добавлено: 15-03-2018 09:48:12

не могу найти решение проблемы

Попробуйте после поиска последнего ордера вставить принт:
lastlot = FindLastLots(....);
Print("Потом прогоните в тестере 1-2 дня и смотрите в журнале свои принты.
Если с лотом всё в порядке, ставьте принт дальше по тексту, если принтов нет - то выше по тексту. Только так найдёте ошибку. Без умения искать ошибку Принт-ами не получиться освоить mql... Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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

Последняя запись: если количество ордеров позволяет -> открываем ещё, если открыли -> прибавляем счётчик.

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

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


найдёте ошибку. Без умения искать ошибку Принт-ами не получиться освоить mql...



Спасибо! а есть и более расширенный пост или материал об алгоритмах поиска ошибок?? теми же принтами, может есть еще варианты. сложно новичку понять и сделать так чтоб мозг работал в нужном направлении, картинка складывается пока очень тяжело, это для меня 4-ый урок программирования в жизни=) и что бы не смущать людей глупыми вопросами, хотел бы решать их сам, но как решать это тоже сложность-)))


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

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

Нда)кто то в дебри лезет)а кто то 2 мя строчками решает проблему)Огромное спасибо, бутылка точно с меня) \M/

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

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

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

Подскажите кто знает плиз. Как известно на ECN счетах сначала открываем ордер, а затем модифицируем. А можно ли в BUY LIMIT ордере сразу указать стоплосс на ECN ?

Столкнулся с ситуацией в тестере, когда при сильном движении в 290 ст.пунктов срабатывает buy limit и сов не успевает выставить SL. Далее счет сливается. Как избежать этого ?

Спойлер



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

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

можно ли в BUY LIMIT ордере сразу указать стоплосс на ECN ?

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

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

Здравствуйте! Идея бота проста: если цена выше машки покупаем, если ниже продаем. Стоп и профит фиксированы. Хочу понять какое уточнение можно внести в код бота, чтобы покупал не хрен знает где (например после того как возьмет профит, ордеров нет, сигнал на покупку, так как цена выше машки), а именно около машки не далее чем на фиксированное количество пунктов? Заранее благодарен!


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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Serhoo всё дело в том, что цена дёргается вверх/вниз и пересекает многократно линию МА, поэтому вводят отступ от линии для избежания ложных срабатываний. Иногда ждут закрытия бара, а бар может быть довольно крупным...
Вот пример решения с дистанциями отступа от МА: min_indent if ( Close[0] = MA + min_indent && Bid пересекли вверх -> OP_BUY
if ( Close[0] > MA && Bid MA - max_indent ) -> пересекли вниз -> OP_SELL
Ссылка на сообщение
Поделиться на другие сайты

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

счетчик для ТП, СЛ и троля. моя проблема со всех уроков.
ситуация, есть скажем такой шаблон - стандарт :
...
double maprice = iMA( Symbol(), 0, MaPeriod, MaShift, MODE_SMMA, PRICE_CLOSE, 1);

//--------- условие на открытие

if (CountBay() == 0 && Ask
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask , Slippadge,0,0,"РОБОТ", Magic, Blue);
if (ticket > 0)
{
SL = NormalizeDouble(Ask - StopLotss *Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit *Point, Digits);

if(OrderSelect(ticket, SELECT_BY_TICKET))
if(OrderModify(ticket, OrderOpenPrice(), SL, TP, 0)== true)
Print ("ошибка модиф бая");

} else Print( "ошибка открытия ордера на покупку" + " error ",GetLastError());

}
//------------- на закрытия

if (Cena_Sell >= Bid && CountBay() > 0 )
{
for(int i = OrdersTotal() -1; i>=0; i-- )
{
if ( OrderSelect( i,SELECT_BY_POS, MODE_TRADES))
{

if ( OrderMagicNumber() == Magic && OrderType()== OP_BUY )
if (! OrderClose( OrderTicket(), OrderLots(), Bid , Slippadge, Black ))
Print("ошибка закрытия ордера на покупку");

}

}

итд...
//-----------------------------------------------
все хорошо он ставит СЛ, ТП, троля. и закрывая позицию тут же открывает снова. до условия закрытия. итд
крутил - вертел пришел к выводу создать такой вот счетчик с его условием открытия:


if (Ask > maprice && CountBay() + CountSell() == 0 && CountCloseBUY()== 0)
...
//---------
int CountCloseBUY()
{
int count=0;
for ( int i= OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) &&
OrderSymbol() == Symbol() && OrderMagicNumber()== Magic &&
OrderType() == OP_BUY)
count++;
}

return (count);
}

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

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

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

Добрый день господа программисты! Подскажите возможно ли написать функцию трала для сетки разнонаправленных ордеров. Ковыряю не первый день все никак.


double sl, tp_, be=PriceBE(-1);
int err=0;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol()==smb && OrderMagicNumber()==magic && OrderType() {
if(Bid>GetLastPriceOpen(OP_BUY) && GetLastPriceOpen(OP_BUY) {
if(Bid-be>trstart*pnt)
{
if(OrderType()==OP_BUY && OrderStopLoss() {
sl = NDD(Bid-trstep*pnt);
if(OrderStopLoss() {
ModifyOrders(OP_BUY, -1, sl, 0);
}
}
if(OrderType()==OP_SELL && OrderTakeProfit() {
tp_ = NDD(Bid-trstep*pnt);
if(OrderTakeProfit() {
ModifyOrders(OP_SELL, -1, 0, tp_);
}
}
}
}
}
}
}
}


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

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

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

Что такое троля, я не понял..., но Вам не нужен счётчик, ибо всегда в истории сделок будут и бай и селл.
Вам нужно условие пересечения МА, а не просто нахождение цены за МА.
Пробуйте вместо части условия: maprice >= Bid , писать ( Open[0] > maprice && Close[0]

Подскажите возможно ли написать функцию трала для сетки разнонаправленных ордеров.


Возможно, если сумма объёмов разных сеток - разная и цена движется в сторону большего объёма. Чем больше разность объёмов, тем ближе ТП. Для одной сетки нужно двигать СЛ, для другой ТП.
Задача не столько сложная, сколько геморройная...
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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