Ваши вопросы по языку MQL4

Айбек

Активный участник
Всем привет! Возникла проблема не могу дописать советник)) Вообщем сова открывает сделку когда rsi < 70 на продажу... аналогично и противоположную сторону с покупкой... Проблема в том что после закрытии ордера... по тейку или стопу... ордер снова открывается! Надо сделать так чтобы ордер открывался только 1 раз и в след раз открывался уже противоположный сигнал)) раньше пользовался last orderом, но щас не могу вспомнить)) Спасибо!
 

matro3

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

sesame

Прохожий
Всем привет, подскажите как лучше реализовать алерт для
графической фигуры треугольника, для начала нужно нарисовать
сам треугольник (чтобы он не перерисовывался), а когда цена
выходит за границы треугольника, срабатывает алерт, анализ
фигур должен работать в фоновом режиме, не открывая графика,
вот проблема, с которой столкнулся, если есть угол наклона
(как его найти?), надо узнать цену, на которой находится
линия в текущий момент.
Линия же находится на разном уровне цены на разных свечах нам
нужен не наклон линии, а именно цена, на которой линия
стоит в текущий момент, если бы линия была горизонтальная, то
цена уровня линии на каждой свече была бы одна и та же.
В этом пространстве находятся котировки по X координате время
по Y координате цена, узнав масштаб графика и наклон линии,
проблема будет решена.

Что думаете насчет этого, может я велосипед изобретаю и есть
готовое решение ?
 

Ugar

Гуру форума
Всем привет, подскажите как лучше реализовать алерт для
графической фигуры треугольника, для начала нужно нарисовать
сам треугольник (чтобы он не перерисовывался), а когда цена
выходит за границы треугольника, срабатывает алерт, анализ
фигур должен работать в фоновом режиме, не открывая графика,
вот проблема, с которой столкнулся, если есть угол наклона
(как его найти?), надо узнать цену, на которой находится
линия в текущий момент.
Линия же находится на разном уровне цены на разных свечах нам
нужен не наклон линии, а именно цена, на которой линия
стоит в текущий момент, если бы линия была горизонтальная, то
цена уровня линии на каждой свече была бы одна и та же.
В этом пространстве находятся котировки по X координате время
по Y координате цена, узнав масштаб графика и наклон линии,
проблема будет решена.

Что думаете насчет этого, может я велосипед изобретаю и есть
готовое решение ?
Прямая линия строится по 2 точкам. Зная координаты этих точек можно посчитать любые точки этой линии. Никаких углов и масштабов графика не надо. Если между точками разница в 100 пунктов и 20 баров. Значит, на линии, цена меняется 100/20=5 пунктов за бар.
Если первая точка находится на цене 1.5674, на следующем баре она будет иметь цену 1.5679, дальше на 1.5684...
Подобные задачки решают в школе, где то в начале.
 

abuuuuuu

Местный знаток
как сделать чтобы советник открывал только один ордер на одном баре ?
не предлагайте if(orderstotal()==0)
например советник проверял бы открытие последнего ордера и текущее время и потом открылся ордер
заранее спасибо
 

matro3

Почетный гражданин
как сделать чтобы советник открывал только один ордер на одном баре ?
не предлагайте if(orderstotal()==0)
например советник проверял бы открытие последнего ордера и текущее время и потом открылся ордер
заранее спасибо

_http://forum.mql4.com/ru/38949/page4#434234
_http://forum.mql4.com/ru/38949/page4#434235
 

no-namer

Активный участник
Всем привет! Возникла проблема не могу дописать советник)) Вообщем сова открывает сделку когда rsi < 70 на продажу... аналогично и противоположную сторону с покупкой... Проблема в том что после закрытии ордера... по тейку или стопу... ордер снова открывается! Надо сделать так чтобы ордер открывался только 1 раз и в след раз открывался уже противоположный сигнал)) раньше пользовался last orderом, но щас не могу вспомнить)) Спасибо!

Примерно:
if(rsi<70 && LastType()==OP_BUY) - открываем SELL
if(rsi>70 && LastType()==OP_SELL) - открываем BUY
//-------------------------------------------------------------------+
int LastType()
{
int type=-1;
datetime dt=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(Symbol()==OrderSymbol() && OrderMagicNumber()==mn_1)
{
if(OrderCloseTime()>dt)
{
dt=OrderCloseTime();
type=OrderType();
}
}
}
return(type);
}
 

Айбек

Активный участник
Примерно:
if(rsi<70 && LastType()==OP_BUY) - открываем SELL
if(rsi>70 && LastType()==OP_SELL) - открываем BUY
//-------------------------------------------------------------------+
int LastType()
{
int type=-1;
datetime dt=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(Symbol()==OrderSymbol() && OrderMagicNumber()==mn_1)
{
if(OrderCloseTime()>dt)
{
dt=OrderCloseTime();
type=OrderType();
}
}
}
return(type);
}
Спасибо Бро, но че то сделки не открываются(
 

zpro

Почетный гражданин
Примерно:
if(rsi<70 && LastType()==OP_BUY) - открываем SELL
if(rsi>70 && LastType()==OP_SELL) - открываем BUY
//-------------------------------------------------------------------+
int LastType()
{
int type=-1;
datetime dt=0;
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(Symbol()==OrderSymbol() && OrderMagicNumber()==mn_1)
{
if(OrderCloseTime()>dt)
{
dt=OrderCloseTime();
type=OrderType();
}
}
}
return(type);
}

int lastType = LastType();
if(rsi<70 && (lastType==OP_BUY || lastType == -1)) - открываем SELL
if(rsi>70 && (lastType==OP_SELL || lastType == -1)) - открываем BUY
 

Milevshi

Активный участник
нужна помощь

Коллеги, помогите выловить ошибку кода.
Задача – закрыть ордер через «5» минут после его открытия.
Вот алгоритм, который я использую:
if(OrdersTotal()>0)
{
for( i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()== MAGIC)
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
if(TimeCurrent() - OrderOpenTime() > timelimit * 60)
{
if(OrderType()==0) // Закрытие оредра на покупку
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),15,Red);
}
if(OrderType()==1) // Закрытие оредра на продажу
{
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),15,Red);
}
}
}
}
}
}
}
Когда смотришь историю тестов, ордера висять дольше… чем надо…не могу понять в чем причина…
Исходные данные:
Тестирую на таймфрейме – 30 мин. Способ тестирования – все тики.
 

vladradon

Программист
Всем привет! Возникла проблема не могу дописать советник)) Вообщем сова открывает сделку когда rsi < 70 на продажу... аналогично и противоположную сторону с покупкой... Проблема в том что после закрытии ордера... по тейку или стопу... ордер снова открывается! Надо сделать так чтобы ордер открывался только 1 раз и в след раз открывался уже противоположный сигнал)) раньше пользовался last orderом, но щас не могу вспомнить)) Спасибо!
Привет! Ко мне обратился друг с просьбой тебе помочь. Я, как прогер, могу дописать код или что-то посоветовать, но мне нужна основа, чтобы все было корректно. Вариаций может быть много для такого простого алгоритма. Подобные вопросы я обычно решаю в течение часа - обратись ко мне в скайп - ник тот же.
 

vladradon

Программист
Я не особо понимаю, зачем нужно для циклического сова делать проверки на осно истории, если изначально можно в той же строке определить какую-то переменную (любую), которая будет фиксировать направление предыдущей сделки... Т.е.: Когда уже доходит до {OrderSend(...) ; "переменная"=(переменная, которая исползуется при открытии ордера для обозначения направления торгов - OPBUY или OPSELL)}
которые уже при следующей проверке на открытие можно проверить на направление входа оператором if.
 

Ugar

Гуру форума
Коллеги, помогите выловить ошибку кода.
Задача – закрыть ордер через «5» минут после его открытия.
Вот алгоритм, который я использую:
if(OrdersTotal()>0)
{
for( i=0;i<OrdersTotal();i++)
...
Когда смотришь историю тестов, ордера висять дольше… чем надо…не могу понять в чем причина…
Исходные данные:
Тестирую на таймфрейме – 30 мин. Способ тестирования – все тики.
не в том порядке перебираешь ордера.
 

vladradon

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

sstyle

Активный участник
OnTick() это и есть start() только по новому.
Вызов трала надо делать внутри start(), эта функция выполняется с приходом тика.
Ну я и делал внутри старт, только не работало. когда заменил start() на OnTick то все заработало как надо. В тестере. А вот на реальном счете сделки не открывает и ошибок в журнале нет. Как будто робот не начинает работу. Как же быть?
 

Milevshi

Активный участник
Спасибо за помощь

Я не особо понимаю, зачем нужно для циклического сова делать проверки на осно истории, если изначально можно в той же строке определить какую-то переменную (любую), которая будет фиксировать направление предыдущей сделки... Т.е.: Когда уже доходит до {OrderSend(...) ; "переменная"=(переменная, которая исползуется при открытии ордера для обозначения направления торгов - OPBUY или OPSELL)}
которые уже при следующей проверке на открытие можно проверить на направление входа оператором if.


Спасибо за помощь
 

matro3

Почетный гражданин
Я не особо понимаю, зачем нужно для циклического сова делать проверки на осно истории, если изначально можно в той же строке определить какую-то переменную (любую), которая будет фиксировать направление предыдущей сделки... Т.е.: Когда уже доходит до {OrderSend(...) ; "переменная"=(переменная, которая исползуется при открытии ордера для обозначения направления торгов - OPBUY или OPSELL)}
которые уже при следующей проверке на открытие можно проверить на направление входа оператором if.

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

vladradon

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

Я обычно в таком случае использую глобальные переменные терминала и в нужном месте программы их записываю (или при определенных обстоятельствах по коду), а они хранятся в отдельном файле терминала автоматически (в 5-м языке есть дополнительная функция записи в любой момент этих переменных в коде проги). А при перезапуске терминала или сова, в функции OnInit() прописываю обновление переменных на те, что сохранены в глобалках. Я имею ввиду функции GlobalVariableSet, GlobalVariableSGet и GlobalVariableCheck. VPS должен выполнять и хранить эти переменные так же, как обычный терминал. Если в имена переменных нужно внести дополнительные данные, чтобы, к примеру разграничить сов по меджикам или комментам для одного счета, то использую функцию StringConcatenate, которая к основному имени добавляет либо меджик, либо коммент и т.п. Описание по этим функциям есть в документации по языку. У меня мультивалютник на 378 комбинаций пар пар уже больше года работает с использованием такого принципа сохранения переменных для ситуаций с перезагрузкой сова или всего терминала и все четко работает, с учетом того, что переменных хранится ооочень много.))
А в случае, если ты какое-то время сова не использовал и заново запустил с новыми настройками и тебе не нужно, чтобы именно по этому счету он поднимал инфу по старым ордерам, то твой алгоритм все равно эти данные поднимет - не устанавливать же именно для этого новый счет. А при такой ситуации можно просто из глобалок терминала удалить переменную, которая содержит последнее направление торговли и спокойно заново начать торговлю.
 
Последнее редактирование:
Верх