Перейти к содержанию

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


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 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 на шаг назад для определения тренда по свече. 


Так вот вопрос, как сделать так, чтобы советник открывал сделку только один раз за свечу. Очень часто так происходит, что он на текущей длинной свече закрывает позицию по трейлингу, и моментально открывает заново, т.к. условия открытия сохраняются, а свеча еще не закрылась. Таким образом весь профит улетает на таких свечах

244.png

В OnTick прописываем условие, которое соблюдается только раз в свечу:
if(Update_Time != iTime(NULL,0,0)) { //обновляем данные  раз в период (скобку не забудьте открыть)

Update_Time = iTime(NULL,0,0); //перезаписываем значение переменной для хранения времени текущей свечи

Далее, if (прописываете условие на вход);

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 5 weeks later...
  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте! Можете выложить урок MQ4 локированию хеджированию разных вариантов, математический, процентный и других вариантах. Написать как работает код, какой код работает и при каких условиях. Во всех уроках я ничего похожего не увидел, если есть, то подскажите где найти. не просто описание, а разбор всего кода.

Ссылка на сообщение
Поделиться на другие сайты

  • 3 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Всем доброго времени суток, подскажите вылезает ошибка 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 ("Ошибка модификации ордера на продажу");
      }
   }    

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
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) , прежде, чем отправлять запрос на модификацию - с тех пор, как бот купил, или продал, прошли сотни миллисекунд, цена обновилась, а советник использует предыдущее значение.

 

И непонятно, почему тейк у вас откладывается от противоположной цены? Если вы хотите тейк в Х пунктов, его нужно прибавлять-отнимать от цены открытия ордера. Это по достижении он будет исполняться по противоположной цене.

А в вашей реализации, если спред расширился - вы тейк можете пытаться позади текущей цены поставить (под ценой открытия - для покупки, над ценой открытия - для продажи).
Что в целом не запрещено, но это вряд ли то, чего вы хотите добиться

 

От противоположной стороны цены нужно проверять стоплевел.

Изменено пользователем Rigal
Ссылка на сообщение
Поделиться на другие сайты

  • 3 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте подскажите как сделать что бы сделка открывалась на открытии текущей свечи а закрывалась на открытии следующей свечи. Спасибо !

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
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(....);
    }

}

 

Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте а можно поподробнее объяснить по коду , когда сделка открывается один раз за свечу. Спасибо.

Ссылка на сообщение
Поделиться на другие сайты

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

Я не понимаю вопроса. Что именно вам подробнее объяснить? Вот же код.

 

Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите а можно применить такой код :

 

//--- вводим новую переменную (величина в секундах для 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("Ошибка открытия ордера на продажу");    
 
   } 
   

 

Ссылка на сообщение
Поделиться на другие сайты

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

Можно. Но ваша переменная потеряется на перезапуске.

Просто проверьте время открытия последнего ордера. OrderTimeOpen внутри цикла OrderSelect.

Ну и у вас не на открытии бара тогда будут открываться сделки.

открытие бара - это мой пример выше, там как раз дополнительная переменная.

Ссылка на сообщение
Поделиться на другие сайты

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

Скажите а можно применить такой код для закрытия сделки в момент открытия следующей свечи :

 

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("Ошибка  ордера на закрытие продажи");
                   }
                }
            }
          }
      } 
      
//----------------------------------------------------------------------------------------- 
    

 


    
 

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
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 не нужны.

Просто на старте свечи переберите все ордера, и если вам попадутся ваши - закрывайте

Ссылка на сообщение
Поделиться на другие сайты

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

Впрочем, повторюсь, это ровно то, что я предложил выше.

Ссылка на сообщение
Поделиться на другие сайты

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

Скажите а могу я прописать ваш код закрытия после всех ф-ий Send в конце программы, ну что бы было по порядку, с начало открытие потом закрытие и еще один вопрос:  подскажите код что бы сделка открывалась один раз за свечу, даже если условия входа сохраняются, скажем сделка закрылась по ТР, а свечка еще не закрылась  и условия сохраняются. Спасибо.

  • Facepalm 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
15 часов назад, Roman 13 сказал:

Скажите а могу я прописать ваш код закрытия после всех ф-ий Send в конце программы, ну что бы было по порядку, с начало открытие потом закрытие и еще один вопрос:  подскажите код что бы сделка открывалась один раз за свечу, даже если условия входа сохраняются, скажем сделка закрылась по ТР, а свечка еще не закрылась  и условия сохраняются. Спасибо.

Вы повторяете исходный вопрос, на который я ответил куском кода.

В этом куске на старте свечи сделки закроются и откроются.

Можно в него добавить дополнительный условий вокруг открытия и закрытия.

Но весь этот код огорожен проверкой открытия свечи, вот этой:

	if(lastBar < iTime(NULL, NULL, 0) {
    	lastBar = iTime(NULL, NULL, 0);
        ... сюда мы попадаем один раз за свечку, на ее открытии
        ... все, что вставится тут, выполнится только на открытии свечи
        }
Ссылка на сообщение
Поделиться на другие сайты

  • 4 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано
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;
                 }
              }
           }
        }
     }

Здравствуйте! А есть те, кто сможет помочь тралл поправить на общий профит?

 

 

Изменено пользователем Lexa000
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Здравствуйте. Как реализовать в советнике, чтобы он перестал обращал внимание на уже залокированные ордера и начинал строительство сетки заново?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Al2ex3 сказал:

Здравствуйте. Как реализовать в советнике, чтобы он перестал обращал внимание на уже залокированные ордера и начинал строительство сетки заново?

Можно менять текущий магик, например. Пересчитали, убедились, что текущий магик в локе - прибавили единицу

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Прошу помочь с присоединением индикатора FXi 4 Semafor к советнику, чтобы он давал сигналы: ордера в покупки при первом появлении синей точки со звёздочкой, а ордера в продажи при первом появлении красной точки со звёздочкой. Проблема у меня в том, что не удаётся использовать буферы в их изначальном виде (Cntr+D), как н-р, со средними скользящими и др. Я по крайней мере не смог. Прошу подсказать отрезком кода, как снять данные для записи в условие открытия ордеров.

 

 

FXi 4 Semafor.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 28.01.2023 в 10:40, Al2ex3 сказал:

Прошу помочь с присоединением индикатора FXi 4 Semafor к советнику, чтобы он давал сигналы: ордера в покупки при первом появлении синей точки со звёздочкой, а ордера в продажи при первом появлении красной точки со звёздочкой. Проблема у меня в том, что не удаётся использовать буферы в их изначальном виде (Cntr+D), как н-р, со средними скользящими и др. Я по крайней мере не смог. Прошу подсказать отрезком кода, как снять данные для записи в условие открытия ордеров.

 

 

FXi 4 Semafor.mq4 6 \u043a\u0411 · 0 загрузок

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

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Rigal сказал:

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

Вот такой советник. Необходимо вместо MACD в параметрах и в коде вставить FXi 4 Semafor. Обычные индикаторы типа Стохастика и др. я научился вставлять. А с FXi 4 Semafor уже всё перепробывал, а ордера в покупки, при первом появлении синей точки со звёздочкой, и ордера в продажи, при первом появлении красной точки со звёздочкой, не хочет открывать. Прошу показать как это сделать.

3.3 Simple martingale EA.mq4

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 1 month later...
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Подскажите, как в коде mql4 прописать запрет торговли конкретными парами? Ну или просто выдать разрешение советнику торговать только конкретными парами?

Без вывода этого в настройки.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, BotPro сказал:

Подскажите, как в коде mql4 прописать запрет торговли конкретными парами? Ну или просто выдать разрешение советнику торговать только конкретными парами?

Без вывода этого в настройки.

if(Symbol() == "EURUSD" ||
   Symbol() == "NZDCAD") return;

Вставить перед проверкой сигнала на вход.
Можно вставить в OnInit() и вместо break делать выгрузку советника. Не помню команду..

Изменено пользователем usver73
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Вопрос про суффикс и ТФ.

 

1) Достаточно ли кода ниже, чтобы советник автоматом определял наличие/отсутствие суффикса/префикса и нормально работал на парах с суфф./преф.?

input string Preffix="Auto";
input string Suffix="Auto";

Инфа отсюда https://www.mql5.com/ru/articles/2564 как-то может помочь? Если да, то как?

 

2) Возможно ли как-то через "условие" запрета торговли на определенных парах также прописать запрет торгов на определенных ТФ?

Если да, то как?

 

Спасибо за дельные ответы

 

 

 

Изменено пользователем BotPro
Ссылка на сообщение
Поделиться на другие сайты

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...