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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, наверное я тебя уже замучал, но всё же ещё спрошу по "TMA+CG". По поводу взятия данных не с нулевого, а с первого бара. Может всё же припомнишь, просто проверять довольно проблематично, похоже что при первом запуске, нулевой бар даёт нулевые же значения. Насколько я понял, при сравнении текущей цены с одной из линий, на проверке (цена > линии), при первом запуске срабатывает в любом случае, а если (цена
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
chistaia-rodina Смотрел сейчас ТМА. ИМХО:
- При закрытии 0-свечи и приходе следующего тика - результат может быть разный... надо знать как МТ устроен (я не знаю)
- 0-бар в индюке рассчитывается на каждом тике на основе МА, которые 0-бар перерисовывают - значение ТМА на 0-баре будет не стабильно. Я понимаю, что он вообще рисует, но на 0-баре особенно заметно.
При использовании 0-бара надо-бы пропускать 1 тик, а потом тест покажет - насколько это оправданно...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет! :-H
Если кто знает, то подскажите плиз:
1. как осуществить динамический тейк и стоп или
2. закрытие сделки, например, покупки при открытии продажи по заданным настройкам советника, т.е. чтобы при открытии продажи покупка закрывалась по той же цене
3. открытие сделки в том же направлении, но большим лотом. например, при соблюдении всех условий открылась продажа, но цена не сразу пошла вниз, а немного ушла на коррекцию, потом развернулась и пошла вниз и нужно бы дозалиться (условия открытия позиции соблюдаются)...как такое осуществить?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
slevg, смотри уроки, там всё что нужно объясняется вполне нормально.
Ссылка на сообщение
Поделиться на другие сайты

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


slevg, смотри уроки, там всё что нужно объясняется вполне нормально.


то что в уроках у меня не работает. там совсем другой принцип открытия сделок, да и динамического тейка в уроках нет...

Forum.txt
Forum.txt

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

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



slevg, смотри уроки, там всё что нужно объясняется вполне нормально.


то что в уроках у меня не работает. там совсем другой принцип открытия сделок, да и динамического тейка в уроках нет...


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

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

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


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

1. Не совсем понятно что Вы имеете в виду, может как писал chistaia-rodina трейлинг стоп, или бот отслеживает показания индюка (напр. пораболика)?
2. Закрытие ордеров по встречному сигналу вещь распространённая - только не по той-же цене: всё-таки спред никто не отменял...Как осуществить: получаете сигнал Селл, перед открытием селл проверяете свои ордера на бай и если есть - ОрдерКлозе();
3. Это называется сетка с мартином (или усреднение с мартингейлом). Осуществляется просто: у Вас открыт ордер Бай, цена стала меньше цены открытия ордера на Х пунктов - открываем ещё Бай с лотом умноженным на коэффициент (мартин), при этом контролируем прочие сигналы - по вкусу...
Ссылка на сообщение
Поделиться на другие сайты

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



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

1. Не совсем понятно что Вы имеете в виду, может как писал chistaia-rodina трейлинг стоп, или бот отслеживает показания индюка (напр. пораболика)?
2. Закрытие ордеров по встречному сигналу вещь распространённая - только не по той-же цене: всё-таки спред никто не отменял...Как осуществить: получаете сигнал Селл, перед открытием селл проверяете свои ордера на бай и если есть - ОрдерКлозе();
3. Это называется сетка с мартином (или усреднение с мартингейлом). Осуществляется просто: у Вас открыт ордер Бай, цена стала меньше цены открытия ордера на Х пунктов - открываем ещё Бай с лотом умноженным на коэффициент (мартин), при этом контролируем прочие сигналы - по вкусу...

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

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


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

Я не знаю как в уроке, выкладывайте код. Если ордера не модифицируются - в журнале записи есть?
по 3) сетки разные бывают. У Вас в любом случае усреднение, если поступил сигнал индюка, то чего проще - проверка сколько ордеров, если один, то усредняемся с увеличенным лотом.
Ссылка на сообщение
Поделиться на другие сайты

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



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

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

да в журнале есть запись: OrderModify error 130, если в коде прописано вот так -
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, comment, Magic, 0, Red);
а если прописать вот так OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); то ошибки нет, но никакой модификации тоже нет.
вот код трейлинга и во вложении вторая точка входа на покупку:

void Trailing()
{
for(int i=0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if (Bid - OrderOpenPrice() > TrailingStop * Point)
{
if (OrderStopLoss() {
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
}
}
}
if (OrderType() == OP_SELL)
{
if (OrderOpenPrice() - Ask > TrailingStop * Point)
{
if (OrderStopLoss() > Ask + (TrailingStop + TrailingStep)*Point)
{
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
}
}
}
}
}
}
}

1.jpg

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

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


да в журнале есть запись: OrderModify error 130, если в коде прописано вот так -
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, comment, Magic, 0, Red);
а если прописать вот так OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red); то ошибки нет, но никакой модификации тоже нет.

OrderSend - это не модификация, а отправка команды открытия ордера, на большинстве счетов сейчас нельзя сразу ставить СЛ и ТР.
Алгоритм Вам нужен такой:
- Проверяем открытые ордера на предмет СЛ, если СЛ нет - ставим через OrderModify.
- Если есть открытые ордера - запоминаем направление (Бай/Селл) включаем трал (я бы трал включал на 2 ордерах, а 1 ордер закрывал по реверсу или ТР)
- Если ордеров нет - направление = -1;
- Проверяем пересечение ценой индикатора. Если (нет) - выход иначе:
- Если да и ордеров нет (направление == -1) - вход + модификация.
- Если (да направление совпадает) - усредняемся через OrderSend, СЛ ставим через OrderModify
- Если (да реверс) - закрываем противоположные ордера и входим по индюку.

Функция Trailing вполне рабочая, только если СЛ=0, то для OP_SELL работать не будет...
Чтоб работало надо: if (OrderStopLoss() ==0 || OrderStopLoss() > Ask + (TrailingStop + TrailingStep)*Point)
Ссылка на сообщение
Поделиться на другие сайты

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

я знаю, что OrderSend это отправка команды на открытие ордера. она у меня используется в функции старт. так вот, если эта команда имеет такой вид - OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, comment, Magic, 0, Red); то в журнале есть сообщение об ошибке: OrderModify error 130.
а если команда записана вот так - OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red), то ошибок нет.
у меня сразу выставляются СЛ и ТР.
алгоритм это конечно хорошо и я его понимаю, только вот как его в коде прописать я не знаю, не силен в mql...потому и обратился за помощью

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

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

1. Что-бы не было ошибки надо открывать, а потом модификацией устанавливать Сл и ТР. По другому никак.
2. Извини, но кроме тебя за это никто не возьмётся. Если самому никак, то бери любого индикаторного сеточника с мартином + трайлинг (Иланы есть индикаторные), ограничивай длину сетки 2 ордерами и меняй индикатор сетки на свой, как это сделать - поможем.

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

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

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

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

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


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

Никак - трайлинг работает только для ордеров, которые в профите... (свой код смотри OP_BUY: if (Bid - OrderOpenPrice()> TrailingStop * Point))

еще вылезла непонятная фигня с продажей - если продажа закрывается под линией индикатора, то сразу же открывается новая продажа, а это не всегда уместно. причем все-равно какого цвета линия индюка...не пойму что не так?

Смотри свои условия на открытие - видимо там есть Опен и Клозе свечи, что то типа: если Опен выше линии, а Клозе ниже, то Селл (я не телепат...)

что-то я не встречал индикаторных иланов...где такие живут?

Вот одна тема. Там используется РСИ как фильтр, но это можно заменить на свой индюк и условия... Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
slevg Судя по Вашим текстам, с головой всё в порядке...
Разбираться в Вашем коде было-бы легче, если на него смотреть...
Это последний намёк.
Ссылка на сообщение
Поделиться на другие сайты

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


slevg Судя по Вашим текстам, с головой всё в порядке...
Разбираться в Вашем коде было-бы легче, если на него смотреть...
Это последний намёк.


Ок. Получилось прикрутить вторую сделку, но как-то некорректно происходит открытие. Одновременно почему-то. Вот код советника:

extern double Lots = 0.1;
extern int TakeProfit = 500;
extern int StopLoss = 1000;
extern int Slippage = 3;
extern string comment = "comment";
extern int Magic = 98765;
extern int Otstup = 5;
extern int TrailingStop = 20;
extern int TrailingStep = 10;
extern double Lot2 = 0.3;
extern int MaxTrade = 2;

double PriceSell, PriceBuy, TP, SL;

int init()
{
if (Digits == 3 || Digits == 5)
{ TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
TrailingStop *= 10;
TrailingStep *= 10;
Otstup *= 10;
}
return(0);
}

int start()
{
Trailing();

PriceSell = iCustom(NULL, 0, "incognito", 0, 0); - здесь 0 - цвет индикатора (зеленый)
PriceBuy = iCustom(NULL, 0, "incognito", 1, 0); - здесь 1 - цвет индикатора (красный)

if (PriceSell >= Bid + Otstup * Point && CountSell() == 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, comment, Magic, 0, Red);
}
if (PriceBuy {
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, comment, Magic, 0, Blue);
}

if(CountBuy() > 0 && CountBuy() {
if (PriceSell > OrderOpenPrice() || PriceBuy > OrderOpenPrice())
{
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lot2, Ask, Slippage, SL, TP, comment, Magic, 0, Blue);
}
}

return(0);
}

//+------------------------------------------------------------------+
//считает количество открытых ордеров на продажу

int CountSell()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
//считает количество открытых ордеров на покупку

int CountBuy()
{
int count = 0;
for(int trade = OrdersTotal()-1; trade >=0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
//трейлинг
void Trailing()
{
for(int i=0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
{
if (Bid - OrderOpenPrice() > TrailingStop * Point)
{
if (OrderStopLoss() == 0 || OrderStopLoss() {
SL = NormalizeDouble(Bid - TrailingStop * Point, Digits);
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
}
}
}
if (OrderType() == OP_SELL)
{
if (OrderOpenPrice() - Ask > TrailingStop * Point)
{
if (OrderStopLoss() == 0 || OrderStopLoss() > Ask + (TrailingStop + TrailingStep)*Point)
{
SL = NormalizeDouble(Ask + TrailingStop * Point, Digits);
if (OrderStopLoss() != SL)
OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
Ссылка на сообщение
Поделиться на другие сайты

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


Ок. Получилось прикрутить вторую сделку, но как-то некорректно происходит открытие. Одновременно почему-то.


Одновременно потому, что: PriceSell и PriceBuy работают по-очереди, т.е. когда в одном есть значение, то в другом 0 (по идее), +
функция OrderOpenPrice() показывает цену последнего выбранного ордера, а ордер выбирается в функциях CountBuy() например. Поэтому Ваша проверка if (PriceSell > OrderOpenPrice() || PriceBuy > OrderOpenPrice()) будет работать не предсказуемо...Для корректности открытия 2 ордера я бы ввел глоб. переменную в которую сохранял значение индюка при открытии первого ордера и запрещал открытие 2 ордера на том-же значении индюка, но это ещё не всё - нужен минимальный шаг между ценами открытия сонаправленных ордеров.
Общей логики нет... Сейчас выправлю скелет, а то Вы долго биться будете...

Вот тренируйтесь. Там надо ещё ф-цию закрытия ордеров прописать...
Спойлер


extern int Step = 15; //минимальный шаг между 1 и 2 ордером
int cBuy, cSell, tic;
double lastPrc, lastInd;

int start()
{
cBuy = CountBuy(); cSell = CountSell();
if (cBuy + cSell > 0) Trailing();
else
{
lastPrc = 0;
lastInd = -1;
}

PriceSell = iCustom(NULL, 0, "incognito", 0, 0); //- здесь 0 - цвет индикатора (зеленый) //Я бы "0, 1)" сделал
PriceBuy = iCustom(NULL, 0, "incognito", 1, 0); //- здесь 1 - цвет индикатора (красный)

//Начало - 1 ордер
if (PriceSell >= Bid + Otstup * _Point && cSell == 0)
{
tic = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (tic > -1)
{
SL = NormalizeDouble(Bid + StopLoss * _Point, _Digits);
TP = NormalizeDouble(Bid - TakeProfit * _Point, _Digits);
if (OrderSelect(tic, SELECT_BY_TICKET))
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);
lastPrc = OrderOpenPrice();
lastInd = PriceSell;
cSell++;
//if (cBuy > 0) f_CloseBuy(); //встречное закрытие
return(0);
}
}
if (PriceBuy {
tic = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if (tic > -1)
{
SL = NormalizeDouble(Ask - StopLoss * _Point, _Digits);
TP = NormalizeDouble(Ask + TakeProfit * _Point, _Digits);
if (OrderSelect(tic, SELECT_BY_TICKET))
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);
lastPrc = OrderOpenPrice();
lastInd = PriceBuy;
cBuy++;
//if (cSell > 0) f_CloseSell(); //встречное закрытие
return(0);
}
}
if (cBuy + cSell == 0) return(0); //нет ордеров - нет доливки
if (lastInd == PriceSell || lastInd == PriceBuy) return(0); //если значения индюка не поменялись - нет доливке

//Доливка
if(cBuy > 0 && cBuy {
tic = OrderSend(Symbol(), OP_BUY, Lot2, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if (tic > -1)
{
SL = NormalizeDouble(Ask - StopLoss * _Point, _Digits);
TP = NormalizeDouble(Ask + TakeProfit * _Point, _Digits);
if (OrderSelect(tic, SELECT_BY_TICKET))
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);
lastPrc = OrderOpenPrice();
lastInd = PriceBuy;
cBuy++;
//if (cSell > 0) f_CloseSell(); //встречное закрытие
return(0);
}
}
if(cSell > 0 && cSell = Bid + Otstup * _Point && lastPrc >= Bid + Step * _Point)
{
tic = OrderSend(Symbol(), OP_SELL, Lot2, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (tic > -1)
{
SL = NormalizeDouble(Bid + StopLoss * _Point, _Digits);
TP = NormalizeDouble(Bid - TakeProfit * _Point, _Digits);
if (OrderSelect(tic, SELECT_BY_TICKET))
OrderModify(OrderTicket(),OrderOpenPrice(), SL, TP,0,CLR_NONE);
lastPrc = OrderOpenPrice();
lastInd = PriceSell;
cSell++;
//if (cBuy > 0) f_CloseBuy(); //встречное закрытие
return(0);
}

return(0);
}

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

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

Попробую в Вашем варианте. Потом отпишусь


Добавлено: 24-08-2014 16:33:57

Oll, твоя вариация рабочая.....Но у тебя как и у меня не решена проблема с немедленным открытием сделки на продажу после закрытия предыдущей. И неважно как закрылась предыдущая, хоть по тейку, хоть по стопу, сразу открывается следующая. Когда цена под линией индюка это гуд, но до поры, до времени. Есть такие продажи, которые открываются в самом низу и тогда естественно следует лось. Как надо это побороть....Есть идеи? Изменено пользователем slevg
Ссылка на сообщение
Поделиться на другие сайты

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

Доброго времени суток!

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

Журнал:

Спойлер

http://3.firepic.org/3/images/2014-08/25/q1vqp0j049i3.png



Код:

Спойлер

//+------------------------------------------------------------------+


//Parameters of expert
extern int TakeProfit = 20;
extern int StopLoss = 5;
extern double Lot = 0.1;
extern int Slippage = 5;
extern int Magic = 123;

extern string TradeTime = "TradeTime";

extern int StartTime1 = 0;
extern int EndTime1 = 2;


extern string indi = "Parameters of expert";

extern int HalfLength = 56;
extern int PRICE_MODE = 0;
extern int ATR_PERIOD = 100;
extern double K = 2.0;

double PH, PL, SL, TP;
int ticket;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;

}

return(INIT_SUCCEEDED);
}
//------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert start function |
//+------------------------------------------------------------------+
void OnTick()
{

PH = iCustom (Symbol(), 0, "KC", HalfLength, PRICE_MODE, ATR_PERIOD, K, 0, 0);
PL = iCustom (Symbol(), 0, "KC", HalfLength, PRICE_MODE, ATR_PERIOD, K, 2, 0);


if (Hour() >= StartTime1 && Hour() {

if (Bid >= PH && Close[1] = PL && CountSell() == 0 && CountBuy() ==0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

ticket = OrderSendX(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red);

if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModifyX(ticket, OrderOpenPrice(), SL, TP, 0);
}
}


if (Ask = PL && Close[1] {
SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
ticket = OrderSendX(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, Green);



if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)== true)
OrderModifyX(ticket, OrderOpenPrice(), SL, TP, 0);
}
}

}

}

//-----------------------------------------------

int CountSell()
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
bool select1 = OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL)
count++;
}
}
return(count);
}



int CountBuy()
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
bool select2 = OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_BUY)
count++;
}
}
return(count);
}



//+------------------------------------------------------------------+

int OrderSendX( string symbol, int cmd, double volume, double price, int slippage, double stoploss,
double takeprofit, string comment, int magic = 0, datetime expiration = 0, color arrow_color=CLR_NONE)

{
int err = GetLastError();
err = 0;
bool exit_loop = false;
int loc_ticket = -1;
int retry = 10;
int cnt = 0;

if(cmd == OP_BUY || cmd == OP_SELL)

{
while(!exit_loop)
{
loc_ticket = OrderSend(symbol, cmd, volume, price, slippage,stoploss, takeprofit, comment, magic, expiration, arrow_color );
err = GetLastError();

switch(err)
{

case ERR_NO_ERROR:
exit_loop = true;
break;

case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;
case ERR_INVALID_PRICE:
case ERR_PRICE_CHANGED:
case ERR_OFF_QUOTES:
case ERR_REQUOTE:
RefreshRates();
continue;
default:
exit_loop = true;
break;


}

if(cnt>retry)

exit_loop = true;
if (!exit_loop)
{
Sleep(1000);
RefreshRates();
}

else
{
if( err != ERR_NO_ERROR)
{
Print("Ошибка :" + err);
}
}
if(err == ERR_NO_ERROR)

{
if ( OrderSelect (loc_ticket, SELECT_BY_TICKET, MODE_TRADES))
{
Print ("Ордер успешно выбран");

}
else Print("Одер не выбран");
return(loc_ticket);

}
Print ("Ошибка открытия ордера после" + cnt + "попыток.");

}

}
return(0);
}

//+------------------------------------------------------------------+

bool OrderModifyX(int loc_ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
{

if(OrderSelect(loc_ticket, SELECT_BY_TICKET,MODE_TRADES))
{
price = NormalizeDouble(price, Digits);
stoploss = NormalizeDouble(stoploss, Digits);
takeprofit = NormalizeDouble(takeprofit, Digits);
CheckValidStop (Symbol(), price, stoploss);

int err = GetLastError();
err = 0;
bool exit_loop = false;
bool result;

int retry = 10;
int cnt = 0;

while(!exit_loop)
{
result = OrderModify(loc_ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError();

if (result == true)
{
Print("Ордер#" + loc_ticket + " успешно модифицирован.");
return(true);
}
else if (result != true)
{
switch(err)
{

case ERR_NO_ERROR:
exit_loop = true;
break;

case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;
case ERR_INVALID_PRICE:
case ERR_PRICE_CHANGED:
case ERR_OFF_QUOTES:
case ERR_REQUOTE:
RefreshRates();
continue;
default:
exit_loop = true;
break;



}

}

}

if(err != ERR_NO_ERROR)
{
Print ("Ошибка модификации ордера #" + loc_ticket);
Print ("Код ошибки: " + err);
}


}


else
{
Print("Не удалось выбрать ордерб ticket = " + loc_ticket);
return(false);
}

return(true);

}
//+------------------------------------------------------------------+

void CheckValidStop (string symbol, double price, double& sl)
{
if(sl == 0)
return;

double servers_min_stop = MarketInfo(symbol, MODE_STOPLEVEL) * MarketInfo (symbol, MODE_POINT);

if(MathAbs (price - sl) {
if(price > sl)
sl = price - servers_min_stop;
else sl = sl + servers_min_stop;


}

sl = NormalizeDouble(sl, MarketInfo (symbol, MODE_DIGITS));

}



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

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

Лучше не делать расчеты на открытии рынка. Уже сталкивался с подобным. Открытие может случиться не в 00:00:00, а в 00:00:01. Пользователь этого даже не заметит, а сова начнет расчеты в 00:00:00. А цена там - нулевая. Это касается только открытия после выходных, конечно.

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

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


Но у тебя как и у меня не решена проблема с немедленным открытием сделки на продажу после закрытия предыдущей. И неважно как закрылась предыдущая, хоть по тейку, хоть по стопу, сразу открывается следующая. ....Есть идеи?

Я эту "проблему" и не решал. Идей (решений) - море! Понять-бы смысл проблемы... Выкладывай скрины с пояснениями.


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


1. "Серьёзных" ошибок незаметил, так - неточности.
2. Фильтр по спреду вещь распространённая выглядит так: if (Ask - Bid > 0.0002) return;
3. Ваши предложения это как в нашей медицине: доктор у меня температура - выпей аспирин...
т.е. Вы пытаетесь бороться со следствием, а не с причиной. Надо проверять уровни СЛ и ТР на разрешённый брокером отступ от рынка: СтопЛевел. Делается это так (в ОнИнит):
StopLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
//Проверка ТР и StopLoss на СтопЛевел
if (StopLevel > ТР * _Point) { Print("Ошибка! Отступ ТР меньше значения StopLevel"); return(INIT_FAILED); }
if (StopLevel > StopLoss * _Point) { Print("Ошибка! StopLoss меньше значения StopLevel"); return(INIT_FAILED); }
Ссылка на сообщение
Поделиться на другие сайты

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

Лучше не делать расчеты на открытии рынка. Уже сталкивался с подобным. Открытие может случиться не в 00:00:00, а в 00:00:01. Пользователь этого даже не заметит, а сова начнет расчеты в 00:00:00. А цена там - нулевая. Это касается только открытия после выходных, конечно.



Позже, в 2:44 был открыт еще один ордер по фунт/доллару, но модификация снова зафейлилась...
Мог ли реально спред быть более шести пунктов ?
Связано ли это с особенностями нано-счета, или , скажем, на ECN будет то же самое? И, хоть, может, и глупо прозвучит, но есть ли какие-нибудь способы борьбы со спредом для ночных скальперов?

Может вместо стопов поставить функцию закрытия ордера, если цена ушла на уровень этого предполагаемого стопа?

Цитата

StopLevel = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
//Проверка ТР и StopLoss на СтопЛевел
if (StopLevel > ТР * _Point) { Print("Ошибка! Отступ ТР меньше значения StopLevel"); return(INIT_FAILED); }
if (StopLevel > StopLoss * _Point) { Print("Ошибка! StopLoss меньше значения StopLevel"); return(INIT_FAILED); }


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

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


Попробовать надо, заодно уровень текущего спреда вывести можно.


Кинь этот скрипт в терминале, подключенном к нано-счёту. Скрипт Алертом выводит уровень СтопЛевела.
У меня на ФхОпен было 0, на Ф4Ю = 300!

StopLevel_0ll.ex4

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

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

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

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

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

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

Войти

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

Войти

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


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

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