Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1503

 
Konstantin Seredkin #:

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

На MQL5 без CopyBuffer и не получится. Только с ним. Привычный по MQL4 стиль работы c данными от индикаторов не работает в MQL5.

 
Yuriy Bykov #:

На MQL5 без CopyBuffer и не получится. Только с ним. Привычный по MQL4 стиль работы c данными от индикаторов не работает в MQL5.

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

 
MrBrooklin #:

Здравствуйте. Пожалуйста, вставьте код в сообщение с помощью специального окна ввода (на картинке показана кнопка для его вызова):

Теперь о коде. Вы правильно сделали, что перебрали все открытые позиции, но почему-то не выбрали ни одной позиции в тикете для дальнейшей работы с ней:

С уважением, Владимир.

Здравствуйте. Спасибо за ответ. Ниже приведен вставленный код в соответствии с запросом.

void deleteAllBuyOrders()
{
   int totalPositions = PositionsTotal();
   bool hasOpenBuyPosition = false;
   
   // Check if there are any open buy positions
   for (int i = 0; i < totalPositions; i++)
   {
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
        {
            hasOpenBuyPosition = true;
            break;
        }
   }
   
   // If there are no open buy positions, delete all pending buy limit orders
   if (!hasOpenBuyPosition)
   {
       int totalOrders = OrdersTotal();
       for(int i = OrdersTotal()-1; i >= 0; i--)
            {
               ulong ticket = OrderGetTicket(i);
               
               if(OrderGetInteger(ORDER_MAGIC) == InpMagic && OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_LIMIT)
               {
                  trade.OrderDelete(ticket);
               }
            }
   }

}
void deleteAllSellOrders()
{
   int totalPositions = PositionsTotal();
   bool hasOpenSellPosition = false;
   
   // Check if there are any open sell positions
   for (int i = 0; i < totalPositions; i++)
   {
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
        {
            hasOpenSellPosition = true;
            break;
        }
   }
   
   // If there are no open sell positions, delete all pending buy limit orders
   if (!hasOpenSellPosition)
   {
       int totalOrders = OrdersTotal();
       for(int i = OrdersTotal()-1; i >= 0; i--)
            {
               ulong ticket = OrderGetTicket(i);
               
               if(OrderGetInteger(ORDER_MAGIC) == InpMagic && OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT)
               {
                  trade.OrderDelete(ticket);
               }
            }
   }

}
 
Konstantin Seredkin #:

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

Ой, я извиняюсь, невнимательно прочитал первое предложение.

По поводу ошибки: размер массивов high и low у вас устанавливается внутри функции iGetArray() и CopyRates(). Но там размер, по идее, должен устанавливаться значению переменной count, которая равна 300. А дальше в цикле вы хотите получить доступ к 1000 элементов. Мне кажется, вызов iGetArray() и CopyRates() вам не нужен. Достаточно вызвать

ArrayResize(high, 1000);
ArrayResize(low, 1000);
 
Mo Isiak #:

Здравствуйте. Спасибо за ваш ответ. Ниже приведен вставленный код в соответствии с запросом.

Я также пытаюсь реализовать процесс с помощью функции onTradeTransaction() из mql5. Программа компилируется нормально, но лимитные ордера на покупку не удаляются, когда нет сделки на покупку. Мне кажется, я неправильно понимаю логику. Пожалуйста, кто-нибудь должен меня поправить. Смотрите код ниже

void OnTradeTransaction(
   const MqlTradeTransaction& trans,      //trade transaction structure
   const MqlTradeRequest& request,        //request structure
   const MqlTradeResult& result          // response structure
   ){
      if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
      {
      int totalPositions = PositionsTotal();
   
      // Check if there are no open buy positions
      for (int i = 0; i < totalPositions; i++)
         {
           if (PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY)
             {
                  for(int i = OrdersTotal()-1; i >= 0; i--)
                  {
                        ulong ticket = OrderGetTicket(i);
                        
                        if(OrderGetInteger(ORDER_MAGIC) == InpMagic)
                        {
                           trade.OrderDelete(ticket);
              
                        }
                   }
              }
         }

      }
   }
 
Mo Isiak #:

Здравствуйте. Спасибо за ответ. Ниже приведен вставленный код в соответствии с запросом.

Здравствуйте.

Похоже, что у вас в коде не хватает выбора позиции с индексом i в циклах поиска открытых позиций. Без нее не понятно, тип какой позиции возвращает PositionGetInteger(POSITION_TYPE).

for (int i = 0; i < totalPositions; i++)
   {
        ulong ticket = PositionGetTicket(i);
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
        {
            hasOpenBuyPosition = true;
            break;
        }
   }

Аналогично надо добавить выбор позиции и в код поиска позиций SELL.

Документация по MQL5: Торговые функции / PositionGetTicket
Документация по MQL5: Торговые функции / PositionGetTicket
  • www.mql5.com
PositionGetTicket - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Yuriy Bykov #:
for(int i = 0; i < totalPositions; i++) { ulong ticket = PositionGetTicket(i); if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY){ hasOpenBuyPosition = true; break; } }
Юрий Быков #:

Здравствуйте.

Похоже, что в вашем коде отсутствует выбор позиции с индексом i в цикле поиска открытых позиций. Без него непонятно, какой тип позиции возвращает PositionGetInteger(POSITION_TYPE).

Аналогично следует добавить выбор позиции в код поиска позиций SELL.

Спасибо Юрию Быкову. Все отлично работает. Спасибо

 
Yuriy Bykov #:

Ой, я извиняюсь, невнимательно прочитал первое предложение.

По поводу ошибки: размер массивов high и low у вас устанавливается внутри функции iGetArray() и CopyRates(). Но там размер, по идее, должен устанавливаться значению переменной count, которая равна 300. А дальше в цикле вы хотите получить доступ к 1000 элементов. Мне кажется, вызов iGetArray() и CopyRates() вам не нужен. Достаточно вызвать

Спасибо все заработало.

 

Есть старая проблема, может подскажите почему так происходит.

Тема такая, натягиваем сетку фибо, берем время верхнего бара и время нижнего.

С помощью полученных индексов получаем кол-во баров между верхней и нежней линией фибо.

Но, если тоже самое проделать через цикл, всегда выходит на один бар меньше.

Как сделать что бы было одинаково ?

int z_bar  =0;
      z_bar = Bars(_Symbol,0,fibo_time_end,fibo_time_start);                                                              // получаем количество баров в границах фибо
      for(int i=iBarShift(_Symbol,0,fibo_time_start); i<iBarShift(_Symbol,0,fibo_time_end); i++)            // перебираем циклом
      {
      Comment(fibo_time_start,"   ",iBarShift(_Symbol,0,fibo_time_start),"    -   ",fibo_time_end,"   ",iBarShift(_Symbol,0,fibo_time_end),"   ",z_bar/*,"   ",l_bars*/,"\n",
              price_start,"\n",
              price_end,"\n");
      }



Как видно на скрине, верхний индекс   линии фибо = 19...  нижний  29, получается 10 баров, по факту их 11, метод bars посчитал правильно, а цикл нет.. как быть

 
Konstantin Seredkin #:

Есть старая проблема, может подскажите почему так происходит.

Тема такая, натягиваем сетку фибо, берем время верхнего бара и время нижнего.

С помощью полученных индексов получаем кол-во баров между верхней и нежней линией фибо.

Но, если тоже самое проделать через цикл, всегда выходит на один бар меньше.

Как сделать что бы было одинаково ?



Как видно на скрине, верхний индекс   линии фибо = 19...  нижний  29, получается 10 баров, по факту их 11, метод bars посчитал правильно, а цикл нет.. как быть

Видимо, "проблема заборного столба", https://ru.wikipedia.org/wiki/Ошибка_на_единицу