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

 
Aleksandr Slavskii #:

Где скопипастил не помню, но работает хорошо.

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

Думаю это то, что вам надо. 

Не пойму тоже ли это самое, если просто шорты брать с отрицательным объемом, а в знаменателе суммировать абсолютные значения?

У вас неплохо б в конце проверку деления на 0 добавить.

 
leonerd #:

Не пойму тоже ли это самое, если просто шорты брать с отрицательным объемом, а в знаменателе суммировать абсолютные значения?

Функция считает среднюю цену отдельно для бай и отдельно для селл.

Не совсем понятно какая у вас стоит задача. Вот эта фраза мне не понятна: " чтобы закрыть случаи противоположных трейдов".

leonerd #:

У вас неплохо б в конце проверку деления на 0 добавить.

Там есть проверка.

 

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


#include <Trade\SymbolInfo.mqh>

input string symbol   = "MTLR";
input int    spred    = 10;
CSymbolInfo C_info;

int OnInit()
  {   
  C_info.Name(symbol); 
  C_info.Digits();
  C_info.Point();
   return(0);
  }
  
void OnTick()
  {  
   C_info.RefreshRates();

   int    spread      = C_info.Spread();
   double ask         = C_info.Ask();
   double bid         = C_info.Bid();
   ulong vol          = C_info.Volume();

   if(spread>spred)
      { 
       string info    = symbol+" = "+ IntegerToString(spread) + " Ask: "  +
                        DoubleToString(ask)                   + " Bid: "  +
                        DoubleToString(bid)                   + " Объем=" +
                        IntegerToString(vol);
       Print(info);
      }  
  }
/* MTLR = 4 Ask: 278.80000000 Bid: 278.76000000 Объем=289 */
 
Fokus24 #:

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

DoubleToString(ask,_Digits)
 
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;
           }
        }
     }