Al2ex3 Опубликовано 1 октября, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 октября, 2022 В 29.09.2022 в 19:22, megakosmo сказал: Здравствуйте! По уроку Павла по трейлинг стропу прикрутил его трейлинг к индиктатру true TMA, и сделал сигнал на вход при пересечении ценой сверху вниз нижней линии по тренду на продажу, на покупку соответственно - наоборот. if (iOpen(NULL,0,0) > iClose(NULL,0,0) && iOpen(NULL,0,0) > PriceLow && iClose(NULL,0,0) < PriceLow && PriceLow < PriceLowPrev && CountBuy() == 0 && CountSell() == 0) PriceLowPrev это линия TMA на шаг назад для определения тренда по свече. Так вот вопрос, как сделать так, чтобы советник открывал сделку только один раз за свечу. Очень часто так происходит, что он на текущей длинной свече закрывает позицию по трейлингу, и моментально открывает заново, т.к. условия открытия сохраняются, а свеча еще не закрылась. Таким образом весь профит улетает на таких свечах В OnTick прописываем условие, которое соблюдается только раз в свечу: if(Update_Time != iTime(NULL,0,0)) { //обновляем данные раз в период (скобку не забудьте открыть) Update_Time = iTime(NULL,0,0); //перезаписываем значение переменной для хранения времени текущей свечи Далее, if (прописываете условие на вход); 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 30 октября, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 октября, 2022 Здравствуйте! Можете выложить урок MQ4 локированию хеджированию разных вариантов, математический, процентный и других вариантах. Написать как работает код, какой код работает и при каких условиях. Во всех уроках я ничего похожего не увидел, если есть, то подскажите где найти. не просто описание, а разбор всего кода. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Mark Опубликовано 21 ноября, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 ноября, 2022 Всем доброго времени суток, подскажите вылезает ошибка 130 при модификации ордера. Можете подсказать в чем может быть проблема? if (SigBuy == 1 && BuyCount()==0) { ticet = OrderSend(Symbol(), OP_BUY, Lots, Ask, slip, 0, 0, "Open_BUY", Magic, 0, Blue); if (ticet < 0) { Print ("Не удалось открыть лимитный ордер на покупку"); } else { SL = NormalizeDouble(Bid - Stoploss*Point, Digits); TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); if (OrderSelect (ticet, SELECT_BY_TICKET)) if (!OrderModify(ticet, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации ордера на покупку"); } } if (SigSell == 1 && SellCount()==0) { ticet = OrderSend(Symbol(), OP_SELL, Lots, Bid, slip, 0, 0, "Open_Sell", Magic, 0, Red); if (ticet < 0) { Print ("Не удалось открыть лимитный ордер на продажу"); } else { SL = NormalizeDouble(Bid + Stoploss*Point, Digits); TP = NormalizeDouble(Ask - TakeProfit*Point, Digits); if (OrderSelect (ticet, SELECT_BY_TICKET)) if (!OrderModify(ticet, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации ордера на продажу"); } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 21 ноября, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 ноября, 2022 7 часов назад, Mark сказал: Всем доброго времени суток, подскажите вылезает ошибка 130 при модификации ордера. Можете подсказать в чем может быть проблема? if (SigBuy == 1 && BuyCount()==0) { ticet = OrderSend(Symbol(), OP_BUY, Lots, Ask, slip, 0, 0, "Open_BUY", Magic, 0, Blue); if (ticet < 0) { Print ("Не удалось открыть лимитный ордер на покупку"); } else { SL = NormalizeDouble(Bid - Stoploss*Point, Digits); TP = NormalizeDouble(Ask + TakeProfit*Point, Digits); if (OrderSelect (ticet, SELECT_BY_TICKET)) if (!OrderModify(ticet, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации ордера на покупку"); } } if (SigSell == 1 && SellCount()==0) { ticet = OrderSend(Symbol(), OP_SELL, Lots, Bid, slip, 0, 0, "Open_Sell", Magic, 0, Red); if (ticet < 0) { Print ("Не удалось открыть лимитный ордер на продажу"); } else { SL = NormalizeDouble(Bid + Stoploss*Point, Digits); TP = NormalizeDouble(Ask - TakeProfit*Point, Digits); if (OrderSelect (ticet, SELECT_BY_TICKET)) if (!OrderModify(ticet, OrderOpenPrice(), SL, TP, 0)) Print ("Ошибка модификации ордера на продажу"); } } Мало данных. Свойства символа, величины тейка и стопа, ошибка в тесте, или в торгах? Но варианты такие: 1. Тейк, или стоп ближе StopLevel 2. У брокера есть FreezeLevel 3. Нужно сделать RefreshRates (или еще лучше, SymbolInfoTick) , прежде, чем отправлять запрос на модификацию - с тех пор, как бот купил, или продал, прошли сотни миллисекунд, цена обновилась, а советник использует предыдущее значение. И непонятно, почему тейк у вас откладывается от противоположной цены? Если вы хотите тейк в Х пунктов, его нужно прибавлять-отнимать от цены открытия ордера. Это по достижении он будет исполняться по противоположной цене. А в вашей реализации, если спред расширился - вы тейк можете пытаться позади текущей цены поставить (под ценой открытия - для покупки, над ценой открытия - для продажи). Что в целом не запрещено, но это вряд ли то, чего вы хотите добиться От противоположной стороны цены нужно проверять стоплевел. Изменено 21 ноября, 2022 пользователем Rigal Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 7 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 декабря, 2022 Здравствуйте подскажите как сделать что бы сделка открывалась на открытии текущей свечи а закрывалась на открытии следующей свечи. Спасибо ! Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 8 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 8 декабря, 2022 input int MagicNumber = 123; datetime lastBar = 0; void OnTick() { if(lastBar < iTime(NULL, NULL, 0) { lastBar = iTime(NULL, NULL, 0); for(int i = 0; i < OrdersTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagic() == MagicNumber) { OrderClose(OrderTicket()....); return; } } OrderSend(....); } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 9 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 декабря, 2022 Здравствуйте а можно поподробнее объяснить по коду , когда сделка открывается один раз за свечу. Спасибо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 9 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 декабря, 2022 Я не понимаю вопроса. Что именно вам подробнее объяснить? Вот же код. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 10 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 декабря, 2022 Подскажите а можно применить такой код : //--- вводим новую переменную (величина в секундах для 1 бара данного ТФ, для М15 равно 60 с х 15 = 900 с) datetime Time_open = 300; //--- вводим новую переменную (время открытия бара,где будет 1-й вход) datetime Time_bar = 0; //----------------------------------+ // Продажа //----------------------------------+ //--- вводим новую строку (снимает запрет на повторный вход, если открылся новый бар) if( (TimeCurrent() - Time_bar) > 300 ) Time_open = 300; //--------------------------------------------------------------------+ if ( CountSell() == 0 && CountBuy() == 0 && ........ . . . { ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Sleepage,0,0,"market_MA_TREND",Magic,0,Red); if(ticket > 0) { sl = NormalizeDouble( ma341 + slSell * Point,Digits); tp = NormalizeDouble(Bid - TakeProfit * Point,Digits); Time_open = TimeCurrent()-Time[0]; //(запоминаем интервал от времени открытия бара, // на котором был вход, до момента входа) Time_bar = Time[0]; //(запоминаем время открытия того бара, где был 1-й вход) if(OrderSelect(ticket,SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(),sl,tp,0,Red )) Print("Ошибка модификации ордера на продажу"); } else Print("Ошибка открытия ордера на продажу"); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 11 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 декабря, 2022 Можно. Но ваша переменная потеряется на перезапуске. Просто проверьте время открытия последнего ордера. OrderTimeOpen внутри цикла OrderSelect. Ну и у вас не на открытии бара тогда будут открываться сделки. открытие бара - это мой пример выше, там как раз дополнительная переменная. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 12 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 декабря, 2022 Скажите а можно применить такой код для закрытия сделки в момент открытия следующей свечи : if ( CountBuy() == 1 || CountSell() == 1 ) { for(int i =OrdersTotal() -1;i >= 0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_BUY) { if ( TimeStop > 0 && Bid > OrderOpenPrice() && // (цена в положительной области относительно уровня входа) TimeCurrent() == Time[0] ) // (выход строго в момент открытия текущей свечи) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,Sleepage,Black)) Print("Ошибка ордера на закрытие покупки"); } } if(OrderType() == OP_SELL) { if ( TimeStop > 0 && Ask < OrderOpenPrice() && // (цена в положительной области относительно уровня входа) TimeCurrent() == Time[0] ) // (выход строго в момент открытия текущей свечи) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,Sleepage,Black)) Print("Ошибка ордера на закрытие продажи"); } } } } } //----------------------------------------------------------------------------------------- Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 13 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 декабря, 2022 5 часов назад, Roman 13 сказал: Скажите а можно применить такой код для закрытия сделки в момент открытия следующей свечи : if ( CountBuy() == 1 || CountSell() == 1 ) { for(int i =OrdersTotal() -1;i >= 0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if( OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_BUY) { if ( TimeStop > 0 && Bid > OrderOpenPrice() && // (цена в положительной области относительно уровня входа) TimeCurrent() == Time[0] ) // (выход строго в момент открытия текущей свечи) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,Sleepage,Black)) Print("Ошибка ордера на закрытие покупки"); } } if(OrderType() == OP_SELL) { if ( TimeStop > 0 && Ask < OrderOpenPrice() && // (цена в положительной области относительно уровня входа) TimeCurrent() == Time[0] ) // (выход строго в момент открытия текущей свечи) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,Sleepage,Black)) Print("Ошибка ордера на закрытие продажи"); } } } } } //----------------------------------------------------------------------------------------- Можно просто проверять OrderProfit() > 0 и не придется городить раздельно для Buy и Sell (цену закрытия можно подсунуть inline, как (OrderType() == OP_BUY ? Bid : Ask) В целом так можно, но вы на каждом тике будете перебирать все открытые ордера трижды (CountBuy() и CountSell(), я полагаю, тоже перебирают ордера у вас). Без всякой причины: если еще не открытие свечи, этого всего можно было бы не делать. ну и туда же: вам эти CountBuy и CountSell не нужны. Просто на старте свечи переберите все ордера, и если вам попадутся ваши - закрывайте Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 13 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 декабря, 2022 Впрочем, повторюсь, это ровно то, что я предложил выше. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Roman 13 Опубликовано 13 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 декабря, 2022 Скажите а могу я прописать ваш код закрытия после всех ф-ий Send в конце программы, ну что бы было по порядку, с начало открытие потом закрытие и еще один вопрос: подскажите код что бы сделка открывалась один раз за свечу, даже если условия входа сохраняются, скажем сделка закрылась по ТР, а свечка еще не закрылась и условия сохраняются. Спасибо. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 13 декабря, 2022 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 декабря, 2022 15 часов назад, Roman 13 сказал: Скажите а могу я прописать ваш код закрытия после всех ф-ий Send в конце программы, ну что бы было по порядку, с начало открытие потом закрытие и еще один вопрос: подскажите код что бы сделка открывалась один раз за свечу, даже если условия входа сохраняются, скажем сделка закрылась по ТР, а свечка еще не закрылась и условия сохраняются. Спасибо. Вы повторяете исходный вопрос, на который я ответил куском кода. В этом куске на старте свечи сделки закроются и откроются. Можно в него добавить дополнительный условий вокруг открытия и закрытия. Но весь этот код огорожен проверкой открытия свечи, вот этой: if(lastBar < iTime(NULL, NULL, 0) { lastBar = iTime(NULL, NULL, 0); ... сюда мы попадаем один раз за свечку, на ее открытии ... все, что вставится тут, выполнится только на открытии свечи } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Lexa000 Опубликовано 5 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 5 января, 2023 double OOP,SL; int b=0,s=0,tip,TicketB=0,TicketS=0; for(int i=0; i<OrdersTotal(); i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol()) { tip = OrderType(); OOP = NormalizeDouble(OrderOpenPrice(),Digits); if(tip==OP_BUY) { b++; TicketB=OrderTicket(); if(Stoploss!=0 && Bid<=OOP - Stoploss * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;} if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE)) continue;} if(TrailingStop>0) { SL=NormalizeDouble(Bid-TrailingStop*Point,Digits); if(SL>=OOP+TrailingStart*Point && (TrallB==0 || TrallB+TrailingStep*Point<SL)) TrallB=SL; } } if(tip==OP_SELL) { s++; if(Stoploss!=0 && Ask>=OOP + Stoploss * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;} if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point) {if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE)) continue;} TicketS=OrderTicket(); if(TrailingStop>0) { SL=NormalizeDouble(Ask+TrailingStop*Point,Digits); if(SL<=OOP-TrailingStart*Point && (TrallS==0 || TrallS-TrailingStep*Point>SL)) TrallS=SL; } } } } } Здравствуйте! А есть те, кто сможет помочь тралл поправить на общий профит? Изменено 5 января, 2023 пользователем Lexa000 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Al2ex3 Опубликовано 17 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 января, 2023 Здравствуйте. Как реализовать в советнике, чтобы он перестал обращал внимание на уже залокированные ордера и начинал строительство сетки заново? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 17 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 января, 2023 1 час назад, Al2ex3 сказал: Здравствуйте. Как реализовать в советнике, чтобы он перестал обращал внимание на уже залокированные ордера и начинал строительство сетки заново? Можно менять текущий магик, например. Пересчитали, убедились, что текущий магик в локе - прибавили единицу 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Al2ex3 Опубликовано 28 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 января, 2023 Прошу помочь с присоединением индикатора FXi 4 Semafor к советнику, чтобы он давал сигналы: ордера в покупки при первом появлении синей точки со звёздочкой, а ордера в продажи при первом появлении красной точки со звёздочкой. Проблема у меня в том, что не удаётся использовать буферы в их изначальном виде (Cntr+D), как н-р, со средними скользящими и др. Я по крайней мере не смог. Прошу подсказать отрезком кода, как снять данные для записи в условие открытия ордеров. FXi 4 Semafor.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 30 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 января, 2023 В 28.01.2023 в 10:40, Al2ex3 сказал: Прошу помочь с присоединением индикатора FXi 4 Semafor к советнику, чтобы он давал сигналы: ордера в покупки при первом появлении синей точки со звёздочкой, а ордера в продажи при первом появлении красной точки со звёздочкой. Проблема у меня в том, что не удаётся использовать буферы в их изначальном виде (Cntr+D), как н-р, со средними скользящими и др. Я по крайней мере не смог. Прошу подсказать отрезком кода, как снять данные для записи в условие открытия ордеров. FXi 4 Semafor.mq4 6 \u043a\u0411 · 0 загрузок Это топик обучения языку, я с удовольствием прокомментирую ваши попытки его использовать - но для этого нужно код советника, а не индикатора. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Al2ex3 Опубликовано 30 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 января, 2023 1 час назад, Rigal сказал: Это топик обучения языку, я с удовольствием прокомментирую ваши попытки его использовать - но для этого нужно код советника, а не индикатора. Вот такой советник. Необходимо вместо MACD в параметрах и в коде вставить FXi 4 Semafor. Обычные индикаторы типа Стохастика и др. я научился вставлять. А с FXi 4 Semafor уже всё перепробывал, а ордера в покупки, при первом появлении синей точки со звёздочкой, и ордера в продажи, при первом появлении красной точки со звёздочкой, не хочет открывать. Прошу показать как это сделать. 3.3 Simple martingale EA.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Rigal Опубликовано 30 января, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 30 января, 2023 Если у вас есть код, где вы вызываете этот индикатор, но у вас не работает - я бы мог подсказать, почему может не работать. А в этом коде ковыряться нет смысла - его писал кто-то, кто знает, как. По крайней мере на базовом уровне. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
BotPro Опубликовано 10 марта, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 марта, 2023 Подскажите, как в коде mql4 прописать запрет торговли конкретными парами? Ну или просто выдать разрешение советнику торговать только конкретными парами? Без вывода этого в настройки. Ссылка на сообщение Поделиться на другие сайты More sharing options...
usver73 Опубликовано 10 марта, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 марта, 2023 1 час назад, BotPro сказал: Подскажите, как в коде mql4 прописать запрет торговли конкретными парами? Ну или просто выдать разрешение советнику торговать только конкретными парами? Без вывода этого в настройки. if(Symbol() == "EURUSD" || Symbol() == "NZDCAD") return; Вставить перед проверкой сигнала на вход. Можно вставить в OnInit() и вместо break делать выгрузку советника. Не помню команду.. Изменено 10 марта, 2023 пользователем usver73 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
BotPro Опубликовано 11 марта, 2023 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 марта, 2023 Вопрос про суффикс и ТФ. 1) Достаточно ли кода ниже, чтобы советник автоматом определял наличие/отсутствие суффикса/префикса и нормально работал на парах с суфф./преф.? input string Preffix="Auto"; input string Suffix="Auto"; Инфа отсюда https://www.mql5.com/ru/articles/2564 как-то может помочь? Если да, то как? 2) Возможно ли как-то через "условие" запрета торговли на определенных парах также прописать запрет торгов на определенных ТФ? Если да, то как? Спасибо за дельные ответы Изменено 11 марта, 2023 пользователем BotPro Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти