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

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

#6576

Спасибо большое, я сейчас отрегулировал и настроил под себя, все супер только вот есть одно НО, надо сделать так что бы на графике можно было регулировать. Что бы индикатор или советник построил уровень а дальше я уже сам мог менять на графике.

#6577
12 минут назад, Гладиoлус сказал:

Спасибо большое, я сейчас отрегулировал и настроил под себя, все супер только вот есть одно НО, надо сделать так что бы на графике можно было регулировать. Что бы индикатор или советник построил уровень а дальше я уже сам мог менять на графике.

Спасибо на форуме делается вот так:

image.png.bd4bb0c3c76e11ed377e1a89d9ac8c59.png

 

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

То есть вы хотите научиться делать самостоятельно.

Я вам показал, куда можно копнуть - дальше дорогу осилит идущий

#6578
42 минуты назад, Rigal сказал:

Спасибо на форуме делается вот так:

image.png.bd4bb0c3c76e11ed377e1a89d9ac8c59.png

 

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

То есть вы хотите научиться делать самостоятельно.

Я вам показал, куда можно копнуть - дальше дорогу осилит идущий

Очень удобная в редакторе контекстная подсказка:

image.png.267d676c74e4b611ae84ea7398b77241.png

 

Но просто включить не спасет, конечно: советник будет на каждом тике перетаскивать туда, где ему эта линия нужна - вам, конечно, нужна какая-то ваша логика, когда эти линии рисовать и что с ними делать.

 

#6579

 

В 31.12.2021 в 17:38, Rigal сказал:

Очень удобная в редакторе контекстная подсказка:

image.png.267d676c74e4b611ae84ea7398b77241.png

 

Но просто включить не спасет, конечно: советник будет на каждом тике перетаскивать туда, где ему эта линия нужна - вам, конечно, нужна какая-то ваша логика, когда эти линии рисовать и что с ними делать.

 

Я вот с одним не могу разобраться, я устанавливаю значения для трендовой линии ObjectCreate(...), линия не выводится на экран. Помогите пожалуйста, как вывести на экран объект?

#6580
15 часов назад, Гладиoлус сказал:

 

Я вот с одним не могу разобраться, я устанавливаю значения для трендовой линии ObjectCreate(...), линия не выводится на экран. Помогите пожалуйста, как вывести на экран объект?

Мы, вроде, разобрались с этим вопросом?

Вот тут:

 

#6581

Здраствуйте!

Что нужно добавить траллу, чтобы пошагово не по времени переводил стоп? Чтобы не зависел от тайм фрейма

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("Ошибка модификации ордера на продажу");

                    }
                 }
              }
           }
        }
     }

  }

 

#6582
14 минут назад, Lexa000 сказал:

Что нужно добавить траллу, чтобы пошагово не по времени переводил стоп? Чтобы не зависел от тайм фрейма

приведенный фрагмент делает как раз это: тащит трал за ценой на расстоянии TrailingStop пунктов с шагом TrailingStep

#6583
7 часов назад, Rigal сказал:

приведенный фрагмент делает как раз это: тащит трал за ценой на расстоянии TrailingStop пунктов с шагом TrailingStep

image.png.09c6c59329e6b48ddea109fef0847677.pngНо строго по м5

#6584

Модификация трала 

7BB63D71-D716-4D0F-9E87-5CDFDFFD5366.jpeg

#6585
1 час назад, Lexa000 сказал:

Но строго по м5

Значит вызывается функция трала не каждый тик, а раз в свечу

#6586
4 часа назад, Lexa000 сказал:

image.png.09c6c59329e6b48ddea109fef0847677.pngНо строго по м5

ну вы привели фрагмент, который тащит трал.

Если он делает это раз в пять минут - он у вас вызывается на пятиминутном баре просто. Поставьте вызов функции первой операцией в onTick и все

 

#6587
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("Ошибка модификации ордера на продажу");
                       }
                    }
                 }
              }
           }
     }

 

#6588

Вроде что-то получилось, буду проверять как на графике будет работать 

#6589
4 часа назад, Lexa000 сказал:
         if(OrderMagicNumber()==MagicID || MagicID==-1)
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)

вот тут нужно либо первый if убрать совсем, либо из вторго убрать проверку мэджика. 

Вместе они не имеют смысла

#6590
4 часа назад, Lexa000 сказал:
 if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
                    {
                     if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)

Вот тут от внешнего if тоже можно избавиться, он перекрывается вторым

#6591
15 часов назад, Rigal сказал:

Вот тут от внешнего if тоже можно избавиться, он перекрывается вторым

Спасибо за совет, но пока я не умею проводить такие манипуляции, только на чужих примерах 

#6592
7 часов назад, Lexa000 сказал:

Спасибо за совет, но пока я не умею проводить такие манипуляции, только на чужих примерах 

ну "манипуляция" в данном случае ограничивается удалением строки с if() и открывающих-закрывающих фигурных скобок, тут многолетнего опыта не требуется. Но можно все оставить, как есть, эти условия просто дублируют друг друга

#6593
2 часа назад, Rigal сказал:

ну "манипуляция" в данном случае ограничивается удалением строки с if() и открывающих-закрывающих фигурных скобок, тут многолетнего опыта не требуется. Но можно все оставить, как есть, эти условия просто дублируют друг друга

Я про это знаю, после компиляции предупреждения выходят result of expression not used. В этом плане нужно что то дописывать 

#6594

Поэкспериментировал по вашему совету, советник торговать стал хуже, сделки чаще закрывать в минус. Переделал все по своемуimage.png.b477ee88c984ba16a05517a81ce843ff.pngimage.png.6a828007723121707ab54e1d0d11b348.png

#6595
29 минут назад, Lexa000 сказал:

Поэкспериментировал по вашему совету, советник торговать стал хуже, сделки чаще закрывать в минус. Переделал все по своемуimage.png.b477ee88c984ba16a05517a81ce843ff.pngimage.png.6a828007723121707ab54e1d0d11b348.png

я не уверен, про мой ли совет вы говорите - но если про мой, то я позволю себе перефразировать, чтобы стал понятен контекст:

"вы посоветовали мне, что Х+2-2 в моих расчетах можно заменить на просто Х, я вам сказал, что я не знаю, как делать такие сложные манипуляции, но, когда попробовал, у мне стало дуть из форточки прямо в левое ухо холодным воздухом, поэтому я переделал все по-своему и не нужны мне ваши дурацкие советы"

 

В такой формулировке вы совершенно правы, мои советы вам ни к чему.

#6596
14 минут назад, Rigal сказал:

я не уверен, про мой ли совет вы говорите - но если про мой, то я позволю себе перефразировать, чтобы стал понятен контекст:

"вы посоветовали мне, что Х+2-2 в моих расчетах можно заменить на просто Х, я вам сказал, что я не знаю, как делать такие сложные манипуляции, но, когда попробовал, у мне стало дуть из форточки прямо в левое ухо холодным воздухом, поэтому я переделал все по-своему и не нужны мне ваши дурацкие советы"

 

В такой формулировке вы совершенно правы, мои советы вам ни к чему.

Не правильно перефразировали. Экспериментировал ведь я. а не вы. Вы могли бы все сделать по своему, и результат возможно был другой. У меня опыта почти нет, и возможно где то что-то пропустил

#6597

Здраствуйте! Можете подсказать, если советник написан без множителя и дистанции, как можно добаваить ту и другую функцию?

Заранее спасибо

#6598
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);             

Вот такой код как можно переделать?

#6599
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);             

Вот такой код как можно переделать?

Спасибо, уже не надо

#6600

Добрый день уважаемые форумчане. Я  с такой просьбой к Вам, собрал сову (первую в жизни, немного даже стал код понимать) а она гадина миллионы не приносит, даже в тестере ( не понимает она что  боковике надо торговать в канале, а на тренде по тренду), но это так лирика. А просьба у меня к Вам вот какая. Нужна функция которая посчитает убытки и когда их сума станет например 120п (или больше на случай если спасательный ордер перейдет на сторону лосей), посчитала бы сумму убытка увеличила лот и выставила тейк отличный от обычного  ну и открыла сделку по условиям совы. К примеру накопились убытки на 120п лот 0.1, функция увеличивает лот до 0.4 и ставит тп 30п. лот, тейк и сумму убытков во внешние хочу вынести чтоб оптимизировать можно было, если 5 сделка минусанет например 20п, то счетчик увеличивается до 20*4+120=200п а лот в 2 раза и дальше в случае минусов в 2раза.  Взять последний убыток и увеличить лот я могу, но убытков бывает несколько, пусть и не больших, а если каждый убыток увеличивать лот, приходит слив. Интересно такой подход быстро сольет счет. Пытался решить проблему сам, никак, не дорос до уровня! Заранее спасибо!

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

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