❓Вопросы по разработке приложений для MetaTrader

1221bdd9cdca11ef96bc26000a26907a_1.webp
Уважаемые друзья!

Вот несколько простых и понятных правил для конструктивного общения в технической части.

1 - Никто вам ничего не должен и ничем не обязан.
2 - Чем больше информации вы предоставите тем более быстрый и конструктивный ответ вы получите.
3 - Аморальное, деструктивное поведение и общение, приведет к моментальной блокировке аккаунта. Работает бот.

Рекомендация по правильному составлению вопроса по программированию:
1 - Пишете что хотели получить или реализовать.
2 - Пишете что сейчас работает не верно.
3 - Прикладываете самодостаточный фрагмент кода. Самодостаточный фрагмент кода - фрагмент кода, который можно скомпилировать сразу, или который содержит все необходимые данные.
4 - Помочь вам будет намного легче и желаннее если код будет содержать комментарии.
5 - Не просите написать код за вас.

Вот несколько примеров:

Хочу создать счетчик рыночных позиций на покупку и продажу, а так же хочу получить количество отложенных ордеров по их типу, но не считает отложенные ордера

C++:
// --- Запросим количество торговых ордеров по всем фин инструментам
   int iTotal = OrdersTotal();
// --- Создадим и обнулим переменную для подсчета НАШИХ ордеров
   int Buy = 0, Sel = 0;
// --- Запустим цикл по ВСЕМ ордерам
   for(int i = 0; i < iTotal; i++)
      // --- Рассматриваем свойства каждого ордера по отдельности
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
         // --- Если символ ордера равен символу графика на котором работает наша программа
         if(OrderSymbol() == Symbol())
            // --- Если Меджик Номер равен Меджик номеру заданному пользователем
            if(OrderMagicNumber() == MagicNumber)
              {
               // ---------------
               // --- Если попался ордер нашей программы, инкрементируем переменную, +1
               if(OrderType() == OP_BUY)
                  Buy++;
               // ---------------
               // --- Если попался ордер нашей программы, инкрементируем переменную, +1
               if(OrderType() == OP_SELL)
                  Sel++;
              }

Хочу изменить комментарий к открываемым позициям, но постоянно пишет "Привет мир"
C++:
// --- Откроем РЫНОЧНЫЙ ордер на продажу OP_SELL, с лотом указанным в настройках, по цене Бид, без стоп лосса и тейк профита
OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0.0,0.0,"Привет мир",MagicNumber,NULL,clrRed);
 
Last edited:
Хочу написать робота, который берёт точку входа по сигналам-стрелкам-значению из буфера стороннего индикатора, а входит, сопровождает и выходит по своим алгоритмам. Как опция собирает статистику прибыльных\убыточных сделок. Такое возможно реализовать в метатрейдере?
 
Last edited by a moderator:
Хочу написать робота, который берёт точку входа по сигналам-стрелкам-значениюизбуфера стороннего индикатора, а входит, сопровождает и выходит по своим алгоритмам. Как опция собирает статистику прибыльных\убыточных сделок. Такое возможно реализовать в метатрейдере?
Да, такое возможно сделать.
Красота терминалов MetaTrader как раз таки и заключается в том что на их языке программирования можно сделать практически любые вещи. Можно даже компьютер пользователя выключить с помощью торгового робота )
 
Last edited:
Создание робота для торговли золотом
создать торгового робота в MQL5 условия для торговли золотом при резком движении инструмента вверх при высокой волатильности выставлять по ходу движения лимитный ордер с функцией трала при откате в обратную сторону на определённое количество пунктов с функцией трейлинг стопа и трейлинг степ, и также на продажу в случае резкого движения вниз выставлять ордер на продажу с функцией трала лимитного ордера в обратную сторону трейлинг стопа и трейлинг Step Автоматический трейлинг ордеров в направлении тренда
Управление временем жизни ордеров
Трейлинг-стоп для открытых позиций
Защита от избыточного количества ордеров
Контроль волатильности через ATR
Логирование ошибок в терминале
Логика трейлинга
:Ордера автоматически перемещаются вместе с ценой
При падении цены BuyStop опускается ниже а при росте цены остается до активации но при этом нужен таймер работы ордера если он не активировалсяПри росте цены SellStop подтягивается выше, а при падении цены остается до активации но при этом нужен таймер работы ордера если он не активировалсяоткрытые переменные input double ATR_Threshold = 50.0; // Минимальный ATR (пункты)input int MomentumBars = 3; // Период импульсаinput double MinMomentum = 30.0; // Минимальный импульс (пункты)input double OrderDistance = 100.0; // Дистанция ордера (пункты)input double TrailingStop = 200.0; // Стоп-лосс (пункты)input double TrailStep = 50.0; // Шаг трейлинга (пункты)input double LotSize = 0.1; // Размер лотаinput int MaxOrders = 2; // Максимум ордеровinput int OrderExpirationSek = 8; // Время жизни ордера (секунды)
 
Создать торгового робота в MQL5 условия для торговли золотом при резком движении инструмента вверх при высокой волатильности выставлять по ходу движения лимитный ордер с функцией трала при откате в обратную сторону на определённое количество пунктов с функцией трейлинг стопа и трейлинг степ, и также на продажу в случае резкого движения вниз выставлять ордер на продажу с функцией трала лимитного ордера в обратную сторону трейлинг стопа и трейлинг Step Автоматический трейлинг ордеров в направлении тренда
Управление временем жизни ордеров
Трейлинг-стоп для открытых позиций
Защита от избыточного количества ордеров
Контроль волатильности через ATR
Логирование ошибок в терминале
Логика трейлинга:
Ордера автоматически перемещаются вместе с ценой
При падении цены BuyStop опускается ниже а при росте цены остается до активации но при этом нужен таймер работы ордера если он не активировался
При росте цены SellStop подтягивается выше, а при падении цены остается до активации но при этом нужен таймер работы ордера если он не активировался
 
Как здесь прикрепить код?
for(int i = total-1; i>=0; i--)
{
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==_Symbol && (m_position.Magic()==Magic || Magic==-1))
if(m_position.PositionType() == POSITION_TYPE_BUY || m_position.PositionType() == POSITION_TYPE_SELL)
{
......
}
}
Вот так.
Если меня за это Владимир не заблокирует.
 
C++:
//--- Input parameters
input double   ATR_Threshold = 1.5;       // Минимальный ATR в долларах
input int      MomentumBars = 5;          // Период импульса
input double   MinMomentum = 2.0;         // Минимальный импульс в %
input int      OrderDistance = 150;       // Дистанция ордера в пунктах
input int      TrailingStop = 100;        // Трейлинг стоп в пунктах
input int      TrailStep = 50;            // Шаг трейлинга в пунктах
input double   LotSize = 0.1;             // Размер лота
input int      MaxOrders = 1;             // Максимум ордеров
input int      OrderExpirationSek = 120;  // Время жизни ордера

//--- Global variables

int atrHandle, momentumHandle;
CTrade Trade;
ulong buyStopTicket = 0, sellStopTicket = 0;
datetime buyStopExpiration, sellStopExpiration;
//+------------------------------------------------------------------+
//| Логирование                                                      |
//+------------------------------------------------------------------+
void Log(string message)
  {
   Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), " ", message);
  }
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int OnInit()
  {
   Log("Инициализация эксперта");

   atrHandle = iATR(_Symbol, PERIOD_CURRENT, 14);
   momentumHandle = iMomentum(_Symbol, PERIOD_CURRENT, MomentumBars, PRICE_CLOSE);
   if(atrHandle == INVALID_HANDLE || momentumHandle == INVALID_HANDLE)
     {
      Log("Ошибка создания индикаторов!");
      return(INIT_FAILED);
     }

   Trade.SetExpertMagicNumber(12345);
   Trade.SetTypeFilling(ORDER_FILLING_FOK);
   Log("Эксперт успешно инициализирован");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CheckOrdersExpiration();
   ManageTrailingStop();

   double atr = GetATR();
   double momentum = GetMomentum();
   double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);

// Расширенное логирование
   Log(StringFormat("ATR=%.2f$ | Momentum=%.2f%% | Ask=%.2f | Bid=%.2f",
                    atr,
                    momentum-100.0,
                    ask,
                    bid));

   bool atrCondition = atr >= ATR_Threshold;
   bool momentumBuyCondition = (momentum - 100.0) >= MinMomentum;
   bool momentumSellCondition = (100.0 - momentum) >= MinMomentum;

   if(atrCondition)
     {
      if(momentumBuyCondition && buyStopTicket == 0 && CountOrders(ORDER_TYPE_BUY_STOP) < MaxOrders)
        {
         double price = NormalizeDouble(ask + OrderDistance * point, digits);
         if(Trade.OrderOpen(_Symbol, ORDER_TYPE_BUY_STOP, LotSize, price, 0, 0, 0, ORDER_TIME_SPECIFIED, TimeCurrent()+OrderExpirationSek, ""))
           {
            buyStopTicket = Trade.ResultOrder();
            buyStopExpiration = TimeCurrent() + OrderExpirationSek;
            Log(StringFormat("BUY STOP @ %.2f (ATR=%.2f, Momentum=+.2f%%)", price, atr, momentum-100.0));
           }
        }
      if(momentumSellCondition && sellStopTicket == 0 && CountOrders(ORDER_TYPE_SELL_STOP) < MaxOrders)
        {
         double price = NormalizeDouble(bid - OrderDistance * point, digits);
         if(Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_STOP, LotSize, price, 0, 0, 0, ORDER_TIME_SPECIFIED, TimeCurrent()+OrderExpirationSek, ""))
           {
            sellStopTicket = Trade.ResultOrder();
            sellStopExpiration = TimeCurrent() + OrderExpirationSek;
            Log(StringFormat("SELL STOP @ %.2f (ATR=%.2f, Momentum=-.2f%%)", price, atr, 100.0-momentum));
           }
        }
     }
   MoveOrdersWithPrice(bid, ask, point, digits);
  }
//+------------------------------------------------------------------+
//| Получить текущее значение ATR                                    |
//+------------------------------------------------------------------+
double GetATR()
  {
   double atr[1];
   if(CopyBuffer(atrHandle, 0, 0, 1, atr) == 1)
      return atr[0];
   Log("Ошибка получения значения ATR!");
   return 0;
  }
//+------------------------------------------------------------------+
//| Получить значение Momentum                                       |
//+------------------------------------------------------------------+
double GetMomentum()
  {
   double momentum[1];
   if(CopyBuffer(momentumHandle, 0, 0, 1, momentum) == 1)
      return momentum[0];
   Log("Ошибка получения значения Momentum!");
   return 0;
  }
//+------------------------------------------------------------------+
//| Перемещение ордеров вслед за ценой                               |
//+------------------------------------------------------------------+
void MoveOrdersWithPrice(double bid, double ask, double point, int digits)
  {
   if(buyStopTicket != 0)
     {
      double newPrice = NormalizeDouble(ask + OrderDistance * point, digits);
      double newSl = NormalizeDouble(bid - TrailingStop * point, digits);
      Trade.OrderModify(buyStopTicket, newPrice, newSl, 0, 0, 0);
     }
   if(sellStopTicket != 0)
     {
      double newPrice = NormalizeDouble(bid - OrderDistance * point, digits);
      double newSl = NormalizeDouble(ask + TrailingStop * point, digits);
      Trade.OrderModify(sellStopTicket, newPrice, newSl, 0, 0, 0);
     }
  }
//+------------------------------------------------------------------+
//| Управление трейлинг-стопом                                       |
//+------------------------------------------------------------------+
void ManageTrailingStop()
  {
   for(int i = PositionsTotal()-1; i >= 0; i--)
     {
      if(PositionGetSymbol(i) == _Symbol)
        {
         ulong ticket = PositionGetInteger(POSITION_TICKET);
         double currentSl = PositionGetDouble(POSITION_SL);
         double newSl = currentSl;
         double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);

         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
           {
            double trailPrice = PositionGetDouble(POSITION_PRICE_OPEN) + TrailStep * point;

            if(PositionGetDouble(POSITION_PRICE_CURRENT) >= trailPrice)
               newSl = PositionGetDouble(POSITION_PRICE_CURRENT) - TrailingStop * point;
           }
         else
           {
            double trailPrice = PositionGetDouble(POSITION_PRICE_OPEN) - TrailStep * point;
            if(PositionGetDouble(POSITION_PRICE_CURRENT) <= trailPrice)
               newSl = PositionGetDouble(POSITION_PRICE_CURRENT) + TrailingStop * point;
           }
         if(newSl != currentSl)
            Trade.PositionModify(ticket, newSl, PositionGetDouble(POSITION_TP));
        }
     }
  }
//+------------------------------------------------------------------+
//| Проверка времени жизни ордеров                                   |
//+------------------------------------------------------------------+
void CheckOrdersExpiration()
  {
   if(buyStopTicket != 0 && TimeCurrent() >= buyStopExpiration)
     {
      Trade.OrderDelete(buyStopTicket);
      buyStopTicket = 0;
     }

   if(sellStopTicket != 0 && TimeCurrent() >= sellStopExpiration)
     {
      Trade.OrderDelete(sellStopTicket);
      sellStopTicket = 0;
     }
  }
//+------------------------------------------------------------------+
//| Подсчет количества ордеров                                       |
//+------------------------------------------------------------------+
int CountOrders(ENUM_ORDER_TYPE type)
  {
   int count = 0;
   for(int i = OrdersTotal()-1; i >= 0; i--)
      if(OrderGetTicket(i) > 0 &&
         OrderGetString(ORDER_SYMBOL) == _Symbol &&
         OrderGetInteger(ORDER_TYPE) == type)
         count++;
   return count;
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
 
Last edited by a moderator:
Добрый день! При компиляции ошибок нету, но торговать не хочет.
 
Добрый день! При компиляции ошибок нету, но торговать не хочет.
Рискну предположить, что в коде есть ошибки.
 
Добрый день! При компиляции ошибок нету, но торговать не хочет.
Проверте условия открытия отложеных позиций, и, может вместо:
if(Trade.OrderOpen(_Symbol, ORDER_TYPE_SELL_STOP, LotSize, price, 0, 0, 0, ORDER_TIME_SPECIFIED, TimeCurrent()+OrderExpirationSek, ""))
Print("Op Sell - Error: ",GetLastError());
прописать
if(Trade.SellStop(LotSize,price,_Symbol,0.0,0.0,ORDER_TIME_SPECIFIED,TimeCurrent()+OrderExpirationSek,""))
Опять же, не мешало бы добавить принты с выводом ошибок.
 
Back
Top Bottom