Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 895

[Удален]  
Sile Si:

Понятно что смещение будет в сторону большего лота, но это-же всё равно средняя цена, как если бы на хедж счёте применить формулу

Или нет?

Вроде да:) Проверьте, если не уверены!

 
Alexey Kozitsyn:

Вроде да:) Проверьте, если не уверены!

Не уверена, но проверить как. Может быть забредёт тот, кто точно знает)

[Удален]  
Sile Si:

Та я про него-ж ФОРТС) Если закрылась по 4657 то и открылась по 4657

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

[Удален]  
Sile Si:

Не уверена, но проверить как. Может быть забредёт тот, кто точно знает)

Эм.. совершите 3 сделки на демо разным лотом и посмотрите цену позиции, потом тоже самое по формуле... и все:)

 
Alexey Kozitsyn:

 Чаще всего цена позиции после переоткрытия не будет совпадать с ценой позиции до клиринга.

Вот дела... значит если функция модификации т\п производит расчёт цены т\п относительно цены позиции, то после клиринга мой т\п может оказаться совсем не там где должен быть.  Как-же тогда поставить правильно т\п?

[Удален]  
Sile Si:

Вот дела... значит если функция модификации т\п производит расчёт цены т\п относительно цены позиции, то после клиринга мой т\п может оказаться совсем не там где должен быть.  Как-же тогда поставить правильно т\п?

ТП останется на том же месте! Просто цена позиции изменится. Т.е. позиция закрывается - Вы получаете прибыль/убыток по позиции, и позиция открывается заново (в том же объеме, что и был). Но, если у позиции был ТП или СЛ - он останется на том же уровне, что и до закрытия. А вот если Вы захотите рассчитать ТП после клиринга, то да - цена позиции подкинет сюрприз.

В таком случае нужно искать сделки на закрытие позиции. И смотреть, было ли переоткрытие позиции. Короче, в таком случае нужно перед модификацией проверять все сделки на предмет закрытия по клирингу. Либо же просто запоминать в переменную начальную цену позиции... ну тут все зависит от задачи.

 
Alexey Kozitsyn:

ТП останется на том же месте! Просто цена позиции изменится. Т.е. позиция закрывается - Вы получаете прибыль/убыток по позиции, и позиция открывается заново (в том же объеме, что и был). Но, если у позиции был ТП или СЛ - он останется на том же уровне, что и до закрытия. А вот если Вы захотите рассчитать ТП после клиринга, то да - цена позиции подкинет сюрприз.

В таком случае нужно искать сделки на закрытие позиции. И смотреть, было ли переоткрытие позиции. Короче, в таком случае нужно перед модификацией проверять все сделки на предмет закрытия по клирингу. Либо же просто запоминать в переменную начальную цену позиции... ну тут все зависит от задачи.

Сюрприз, это уж точно). Т\П модифицируется по условию: если т\п != цена позиции + N. Для меня было бы проще запомнить в переменную, но после переоткрытия, сделки новые могут ещё быть. Как, в таком случае посчитать среднюю цену сделок, составляющих позицию, совершённых до и после лиринга, чтобы от неё считать т\п? Точнее спросить, как найду те сделки, что были до переоткрытия и соединю их со сделками совершёнными посл клиринга?

[Удален]  
Sile Si:

Сюрприз, это уж точно). Т\П модифицируется по условию: если т\п != цена позиции + N. Для меня было бы проще запомнить в переменную, но после переоткрытия, сделки новые могут ещё быть. Как, в таком случае посчитать среднюю цену сделок, составляющих позицию, совершённых до и после лиринга, чтобы от неё считать т\п? Точнее спросить, как найду те сделки, что были до переоткрытия и соединю их со сделками совершёнными посл клиринга?

Идентификатор позиции не поменяется. По нему ищите сделки.

 

Пожалуйста, помогите с устранением ошибки.

Текст ошибки "2018.07.05 15:21:32.080    StBB0 (EURUSD,M5)    array out of range in 'StBB0.mq5' (139,33)"

Непонятно почему рассчитываются значения для всего массива, хотя явно указал только первые 5 свечей (замена на values_to_copy не помогает).

//+------------------------------------------------------------------+
//|                                                         StBB0.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//#property indicator_chart_window 
//#property indicator_minimum 1
//#property indicator_maximum 100

#property indicator_buffers 4 
#property indicator_plots   1 

//--- построение Middle 
#property indicator_label1  "Middle" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrMediumSeaGreen 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- построение Upper 
#property indicator_label3  "Upper" 
#property indicator_type3  DRAW_LINE 
#property indicator_color3  clrMediumSeaGreen 
#property indicator_style3  STYLE_SOLID 
#property indicator_width3  1 
//--- построение Lower 
#property indicator_label2  "Lower" 
#property indicator_type2   DRAW_LINE 
#property indicator_color2  clrMediumSeaGreen 
#property indicator_style2  STYLE_SOLID 
#property indicator_width2  1 


//--- индикаторные буферы 
double         UpperBuffer[];
double         LowerBuffer[];
double         MiddleBuffer[];

double         Buffer[];

input int                  bands_period=20;           // период скользящей средней 
input int                  bands_shift=0;             // сдвиг 
input double               deviation=2.0;             // кол-во стандартных отклонений  
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены 

//--- переменная для хранения хэндла индикатора iBands 
int    handle;
//--- будем хранить количество значений в индикаторе Bollinger Bands 
int    bars_calculated=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
//--- привязка массивов к индикаторным буферам 
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
   SetIndexBuffer(2,UpperBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(1,LowerBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,MiddleBuffer,INDICATOR_CALCULATIONS);
//--- зададим смещение для каждой линии 
   PlotIndexSetInteger(0,PLOT_SHIFT,bands_shift);
//PlotIndexSetInteger(1,PLOT_SHIFT,bands_shift);
//PlotIndexSetInteger(2,PLOT_SHIFT,bands_shift);

//---- индексация элементов в буферах как в таймсериях  
   ArraySetAsSeries(UpperBuffer,true);
   ArraySetAsSeries(LowerBuffer,true);
   ArraySetAsSeries(MiddleBuffer,true);
   ArraySetAsSeries(Buffer,true);
//--- создадим хэндл индикатора 

   handle=iBands(_Symbol,PERIOD_CURRENT,bands_period,bands_shift,deviation,applied_price);

//--- если не удалось создать хэндл 
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки 
      PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",_Symbol,EnumToString(PERIOD_CURRENT),GetLastError());       //--- работа индикатора завершается досрочно 
      return(INIT_FAILED);
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//--- количество копируемых значений из индикатора iBands 
   int values_to_copy;
//--- узнаем количество рассчитанных значений в индикаторе 
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",calculated,GetLastError());
      return(0);
     }
//--- если это первый запуск вычислений нашего индикатора или изменилось количество значений в индикаторе iBands 
//--- или если необходимо рассчитать индикатор для двух или более баров (значит что-то изменилось в истории) 
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- если размер индикаторных массивов больше, чем значений в индикаторе iBands на паре symbol/period, то копируем не все  
      //--- в противном случае копировать будем меньше, чем размер индикаторных буферов 
      if(calculated>rates_total) values_to_copy=rates_total;
      else                       values_to_copy=calculated;
     }
   else
     {
      //--- значит наш индикатор рассчитывается не в первый раз и с момента последнего вызова OnCalculate()) 
      //--- для расчета добавилось не более одного бара 
      values_to_copy=(rates_total-prev_calculated)+1;
     }
//--- заполняем массив значениями из индикатора Bollinger Bands 
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работу 
   if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy)) return(0);
//--- сформируем сообщение 
   string comm=StringFormat("%s ==>  Обновлено значений в индикаторе %s: %d",
                            TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),values_to_copy);
//--- выведем на график служебное сообщение 
//Comment(comm); 
   if(ArraySize(UpperBuffer)>0)
     {
      for(int bar=0; 0<5 && !IsStopped(); bar++)   
      {
         double _max=UpperBuffer[bar];
         double _min=LowerBuffer[bar];
         double _Close=iClose(_Symbol,PERIOD_CURRENT,bar);
         Buffer[bar]=MathAbs((((_max+_min)/2)-_Close));
        };

     };

//Print(bars_calculated);
//--- запомним количество значений в индикаторе Bollinger Bands 
   bars_calculated=calculated;
//--- вернем значение prev_calculated для следующего вызова 
   return(rates_total);
  }
//+------------------------------------------------------------------+ 
//| Заполняем индикаторные буферы из индикатора iBands               | 
//+------------------------------------------------------------------+ 
bool FillArraysFromBuffers(double &base_values[],     // индикаторный буфер средней линии Bollinger Bands 
                           double &upper_values[],    // индикаторный буфер верхней границы 
                           double &lower_values[],    // индикаторный буфер нижней границы 
                           int shift,                 // смещение 
                           int ind_handle,            // хэндл индикатора iBands 
                           int amount                 // количество копируемых значений 
                           )
  {
//--- сбросим код ошибки 
   ResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0 
   if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки 
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным 
      return(false);
     }

//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1 
   if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки 
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным 
      return(false);
     }

//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2 
   if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки 
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным 
      return(false);
     }
//--- все получилось 
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Indicator deinitialization function                              | 
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason)
  {
//--- почистим график при удалении индикатора 
   Comment("");
  }
//+------------------------------------------------------------------+
 
SEM:

Пожалуйста, помогите с устранением ошибки.

Текст ошибки "2018.07.05 15:21:32.080    StBB0 (EURUSD,M5)    array out of range in 'StBB0.mq5' (139,33)"

Непонятно почему рассчитываются значения для всего массива, хотя явно указал только первые 5 свечей (замена на values_to_copy не помогает).

Ошибка то где? Выделите строку цветом