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

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

#3951
SilverKZ, большое Спасибо! Запомню. 8->
#3952

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

Zeron.mq40 скач.
Zeron.ex40 скач.
Alpari_Limited_MT4.png

Изменено 23 ноября, 2016 пользователем mangold

#3953

Написал функцию закрытия ордеров по обратному сигналу. А она не работает. Может кто подскажет, где я накосячил?

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;
}
}
}
//Окончание закрытия ордеров+++++++++++++++++++++++++++++++++++++++++++++++++++++

#3954

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

#3955

Спасибо а подскажите в каких единицах измеряется время истечения отложенного ордера в функции Send ?

#3956

Ну как я понимаю - формат datatime значит указывается конкретная дата + время с точностью до секунды.

#3957

Не понятно а какое значение нужно поставить если я хочу чтобы отложенный ордер закрылся например через 30 мин
те через две свечи если ордер не сработал ?

#3958

Попробуйте так
datetime x=TimeCurrent()+30*60;

то есть мы к переменной с текущим временем прибавляем то количество секунд, через которое хотим чтобы ордер закрылся ну и переменную x, записываем в функцию Send как время истечения отложенного ордера

#3959

Здравствуйте трейдеры. У меня к вам вопрос касательно функции "долива". Суть в следующем, советник открывает отложенные ордера вверх и вниз от текущей цены рынка. Например 3 отложки вверх и 3 отложки вниз, у каждой свой TP и SL. Допустим цена двинулась вверх, и открыла два ордера на OP_BUY. В то время как эти два ордера открылись, снизу от цены образовалось пустое пространство, которое нужно заполнить ордерами OP_SELLSTOP или OP_SELLLIMIT. Казалось-бы, все логично, но я не могу придумать, как обыграть долив при условии функции CountOrders (это количество открываемых отложек), + специфика выбора OP_Limmit и OP_Stop. Все возможные варианты решения проблемы не дали никаких результатов ~x( ~x( ~x( Я прикрепляю ниже его код и если вы знаете как решить эту проблему, видите ошибки или есть какие нибудь идеи, я буду вам очень благодарен за помощь. (P.S. В советнике прописана один из вариантов)

Советник_-_копия.mq44 скач.

#3960
Спойлер


Здравствуйте трейдеры. У меня к вам вопрос касательно функции "долива". Суть в следующем, советник открывает отложенные ордера вверх и вниз от текущей цены рынка. Например 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

#3961

:-T

_2.mq44 скач.

#3962

:-T

_2.3_.mq46 скач.

#3963
Товарищи программисты, нужна помощь! :((

В данном советнике использую функцию проверки открытия ордера на текущей свече.
Был ли на ней ордер либо нет.
Если был - пропускаем эту свечу и не рассматриваем.
Если нет - рассматриваем возможность открыть ордер.

Собственно максимум один ордер на каждой свече.





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

И соответственно проверка дня открытия последнего ордера с текущим днём для торговли на дневном таймфрейме.


Выглядит это следующим образом:




Функции возвращают 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Д, как у меня.

Надеюсь у кого-нибудь найдёться в закромах подобна функция. ;)
#3964

Richie, у тебя тормозит оттого, что ты каждый раз, а скорее даже каждый тик заглядываешь в MODE_History. если это не вспомогательный советник и в нем же ты открываешь ордера, можно сделать флаг. К примеру, делаешь его true, каждый раз как открылся ордер, а на каждой новой свече сбрасываешь его на false. И все, на тиках будешь просто проверять этот флаг. Ну, я бы так сделал. И на любом ТФ будет работать.

#3965
Arius777 то есть сразу после OrderSend некоему булевому значению "X" присваиваем true.
А при открытии новой свечи присваиваем X = false;

Но вот как сделать проверку данной свечи? Было б шикарно если вы привели пример.

Спасибо.

Изменено 5 декабря, 2016 пользователем Richie Rich

#3966

Да где-то выше это уже мусолилось...

Ну ладно, вот кратко

Спойлер


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

#3967
Arius777, Браво! Яро плюсую! =d>

Вот так себе сделал: 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

#3968

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

Ситуация такая:

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

Буду очень благодарен за помощь.

Спасибо.

#3969

Здравствуйте вопрос по частичному закрытию лота , а как закрывается остальная часть лота ?

#3970


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

Ситуация такая:

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

Буду очень благодарен за помощь.

Спасибо.



Анализируем, в "цикле" OrderSelect() если появился тип ордера OP_BUY или OP_SELL, то второй ордер с типом OP_SELLSTOP (OP_SELLLIMIT)или OP_BUYSTOP (OP_BUYLIMIT) удаляем через OrderDelete(......)
#3971


Здравствуйте вопрос по частичному закрытию лота , а как закрывается остальная часть лота ?



Просто закрывается через OrderClose -> а там OrderLots, выбранного ордера через OrderSelect
#3972

Всем доброго! :-H

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

Заранее спасибо !

Спойлер

#3973

А цикл используется ?

#3974

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

#3975

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

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

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