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

 
Здравствуйте! 
Возможно с сайта https://ru.investing.com/tools/correlation-calculator
Информацию передавать на график?
Как это возможно сделать? 
За ранее благодарю. 
 
Irina Dymura:
Здравствуйте! 
Возможно с сайта https://ru.investing.com/tools/correlation-calculator
Информацию передавать на график?
Как это возможно сделать? 
За ранее благодарю. 
WebRequest() пробуйте.
 
Ihor Herasko:

Да. Нет никакого смысла переводить время в строку, т. к. время - это число секунд. С этим числом работать гораздо проще, чем со строками, и быстрее.

Вы одно поправили, а другое испортили))

Во второй части вместо:

верните:

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


Спасибо за ответы! Я оба варианта пробовал.

Не понимаю в чем подвох - все равно при закрытии по стопу тут же заходит:

lil_lil:

Произнесите вслух ваше условие и поймёте в чём дело)

if ( TimeSeconds(TimeCurrent()) - TimeSeconds(OrderCloseTime()) > TimeSeconds(30*60) )
if ( TimeCurrent() -OrderCloseTime() > 30*60 )

По идее там != везде условие, то есть наоборот > должно стоять,  если я правильно понял о чем Вы. Но все варианты прогнал - все равно заходит.

 

Помогите разобраться с логикой, найти ошибку

Подробно закомментировал код. 

Нужно, чтобы рисовал фракталы с периодом, причем по типу "зигзага", чтобы последовательно шли нижний верхний нижний фракталы и так далее.

Но по итогу на графике все равно проскакивают повторяющиеся фракты

Основа взята со стандарного индюка фрактала. Скриншот ниже с повторным фракталом на периоде 5

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_color2  Gray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input data
input int period = 5;
int per = period;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
  if(per % 2 == 0) per++; //период фракталов только нечетный
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i,limit;
//---
   if(rates_total < per)
      return(0);
//---
   if(prev_calculated < per + (per - 1) / 2)
     {
      limit = (per - 1) / 2;
      //--- clean up arrays
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
     }
   else limit = rates_total - per;
   for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
     {
      high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свече
      for(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)
         //---- Upper Fractal
         if(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
            ExtUpperBuffer[i] = EMPTY_VALUE;
            high_f = false;            
         }        
         //---- Lower Fractal
         if(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет        
            ExtLowerBuffer[i] = EMPTY_VALUE;
            low_f = false;   
         }  
      }  
       //устанавливаем верхний
      if(high_f){//если фрактал все таки есть (из цикла-проверки выше)
         if(lastIsLower){//еси последний фрактал был нижний
            ExtUpperBuffer[i] = high[i];//устанавливаем сверху
            lastUpperIndex = i;//записываем индекс в буффере установленного
            lastIsLower = false;//говорим что последний - не нижний
            lastIsUpper = true;//а верхний
         }else{
            if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)
               if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
                  ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
                  ExtUpperBuffer[i] = high[i];//устанавливаем новый
                  lastUpperIndex = i;//записываем индекс нового
               }
            }
         }
      }
      //аналогично для фрактала снизу
      if(low_f){
         if(lastIsUpper){
            ExtLowerBuffer[i] = low[i];
            lastLowerIndex = i;
            lastIsLower = true;
            lastIsUpper = false;
         }else{
            if(lastIsLower){
               if(low[i] < ExtLowerBuffer[lastLowerIndex]){
                  ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
                  ExtLowerBuffer[i] = low[i];
                  lastLowerIndex = i;
               }
            }
         }
      }   
    }
  
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }

//+------------------------------------------------------------------+
Файлы:
6gvzow.JPG  149 kb
 
Подскажите, как в MQL4 получить объем открытых позиций по символу, если SYMBOL_SESSION_INTEREST не поддерживается? Спасибо!
 
kotaries:
Подскажите, как в MQL4 получить объем открытых позиций по символу, если SYMBOL_SESSION_INTEREST не поддерживается? Спасибо!

Пробежать в цикле по всем позициям, и посчитать их совокупный объём: OrderLots()

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает сумму лотов открытых позиций                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              l+=OrderLots();
            }
          }
        }
      }
    }
  }
  return(l);
}
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Никак не могу понять на основании чего возвращается определенное значение prev_calculated? 

как оно вообще вычисляется

 
Roman Sharanov:

Никак не могу понять на основании чего возвращается определенное значение prev_calculated? 

как оно вообще вычисляется

За этим система сдедит. По сути, вам должно быть интересно лишь её значение, а не как оно там внутри считается.
 
Roman Sharanov:

Никак не могу понять на основании чего возвращается определенное значение prev_calculated? 

как оно вообще вычисляется

Это то значение, которое вернула функция OnCalculate() на прошлой итерации. Об этом прямо написано в документации:

Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.

 

     Задача - найти бар с минимальным закрытием

 for(int x=0; x<=xBars -1; x++) 

    { 

     counter++;

//     Print(Close[x],",,,",counter); 

     int h = ArrayMinimum(Close[x]);

       if(counter > 20) break;

    }

   Компилятор ругается на Close

Причина обращения: