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

 
Aleksey Vyazmikin #:

Записан в свойствах минутного бара, как и объём.

Да, максимальный, средний или минимальный. Зависит от брокера.
 
Kedrov #:

И где их, свойства минутного бара, посмотреть?

Спасибо!

Посмотрите функцию  CopySpread();

 

Коллеги! Всем ок пятницы и выходных!!! Прошу кто с индикаторами на "ТЫ" МТ5 - не могли бы код глянуть - все написал по классике (стандартной трактовке - академически по учебнику) :-)

интересует прежде всего обыгрывание этой темы (академически...):

   int limit=rates_total-prev_calculated;

      
  int i=fmax(0,prev_calculated-1);
   
   for(i=0; i<rates_total; i++)
...

т.е. все ли правильно именно как индикатор (индикатор!) (я об оптимальности кода чтобы не тормозил).

На формулы можно внимания не обращать - они правильные.

Задача индикатора отображение разности значений котировок двух символов по цене открытия. Из первого символа цены откр бара отнимается значение цены откр второго символа этого же бара по его номеру...

Тут просто много разных индикаторов и все они отображают по разному.... :-) написал свой...

естественно все под мою ответственность - просто можете посмотреть и предоставьте тут кому не сложно и есть время - обратную связь. Спасибо.

Файлы:
spreads.mq5  7 kb
 
Aleksey Vyazmikin #:

Посмотрите функцию  CopySpread();

Меня интересует маржа, а не спред. (См. мой первичный пост)

Инфа из интернета:

Спред на бирже — это разница между лучшими ценами покупки и продажи торгового актива.

Маржа в трейдинге – это залоговые средства, который трейдер должен внести на свой счет, чтобы покрыть часть риска, которую трейдер создает для брокера

Маржа, которую требует ваш брокер Forex, будет определять максимальное кредитное плечо, которое вы можете использовать на своем торговом счете. Поэтому торговлю с кредитным плечом иногда называют «маржинальной торговлей».

Спасибо!

 
Roman Shiredchenko #:

Коллеги! Всем ок пятницы и выходных!!! Прошу кто с индикаторами на "ТЫ" МТ5 - не могли бы код глянуть - все написал по классике (стандартной трактовке - академически по учебнику) :-)

интересует прежде всего обыгрывание этой темы (академически...):

т.е. все ли правильно именно как индикатор (индикатор!) (я об оптимальности кода чтобы не тормозил).

На формулы можно внимания не обращать - они правильные.

Задача индикатора отображение разности значений котировок двух символов по цене открытия. Из первого символа цены откр бара отнимается значение цены откр второго символа этого же бара по его номеру...

Тут просто много разных индикаторов и все они отображают по разному.... :-) написал свой...

естественно все под мою ответственность - просто можете посмотреть и предоставьте тут кому не сложно и есть время - обратную связь. Спасибо.

пункт номер РАЗ: короткий код лучше вставлять непосредственно в сообщение. Web-деятели не осилили "посмотреть приаттаченный файл без загрузки", а не все кто готов помочь или высказаться жаждет скачивать файл и запускать MetaEditor

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
  {

//-------------------------------
   int limit=rates_total-prev_calculated;

      
  int i=fmax(0,prev_calculated-1);
   
   for(i=0; i<rates_total; i++)
     {     
      int symb2Shift = iBarShift(Symbol2,Period(),iTime(Symbol1,Period(),i),true);
      if(symb2Shift != -1)
        {      
         if(!Symbol2_Reverse)
           {
            BufferCurrent[i] = NormalizeDouble(100000*Weighting_coefficients1*kVol1*iOpen(Symbol1,Period(),i) - 100000*Weighting_coefficients2*kVol2*iOpen(Symbol2,Period(),i),0);                
        //----------------------------------------
           }
         else
           {
            BufferCurrent[i] = NormalizeDouble(100000*Weighting_coefficients1*iOpen(Symbol1,Period(),i) - 100000*1/(Weighting_coefficients2*iOpen(Symbol2,PERIOD_CURRENT,i)),0);  
            // BufferCurrent[i] = NormalizeDouble(10000*Weighting_coefficients1*iOpen(Symbol1,Period(),i) + 10000*(Weighting_coefficients2*iOpen(Symbol2,PERIOD_CURRENT,i)),0);  
                    
        //----------------------------------------
           }        
        }    
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  

2. не раскрыто ветвление, "что-же делать если подходящего бара нет". Просто есть вариант что тот просто не подкачался ещё и стоит вернуть prev_calculated

3. в OnInit надо убедится что Symbol2 есть в обзоре рынка или его добавить, плюс там-же и при первом OnCalculate нужны танцы с бубном чтобы принудить терминал начать скачивать бары другого инструмента. Например запросить iBarShift(Symbol2,PERIOD_CURRENT,iTime(_Symbol,iBars(_Symbol,PERIOD_CURRENT)-1)); Или соответсвующий CopyTime. Есть подозрение что от билда к билду бубны разные нужны

4. Использовать специальную форму OnCalculate тут не оправданно, ты-же никак не используешь price[]

 
Roman Shiredchenko #:

Направление не верное в цикле и в функциях. У вас получается расчёт с переду назад.

for(i=0; i<rates_total; i++)

В таком цикле вы заканчиваете перебор на rates_total-1 баре, а в функциях iOpen(), iBarShift(), направление другое и самый крайний(правый) бар имеет индекс ноль.

Вам нудно что то типа так

   int i = fmin(rates_total - 1, rates_total - prev_calculated);
   for(; i >= 0; i--)

Ну и без проверки деления на ноль, совсем плохо.

Ещё желательно добавить в OnInit() проверку символов

 if(!SymbolSelect(Symbol1, true) || !SymbolSelect(Symbol2, true))
      return INIT_FAILED;
 
Kedrov #:

Меня интересует маржа, а не спред. (См. мой первичный пост)

Инфа из интернета:

Спред на бирже — это разница между лучшими ценами покупки и продажи торгового актива.

Маржа в трейдинге – это залоговые средства, который трейдер должен внести на свой счет, чтобы покрыть часть риска, которую трейдер создает для брокера

Маржа, которую требует ваш брокер Forex, будет определять максимальное кредитное плечо, которое вы можете использовать на своем торговом счете. Поэтому торговлю с кредитным плечом иногда называют «маржинальной торговлей».

Спасибо!

Я ответил на ваш вопрос в контексте моей цитаты. Иное меня не интересует. Вы мне что деньги платите с таким тоном со мной говорить?

 
Aleksandr Slavskii #:

Направление не верное в цикле и в функциях. У вас получается расчёт с переду назад.

В таком цикле вы заканчиваете перебор на rates_total-1 баре, а в функциях iOpen(), iBarShift(), направление другое и самый крайний(правый) бар имеет индекс ноль.

Вам нудно что то типа так

Ну и без проверки деления на ноль, совсем плохо.

Ещё желательно добавить в OnInit() проверку символов

спс большое- внесу правки....

 
Roman Shiredchenko #:

спс большое- внесу правки....

Вот так что то показывает.

//+------------------------------------------------------------------+
//|                                            spread_indicator.mq5
//|
//|
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, Roman Shiredchenko"
#property version   "1.2"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Current
#property indicator_label1  "Difference"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input double Weighting_coefficients1 = 1;  // proportionality factor (position volume) of the first spread symbol
input string Symbol2 = "USDCAD";   //second spread symbol
input bool   Symbol2_Reverse = true;    //inverse correlation
input double Weighting_coefficients2 = 1;  // proportionality factor (position volume) of the first spread symbol

//--- indicator buffers
double         BufferCurrent[];  // Current
const int EMPTY = -1;
double kPrice1, kPrice2;
double kVol1 = 1, kVol2 = 1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!SymbolSelect(Symbol2, true))
      return INIT_FAILED;
//--- indicator buffers mapping
   SetIndexBuffer(0, BufferCurrent, INDICATOR_DATA);
   PlotIndexSetString(0, PLOT_LABEL, "Spread");
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS, 0);
   PlotIndexSetInteger(0, PLOT_SHIFT, 0);
   ArraySetAsSeries(BufferCurrent, true);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,       // размер входных таймсерий
                const int prev_calculated,  // обработано баров на предыдущем вызове
                const datetime& time[],     // Time
                const double& open[],       // Open
                const double& high[],       // High
                const double& low[],        // Low
                const double& close[],      // Close
                const long& tick_volume[],  // Tick Volume
                const long& volume[],       // Real Volume
                const int& spread[])        // Spread
  {
   int limit = 0, corr = 0;
   if(prev_calculated <= 0)
      limit = rates_total - 1;

   ArraySetAsSeries(time, true);
   ArraySetAsSeries(open, true);

   for(int i = limit; i >= 0; i--)
     {
      datetime time2 = iTime(Symbol2, PERIOD_CURRENT, i - corr);
      if(time2 > time[i])//если такого бара нет на текущем инструменте
        {
         corr++;
         continue;
        }
      double open2 = iOpen(Symbol2, PERIOD_CURRENT, i);
      if(open2 != 0)
         if(!Symbol2_Reverse)
            BufferCurrent[i] = NormalizeDouble(100000 * Weighting_coefficients1 * kVol1 * open[i] - 100000 * Weighting_coefficients2 * kVol2 * open2, 0);
         else
            BufferCurrent[i] = NormalizeDouble(100000 * Weighting_coefficients1 * open[i] - 100000 * 1 / (Weighting_coefficients2 * open2), 0);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


 
Maxim Kuznetsov #:

пункт номер РАЗ: короткий код лучше вставлять непосредственно в сообщение. Web-деятели не осилили "посмотреть приаттаченный файл без загрузки", а не все кто готов помочь или высказаться жаждет скачивать файл и запускать MetaEditor

2. не раскрыто ветвление, "что-же делать если подходящего бара нет". Просто есть вариант что тот просто не подкачался ещё и стоит вернуть prev_calculated

3. в OnInit надо убедится что Symbol2 есть в обзоре рынка или его добавить, плюс там-же и при первом OnCalculate нужны танцы с бубном чтобы принудить терминал начать скачивать бары другого инструмента. Например запросить iBarShift(Symbol2,PERIOD_CURRENT,iTime(_Symbol,iBars(_Symbol,PERIOD_CURRENT)-1)); Или соответсвующий CopyTime. Есть подозрение что от билда к билду бубны разные нужны

4. Использовать специальную форму OnCalculate тут не оправданно, ты-же никак не используешь price[]

спс! А то я смотрю там возможно без подкачки истории показатели индикатора одни и теже....

буду вносить правки...

и по коду думал длинный - поэтому в файле сделал...

буду на экран.

" Web-деятели не осилили "посмотреть приаттаченный файл без загрузки" " - улыбнуло... в общем читаю доку....