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

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


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

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

Так добавьте в конструктор счётчик открытый ордеров, если он > 0 то не открывать ордера.)

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

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

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

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

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

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

Перейти

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

Перейти

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

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


Всем привет!

Если не заморачиваться, можно отправить советник спать, после открытия ордера. Измерять будем свечками:
ticket = OrderSend(.................)
if (ticket > 0)
{
if (OrderModify(.............))
{
int sleep = timefr*60*1000;
Sleep(sleep);
}
}

timefr - во внешние переменные. Это период графика в минутах (если H1, пишем 60, если H4 - 240).
Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;
Теперь, можно ограничить общее количество ордеров: if (CountSell() (например)

Конечно, если во время спячки перезапустить терминал или советник, может установиться ещё один ордер...


Вы говорите ''Если нужно пропустить два бара, пишем sleep = 2*timefr*60*1000;''А как я узнаю сколько нужно пропустить баров? Я ведь не смогу предсказать когда именно появится следующий пин-бар.
Может лучше все так же оставить, а в конце добавить if (buypin == true) sleep = false;, то-есть если появляется новый пин-бар, то сплячку отключаем:
ticket = OrderSend(.................)
if (ticket > 0)
{
if (OrderModify(.............))
{
int sleep = timefr*60*1000;
Sleep(sleep);
if (buypin == true) sleep = false;
}
}
Или так не получится?

А то что если во время спячки перезапустить терминал или советник, может установиться ещё один ордер это точно? Если это так то наверное лучше искать другой вариант.
А может в этом случае написать что-то типа такого: if (цена первого ордера == цене второго ордера) то второй закрыть; ? Или не получится.

Еще. Как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется?
Я так написала, ничего не получилось:
if (pinbuy == true)
{
if (ticket > 0 && CountBuyStop() > 0 && CountBuy() == 0)
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if (Ask {
OrderDelete (ticket);
}
}
}
}

if (pinsell == true)
{
if (ticket > 0 && CountSellStop() > 0 && CountSell() == 0)
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if (Bid > dhigh)
{
OrderDelete (ticket);
}
}
}
}
Ссылка на сообщение
Поделиться на другие сайты

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


А как я узнаю сколько нужно пропустить баров? Я ведь не смогу предсказать когда именно появится следующий пин-бар.



А не нужно узнавать, сколько пропускать баров. Если сов обнаружил пин-бар на предыдущей свече, он выставляет (допустим) отложку. Если ордер установился, срабатывает команда Sleep. В начале следующей свечи он снова проверяет предыдущую и т.д. Двойку, я предложил на случай, если не нужно отрабатывать два пин-бара подряд.
Это был просто пример, а не кусок кода в коммерческий бот :)
Ссылка на сообщение
Поделиться на другие сайты

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


Так добавьте в конструктор счётчик открытый ордеров, если он > 0 то не открывать ордера.)



если бы я знал, как это делать. советник мастерил по этому конструктору:
_http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/

MACDMA.mq4

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

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

Ребята, подскажите как сделать что бы в советнике по мартину открывать следующие ордера по индикатору. Я добавляю там где идет проверка на сколько ушла цена в обратную сторону , но он почему то игнорирует и продолжает открывать как и раньше

else
{
int order_type = FindLastOrderType();
if (order_type ==OP_BUY)
{
price=FindLastPrice(OP_BUY);
if((Ask S1 && st2 {
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot*Multiplier,2);
ticket = OrderSend(Symbol(),OP_BUY,lastlot,Ask,Slippage,0,0,"",Magic,0,Blue);
if ( ticket > 0)
ModifyOrders( OP_BUY);
}
}


Добавлено: 21-10-2013 08:43:23

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

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

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

В самом коде есть ошибки:
1. Нету проверки на пересечение EMA, есть только проверка что текущее значение EMA5 выше или ниже LWMA. Чтобы проверить пересечение, нужно проверять что на предыдущем баре (shift=1) значение было ниже(выше), а на следущем - поменялось.
2. В самих параметрах индикаторов есть ошибки - в переменной Buy1_2 вместо EMA 5 в одном месте вычисляеться EMA 15
3. Buy2_1 - вместо LWMA вычисляеться SMA

И не понятно что такое 1 бар MACD в описании. Это предыдущий бар ?

MACDMA_fixed.mq4

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

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


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

В самом коде есть ошибки:
1. Нету проверки на пересечение EMA, есть только проверка что текущее значение EMA5 выше или ниже LWMA. Чтобы проверить пересечение, нужно проверять что на предыдущем баре (shift=1) значение было ниже(выше), а на следущем - поменялось.
2. В самих параметрах индикаторов есть ошибки - в переменной Buy1_2 вместо EMA 5 в одном месте вычисляеться EMA 15
3. Buy2_1 - вместо LWMA вычисляеться SMA

И не понятно что такое 1 бар MACD в описании. Это предыдущий бар ?



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

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

Добрый день! Опять я :)
Просмотрел еще пару раз видео по мартину и внес некоторые изменения, но почемуто открываются 2 ордера на покупку... Подскажите от куда руки растут, в смысле от куда начал неправильно идти:
int start()
{
if (HourStart == TimeHour(TimeCurrent()) && CountBay() == 0)
{
SL1 = NormalizeDouble(Ask - StopLoss*Point, Digits);
TP1 = NormalizeDouble(Ask + StopLoss*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slipage, SL1, TP1, Coment, Magic, 0, Blue);

int order_type = FindLastOrderType();
if (order_type == OP_BUY)
{
price = FindLastPrice(OP_BUY);
if (Ask {
SL2 = NormalizeDouble(Ask - StopLoss*Point, Digits);
TP2 = NormalizeDouble(Ask + StopLoss*Point, Digits);
ticket = OrderSend(Symbol(), OP_BUY, Lots * 2, Ask, Slipage, SL2, TP2, Coment, Magic, 0, Blue);
}
}


}
return(0);
}

//+------------------------------------------------------------------+
double FindLastPrice(int otype)
{
double oldopenprice;
int oldticket;
ticket = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket>ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}

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

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

Добрый вечер, xbms, у меня очень интересный вопрос.

А именно:
1. Ситуация частичного закрытия ордера - изменяется тикет, и записывается в комментарий к новому ордеру, это понятно, его можно достать.
2. Ситуация некоторые брокеры при переносе позиции через ночь\выходные, закрывают позу и в начале дня опять открывают, как в этом случае ведёт себя тикет? Старый тикет запишется в комментарий к новой позе, или вообще случайный тикет, пустой коммент?

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

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

Здравствуйте!
Не могу найти ошибку в своем коде.
Условие - открыть позицию на бай, если между High и Close предыдущего бара меньше 20 пунктов. В тестере открывается так, как не ожидал... Другие условия: свеча не меньше 350 пунктов; восходящая свеча

HL1=iHigh(NULL,0,1)-iClose(NULL,0,1);

if (iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point&&HL1iOpen(NULL,0,1))

Почему открылся BUY?


P.S. Опечатался в посте, исправил скобки. Проблема все равно существует

xauusdm5.png

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

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


Здравствуйте!
Не могу найти ошибку в своем коде.
Условие - открыть позицию на бай, если между High и Close предыдущего бара меньше 20 пунктов. В тестере открывается так, как не ожидал... Другие условия: свеча не меньше 350 пунктов; восходящая свеча

HL1=iHigh(NULL,0,1)-iClose(NULL,0,1);

if ((iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point)&&(HL1iOpen(NULL,0,1)

Почему открылся BUY?




Зачем столько скобок? внутри лишние а в конце не хватило или это описка не знаю!

Вот так не откроет!!!

if(iHigh(NULL,0,1)- iLow(NULL,0,1)>=350*Point && iClose(NULL,0,1)>iOpen(NULL,0,1) && iHigh(NULL,0,1)-iClose(NULL,0,1)


или по короче вот так
if(High[1]- Low[1]>=350*Point && Close[1]>Open[1] && High[1]-Close[1]
Изменено пользователем elruso
Ссылка на сообщение
Поделиться на другие сайты

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


А как написать, что если минимум(в случае pinbuy)) был пробит то отложенный ордер на покупку удаляется?



просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку...
Ссылка на сообщение
Поделиться на другие сайты

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


просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку...


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

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



просто сравнить цену с pinbuy, и если она ниже (на сколько ниже? это в параметрах, вероятно должно быть вынесено), то удалить отложенный ордер на покупку...


Так я это и так знаю, только как это написать в коде?


да в общем-то несложно...
я не смотрел этих индикаторов, но примерно так:

if ((Ask + Pips*Point) {
DeleteStopOrder(); //-- тут функция удаления стоп-ордера
}

Pips - это переменная в параметрах, в пунктах... на сколько должна быть ниже pinbuy

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

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

Вот, посмотрите, может так:
if(pinsell == true)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELLSTOP)
{
if(CountSellStop() > 0)
{
if(Bid == dhigh)
OrderDelete(ticket);
}
}
}
}

if(pinbuy == true)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_BUYSTOP)
{
if(CountBuyStop() > 0)
{
if(Ask == dlow)
OrderDelete(ticket);
}
}
}
}

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

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

if(Bid == dhigh)
if(Ask == dlow)



в этих местах слишком жёстко... котировки могут "проскочить" как минимум на 1 пункт и тогда ой :)
лучше писать "=" , зависит от условия...
Ссылка на сообщение
Поделиться на другие сайты

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


Цитата

if(Bid == dhigh)
if(Ask == dlow)



в этих местах слишком жёстко... котировки могут "проскочить" как минимум на 1 пункт и тогда ой :)
лучше писать "=" , зависит от условия...


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

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


Ага, поняла, ну а в целом правильно написала?



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

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

А почему у меня при тестировании высвечивается в журнале ошибка 130?
Вот мой стоп-лосс в коде советника:
int init()
{
if(Digits == 3 || Digits == 5)
StopLoss *= 10;

return(0);
}



if(pinbuy == true) SL = NormalizeDouble(dlow - StopLoss * Point, Digits);

if(pinsell == true) SL = NormalizeDouble(dhigh + StopLoss * Point, Digits);

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

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


А почему у меня при тестировании высвечивается в журнале ошибка 130?
Вот мой стоп-лосс в коде советника:
int init()
{
if(Digits == 3 || Digits == 5)
StopLoss *= 10;

return(0);
}

if(pinbuy == true) SL = NormalizeDouble(dlow - StopLoss * Point, Digits);

if(pinsell == true) SL = NormalizeDouble(dhigh + StopLoss * Point, Digits);



не ясно как вычисляются dlow и dhigh... скорее всего неправильно, ибо ошибка 130 - это неправильные стопы.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


double dlow = Low [1]; // Минимум предыдущего бара
double dhigh = High [1]; // Максимум предыдущего бара



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

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

Хочу написать советник с использованием индикатора Stochastic oscillator. Так же хочу чтобы в рынок осуществлялся при условии медвежьей и бычьей дивергенции. В основном меня это интересует, кто может помочь?

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

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

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

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

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

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

Войти

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

Войти

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


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

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