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

От xbms, 13 апреля, 2013 в Уголок Программиста

#5101

Привет! Подскажите как в коде обрисовать ситуацию : есть некий гэп и далее цена проходит определенное расстояние в пунктах.

Гэп - это разница между двумя последовательными тиками. У Вас на картинке гэп пришёлся на начало свечи, но частенько бывает и внутри свечи и на графике его не видно. В советниках можно сделать так:
double lastBid; // на глобальном уровне
if ( lastBid - Bid > gap * _Point ) { ... здесь код для обработки гэпа ... }
lastBid = Bid;
если нужно именно на начало свечи, то надо добавить проверку времени
#5102

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


А если так if close(предыд) - open (текущ) > gap ?

И как всё-таки можно показать, что цена после прошла X пунктов не закрыв гэп. И вот только тогда идет обработка этого гэпа.
#5103

И как всё-таки можно показать, что цена после прошла X пунктов не закрыв гэп. И вот только тогда идет обработка этого гэпа.


На открытии каждой свечи в цикле смотрите на глубину n-свечей для поиска гэпа.
Если в промежутке n - 0-я свеча был гэп и Open[0] Ну и расстояние можно посчитать как разницу между Open`s
#5104

А если так if close(предыд) - open (текущ) > gap ?
И как всё-таки можно показать, что цена после прошла X пунктов не закрыв гэп. И вот только тогда идет обработка этого гэпа.

Да можно. Вопрос не понял. Если решения нет - распиши понятнее, можно с картинкой.
#5105

Добрый день!
Помогите плиз разобраться с циклами.
Написал 2 цикла. Первый ищет цену открытия самого первого ордера в рынке. Второй ищет номер тикета этого же первого рыночного ордера. Дальше советник закрывает этот ордер при равенстве цены открытия уровню мувинга. Компиляция ошибку не выдает, а на тестировании появляется ошибка OrderClose Erorr138

Спойлер

//+------------------------------------------------------------------+
double FindFerstOrderPrice(int otype)
{
int oldticket;
double ferstopenprice=0;
ticket=0;
for (int cnt=OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket=oldticket;
ferstopenprice=OrderOpenPrice();
}
}
}
}
return(ferstopenprice);
}
//+------------------------------------------------------------------+
double FindFerstTicket(int otype)
{
int oldticket;
double ferstticket=0;
ticket=0;
for (int cnt=OrdersTotal()-1; cnt >=0; cnt--)
{
if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket=oldticket;
ferstticket=OrderTicket();
}
}
}
}
return(ferstticket);
}
//+------------------------------------------------------------------+

if(BuyCount()>=1 && SellCount()==0)
{
if (PriceM {
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY && OrderTicket() == FindFerstTicket(OP_BUY))
{
if (OrderClose(OrderTicket(), OrderLots(), Ask, 5, Blue))
Print ("Ордер успешно закрыт");
else Print ("Ошибка закрытия ордера");

}
}
}
}
}

Изменено 14 мая, 2018 пользователем 0ll

#5106

Братцы! Ну подскажите, очень сильно начинающему програмеру, где нарыть на форуме решение моей занозы в ж... (уверен, где-то есть, найти не могу >D-b

Изменено 13 мая, 2018 пользователем Chuchundra

#5107
Chuchundra кнопка должна отсылать евент (событие нажатия) графику и сове, сова должна ловить событие и проверять статус кнопки и делать некое действие. Читайте справку по функциям EventChartCustom и OnChartEvent.

lordsamven Нужно находить ордер и запоминать цену и тикет в одном цикле, Зная тикет можно (и нужно!) выбрать ордер по тикету (читайте справку OrderSelect), при закрытии ордера Бай используйте цену Бид - это же продажа
#5108

Chuchundra кнопка должна отсылать евент (событие нажатия) графику и сове, сова должна ловить событие и проверять статус кнопки и делать некое действие. Читайте справку по функциям EventChartCustom и OnChartEvent.


Спасибо за наводку, буду морщить лоб и разбираться.. А нет ли постов на форуме, где это разжевывается для нубов ?
#5109

Если решения нет - распиши понятнее, можно с картинкой.



после гэпа цена без отката проходит нужное количество пунктов
[SPOILER]
#5110

Спасибо за наводку, буду морщить лоб и разбираться.. А нет ли постов на форуме, где это разжевывается для нубов ?


Читайте здесь

sleturin Ваша задача решается так:
1. Обнаружили гэп. Сохраняем направление, цену открытия и закрытия гэпа и вычисляем цену входа.
2. на каждом тике определяем положение цены, их может быть 3: за гэпом сверху(цена закрыла дырку), внутри от начала гэпа до цены входа, и за ценой входа.
3. Реакция совы на положение цены, их тоже 3: ждём следующий гэп, ждём входа, вход.
Справитесь?
#5111

Справитесь?


Спойлер

double PreCl = iClose(Symbol(), 0, 1);
double PreOp = iOpen(Symbol(), 0, 1);
double CurOp = iOpen(Symbol(), 0, 0);

double nizGap, verhGap, tochkaBuy, tochkaSell;
bool sigbuy=false,sigsell=false;
bool readySell = false, readyBuy = false;

bool white ;

if (PreCl >= PreOp) white = true ;

else

white = false; // черная


if (white == false) {

if ( PreCl > CurOp) {

if ( (PreCl - CurOp) >= mingap * _Point && (PreCl - CurOp) readyBuy = true;
nizGap = CurOp;
verhGap = PreCl;
tochkaBuy = CurOp - prohod * _Point;
}
}

}

if (white == true) {

if ( PreCl
if ( (CurOp - PreCl) >= mingap * _Point && ( CurOp - PreCl) readySell = true;
nizGap =PreCl;
verhGap = CurOp;
tochkaSell = CurOp + prohod * _Point;
}

}

}

if (readyBuy == true && Bid >= verhGap) readyBuy = false;

if (readySell == true && Bid

if (readyBuy == true && Bid
if (readySell == true && Bid >= tochkaSell) {readySell = false; sigsell = true;}



Это даже работает.
Но только тогда, когда проход в X пунктов был на нулевой свече. Сохранить гэп и контролировать ход цены относительно него на последующих свечках хз как. >:d
#5112

Но только тогда, когда проход в X пунктов был на нулевой свече. Сохранить гэп и контролировать ход цены относительно него на последующих свечках хз как.


Извиняюсь, код не разбирал.... Но если про предложение на предыдущей странице:
Зачем сохранять информацию о гэпе?
Она (информация о гэпе) актуальна сколько-то времени( Х свечей)...
Смотрите Х свечей назад (в цикле проверяя MathAbs(Close[Х+1]-Open[Х]) )- был ли гэп...
#5113

Как будет выглядеть команда нарисовать стрелку над N свечой от текущей?

#5114

Сохранить гэп и контролировать ход цены относительно него на последующих свечках хз как.

Нужно просто объявить переменные на глобальном уровне (вне функции ОнТик)
Логика такая: если в переменных записано -1, то ждём гэп, если записаны уровни гэпа, значит ждём отход цены, если цена закрыла гэп или тайм-оут - записываем в переменные -1, и цикл повторяется. На каждой свече переписывать переменные или пытаться найти гэп - ненужно!
Стрелочки рисуются по времени - просто передайте в функцию Time[X_bar]
ПС: вместо iOpen(Symbol(), 0, 0) можно использовать Open[0] - будет быстрее работать.
#5115

Нужно просто объявить переменные на глобальном уровне (вне функции ОнТик)


0ll, а если рабочий ТФ >H1, то наверно надо озаботиться о восстановлении переменной после reboot?
#5116

ПС: вместо iOpen(Symbol(), 0, 0) можно использовать Open[0] - будет быстрее работать.


Вот кстати интересная тема - время, особенно при тестировании. Есть много дублирующих функций в языке, какие лучше использовать для ускорения работы советника?
Может создать табличку?
#5117

Нужно просто объявить переменные на глобальном уровне (вне функции ОнТик)

0ll, а если рабочий ТФ >H1, то наверно надо озаботиться о восстановлении переменной после reboot?
Ну это следующий этап, сначала делаем тестерный вариант, а потом, если будет результат, будем заморачиваться ребутами :d

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

Там, где круглые скобки, работать будет медленне в сравнении с квадратными ;)
Круглые скобки - это вызов функции, создание стеков, выделение памяти - куча тактов процессора, а квадратные скобки это просто чтение ячейки массива из памяти. Кстати _Symbol будет быстрее, чем Symbol(). Всё имхо, я внутрь МТ не заглядывал...
#5118

Добрый день. Пожалуйста, подскажите по такому моменту: нужно привязать к советнику индикатор зигзаг, он вроде стандартный, но в документации его нет. Получается его цеплять через iCustom? И еще подскажите как в условии прописать направление движения зигзага(например: пересечение МА сверху вниз)?

Изменено 19 мая, 2018 пользователем Sacred70

#5119
Sacred70 в зигзагах может быть 1 или 2 буфера. В буфер записываются цена вершины или 0 для каждого бара.
Нужно искать ближайшие вершины и вычислять пересечения, или ждать появления новой вершины, но она появляется не на 0 баре! а на каком не известно - придётся на каждом баре смотреть вглубь циклом...
#5120

Добрый день.
Перечитал ветку на предмет обсуждения урока 9 по теме"Введение в объекто ориентированное програмирование" (массивы начало можн осказать)
Домашние задание выполнил кроме п.п.3 в котором надо: Создайте отдельно структуру и массив, в котором будет содержаться информация об отложенных ордерах. Выведите информацию(номер тикета,тип ордера, цена) в виде комментария на экран, однако это нужно через функцию, с передачей адреса массива в функцию(аналог ShowInfo).
- итого при выполнении это пункта сделал. Но криво=) почему то при переборе ордеров не выбираться ТОЛЬКО отложные, а фигачит все что есть и те что в рынке. понять не могу в чем проблема. Знаний не хватает.
Если кто от делал этот урок, либо есть готовый пример функции по выбору ОТЛОЖНЫХ ордеров, выведение их в comment и все это в массивах (массив конечно задан в глобальном) поделитесь для изучения самостоятельного.
Свой вариант не выкладываю, потому что не хочу сторонних исправлений, хочу начать доходить своей головой, изучая учебник и примеры..
Спасибо вам за материал=) интересно! и полезно-)

#5121

Но криво=) почему то при переборе ордеров не выбираться ТОЛЬКО отложные, а фигачит все что есть и те что в рынке. понять не могу в чем проблема.


Когда Вы в цикле перебираете ордера, то нужно делать проверку OrderType() >1.т.е. если тип ордера от 2 до 5, значит он отложенный.
#5122


Но криво=) почему то при переборе ордеров не выбираться ТОЛЬКО отложные, а фигачит все что есть и те что в рынке. понять не могу в чем проблема.


Когда Вы в цикле перебираете ордера, то нужно делать проверку OrderType() >1.т.е. если тип ордера от 2 до 5, значит он отложенный.

Спасибо! а я делал так. видимо не корректно. if (OrderType()==OP_BUYLIMIT || OrderType()== OP_BUYSTOP|| OrderType()== OP_SELLLIMIT || OrderType()== OP_SELLSTOP)
А еще вопрос, массив можно вывести на печать либо на коммент только поэлементно. то-есть [1], [2] ..[Х] это каждую строку записывать с каждой цифрой или есть более элегантные способы? а то помучается ограничение выводимых строк в комментах. и если например ордеров больше чем я записал. они просто не отобразятся.

p/s/ не помогло. все равно выдает подряд два ордера из 4, при том почему то один берет от ложный а второй в рынке. (но тот что был в рынке он ранее был отложным. может в этом дело?)
Прикрепил файл. Пожалуйста укажите на ошибку. или лучше скажите в какую сторону копать. не хочу просто исправлений они не учат в основном-)

test_9.mq42 скач.

Изменено 22 мая, 2018 пользователем Sam123456789

#5123

p/s/ не помогло. все равно выдает подряд два ордера из 4, при том почему то один берет от ложный а второй в рынке. (но тот что был в рынке он ранее был отложным. может в этом дело?)

if (OrderType()>=2)

OrdersTD.TicketTD = OrderTicket();
OrdersTD.TypeTD = OrderType();
OrdersTD.OpenPriceTD = OrderOpenPrice();

Последние три строки забыли окружить { }

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


В Comment точно нарветесь на ограничение, а в журнал (Print) вполне можно вывести.
Делаете цикл по массиву (от 0 до ArraySize()-1) и на каждой итерации собираете нужные данные по ордеру в одну строку, типа:
string str = OrdersTD.TicketTD+" "+OrdersTD[1].TypeTD+ " " ....
Print(str);
p.s. Не забудьте привести все типы к string.

Изменено 22 мая, 2018 пользователем usver73

#5124

Спасибо! заработало, действительно элементарная ошибка в правописании =)
только интересно что под [1] в массиве идет нулевое значение.
И вообще конечно вы правы и Лучше делать вывод данных через цикл. попробую именно так еще. Потому что если сделать как я:
---------------------------
"Номер тикета1 оредра" + IntegerToString (OrdersTD[1].TicketTD) +"\n" +
"Номер тикета2 оредра" + IntegerToString (OrdersTD[2].TicketTD) +"\n" +
"Номер тикета3 оредра" + IntegerToString (OrdersTD[3].TicketTD) +"\n" +
-----------------------------
То если есть 1 ордер а я в коде записал запрос на вывод трех то советник перестает работать! вывод надо перебирать и выводить только те что есть в наличии, а не жестко прописывать в коде количество строк вывода. спасибо еще раз-)

#5125

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025