mobidik Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Как сделать так, чтобы сделки открывались строго только по сигналу индикатора, а не после закрытия по стопу? В условии вы проверяете на наличие цвета, а нужно на смену цвета, тогда после TP новая сделка открываться не будет. Т.е., если был красный, а стал зеленый - вход на бай, а после TP- был зеленый и есть зеленый - ничего не делаем. Нужно проверять состояние предыдущего бара. Ссылка на сообщение Поделиться на другие сайты More sharing options...
slevg Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Как сделать так, чтобы сделки открывались строго только по сигналу индикатора, а не после закрытия по стопу? В условии вы проверяете на наличие цвета, а нужно на смену цвета, тогда после TP новая сделка открываться не будет. Т.е., если был красный, а стал зеленый - вход на бай, а после TP- был зеленый и есть зеленый - ничего не делаем. Нужно проверять состояние предыдущего бара. Нет, в условии проверяется не наличие цвета, а цена индикатора. PriceBuy - цена индикатора при продаже, а PriceSell - при покупке, раньше было наоборот, но это не принципиально какому цвету присвоить значение цены. В ваших словах есть здравый смысл. Т.е. если цена соответствующая зеленому цвету стала больше цены соотв. красному цвету, то входим в бай, а если наоборот то в сел. Как же это воплотить в коде? Это надо сравнить энное количество времени назад чему равнялась цена...Как сравнить? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Это надо сравнить энное количество времени назад чему равнялась цена...Как сравнить?Достаточно посмотреть на предыдущем бареУ Вас так: PriceBuy = iCustom(NULL, 0, "tr", 0, 0); //я уже писал про 0-бар - он может перерисовыватьПред. бар: PriceBuy = iCustom(NULL, 0, "tr", 0, 1); //1 в конце - номер бара. Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Как сравнить? Примерно так: 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 if (Bid PriceBuy_1)+остальное условие.По этому примеру - подробнее можно?Дайте ссылочку на справку или объясните как пользоваться вложенной логикойУ меня не получилось разобраться:(2 2) = false(2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 if (Bid PriceBuy_1)+остальное условие.По этому примеру - подробнее можно?Дайте ссылочку на справку или объясните как пользоваться вложенной логикойУ меня не получилось разобраться:(2 2) = false(2 Согласен, что-то поторопился.... Как говорится, спешка нужна только при ловле блох...Я думаю, что смысл был понятен: проверяем условие на направление движения индюка, а затем выполнения условия на вход. PS.А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там.Двумя страницами ранее есть скрин. Индюк похож на Озимандиас - лестница рядом с ценой.Не в качестве критики: здесь люди обучаются - т.е. принимают все советы напрямую. Надо поаккуратнее... Ссылка на сообщение Поделиться на другие сайты More sharing options...
mahahuha Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Как реализовать задержку до открытия следующей свечи? Нужна в плане запрета выставления повторного ордера (условия да выставления присутствуют всю текущую свечу)... Обычный sleep конечно канает, но на больших ТФ можно упустить кучу сигналов из-за подобного костыля... есть ли в mql4 подобная функция? Изменено 29 августа, 2014 пользователем mahahuha Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Есть несколько способов:- по времени открытия текущего бара if (tt == Time[0]) return; tt = Time[0];- по объёму if (Volume[0] > 1) return;можно ещё придумать если надо... Generic A-TLP v.12.39.7 - Описание параметров - 20170805.docGeneric A-TLP v.12.38.4 - Описание параметров - 20161217.doc 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
mahahuha Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 спасибо! что-то голова под конец недели не варит;) это вполне хватит... Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там.Двумя страницами ранее есть скрин. Индюк похож на Озимандиас - лестница рядом с ценой.Не в качестве критики: здесь люди обучаются - т.е. принимают все советы напрямую. Надо поаккуратнее... С замечанием полностью согласен.Судя по тому скрину, индюк - Supertrend или его вариант. В данном случае, я бы накинул еще МА с малым периодом и контролировал пробитием МА другого индюка на значение превышающие delta, во избежание множества ложных сигналов. Тогда можно будет как период и др. пар. МА подбирать так и значение delta для получения более качественных сигналов.Вообщем, как-то так...001.png Ссылка на сообщение Поделиться на другие сайты More sharing options...
baksik99 Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 добрый день!Решил написать по вашему уроку советник по ТМА....все прописал как у вас почему не могу скомпилировать? куча ошибок выводит.....раньше таких не было ...может из за того что поменяли билд....Вот код!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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 baksik99 У Вас проблемы с аккуратностью. Две функции CountBuy. Вместо { поставили ;Ну и в Старте после проверки тикета скобку открыли, а закрыть забыли. Ссылка на сообщение Поделиться на другие сайты More sharing options...
xbms Опубликовано 29 августа, 2014 Автор Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 baksik99 У Вас проблемы с аккуратностью. Две функции CountBuy. Вместо { поставили ;Ну и в Старте после проверки тикета скобку открыли, а закрыть забыли. Да, там побольше ошибок... где-то нехватает точки с запятой, а где-то ну совсем лишние...немного бездумный набор текста...Исправил, держите baksik99tma_test.mq4VIP_bot_fix.ex4 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
baksik99 Опубликовано 29 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 29 августа, 2014 Спасибо, xbms Ссылка на сообщение Поделиться на другие сайты More sharing options...
slevg Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 Согласен, что-то поторопился.... Как говорится, спешка нужна только при ловле блох...Я думаю, что смысл был понятен: проверяем условие на направление движения индюка, а затем выполнения условия на вход. PS.А, вообще-то, лучше увидеть сам индюк и описание условий входа, а так можно долго гадать, что и как там. Да, смысл был понятен, но в такой модификации график получается зигзагообразным, сова топчется на месте.Я тут решил ввести переменную MaxLot = лот1+лот2, чтобы в одном направлении был лот не больше MaxLot и тем самым не будет доливок, если они уже есть. Вопрос: как прописать в коде следующее условие - максимальный объем одновременно открытых сделок продажи/покупки должен быть не больше MaxLot? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 Вопрос: как прописать в коде следующее условие - максимальный объем одновременно открытых сделок продажи/покупки должен быть не больше MaxLot?В функции подсчёта ордеров считаешь суммарный лот: sumLot += OrderLots();Затем перед доливкой сравниваешь: if (maxLot Ссылка на сообщение Поделиться на другие сайты More sharing options...
slevg Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 В функции подсчёта ордеров считаешь суммарный лот: 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 slevg sumLot - double на глобальном уровне?по стороне Бай тоже складывали? или у Вас махЛот на каждую сторону? Ссылка на сообщение Поделиться на другие сайты More sharing options...
slevg Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 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 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 А если прописать вот так:if (MaxLot Ну будьте внимательны! после первого ордера сумЛот не может быть больше МахЛота! Вам нужно их поменять местами в if(). И 2 ретурн внизу уберите. Ссылка на сообщение Поделиться на другие сайты More sharing options...
slevg Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 А если прописать вот так:if (MaxLot Ну будьте внимательны! после первого ордера сумЛот не может быть больше МахЛота! Вам нужно их поменять местами в if(). И 2 ретурн внизу уберите. Не помогло. Суммарный лот для продажи в работе был 0,8, а должен быть не больше 0,6....Может я что не так описал в CountSell и CountBuy? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 Не помогло. Суммарный лот для продажи в работе был 0,8, а должен быть не больше 0,6...А как он 0,8 оказался? У Вас 1 лот 0,2, а 2 - 0,4 ? МахЛот сделайте = 0,3. Ссылка на сообщение Поделиться на другие сайты More sharing options...
slevg Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 Не помогло. Суммарный лот для продажи в работе был 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; чтобы каждый раз его не перезадавать Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 30 августа, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 августа, 2014 slevg Так что Вы хотите? У Вас был ордер 0,2 + доливка 0,4, потом 0,2 закрылся остался 0,4, что меньше 0,6, потом открылся ещё 0,4. Всё по правилам! Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти