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

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


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

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


Как сделать так, чтобы сделки открывались строго только по сигналу индикатора, а не после закрытия по стопу?



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

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

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

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

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

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

Перейти

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

Перейти

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

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



Как сделать так, чтобы сделки открывались строго только по сигналу индикатора, а не после закрытия по стопу?



В условии вы проверяете на наличие цвета, а нужно на смену цвета, тогда после TP новая сделка открываться не будет. Т.е., если был красный, а стал зеленый - вход на бай, а после TP- был зеленый и есть зеленый - ничего не делаем. Нужно проверять состояние предыдущего бара.

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

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


Это надо сравнить энное количество времени назад чему равнялась цена...Как сравнить?

Достаточно посмотреть на предыдущем баре
У Вас так: PriceBuy = iCustom(NULL, 0, "tr", 0, 0); //я уже писал про 0-бар - он может перерисовывать
Пред. бар: PriceBuy = iCustom(NULL, 0, "tr", 0, 1); //1 в конце - номер бара.
Ссылка на сообщение
Поделиться на другие сайты

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


Как сравнить?



Примерно так:

PriceBuy_0 = iCustom(NULL, 0, "tr", 0, 0);//зеленый 0-бар
PriceBuy_1 = iCustom(NULL, 0, "tr", 0, 1);//зеленый 1-бар

PriceSell_0 = iCustom(NULL, 0, "tr", 1, 0);//красный 0-бар
PriceSell_1 = iCustom(NULL, 0, "tr", 1, 1);//красный 1-бар

if (Bid PriceBuy_1)+остальное условие.

if (Ask >= PriceSell_0
Ссылка на сообщение
Поделиться на другие сайты

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


if (Bid PriceBuy_1)+остальное условие.

По этому примеру - подробнее можно?
Дайте ссылочку на справку или объясните как пользоваться вложенной логикой
У меня не получилось разобраться:
(2 2) = false
(2
Ссылка на сообщение
Поделиться на другие сайты

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



if (Bid PriceBuy_1)+остальное условие.

По этому примеру - подробнее можно?
Дайте ссылочку на справку или объясните как пользоваться вложенной логикой
У меня не получилось разобраться:
(2 2) = false
(2


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

PS.
А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там.
Ссылка на сообщение
Поделиться на другие сайты

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


А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там.

Двумя страницами ранее есть скрин. Индюк похож на Озимандиас - лестница рядом с ценой.
Не в качестве критики: здесь люди обучаются - т.е. принимают все советы напрямую. Надо поаккуратнее...
Ссылка на сообщение
Поделиться на другие сайты

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

Как реализовать задержку до открытия следующей свечи? Нужна в плане запрета выставления повторного ордера (условия да выставления присутствуют всю текущую свечу)... Обычный sleep конечно канает, но на больших ТФ можно упустить кучу сигналов из-за подобного костыля... есть ли в mql4 подобная функция?

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

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

Есть несколько способов:
- по времени открытия текущего бара
if (tt == Time[0]) return;
tt = Time[0];
- по объёму if (Volume[0] > 1) return;

можно ещё придумать если надо...

Generic A-TLP v.12.39.7 - Описание параметров - 20170805.doc
Generic A-TLP v.12.38.4 - Описание параметров - 20161217.doc

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

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



А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там.

Двумя страницами ранее есть скрин. Индюк похож на Озимандиас - лестница рядом с ценой.
Не в качестве критики: здесь люди обучаются - т.е. принимают все советы напрямую. Надо поаккуратнее...


С замечанием полностью согласен.
Судя по тому скрину, индюк - Supertrend или его вариант. В данном случае, я бы накинул еще МА с малым периодом и контролировал пробитием МА другого индюка на значение превышающие delta, во избежание множества ложных сигналов. Тогда можно будет как период и др. пар. МА подбирать так и значение delta для получения более качественных сигналов.
Вообщем, как-то так...

001.png

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

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

добрый день!
Решил написать по вашему уроку советник по ТМА....все прописал как у вас почему не могу скомпилировать? куча ошибок выводит.....раньше таких не было ...может из за того что поменяли билд....
Вот код!


extern double Lots = 0.01;
extern int TakeProfit = 20;
extern int StopLoss = 10;
extern int Slippage = 5;
extern int Magic = 1234;

extern string comment = "Paradis";
extern string Indi = "TMA with Distances";
extern string TimeFrame = "current time frame";
extern int HalfLength = 56;
extern int Price = PRICE_CLOSE;
extern double ATRMultiplier = 2.0;
extern int ATRPeriod = 100;
extern bool Interpolate = true;

double PriceHigh, PriceLow, SL, TP;
int ticket;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if (Digits == 3 || Digits == 5)
{
TakeProfit *= 10;
StopLoss *= 10;
Slippage *= 10;
}
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom(Symbol, 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
PriceLow = iCustom(Symbol, 0, "TMA with Distances", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

if (Bid >= PriceHigh && CountSell() == 0)
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, comment, Magic, 0, Red);
if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}

if (Ask {
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, comment, Magic, 0, Blue);
if (ticket > 0)
{
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify(ticket, OrderOpenPrice(), SL, TP, 0);
}
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;
}
//+------------------------------------------------------------------+
int CountBuy();
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);
}
//+------------------------------------------------------------------+

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
baksik99 У Вас проблемы с аккуратностью. Две функции CountBuy. Вместо { поставили ;
Ну и в Старте после проверки тикета скобку открыли, а закрыть забыли.
Ссылка на сообщение
Поделиться на другие сайты

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


baksik99 У Вас проблемы с аккуратностью. Две функции CountBuy. Вместо { поставили ;
Ну и в Старте после проверки тикета скобку открыли, а закрыть забыли.



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

tma_test.mq4
VIP_bot_fix.ex4

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

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


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

PS.
А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там.


Да, смысл был понятен, но в такой модификации график получается зигзагообразным, сова топчется на месте.
Я тут решил ввести переменную MaxLot = лот1+лот2, чтобы в одном направлении был лот не больше MaxLot и тем самым не будет доливок, если они уже есть. Вопрос: как прописать в коде следующее условие - максимальный объем одновременно открытых сделок продажи/покупки должен быть не больше MaxLot?
Ссылка на сообщение
Поделиться на другие сайты

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


Вопрос: как прописать в коде следующее условие - максимальный объем одновременно открытых сделок продажи/покупки должен быть не больше MaxLot?

В функции подсчёта ордеров считаешь суммарный лот: sumLot += OrderLots();
Затем перед доливкой сравниваешь: if (maxLot
Ссылка на сообщение
Поделиться на другие сайты

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


В функции подсчёта ордеров считаешь суммарный лот: sumLot += OrderLots();
Затем перед доливкой сравниваешь: if (maxLot


Вот так?:
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);
count = 0;
for(trade = OrdersTotal()-1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
sumLot+=OrderLots();
count++;
}

}

if (MaxLot
if (CountSell() >= 1 && CountSell() {
if (PriceSell {
SL1 = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP1 = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderSend(Symbol(), OP_SELL, Lot2, Bid, Slippage, SL1, TP1, comment, Magic, 0, Red);
}
}
В таком варианте все то же и в работе лот больше, чем MaxLot
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
slevg sumLot - double на глобальном уровне?
по стороне Бай тоже складывали? или у Вас махЛот на каждую сторону?
Ссылка на сообщение
Поделиться на другие сайты

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


slevg sumLot - double на глобальном уровне?
по стороне Бай тоже складывали? или у Вас махЛот на каждую сторону?


Да, sumLot описал в самом начале, где все переменные.
На бай не делал, на пробу сделал для продажи. В CountBuy не описывал. МахЛот одинаковый что для покупки, что для продажи - лот1+лот2.
А если прописать вот так:

if (MaxLot {
if(CountBuy() >= 1 && CountBuy() {
if (Ask > LastPrBuy + Step*Point && Ask >= PriceBuy)
{
SL1 = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP1 = NormalizeDouble(Ask + TakeProfit * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lot2, Ask, Slippage, SL1, TP1, comment, Magic, 0, Blue);
}
}

if (CountSell() >= 1 && CountSell() {
if (PriceSell {
SL1 = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP1 = NormalizeDouble(Bid - TakeProfit * Point, Digits);
OrderSend(Symbol(), OP_SELL, Lot2, Bid, Slippage, SL1, TP1, comment, Magic, 0, Red);
}
}
} return(0);
return(0);
}
то доливки нет вообще Изменено пользователем slevg
Ссылка на сообщение
Поделиться на другие сайты

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


А если прописать вот так:
if (MaxLot

Ну будьте внимательны! после первого ордера сумЛот не может быть больше МахЛота! Вам нужно их поменять местами в if(). И 2 ретурн внизу уберите.
Ссылка на сообщение
Поделиться на другие сайты

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



А если прописать вот так:
if (MaxLot

Ну будьте внимательны! после первого ордера сумЛот не может быть больше МахЛота! Вам нужно их поменять местами в if(). И 2 ретурн внизу уберите.

Не помогло. Суммарный лот для продажи в работе был 0,8, а должен быть не больше 0,6....
Может я что не так описал в CountSell и CountBuy?
Ссылка на сообщение
Поделиться на другие сайты

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


Не помогло. Суммарный лот для продажи в работе был 0,8, а должен быть не больше 0,6...

А как он 0,8 оказался? У Вас 1 лот 0,2, а 2 - 0,4 ? МахЛот сделайте = 0,3.
Ссылка на сообщение
Поделиться на другие сайты

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



Не помогло. Суммарный лот для продажи в работе был 0,8, а должен быть не больше 0,6...

А как он 0,8 оказался? У Вас 1 лот 0,2, а 2 - 0,4 ? МахЛот сделайте = 0,3.

0,8 он оказался потому, что после закрытия лота первого 0,2 открылась продажа лотом 0,4 и еще до этого была доливка тоже лотом 0,4...МаксЛот я не задавал конкретное значение. Я в самом начале присвоил ему значение MaxLot = Lot1 + Lot2; чтобы каждый раз его не перезадавать
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
slevg Так что Вы хотите? У Вас был ордер 0,2 + доливка 0,4, потом 0,2 закрылся остался 0,4, что меньше 0,6, потом открылся ещё 0,4. Всё по правилам!
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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