Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1421

 
viktor:
Скажите где можно скачать версия терминала МТ4 1320
Alpari
 

У индикатора OBV в мт5 нет возможности выбора типа цены расчета

В мт4 эта возможность есть.

Почему?

И вообще, OBV рассчитывается как сумма всего объема по всей истории, где свеча вниз там объем "отрицательный"
Так и откуда при таком расчете в мт4 возможность выбрать тип цены для расчета индикатора? если она в расчете не участвует 

 

Есть часть кода для подсчета отдельного количества бай и селл ордеров. (b - бай ордера,  s - селл ордера)

Далее, хочу написать условие, при котором, если открывается новый ордер или закрывается имеющийся ранее. Т. е надо произвести сравнение в количестве ранее открытых ордеров и последующих изменений, но не пойму как это написать в коде. Как сохранить изменения в количестве ордеров? Прошу помочь.

double LB=0,LS=0;
  double   RaznSB=0, RaznBS=0;
   int b=0,s=0;
   int izmb=0, izms=0;
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
            {  
               LB  += OrderLots();
               b++; 
            }                                         
            if (tip==OP_SELL)        
            {
               LS  += OrderLots();
               s++;
            } 
         }
     }
     
   }
    if (izmb>b ||izmb<b || izms>s || izms<s) { 
    izmb=b;
    izms=s 
     }
 
Roman Sharanov:

У индикатора OBV в мт5 нет возможности выбора типа цены расчета

В мт4 эта возможность есть.

Почему?

И вообще, OBV рассчитывается как сумма всего объема по всей истории, где свеча вниз там объем "отрицательный"
Так и откуда при таком расчете в мт4 возможность выбрать тип цены для расчета индикатора? если она в расчете не участвует 

В хорошо заданном вопросе содержится половина ответа.

 
scomoroh:

Есть часть кода для подсчета отдельного количества бай и селл ордеров.

И есть куда его вставить)

 
Artyom Trishkin:

В хорошо заданном вопросе содержится половина ответа.

То есть выбор типа цены в мт4 ц OBV ничего не значит и ни на что не влияет?
 
MakarFX:

И есть куда его вставить)

Тогда продублирую вопрос.

Есть часть кода для подсчета отдельного количества бай и селл ордеров. (b - бай ордера,  s - селл ордера)

Далее, написал  условие, при котором, если открывается новый ордер или закрывается имеющийся ранее, то действие предается дальше. Т. е надо произвести сравнение в количестве ранее открытых ордеров и последующих изменений, но не пойму как это написать в коде. Как сохранить изменения в количестве ордеров? Прошу помочь.


   double LB=0,LS=0;
   int b=0,s=0;
   int izmb=0, izms=0;
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
             {  
               LB  += OrderLots();
               b++; 
             }                                         
            if (tip==OP_SELL)        
             {
               LS  += OrderLots();
               s++;
            } 
         }
     }     
   }
   if (izmb>b ||izmb<b || izms>s || izms<s){ //условие сравнения количества ордеров, изменилось или нет,
    izmb=b;                                   //если изменилось то присваиваем новое значение, как его сохранить? Ведь с новым тиком
    izms=s                                    // оно опять будет равно "0"???
     }
 
Vitaly Muzichenko:

Если что, то нужно делать статиком, иначе обнуляется

Обычно флаги глобальными делаю. Конечно в теле функции заново объявится и нужен Статик. НО почему никто не заметил что фигурных скобок не хватает)))) принт И присвоение в скобках должны быть)

И без статик конечно он будет печатать на каждом  вызове функции т.к. printsimbol="" станет равен НУЛЬ, а symbol присвоится текущее значение)

static string symbol, printsimbol="";
      long currChart=ChartFirst(); int i=0;
      while(currChart>=0)
        {
         if(ChartGetInteger(currChart,CHART_BRING_TO_TOP,0)==true) 
           { 
            if(ChartSymbol(currChart)!=symbol)
                {
                 symbol=ChartSymbol(currChart);
                 if(printsimbol!=symbol)
                   { Print(symbol);printsimbol=symbol;}
                }
           } 
         currChart=ChartNext(currChart);  i++;
        }
 
scomoroh:

Тогда продублирую вопрос.

Есть часть кода для подсчета отдельного количества бай и селл ордеров. (b - бай ордера,  s - селл ордера)

Далее, написал  условие, при котором, если открывается новый ордер или закрывается имеющийся ранее, то действие предается дальше. Т. е надо произвести сравнение в количестве ранее открытых ордеров и последующих изменений, но не пойму как это написать в коде. Как сохранить изменения в количестве ордеров? Прошу помочь.


Я бы так попробывал

//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int izmb,izms;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(200);

   izmb=0; izms=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CountOrders(0,0)!=izmb){izmb=CountOrders(0,0);}
   if(CountOrders(0,1)!=izms){izms=CountOrders(0,1);}
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders(string symb="", int or_ty=-1) 
  {
   int cnt=0;
   if(symb=="0") symb=_Symbol;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==symb || symb=="")
           {
            if(or_ty<0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
 
Кто знает почему советник в тестере работает прекрасно, выставляет заявки и т д , а на реальном счету , заявки не выставляются хотя робот активный