Советник безубытка по АТР: нужна помощь программиста

Skyrider60

Активный участник
Не могу заставить работать его на всех парах одновременно. На одно паре на которой он установлен все прекрасно работает.
Подскажите, как изменить код, чтобы он пробегал по всем парам и устанавливал БУ.
BU:
//+------------------------------------------------------------------+
//|                                                           BU.mq4 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double BULevel       = 1;      // уровень БУ
extern double BUPoint       = 0.2;       // пункты БУ
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  BU();
  }
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
 
   double atr = iATR(Symbol(),PERIOD_M15,14,0);
 
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderOpenPrice()<=(Bid-(BULevel+BUPoint)*atr) && OrderOpenPrice()>OrderStopLoss())
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+BUPoint*atr,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()>=(Ask+(BULevel+BUPoint)*atr) && (OrderOpenPrice()<OrderStopLoss() || OrderStopLoss()==0))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-BUPoint*atr,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
 

Вложения

  • BU.mq4
    5 КБ · Просмотры: 18
Последнее редактирование модератором:

Skyrider60

Активный участник
Эта строка определяет работу советника в пределах символа на котором он установлен.
Вам надо создать перебор символов по которым открыты ордера или ставить на каждый символ
Да я знаю, я уже перепробовал много вариантов, и с массивами, что-то не получается. Не хватает знаний и опыта.
 

MakarFX

Элитный участник
Да я знаю, я уже перепробовал много вариантов, и с массивами, что-то не получается. Не хватает знаний и опыта.
C-подобный:
input string Symbols = "EURUSD,GBPUSD,AUDUSD,USDCHF,EURJPY,GBPJPY,USDJPY,CHFJPY"; // Список символов-разделены ",")
ushort sep = StringGetCharacter(",",0); // Код разделителя
string LV_1[]; // Массив для символов
int szl; // Размер массива
//---
int OnInit()
  {
   szl = StringSplit(Symbols,sep,LV_1); // Заполняем массив и получаем размер
   return(INIT_SUCCEEDED);
  }
//---
void OnTick()
  {
   for(int i=0; i<szl; i++) Print(LV_1[i]);
  }
Тренируйтесь)
 

ИванМН

Местный знаток
Да можно и проще: сканируем "Обзор рынка" и бежим по тем символам, которые в нём отображены. Тогда не надо будет ничего вбивать от руки.
 
Верх