Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
Написал функцию закрытия ордеров по обратному сигналу. А она не работает. Может кто подскажет, где я накосячил?
void ExtrClosMidi()
{
//Закрытие ордера на продажу по сигналу СП-0
if(CountSell()>0)
{
if(SP_midi0>0 && Martin==false) // условие экстренного закрытия ордеров по сигналу СП-0
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black))
Alert(Symbol()," Ошибка закрытия ордера на продажу!");
SendMail(Symbol()," Ошибка закрытия ордера на продажу");
}
}
}return;
}
}
//Закрытие ордера на покупку по сигналу индикатора
if(CountBuy()>0)
{
if(SP_midi0 {
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black))
Alert(Symbol()," Ошибка закрытия ордера на покупку!");
SendMail(Symbol()," Ошибка закрытия ордера на покупку");
}
}
}return;
}
}
}
//Окончание закрытия ордеров+++++++++++++++++++++++++++++++++++++++++++++++++++++
А что пишет - какие ошибки в журнале ? Если нет ошибок в журнале надо полностью текст программы смотреть, там у Вас есть функции и переменные, которые могут повлиять на закрытие ордеров.
Вы сами гляньте, куда у Вас вообще программа заходит при удалении ордера.
Спасибо а подскажите в каких единицах измеряется время истечения отложенного ордера в функции Send ?
Ну как я понимаю - формат datatime значит указывается конкретная дата + время с точностью до секунды.
Не понятно а какое значение нужно поставить если я хочу чтобы отложенный ордер закрылся например через 30 мин
те через две свечи если ордер не сработал ?
Попробуйте так
datetime x=TimeCurrent()+30*60;
то есть мы к переменной с текущим временем прибавляем то количество секунд, через которое хотим чтобы ордер закрылся ну и переменную x, записываем в функцию Send как время истечения отложенного ордера
Здравствуйте трейдеры. У меня к вам вопрос касательно функции "долива". Суть в следующем, советник открывает отложенные ордера вверх и вниз от текущей цены рынка. Например 3 отложки вверх и 3 отложки вниз, у каждой свой TP и SL. Допустим цена двинулась вверх, и открыла два ордера на OP_BUY. В то время как эти два ордера открылись, снизу от цены образовалось пустое пространство, которое нужно заполнить ордерами OP_SELLSTOP или OP_SELLLIMIT. Казалось-бы, все логично, но я не могу придумать, как обыграть долив при условии функции CountOrders (это количество открываемых отложек), + специфика выбора OP_Limmit и OP_Stop. Все возможные варианты решения проблемы не дали никаких результатов ~x( ~x( ~x( Я прикрепляю ниже его код и если вы знаете как решить эту проблему, видите ошибки или есть какие нибудь идеи, я буду вам очень благодарен за помощь. (P.S. В советнике прописана один из вариантов)
Здравствуйте трейдеры. У меня к вам вопрос касательно функции "долива". Суть в следующем, советник открывает отложенные ордера вверх и вниз от текущей цены рынка. Например 3 отложки вверх и 3 отложки вниз, у каждой свой TP и SL. Допустим цена двинулась вверх, и открыла два ордера на OP_BUY. В то время как эти два ордера открылись, снизу от цены образовалось пустое пространство, которое нужно заполнить ордерами OP_SELLSTOP или OP_SELLLIMIT. Казалось-бы, все логично, но я не могу придумать, как обыграть долив при условии функции CountOrders (это количество открываемых отложек), + специфика выбора OP_Limmit и OP_Stop. Все возможные варианты решения проблемы не дали никаких результатов ~x( ~x( ~x( Я прикрепляю ниже его код и если вы знаете как решить эту проблему, видите ошибки или есть какие нибудь идеи, я буду вам очень благодарен за помощь. (P.S. В советнике прописана один из вариантов)
Александр_F Логика должна быть такая : если у Вас четкое правило не более трех ордеров в одну сторону, значит перед открытием 4го например вверх надо удалить ненужный, который был первый вверх.
Изменено 29 ноября, 2016 пользователем AndreyGold
В данном советнике использую функцию проверки открытия ордера на текущей свече.
Был ли на ней ордер либо нет.
Если был - пропускаем эту свечу и не рассматриваем.
Если нет - рассматриваем возможность открыть ордер.
Собственно максимум один ордер на каждой свече.
Я это реализовал с помощью проверки часа открытия последнего ордера с текущим часом для работы на часовых свечах.
И соответственно проверка дня открытия последнего ордера с текущим днём для торговли на дневном таймфрейме.
Функции возвращают True, если на текущей свече уже был открыт ордер,
либо False, если на текущей свече ещё не было открыто ордера.
Цитатаbool One_Order_in_Hour()
{
for(int i=0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol())
{
if (TimeHour (OrderOpenTime()) == Hour () &&
TimeDay (OrderOpenTime()) == Day () &&
TimeMonth(OrderOpenTime()) == Month() &&
TimeYear (OrderOpenTime()) == Year ()) return(1);
}
}
return(0);
}
Цитатаbool One_Order_in_Day()
{
for(int i=0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && OrderSymbol() == Symbol())
{
if (TimeDay (OrderOpenTime()) == Day () &&
TimeMonth(OrderOpenTime()) == Month() &&
TimeYear (OrderOpenTime()) == Year ()) return(1);
}
}
return(0);
}
Всё бы ничего, если б эти функции катастрофически не тормозили время прогона советника в тестере раз так в ...надцать. ~x(
Примерно с 3-5 минут до 7-8 часов.
Может есть возможность сделать данную проверку иным способом?
И было бы шикарно использовать данную примочку на любом таймфрейме, а не только на 1Н и 1Д, как у меня.
Надеюсь у кого-нибудь найдёться в закромах подобна функция. ;)
Richie, у тебя тормозит оттого, что ты каждый раз, а скорее даже каждый тик заглядываешь в MODE_History. если это не вспомогательный советник и в нем же ты открываешь ордера, можно сделать флаг. К примеру, делаешь его true, каждый раз как открылся ордер, а на каждой новой свече сбрасываешь его на false. И все, на тиках будешь просто проверять этот флаг. Ну, я бы так сделал. И на любом ТФ будет работать.
А при открытии новой свечи присваиваем X = false;
Но вот как сделать проверку данной свечи? Было б шикарно если вы привели пример.
Спасибо.
Изменено 5 декабря, 2016 пользователем Richie Rich
Да где-то выше это уже мусолилось...
Ну ладно, вот кратко
datetime Newcandle;
bool Activeorder=false;
void OnTick()
{
if (Newcandle!=Time[0])
{
Activeorder=false;
Newcandle = Time[0];
}
void MyFunction(...)
{
...
if (!Activeorder)
{
...//здесь какие-то Ваши условия
if (OrderSend(...))
Activeorder=true;
}
}
}
Ну вот как-то так если кратко - работать будет на всех ТФ, не более одного ордера на каждой свече. >:d
Изменено 5 декабря, 2016 пользователем Arius777
Вот так себе сделал: 8->
Цитатаdatetime NewCandle;
bool ActiveOrder = false,
void OnTick()
{
if (NewCandle != iTime(Symbol(),TimeFrame,0))
{
NewCandle = iTime(Symbol(),TimeFrame,0); ActiveOrder = 0;
}
if (ActiveOrder == 0)
{
if (условия на бай) { SendBuy (); ActiveOrder = 1; }
if (условия на селл) { SendSell (); ActiveOrder = 1; }
}
}
Изменено 5 декабря, 2016 пользователем Richie Rich
Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.
Ситуация такая:
выставляем 2 отложенных ордера в разных направлениях, как только срабатывает один из них, то другой удаляется и больше не выставляется.
Буду очень благодарен за помощь.
Спасибо.
Здравствуйте вопрос по частичному закрытию лота , а как закрывается остальная часть лота ?
Всем доброго дня! Подскажите пожалуйста как поставить удаление ордера в советнике.
Ситуация такая:
выставляем 2 отложенных ордера в разных направлениях, как только срабатывает один из них, то другой удаляется и больше не выставляется.
Буду очень благодарен за помощь.
Спасибо.
Анализируем, в "цикле" OrderSelect() если появился тип ордера OP_BUY или OP_SELL, то второй ордер с типом OP_SELLSTOP (OP_SELLLIMIT)или OP_BUYSTOP (OP_BUYLIMIT) удаляем через OrderDelete(......)
Здравствуйте вопрос по частичному закрытию лота , а как закрывается остальная часть лота ?
Просто закрывается через OrderClose -> а там OrderLots, выбранного ордера через OrderSelect
Всем доброго! :-H
Прошу помощи в написание простого индикатора.
Программировать мало умею, и по сему посоветуйте какой нибудь похожий индикатор который можно было бы изменить до своих нужд.
Принцип индикатора в том чтоб выделять прямоугольником 4 и более баров (желательно настраиваемый количество) с разнонаправленными типами.
Например:
Заранее спасибо !

А цикл используется ?
После того как какой-то ордер или ордера закрылись частично из оставшихся ордеров остается обыкновенный список открытых ордеров, для каких-нибудь действий с этим списком нужен будет цикл их перебора.
Всем, доброго времени суток, такая проблема...
Хочу написать небольшой индикатор, которые будет собирать данные, за последние 10 дней, о том, как реагирует рынок на открытие Лондона, то есть бычья свеча или медвежья по отношению к предыдущей часовой свече, но не знаю как сделать, что бы он собирал данные за разные дни с 11ти часовой свечи к 10ти часовой (мск.). Подскажите пожалуйста как это правильно сделать.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем