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

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

#1226


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



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



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



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

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


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

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


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



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

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
#1230


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

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



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

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


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

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


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

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

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

Изменено 29 августа, 2014 пользователем mahahuha

#1234

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

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

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

#1235

спасибо! что-то голова под конец недели не варит;) это вполне хватит...

#1236



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

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


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

001.png

#1237

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


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);
}
//+------------------------------------------------------------------+

Изменено 29 августа, 2014 пользователем baksik99

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


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



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

tma_test.mq419 скач.
VIP_bot_fix.ex40 скач.

#1240

Спасибо, xbms

#1241


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

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


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


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

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


В функции подсчёта ордеров считаешь суммарный лот: 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
#1244
slevg sumLot - double на глобальном уровне?
по стороне Бай тоже складывали? или у Вас махЛот на каждую сторону?
#1245


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);
}
то доливки нет вообще

Изменено 30 августа, 2014 пользователем slevg

#1246


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

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



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

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

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


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

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



Не помогло. Суммарный лот для продажи в работе был 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; чтобы каждый раз его не перезадавать
#1250
slevg Так что Вы хотите? У Вас был ордер 0,2 + доливка 0,4, потом 0,2 закрылся остался 0,4, что меньше 0,6, потом открылся ещё 0,4. Всё по правилам!

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

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