Кто может помочь с безубытком? (MQL4)

 

Всем привет, в первые пишу на этом форуме, надеюсь найдутся желающие помочь)

Написал советник, но нужно, чтобы после прохождения цены от точки входа на 100 пунктов, робот ставил безубыток 50 пунктов в плюс от точки входа (и не менялся).

Вот сам код:

   
   double X1;
          X1 = Resist_Line1 - 100 * Point;
   
   if (Ask > Support_Line1 && Ask <X1 ) //----Первый канал для торговли----//
         
      
      {  
          double stoploss1 = Low[3];
          double takeprofit1 = Resist_Line1;   

  int ticket1;
  
  ticket1 = OrderSend 
  ("", OP_BUY, Lots, Ask, 3, stoploss1, takeprofit1, "", 111, 0, Red);   //Открытие ордера
          //--------Здесь будет безубыток---------------------------------------   
 

Думал делать так, но нихера не получилось...


if (Ask > OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES)+ 100*Point )//Перевод в Безубыток
      {
   bool  slb1 = OrderModify (ticket1, OrderOpenPrice(), Ask-50*Point, OrderTakeProfit(), 0,Red );
         
      }

В общем рак в программировании) 

Надеюсь на вашу помощь)

 
Yaroslav Brik:

Думал делать так, но нихера не получилось...

if (Ask > OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES)+ 100*Point )//Перевод в Безубыток
      {
   bool  slb1 = OrderModify (ticket1, OrderOpenPrice(), Ask-50*Point, OrderTakeProfit(), 0,Red );
         
      }


В общем рак в программировании) 

Надеюсь на вашу помощь)

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

Лучше уж так хоть:

if (OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES))
    {
       if (Ask - OrderOpenPrice() > 100*Point)
           {
              bool  slb1 = OrderModify (ticket1, OrderOpenPrice(), OrderOpenPrice()+50*Point, OrderTakeProfit(), 0,Red );
           }
    }
P.S.
Вообще, я бы еще перенес проверку в отдельный блок и через OrderType() менял условия проверки в зависимости от типа ордера (если у вас, конечно, ордеры в обе стороны открываются).
 

//Получаем тикет ордера для Без убытка

OrderSelect(OrderTicket,SELECT_BY_POS,MODE_TRADES);  

      {

//Проверили профит по ордеру больше нуля или нет, можно не проверять.

      if (OrderProfit()>0) 
         {

//Узнали тип ордера покупка или продажа

         if (OrderType()==OP_SELL)
            {
      
            double CurrentPoint = (OrderOpenPrice()-Ask)/(_Point);
            if (CurrentPoint>=1000)
                  {

//Тянем SL  в БУ + 50 пунктов по 5 знаку

                   OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-500*Point,OrderTakeProfit(),0,clrWhite);
                  }
            }
            if (OrderType()==OP_BUY)
            {
       
            double CurrentPoint = (Bid-OrderOpenPrice())/(_Point);
            if (CurrentPoint>=1000)
                  {

//Тянем SL  в БУ + 50 пунктов по 5 знаку

                   OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+500*Point,OrderTakeProfit(),0,clrWhite);
                  }
            }  
          }
 
Yaroslav Brik:

Всем привет, в первые пишу на этом форуме, надеюсь найдутся желающие помочь)

Написал советник, но нужно, чтобы после прохождения цены от точки входа на 100 пунктов, робот ставил безубыток 50 пунктов в плюс от точки входа (и не менялся).

Получив 100 пунктов прибыли, надо сразу закрывать... Зачем же ждать, когда останется 50 ?

 
STARIJ:

Получив 100 пунктов прибыли, надо сразу закрывать... Зачем же ждать, когда останется 50 ?

100 пунктов по 5му знаку имел в виду. Это мало

 
Yaroslav Brik:

100 пунктов по 5му знаку имел в виду. Это мало

50 пунктов еще меньше. Опробуйте в тестере тот и другой вариант
 

Ребята подскажите пож. как записать в коде советника чтобы при едино разовом  выполнении условия советник открывал 3 сделки сразу с возможностью установки LS?

Вот моё условие

if(MA_1>MA_2)
ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
if(MA_1<MA_2)
ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Мне советовали использовать функцию ( OrdersTotal() ) но она не подходит в моём случае. Я записал так

void OnTick()
  {
//---
   double MA_1;
   MA_1=iMA(_Symbol,0,1,0,1,0,0);
   double MA_2;
   MA_2=iMA(_Symbol,0,6,0,1,0,0);
   int ticket=0;
   if(OrdersTotal()<=3)
     {
      if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);
     }
//---
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

Компилируется ошибок нет но это не для моего случая данная функция.

 
Seric29:

Ребята подскажите пож. как записать в коде советника чтобы при едино разовом  выполнении условия советник открывал 3 сделки сразу с возможностью установки LS?

Вот моё условие

Мне советовали использовать функцию ( OrdersTotal() ) но она не подходит в моём случае. Я записал так

Компилируется ошибок нет но это не для моего случая данная функция.

 попробуй просто так вставить:


if (OrdersTotal()>= 3) // Если общее количество ордеров больше 3х
   {
     return; //задача закрывается
   }
 
Yaroslav Brik:

 попробуй просто так вставить:


Если я открываю позицию после выполнения условия

if(MA_1>MA_2)
         ticket=OrderSend(_Symbol,OP_BUY,Lots,Ask,0,Ask-SL*Point,Bid+TP*Point,NULL,0,0,clrGreen);
      if(MA_1<MA_2)
         ticket=OrderSend(_Symbol,OP_SELL,Lots,Bid,0,Bid+SL*Point,Ask-TP*Point,NULL,0,0,clrRed);

Это означает что во-первых после выполнения условия в реальном времени советник открывает сделки т. е. бесконечно поэтому я задал вопрос "при едино разовом  выполнении условия советник открывал 3 сделки"

во-вторых если и будет открыто 3 сделки сразу то также будут выставлены стоп ордера а это означает наличие 6 ордеров в реальном времени поэтому к функции OrdersTotal должно что-то быть ещё так как она просто учитывает ордера. У меня есть этот код но мне немного не понятно.


Можете объяснить формулировку кода?

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  // для чего эта переменная
   int ticket=0;
   if(buy) 
     {
      while(i<orders) // здесь эта переменная используется чтобы сравнивать ордера или для чего
        {
         RefreshRates(); // если убрать эту функцию коду хуже не становится
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //здесь понятно
         if(ticket!=-1) // эта строчка тоже не понятна
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // функция для выбора ордера это логично но тоже не понятно как ей пользоваться
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // эту строчку тоже хотел бы чтобы объяснили
              }
           }
         i++; // что увеличивается на оду единицу это относится к магическому номеру ордера чтобы программа понимала что у неё есть ордера
        }
     }
   i=0;
   if(sell) // прошлая запись была для покупак эта для продаж 
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }  
 
Seric29:

Если я открываю позицию после выполнения условия

Это означает что во-первых после выполнения условия в реальном времени советник открывает сделки т. е. бесконечно поэтому я задал вопрос "при едино разовом  выполнении условия советник открывал 3 сделки"

во-вторых если и будет открыто 3 сделки сразу то также будут выставлены стоп ордера а это означает наличие 6 ордеров в реальном времени поэтому к функции OrdersTotal должно что-то быть ещё так как она просто учитывает ордера. У меня есть этот код но мне немного не понятно.


Можете объяснить формулировку кода?

#property copyright "Влад Сергеев для mmgp" 
#property version   "1.00" 
#property strict 
#property script_show_inputs 

input int      orders = 4;      //всего ордеров в серии 
input bool     buy = true;      //флаг разрешающий/запрещающий покупки 
input bool     sell = false;    //флаг разрешающий/запрещающий продажи 
input int      magic = 100500;  //уникальный номер для ордеров, открываемых этим скриптом 
input double   lot = 0.01;      //объем каждого ордера серии 
input int      tp = 100;        //тейк профит, в пунктах 
input int      sl = 100;        //стоп лосс, в пунктах 
input int      slip = 2;        //допустимое проскальзывание на открытии, в пунктах (для ECN, где открытие по рынку - игнор) 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int i=0;  //эта переменная будет считать кол-во открываемых позиций 
   int ticket=0;
   if(buy) //если покупки разрешены
     {
      while(i<orders) // ордера buy будут открываться до количества равного orders
        {
         RefreshRates(); // Эта функция используется, когда эксперт или скрипт производит вычисления в течение долгого времени и нуждается в обновленных данных. 
         ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slip,0,0,"",magic,0,clrBlue); //запоминаем номер тикета открывшегося ордера
         if(ticket!=-1) // если ордер на покупку открылся(если -1 тогда не открылся)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  // если только что открытый ордер выбрался для дальнейшей работы с ним
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-sl*Point,Digits),NormalizeDouble(OrderOpenPrice()+tp*Point,Digits),0,clrBlue);
               // модифицируется только что открытый ордер(установка стоплосса и тейкпрофита)
              }
           }
         i++; // +один ордер идём наверх и проверяем условие i<orders
        }
     }
   i=0;//обнуляем счётчик и делаем всё как и с buy
   if(sell) //
     {
      while(i<orders) 
        {
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slip,0,0,"",magic,0,clrRed);
         if(ticket!=-1) 
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))  
              {
               OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+sl*Point,Digits),NormalizeDouble(OrderOpenPrice()-tp*Point,Digits),0,clrRed);
              }
           }
         i++;
        }
     }
  }
Причина обращения: