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

 
Fokus24 #:

Подскажите как можно округлить цены ask и bid в классе CSymbolInfo до шага цены?

Для передачи в методы открытия позиций и ордеров достаточно использовать NormalizeDouble(). Второй параметр можно получить, используя 

C_info.Digits()
Документация по MQL5: Преобразование данных / NormalizeDouble
Документация по MQL5: Преобразование данных / NormalizeDouble
  • www.mql5.com
NormalizeDouble - Преобразование данных - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Привет, ребята, я только начал использовать mt5. Проблема в том, что я не могу увидеть мой индикатор костюма на графике .Код не имеет ошибок я поставил график на передний план я проверил список индикаторов на графике и я могу видеть мой индикатор, я обновил я закрыл и открыл mt5 , я удалил и перезагрузил, но все равно любой индикатор костюма, который я делаю, не отображается на графике .Любые мысли
 
Уважаемые все, мне нужна ваша помощь, пожалуйста. Я пытаюсь создать советник, и у меня возникли проблемы с кодом, которые я никак не могу решить. Я хочу удалить все лимитные ордера на покупку, когда нет позиций на покупку, а также сделать то же самое для лимитных ордеров на продажу, когда нет позиций на продажу. Ниже приведен код, который я написал, и я вызвал функции deleteAllBuyOrders() и deleteAllSellOrders() в моей секции onTick(), но это просто не работает. Код компилируется нормально, однако при тестировании, когда все позиции на покупку закрываются, отложенные ордера с лимитом на покупку не удаляются, как я хочу. Пожалуйста, помогите мне
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void deleteAllBuyOrders()
{
int totalPositions = PositionsTotal();
bool hasOpenBuyPosition = false;
// Проверьте, есть ли открытые позиции на покупку
for (int i = 0; i < totalPositions; i++)
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
{
hasOpenBuyPosition = true;
break;
}
}
// Если нет открытых позиций на покупку, удалите все отложенные лимитные ордера на покупку
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;
// Проверьте, есть ли открытые позиции на продажу
for (int i = 0; i < totalPositions; i++)
{
if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
{
hasOpenSellPosition = true;
break;
}
}
// Если нет открытых позиций на продажу, удалите все отложенные лимитные ордера на покупку
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);
}
}
}

}
 
NoobDaytrader #:
Привет, ребята, я только начал использовать mt5. Проблема в том, что я не могу увидеть мой индикатор костюма на графике .Код не имеет ошибок я поставил график на передний план я проверил список индикаторов на графике и я могу видеть мой индикатор, я обновил я закрыл и открыл mt5 , я удалил и перезагрузил, но все равно любой индикатор костюма, который я делаю, не отображается на графике .Любые мысли

См тут статьи -там все расжевано. В поиске типа пользовательский индикатор и см в статьях.

Особенности написания пользовательских индикаторов.
Так как то см в поиске запрашивайте тут.
Там несколько статей подробных есть.
 
Mo Isiak #:
Уважаемые все, мне нужна ваша помощь, пожалуйста. Я пытаюсь создать советник, и у меня возникли проблемы с кодом, которые я никак не могу решить. Я хочу удалить все лимитные ордера на покупку, когда нет позиций на покупку, а также сделать то же самое для лимитных ордеров на продажу, когда нет позиций на продажу. Ниже приведен код, который я написал, и я вызвал функции deleteAllBuyOrders() и deleteAllSellOrders() в моей секции onTick(), но это просто не работает. Код компилируется нормально, однако при тестировании, когда все позиции на покупку закрываются, отложенные ордера с лимитом на покупку не удаляются, как я хочу. Пожалуйста, помогите мне ...

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

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

PositionGetTicket

Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней 
при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.

ulong  PositionGetTicket( 
   int  index      // номер в списке позиций 
   ); 

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

 

Ткните носом что делаю не так, хочу код с mql5 заставить работать на mql4

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

//--- ZigZag knee search
   double high[],low[];
   MqlRates rates[];
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(rates,true);
   int start_pos=0,count=300;
   if(!iGetArray(handle_iCustom,0,start_pos,count,high) ||
      !iGetArray(handle_iCustom,1,start_pos,count,low) ||
      CopyRates(_Symbol,Period(),start_pos,count,rates)!=count)
     {
      return(false);
     }
     
//Last Hi
   for(int i=0; i<1000; i++)
     {
      high[i]=iCustom(NULL,0,"ZigZag",ExDepth,ExDeviation,ExBackstep,0,i);
     }     
//Last Low
   for(int i=0; i<1000; i++)
     {
      low[i]=iCustom(NULL,0,"ZigZag",ExDepth,ExDeviation,ExBackstep,1 ,i);
     }

     
   
     
     
   double left=0.0,middle=0.0,right=0.0;
   datetime left_date=0.0,middle_date=0.0,right_date=0.0;
   for(int i=0; i<count; i++)
     {
     
      if(high[i]!=0.0 || low[i]!=0.0)
        {
         double value=(high[i]!=0.0)?high[i]:low[i];
         if(value==0.0)
            return(false);
         if(right==0.0)
           {
            right=value;
            right_date=rates[i].time;
            continue;
           }
         if(middle==0.0)
           {
            middle=value;
            middle_date=rates[i].time;
            continue;
           }
         if(left==0.0)
           {
            left=value;
            left_date=rates[i].time;
            break;
           }
        }
     }
 
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);
Причина обращения: