Не работает перевод в безубыток MQL4

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nikolai_korzhok
61
Nikolai_korzhok  

Пишу советника, хочу чтобы переводил открытую позицию в безубыток, если цена прошла от цены открытия ордера указанное число пунктов. Перечитал тут все ветки по этой теме, вроде и делаю все, как показано в примерах и в справке, но не работает и все. Выдает только такое предупреждение когда пишу ticket вместо OrderTicket() : possible loss of data due to type conversion sample. Пробовал так:

if(OrderSelect(OrderTicket(), SELECT_BY_POS,MODE_TRADES))
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
      if(NormalizeDouble(Ask - OrderOpenPrice(), _Digits)>=NormalizeDouble(650*Point,_Digits))
         if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(1*Point,_Digits),OrderTakeProfit(),0, clrBlue))
            Print("Ордер в Б.У. не переведен");

потом так:

if(CountBuy() ==0)
     {
      //условия на покупку
      /*стоп лосс в 2 условиях{
       sl = NormalizeDouble(Low[6] - 5*Point, 5);  //Рассчет стопа для продаж
       if(NormalizeDouble(Ask - sl,5)>=NormalizeDouble(StopLoss*Point,5))
         {
          sl=NormalizeDouble(Ask - StopLoss*Point, 5);
         }*/
      tp = NormalizeDouble(Ask + TakeProfit*Point, 5);  //Рассчет тейка для продаж);
      ticket= OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, sl, tp, "С1 БАЙ", Magic, 0, clrBlue);


      if(ticket> 0)
        {
         //Модифицируем ордер:
         if(OrderSelect(ticket, SELECT_BY_POS))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
              {
               if(Bid - OrderOpenPrice()>NormalizeDouble(650*Point,_Digits))
                 {
                  if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice(),5)+NormalizeDouble(1*Point,5),OrderTakeProfit(),0,clrNONE))
                     Print("Ордер в Б.У. не переведен");
                 }
              }
           }
        }
     }
tp = NormalizeDouble(Ask + TakeProfit*Point, 5);  //Рассчет тейка для продаж);
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, sl, tp, "С1 БАЙ", Magic, 0, clrBlue);
if(ticket > 0)
  {
//Модифицируем ордер:
   if(OrderSelect(ticket, SELECT_BY_TICKET))
     {
      if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
        {
         if(NormalizeDouble(Ask - OrderOpenPrice(), _Digits)>=NormalizeDouble(650*Point,_Digits))
           {
            if(!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(1*Point,_Digits),OrderTakeProfit(),0, clrBlue))
               Print("Ордер в Б.У. не переведен");
           }
        }
     }
Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Ihor Herasko
21795
Ihor Herasko  
Nikolai_korzhok:

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

Видимо, нет понимания, что Вы пишите. Угадать здесь не получится.

Начните с малого. Разберите хотя бы первую строку, которую приводите. Уже в ней ошибка. Причем это не опечатка, а именно не понимание того, что пишете:

if(OrderSelect(OrderTicket(), SELECT_BY_POS,MODE_TRADES))

Откройте справку по функции OrderSelect() и почитайте, что означает каждый из ее аргументов. Если не поймете, спросите, поставив прямой вопрос о том, что именно не понятно.

Nikolai_korzhok
61
Nikolai_korzhok  
Ihor Herasko:

Видимо, нет понимания, что Вы пишите. Угадать здесь не получится.

Начните с малого. Разберите хотя бы первую строку, которую приводите. Уже в ней ошибка. Причем это не опечатка, а именно не понимание того, что пишете:

Откройте справку по функции OrderSelect() и почитайте, что означает каждый из ее аргументов. Если не поймете, спросите, поставив прямой вопрос о том, что именно не понятно.

Да, Я только осваиваю язык, поэтому и задаю тут вопросы и не понимаю в чем ошибка в первой строке
Ihor Herasko
21795
Ihor Herasko  
Nikolai_korzhok:
Да, Я только осваиваю язык, поэтому и задаю тут вопросы и не понимаю в чем ошибка в первой строке

Прочитайте справку по функции OrderSelect() и задайте прямой вопрос.

Nikolai_korzhok
61
Nikolai_korzhok  
Ihor Herasko:

Прочитайте справку по функции OrderSelect() и задайте прямой вопрос.

Я пишу в MQL4. Я не понимаю, что там надо писать. Я делаю так, как указано в других советниках или видео. Я писал туда и ticket и OrderTicket() и просто числа -не работает. Причем , что в советнике с видео обучения код такой и ордер модифицируется:

 if(CountBuy() == 0 && Ask <= PriceLow)
     {
      ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
      if(ticket > 0)
        {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

         if(OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка модификации ордера на покупку!");
        }
      else
         Print("Ошибка открытия ордера на покупку!");
     }
Ihor Herasko
21795
Ihor Herasko  
Nikolai_korzhok:

Я не понимаю, что там надо писать.

Так дело с мертвой точки не сдвинется. Невозможно что-то делать правильно, не понимая, что и как следует делать. Выход только один - разбираться. Если желания разбираться нет, то и писать код самому не стоит. В этом случае обращайтесь во Фриланс.

Nikolai_korzhok
61
Nikolai_korzhok  
Ihor Herasko:

Так дело с мертвой точки не сдвинется. Невозможно что-то делать правильно, не понимая, что и как следует делать. Выход только один - разбираться. Если желания разбираться нет, то и писать код самому не стоит. В этом случае обращайтесь во Фриланс.

Так я и не спорю, я для этого и задал вопрос, чтобы разобраться. Просто как разбираться?! Для меня разумнее всего задать вопрос тут. методом тыка у меня не получилось, посмотреть видео и сделать примерно как там- тоже, в справке если бы тоже было бы все понятно для меня- я бы не задал вопрос тут.
FXwin
755
FXwin  
Nikolai_korzhok:
Так я и не спорю, я для этого и задал вопрос, чтобы разобраться. Просто как разбираться?! 

Рекомендую не просто воткнуть в код, а разобраться что было не правильно в своём творчестве

extern int NoLoss  = 20;  //Безубыток (=0 откл) 
extern int NLstart = 150; //Старт безубытка

double Stoplevel;

void OnTick() 
  {
   double OSL,OOP,Sl;
   int    OT,OTicket;
   Stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);

   if(NoLoss!=0){
   for (int i=0; i<OrdersTotal(); i++) 
   if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { 
       OT  = OrderType(); 
       OSL = NormalizeDouble(OrderStopLoss(),Digits);
       OOP = NormalizeDouble(OrderOpenPrice(),Digits);
       Sl=OSL;

   if (OT==OP_BUY) {  
       if ((Bid-OOP)/Point>=NLstart) Sl=NormalizeDouble(OOP+NoLoss*Point,Digits);
       if ((Sl!=OSL||OSL==0.0) && Sl<=NormalizeDouble(Bid-Stoplevel*Point,Digits)){  
           OTicket=OrderTicket();
       if (!OrderModify(OTicket,OOP,Sl,OrderTakeProfit(),0,DarkGray)) Print("Error OrderModify BUY ",GetLastError());}
          }                                         
   if (OT==OP_SELL) {
       if ((OOP-Ask)/Point>=NLstart) Sl=NormalizeDouble(OOP-NoLoss*Point,Digits);
       if ((Sl!=OSL||OSL==0.0) && Sl>=NormalizeDouble(Ask+Stoplevel*Point,Digits)){  
           OTicket=OrderTicket();
       if (!OrderModify(OTicket,OOP,Sl,OrderTakeProfit(),0,DarkGray)) Print("Error OrderModify SELL ",GetLastError());}
          }
       } 
    }   
}//OnTick END
Nikolai_korzhok
61
Nikolai_korzhok  
Всем спасибо, почитал еще, потом написал так, и все заработало .
 for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
              {
               if(Bid - OrderOpenPrice()>NormalizeDouble(650*Point,_Digits))
                 {
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NormalizeDouble(1*Point,5),OrderTakeProfit(),0,clrNONE))
                     Print("Ордер в Б.У. не переведен");
                 }
              }
           }
     }  
Вот тут был отличный пример с описанием for, и после этого стало понятно, что куда писать) https://www.mql5.com/ru/forum/100201/page2
Объясните мне зачем и почему (про OrderSelect())
Объясните мне зачем и почему (про OrderSelect())
  • 2008.04.17
  • www.mql5.com
1. ЗАЧЕМ проверять успешость выполнения функции OrderSelect()? 2. ПОЧЕМУ она может быть выполнена неуспешно...
FXwin
755
FXwin  
Nikolai_korzhok:
Всем спасибо, почитал еще, потом написал так, и все заработало 

Чуть поправлю

 for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
              {
               if((Bid - OrderOpenPrice())/Point > 650)
                 {
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE))
                     Print("ОШИБКА: Ордер BUY в Б/У не переведен, причина "+GetLastError());
                 }
              }
          }
     }  

1. Получить пункты можно и без Digits знаков после запятой 

2. Нормализовать надо всю полученную цену и 1*Point это мало, в итоге закроется с минусом, желательно брать этот кусок равным спреду,
например если спред 10 то лучше с запасом указать 15 из-за проскальзывания цены во время закрытия чтобы не получить минус вместо БУ

3. Если есть ошибка модификации, то лучше её знать чтобы с ней потом бороться 

Alexandr Gavrilin
43543
Alexandr Gavrilin  
Воспользуйтесь поиском на форуме, в библиотеке куча решений, возьмите и посмотрите как работает. Используйте чужое решение либо перепишите на свой стиль.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий