Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2470

 
ANDREY #:

Спасибо. Но в этом случае ( в вашем коде) одно и то же  ДЕЙСТВИЕ прописано в коде 2 раза. А мне бы сделать так что бы ДЕЙСТВИЕ было прописано только 1 раз..... если конечно язык позволяет. А Ваш вариант я привел в своем примере, только без  else

If (x > 0 && z > 0 || x < 0) { y = 10; }
 
ANDREY #:

Спасибо. Но в этом случае ( в вашем коде) одно и то же  ДЕЙСТВИЕ прописано в коде 2 раза. А мне бы сделать так что бы ДЕЙСТВИЕ было прописано только 1 раз..... если конечно язык позволяет. А Ваш вариант я привел в своем примере, только без  else

Похоже Вы не понимаете как работает "else"

"else" не вызывает никаких дополнительных действий, а выдает результат если "if" не выдал.

 
Все понял. Всем спасибо.
 
Andrei Iakovlev #:

У меня вопрос про ArraySort.

Нулевое измерение - это первый (нулевой) столбец? Что такое вообще измерение у массива?

Одномерный массив: array[ ];

Двумерный массив: array[ ][ ];

Трёхмерный массив array[ ][ ][ ];

Первое, второе, третье измерения помечены цветом.

Про нулевое измерение не слышал :)

ЗЫ. И зачем было удалять...

 
Andrei Iakovlev #:
Подумал что тема не та

Да, действительно. Сюда перенёс.

 
Andrei Iakovlev #:
Что такое измерение?
Почитайте в учебнике: https://www.mql5.com/ru/book/basis/arrays/arrays_overview
Учебник по MQL5: Основы программирования / Массивы / Характеристики массивов
Учебник по MQL5: Основы программирования / Массивы / Характеристики массивов
  • www.mql5.com
Прежде чем приступать к изложению синтаксических особенностей объявления и приемов работы с массивами в MQL5, затронем базовые концептуальные...
 

Ребята требуется помощь.

Я с хедж счетами работал только в далеком 2015 году на мт4, в МТ5 тут понадобилось сделать универсальность и возникла проблема с тейк профитами.

Смотрите логика:

Открываем Бай Селл

Робот подхватывает позиции, сомотрит что на них нет ТП и выставляет им ТП.

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

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


input  int                TakeProfit         = 100;               // »|     > 0 - Тейк профит
input  int                NTakeProfit        = 50;                // »|     > 0 - Тейк профит 2


m_take_profit              = TakeProfit                  * m_symbol.Point();
m_ntake_profit            = NTakeProfit                * m_symbol.Point();


//+------------------------------------------------------------------+
//| Метод установки   TP                                             |
//+------------------------------------------------------------------+
void TakeMetod()
  {
   int    total_position  =0;
 //---
   int      count_buys           = 0;
   double   volume_buys          = 0.0;
   double   tp_buy               = 0.0;
   double   volume_biggest_buys  = 0.0;
   int      count_sells          = 0;
   double   volume_sells         = 0.0;
   double   tp_sell              = 0.0;
   double   volume_biggest_sells = 0.0;
   CalculateAllPositions(count_buys,volume_buys,tp_buy,volume_biggest_buys,
                         count_sells,volume_sells,tp_sell,volume_biggest_sells);
   //---
   total_position=PositionsTotal();
   if(!RefreshRates())
         return;
         
//--- Пройдемся в цикле по всем ордерам
   for(int i=total_position-1; i>=0; i--)
     {
      //--- Если ордер выбран
      if(m_position.SelectByIndex(i) && m_position.Symbol()==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY )
           {
           if(count_buys==1)
                 {
                  double new_tp=m_position.TakeProfit();
                  if(m_position.TakeProfit()==0.0)
                     new_tp=m_symbol.NormalizePrice(m_position.PriceOpen()+m_take_profit);
                  if(!m_trade.PositionModify(m_position.Ticket(),m_symbol.NormalizePrice(0),m_symbol.NormalizePrice(new_tp)))
                     Print("First Modify BUY ",m_position.Ticket(),
                           " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                           ", description of result: ",m_trade.ResultRetcodeDescription());
                 }         

           if(count_buys>=2)
                 {
                  double new_tp=m_position.TakeProfit();
                  double m_price = GetAveragePrice(POSITION_TYPE_BUY);
                  new_tp=m_symbol.NormalizePrice(m_price+m_ntake_profit); 
                  if(!CompareDoubles(m_position.TakeProfit(),new_tp))
                 {  
                  if(!m_trade.PositionModify(m_position.Ticket(),m_symbol.NormalizePrice(0),m_symbol.NormalizePrice(new_tp)))
                     Print("First Modify BUY ",m_position.Ticket(),
                           " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                           ", description of result: ",m_trade.ResultRetcodeDescription());
                 } 
              }        
          }


         if(m_position.PositionType()==POSITION_TYPE_SELL )
           {
            if(count_sells==1)
                 {
                  double new_tp=m_position.TakeProfit();
                  if(m_position.TakeProfit()==0.0)
                     new_tp=m_symbol.NormalizePrice(m_position.PriceOpen()-m_take_profit);
                  if(!m_trade.PositionModify(m_position.Ticket(),m_symbol.NormalizePrice(0),m_symbol.NormalizePrice(new_tp)))
                     Print("First Modify BUY ",m_position.Ticket(),
                           " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                           ", description of result: ",m_trade.ResultRetcodeDescription());
                 }

             if(count_sells>=2)
                 {
                  double new_tp=m_position.TakeProfit();
                  double m_price = GetAveragePrice(POSITION_TYPE_SELL);
                  new_tp=m_symbol.NormalizePrice(m_price-m_ntake_profit); 
                  if(!CompareDoubles(m_position.TakeProfit(),new_tp))
                 {                   
                  if(!m_trade.PositionModify(m_position.Ticket(),m_symbol.NormalizePrice(0),m_symbol.NormalizePrice(new_tp)))
                     Print("First Modify BUY ",m_position.Ticket(),
                           " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
                           ", description of result: ",m_trade.ResultRetcodeDescription());
                 }
              }          
           }
        }
     }
  }

//+----------------------------------------------------------------------------+
//| Расчет среденй цены (0)-buy (1)-sell                                       |
//+----------------------------------------------------------------------------+
double GetAveragePrice(int ot=-1)
  {
   double order_lots = 0, order_price = 0, avg_price = 0;
     {
      for(int i = PositionsTotal()-1; i>=0; i--)
        {
         if(m_position.SelectByIndex(i))
           {
            if(m_position.Symbol()==Symbol())
              {
               if(m_position.PositionType()==ot || ot < 0)
                 {
                  order_lots += m_position.Volume();
                  order_price += m_position.PriceOpen() *m_position.Volume();
                 }
              }
           }
        }
     }
   avg_price = m_symbol.NormalizePrice(order_price / order_lots);
   return(avg_price);
  }

//+------------------------------------------------------------------+
//|                                                                                |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,Digits()-1)==0)
      return(true);
   else
      return(false);
  }
//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
void CalculateAllPositions(int &count_buys,double &volume_buys,double &tp_buy,double &volume_biggest_buys,
                           int &count_sells,double &volume_sells,double &tp_sell,double &volume_biggest_sells)
  {
   count_buys  =0;   volume_buys   = 0.0; volume_biggest_buys  = 0.0;
   count_sells =0;   volume_sells  = 0.0; volume_biggest_sells = 0.0;
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name())
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               count_buys++;
               volume_buys+=m_position.Volume();
               tp_buy     = m_position.TakeProfit();
               if(m_position.Volume()>volume_biggest_buys)
                  volume_biggest_buys=m_position.Volume();
               continue;
              }
            else if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               count_sells++;
               volume_sells+=m_position.Volume();
               tp_sell      =m_position.TakeProfit();
               if(m_position.Volume()>volume_biggest_sells)
                  volume_biggest_sells=m_position.Volume();
              }
           }
  }  

Почему он берет тейк не своего направления понять не могу

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


 

Всем добрый день. Пытаюсь написать очередной Грааль 😋🤓😎😁😁😁😉 и для этого мне нужен стоп по максимуму и минимуму 5 свечей. Для сел ордеров получается по макс 5 свечей, а для бай ордеров по мин 5 свечей. Но мне нужна не просто цена макс или лоу за 5 свечей, а разница в пунктах от текущей свечи до уровня хай, лоу 5 свечей. Написал вот такие функции для этого дела.

//--ФУНКЦИЯ РАСЧЁТА МИНИМУМА ПОСЛЕДНИХ 5 СВЕЧЕЙ НАЧАЛО-----------------------------------------------------------------------------------------------+
double f___CalculateStopLoss_dl9_buy()
{
    // Переменная для хранения минимума последних 5 свечей
    double minLow = Low[0]; // Изначально считаем минимумом Low текущей свечи

    // Цикл для нахождения минимума за последние 5 свечей
    for (int i = 1; i < 5; i++) 
    {
        if (Low[i] < minLow) // Если Low предыдущей свечи меньше текущего minLow, обновляем его
        {
            minLow = Low[i];
        }
    }

    // Текущая цена открытия (Bid)
    double currentPrice = Bid;

    // Разница между текущей ценой и минимумом последних 5 свечей
    double stopSize = currentPrice - minLow;

    // Переводим разницу в пункты
    double stopSizePoints = stopSize / MarketInfo(Symbol(), MODE_POINT);

    // Возвращаем размер стопа в пунктах
    return stopSizePoints;
}

//-----ФУНКЦИЯ РАСЧЁТА МИНИМУМА ПОСЛЕДНИХ 5 СВЕЧЕЙ КОНЕЦ --------------------------------------------------------------------------------------------+


//--ФУНКЦИЯ РАСЧЁТА МАКСИМУМА ПОСЛЕДНИХ 5 СВЕЧЕЙ НАЧАЛО-----------------------------------------------------------------------------------------------+
double f___CalculateStopLoss_dl9_sell()
{
    // Переменная для хранения максимума последних 5 свечей
    double maxHigh = High[0]; // Изначально считаем максимумом High текущей свечи

    // Цикл для нахождения максимума за последние 5 свечей
    for (int i = 1; i < 5; i++) 
    {
        if (High[i] > maxHigh) // Если High предыдущей свечи больше текущего maxHigh, обновляем его
        {
            maxHigh = High[i];
        }
    }

    // Текущая цена (Bid)
    double currentPrice = Bid;

    // Разница между максимумом последних 5 свечей и текущей ценой
    double stopSize = maxHigh - currentPrice;

    // Переводим разницу в пункты
    double stopSizePoints = stopSize / MarketInfo(Symbol(), MODE_POINT);

    // Возвращаем размер стопа в пунктах
    return stopSizePoints;
}

//-----ФУНКЦИЯ РАСЧЁТА МАКСИМУМА ПОСЛЕДНИХ 5 СВЕЧЕЙ КОНЕЦ --------------------------------------------------------------------------------------------+


Размер в пунктах вроде должен нормально высчитываться, но при присвоении значений которые эти функции вернут, в переменную сл и передачу переменной сл в функцию открытия ордеров у меня в тесте вылетает инвалид стоп лос и ошибка OrderSend error 4107

Что я не так пишу и как завести мой Грааль, подскажите пожалуйста? P/S если в функцию открытия ордеров я передам просто размер стопа то всё норм работает…

Вот код функции открытия бай и селл ордера.


      //---ФУНКЦИЯ ОТКРЫТИЯ РЫНОЧНОГО БАЙ ОРДЕРА НАЧАЛО----------------------------------------------------------------------------------------------+
      
      int f__open_market_buy(double param_lot, // ЛОТ ОРДЕРА
       int param_slipage, double param_sl,     //СТОП ЛОС ОРДЕРА 
       
        double param_tp,                       // ТЕЙК ПРОФИТ ОРДЕРА
         string param_order_comment, // КОМЕНТАРИЙ ОРДЕРА
         int param_magik_number ) // МАГИЧЕСКИЙ НОМЕР ОРДЕРА
      {
       int tiket_order= 0;// ТИКЕТ ОТКРЫТОГО ОРДЕРА
       tiket_order= OrderSend(Symbol(), OP_BUY, param_lot, Ask, param_slipage, Ask-param_sl, Ask+param_tp, param_order_comment, param_magik_number, 0, clrGreen);
       return(tiket_order);
      
      }
      
      //------ФУНКЦИЯ ОТКРЫТИЯ РЫНОЧНОГО БАЙ ОРДЕРА КОНЕЦ-------------------------------------------------------------------------------------------+


            //---ФУНКЦИЯ ОТКРЫТИЯ РЫНОЧНОГО СЕЛЛ ОРДЕРА НАЧАЛО----------------------------------------------------------------------------------------------+
      
      int f__open_market_sell(double param_lot, // ЛОТ ОРДЕРА
       int param_slipage, double param_sl,     //СТОП ЛОС ОРДЕРА 
       
        double param_tp,                       // ТЕЙК ПРОФИТ ОРДЕРА
         string param_order_comment, // КОМЕНТАРИЙ ОРДЕРА
         int param_magik_number ) // МАГИЧЕСКИЙ НОМЕР ОРДЕРА
      {
       int tiket_order= 0;// ТИКЕТ ОТКРЫТОГО ОРДЕРА
       tiket_order= OrderSend(Symbol(), OP_SELL, param_lot, Bid, param_slipage, Bid+param_sl, Bid-param_tp, param_order_comment, param_magik_number, 0, clrRed);
       return(tiket_order);
      
      }
      
      //------ФУНКЦИЯ ОТКРЫТИЯ РЫНОЧНОГО СЕЛЛ ОРДЕРА КОНЕЦ-------------------------------------------------------------------------------------------+

Что я не так делаю и как это добро завести?

 
DanilaMactep #:
/ MarketInfo(Symbol(), MODE_POINT)
Удали это
 
DanilaMactep #:

Всем добрый день. Пытаюсь написать очередной Грааль 😋🤓😎😁😁😁😉 и для этого мне нужен стоп по максимуму и минимуму 5 свечей. Для сел ордеров получается по макс 5 свечей, а для бай ордеров по мин 5 свечей. Но мне нужна не просто цена макс или лоу за 5 свечей, а разница в пунктах от текущей свечи до уровня хай, лоу 5 свечей. Написал вот такие функции для этого дела.


Размер в пунктах вроде должен нормально высчитываться, но при присвоении значений которые эти функции вернут, в переменную сл и передачу переменной сл в функцию открытия ордеров у меня в тесте вылетает инвалид стоп лос и ошибка OrderSend error 4107

Что я не так пишу и как завести мой Грааль, подскажите пожалуйста? P/S если в функцию открытия ордеров я передам просто размер стопа то всё норм работает…

Вот код функции открытия бай и селл ордера.



Что я не так делаю и как это добро завести?

Можно же вот так найти максимум и минимум

int Glubina = 5; // находим максимум и минимум за заданное кол-во баров
double Hi_price = 0.0;
double Lo_price = 0.0;

Hi_price      = NormalizeDouble(iHigh(Symbol(),PERIOD_M1,iHighest(Symbol(),PERIOD_M1,MODE_HIGH,Glubina,1)), _Digits);  
Lo_price      = NormalizeDouble(iLow (Symbol(),PERIOD_M1,iLowest (Symbol(),PERIOD_M1,MODE_LOW ,Glubina,1)), _Digits);