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

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

#6676
В 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 (прописываете условие на вход);

#6677

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

#6678

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

#6679
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

#6680

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

#6681
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(....);
    }

}

 

#6682

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

#6683

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

 

#6684

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

 

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

 

#6685

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

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

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

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

#6686

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

 

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

 


    
 

 

#6687
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 не нужны.

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

#6688

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

#6689

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

#6690
15 часов назад, Roman 13 сказал:

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

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

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

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

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

	if(lastBar < iTime(NULL, NULL, 0) {
    	lastBar = iTime(NULL, NULL, 0);
        ... сюда мы попадаем один раз за свечку, на ее открытии
        ... все, что вставится тут, выполнится только на открытии свечи
        }
#6691
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

#6692

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

#6693
1 час назад, Al2ex3 сказал:

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

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

#6694

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

 

 

FXi 4 Semafor.mq411 скач.

#6695
В 28.01.2023 в 10:40, Al2ex3 сказал:

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

 

 

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

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

#6696
1 час назад, Rigal сказал:

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

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

3.3 Simple martingale EA.mq415 скач.

#6697

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

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

#6698

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

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

#6699
1 час назад, BotPro сказал:

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

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

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

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

Изменено 10 марта, 2023 пользователем usver73

#6700

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

 

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

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

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

 

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

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

 

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

 

 

 

Изменено 11 марта, 2023 пользователем BotPro

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

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