Спасибо большое, я сейчас отрегулировал и настроил под себя, все супер только вот есть одно НО, надо сделать так что бы на графике можно было регулировать. Что бы индикатор или советник построил уровень а дальше я уже сам мог менять на графике.
Обучение языку MQL4 под MetaTrader 4📌
От xbms, 13 апреля, 2013 в Уголок Программиста
12 минут назад, Гладиoлус сказал:Спасибо большое, я сейчас отрегулировал и настроил под себя, все супер только вот есть одно НО, надо сделать так что бы на графике можно было регулировать. Что бы индикатор или советник построил уровень а дальше я уже сам мог менять на графике.
Спасибо на форуме делается вот так:

Что касается всего остального - ну вы в ветке обучения языку, да?
То есть вы хотите научиться делать самостоятельно.
Я вам показал, куда можно копнуть - дальше дорогу осилит идущий
42 минуты назад, Rigal сказал:
Очень удобная в редакторе контекстная подсказка:

Но просто включить не спасет, конечно: советник будет на каждом тике перетаскивать туда, где ему эта линия нужна - вам, конечно, нужна какая-то ваша логика, когда эти линии рисовать и что с ними делать.
В 31.12.2021 в 17:38, Rigal сказал:
Я вот с одним не могу разобраться, я устанавливаю значения для трендовой линии ObjectCreate(...), линия не выводится на экран. Помогите пожалуйста, как вывести на экран объект?
15 часов назад, Гладиoлус сказал:
Я вот с одним не могу разобраться, я устанавливаю значения для трендовой линии ObjectCreate(...), линия не выводится на экран. Помогите пожалуйста, как вывести на экран объект?
Мы, вроде, разобрались с этим вопросом?
Вот тут:
Здраствуйте!
Что нужно добавить траллу, чтобы пошагово не по времени переводил стоп? Чтобы не зависел от тайм фрейма
void Trailing()
{
for(int i=OrdersTotal() -1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
if(OrderMagicNumber()==MagicID || MagicID==-1)
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)
{
if(OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
{
if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop * Point, Digits),0,0))
Print("Ошибка модификации ордера на покупку");
}
}
}
if(OrderType() == OP_SELL)
{
if(OrderOpenPrice() - Ask > TrailingStop * Point || OrderStopLoss() == 0)
{
if(OrderStopLoss() > Ask + (TrailingStep + TrailingStop) * Point || OrderStopLoss() == 0)
{
if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStop * Point, Digits),0,0))
Print("Ошибка модификации ордера на продажу");
}
}
}
}
}
}
}
14 минут назад, Lexa000 сказал:Что нужно добавить траллу, чтобы пошагово не по времени переводил стоп? Чтобы не зависел от тайм фрейма
приведенный фрагмент делает как раз это: тащит трал за ценой на расстоянии TrailingStop пунктов с шагом TrailingStep
7 часов назад, Rigal сказал:приведенный фрагмент делает как раз это: тащит трал за ценой на расстоянии TrailingStop пунктов с шагом TrailingStep
Но строго по м5
1 час назад, Lexa000 сказал:Но строго по м5
Значит вызывается функция трала не каждый тик, а раз в свечу
4 часа назад, Rigal сказал:ну вы привели фрагмент, который тащит трал.
Если он делает это раз в пять минут - он у вас вызывается на пятиминутном баре просто. Поставьте вызов функции первой операцией в onTick и все
Так и сделал, все тоже самое
void OnTick() { for(int i=OrdersTotal() -1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if(OrderMagicNumber()==MagicID || MagicID==-1) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID) { if(OrderType() == OP_BUY) { if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0) { if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop * Point, Digits),0,0)) Print("Ошибка модификации ордера на покупку"); //if(Trailing && TrailingStop>0 && TrailingStep<TrailingStop) } } } if(OrderType() == OP_SELL) { if(OrderOpenPrice() - Ask > TrailingStop * Point || OrderStopLoss() == 0) { if(OrderStopLoss() > Ask + (TrailingStep + TrailingStop) * Point || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStop * Point, Digits),0,0)) Print("Ошибка модификации ордера на продажу"); } } } } } }
Вроде что-то получилось, буду проверять как на графике будет работать
4 часа назад, Lexa000 сказал:if(OrderMagicNumber()==MagicID || MagicID==-1) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)
вот тут нужно либо первый if убрать совсем, либо из вторго убрать проверку мэджика.
Вместе они не имеют смысла
4 часа назад, Lexa000 сказал:if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0) { if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)
Вот тут от внешнего if тоже можно избавиться, он перекрывается вторым
15 часов назад, Rigal сказал:Вот тут от внешнего if тоже можно избавиться, он перекрывается вторым
Спасибо за совет, но пока я не умею проводить такие манипуляции, только на чужих примерах
7 часов назад, Lexa000 сказал:Спасибо за совет, но пока я не умею проводить такие манипуляции, только на чужих примерах
ну "манипуляция" в данном случае ограничивается удалением строки с if() и открывающих-закрывающих фигурных скобок, тут многолетнего опыта не требуется. Но можно все оставить, как есть, эти условия просто дублируют друг друга
2 часа назад, Rigal сказал:ну "манипуляция" в данном случае ограничивается удалением строки с if() и открывающих-закрывающих фигурных скобок, тут многолетнего опыта не требуется. Но можно все оставить, как есть, эти условия просто дублируют друг друга
Я про это знаю, после компиляции предупреждения выходят result of expression not used. В этом плане нужно что то дописывать
Поэкспериментировал по вашему совету, советник торговать стал хуже, сделки чаще закрывать в минус. Переделал все по своему

29 минут назад, Lexa000 сказал:
я не уверен, про мой ли совет вы говорите - но если про мой, то я позволю себе перефразировать, чтобы стал понятен контекст:
"вы посоветовали мне, что Х+2-2 в моих расчетах можно заменить на просто Х, я вам сказал, что я не знаю, как делать такие сложные манипуляции, но, когда попробовал, у мне стало дуть из форточки прямо в левое ухо холодным воздухом, поэтому я переделал все по-своему и не нужны мне ваши дурацкие советы"
В такой формулировке вы совершенно правы, мои советы вам ни к чему.
14 минут назад, Rigal сказал:я не уверен, про мой ли совет вы говорите - но если про мой, то я позволю себе перефразировать, чтобы стал понятен контекст:
"вы посоветовали мне, что Х+2-2 в моих расчетах можно заменить на просто Х, я вам сказал, что я не знаю, как делать такие сложные манипуляции, но, когда попробовал, у мне стало дуть из форточки прямо в левое ухо холодным воздухом, поэтому я переделал все по-своему и не нужны мне ваши дурацкие советы"
В такой формулировке вы совершенно правы, мои советы вам ни к чему.
Не правильно перефразировали. Экспериментировал ведь я. а не вы. Вы могли бы все сделать по своему, и результат возможно был другой. У меня опыта почти нет, и возможно где то что-то пропустил
Здраствуйте! Можете подсказать, если советник написан без множителя и дистанции, как можно добаваить ту и другую функцию?
Заранее спасибо
void CheckMartingale() { //функция анализа ордеров мартингейла ZeroMemory(env); //обнуляем данные структуры int _OrdersTotal = OrdersTotal(); for(int pos = _OrdersTotal - 1; pos >= 0; pos--) { if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { Print(__FUNCTION__ + ": не удалось выделить ордер! " + ErrorDescription(GetLastError())); continue; } if(OrderType() <= 2 && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY) { env.count_buy++; if(env.firstlotB == 0 || OrderLots() < env.firstlotB) env.firstlotB = OrderLots(); if(OrderOpenTime() > env.lasttimeB) { env.lasttimeB = OrderOpenTime(); env.last_distanceB = OrderOpenPrice()-Ask; env.lastlotB = OrderLots(); } } else if(OrderType() == OP_SELL) { env.count_sell++; if(env.firstlotS == 0 || OrderLots() < env.firstlotS) env.firstlotS = OrderLots(); if(OrderOpenTime() > env.lasttimeS) { env.lasttimeS = OrderOpenTime(); env.last_distanceS = Bid-OrderOpenPrice(); env.lastlotS = OrderLots(); } } } } if(env.last_distanceB != 0 || env.last_distanceS != 0) { //если есть открытые ордера if(env.lasttimeB > 0 && env.last_distanceB >= GridDistance*Point) { if(OpenTrade(OP_BUY,Multiplier)) { //Открытие следующего ордера сетки на покупку env.count_buy++; //прибавление ордера к счетчику Modify_grid(OP_BUY); //модификация целей ордера после открытия } } if(env.lasttimeS > 0 && env.last_distanceS >= GridDistance*Point) { if(OpenTrade(OP_SELL,Multiplier)) { //Открытие следующего ордера сетки на продажу env.count_sell++; //прибавление ордера к счетчику Modify_grid(OP_SELL); //модификация целей ордера после открытия } } } } //================================================================ double GetLots() { double lot; double minlot=MarketInfo(Symbol(),MODE_MINLOT); double maxlot=MarketInfo(Symbol(),MODE_MAXLOT); if(risk!=0) { lot=NormalizeDouble(AccountBalance()*risk/100/10000,2); if(lot<minlot) lot=minlot; if(lot>maxlot) lot=maxlot; } else lot=LOTS; return(lot);
Вот такой код как можно переделать?
4 часа назад, Lexa000 сказал:void CheckMartingale() { //функция анализа ордеров мартингейла ZeroMemory(env); //обнуляем данные структуры int _OrdersTotal = OrdersTotal(); for(int pos = _OrdersTotal - 1; pos >= 0; pos--) { if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) { Print(__FUNCTION__ + ": не удалось выделить ордер! " + ErrorDescription(GetLastError())); continue; } if(OrderType() <= 2 && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { if(OrderType() == OP_BUY) { env.count_buy++; if(env.firstlotB == 0 || OrderLots() < env.firstlotB) env.firstlotB = OrderLots(); if(OrderOpenTime() > env.lasttimeB) { env.lasttimeB = OrderOpenTime(); env.last_distanceB = OrderOpenPrice()-Ask; env.lastlotB = OrderLots(); } } else if(OrderType() == OP_SELL) { env.count_sell++; if(env.firstlotS == 0 || OrderLots() < env.firstlotS) env.firstlotS = OrderLots(); if(OrderOpenTime() > env.lasttimeS) { env.lasttimeS = OrderOpenTime(); env.last_distanceS = Bid-OrderOpenPrice(); env.lastlotS = OrderLots(); } } } } if(env.last_distanceB != 0 || env.last_distanceS != 0) { //если есть открытые ордера if(env.lasttimeB > 0 && env.last_distanceB >= GridDistance*Point) { if(OpenTrade(OP_BUY,Multiplier)) { //Открытие следующего ордера сетки на покупку env.count_buy++; //прибавление ордера к счетчику Modify_grid(OP_BUY); //модификация целей ордера после открытия } } if(env.lasttimeS > 0 && env.last_distanceS >= GridDistance*Point) { if(OpenTrade(OP_SELL,Multiplier)) { //Открытие следующего ордера сетки на продажу env.count_sell++; //прибавление ордера к счетчику Modify_grid(OP_SELL); //модификация целей ордера после открытия } } } } //================================================================ double GetLots() { double lot; double minlot=MarketInfo(Symbol(),MODE_MINLOT); double maxlot=MarketInfo(Symbol(),MODE_MAXLOT); if(risk!=0) { lot=NormalizeDouble(AccountBalance()*risk/100/10000,2); if(lot<minlot) lot=minlot; if(lot>maxlot) lot=maxlot; } else lot=LOTS; return(lot);Вот такой код как можно переделать?
Спасибо, уже не надо
Добрый день уважаемые форумчане. Я с такой просьбой к Вам, собрал сову (первую в жизни, немного даже стал код понимать) а она гадина миллионы не приносит, даже в тестере ( не понимает она что боковике надо торговать в канале, а на тренде по тренду), но это так лирика. А просьба у меня к Вам вот какая. Нужна функция которая посчитает убытки и когда их сума станет например 120п (или больше на случай если спасательный ордер перейдет на сторону лосей), посчитала бы сумму убытка увеличила лот и выставила тейк отличный от обычного ну и открыла сделку по условиям совы. К примеру накопились убытки на 120п лот 0.1, функция увеличивает лот до 0.4 и ставит тп 30п. лот, тейк и сумму убытков во внешние хочу вынести чтоб оптимизировать можно было, если 5 сделка минусанет например 20п, то счетчик увеличивается до 20*4+120=200п а лот в 2 раза и дальше в случае минусов в 2раза. Взять последний убыток и увеличить лот я могу, но убытков бывает несколько, пусть и не больших, а если каждый убыток увеличивать лот, приходит слив. Интересно такой подход быстро сольет счет. Пытался решить проблему сам, никак, не дорос до уровня! Заранее спасибо!
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем
