Та я про него-ж ФОРТС) Если закрылась по 4657 то и открылась по 4657
Ну в том случае, если цена закрытия полностью совпадает с ценой позиции, тогда - да, но это как сломанные часы, которые дважды в день точное время показывают. Чаще всего цена позиции после переоткрытия не будет совпадать с ценой позиции до клиринга.
Чаще всего цена позиции после переоткрытия не будет совпадать с ценой позиции до клиринга.
Вот дела... значит если функция модификации т\п производит расчёт цены т\п относительно цены позиции, то после клиринга мой т\п может оказаться совсем не там где должен быть. Как-же тогда поставить правильно т\п?
Вот дела... значит если функция модификации т\п производит расчёт цены т\п относительно цены позиции, то после клиринга мой т\п может оказаться совсем не там где должен быть. Как-же тогда поставить правильно т\п?
ТП останется на том же месте! Просто цена позиции изменится. Т.е. позиция закрывается - Вы получаете прибыль/убыток по позиции, и позиция открывается заново (в том же объеме, что и был). Но, если у позиции был ТП или СЛ - он останется на том же уровне, что и до закрытия. А вот если Вы захотите рассчитать ТП после клиринга, то да - цена позиции подкинет сюрприз.
В таком случае нужно искать сделки на закрытие позиции. И смотреть, было ли переоткрытие позиции. Короче, в таком случае нужно перед модификацией проверять все сделки на предмет закрытия по клирингу. Либо же просто запоминать в переменную начальную цену позиции... ну тут все зависит от задачи.
ТП останется на том же месте! Просто цена позиции изменится. Т.е. позиция закрывается - Вы получаете прибыль/убыток по позиции, и позиция открывается заново (в том же объеме, что и был). Но, если у позиции был ТП или СЛ - он останется на том же уровне, что и до закрытия. А вот если Вы захотите рассчитать ТП после клиринга, то да - цена позиции подкинет сюрприз.
В таком случае нужно искать сделки на закрытие позиции. И смотреть, было ли переоткрытие позиции. Короче, в таком случае нужно перед модификацией проверять все сделки на предмет закрытия по клирингу. Либо же просто запоминать в переменную начальную цену позиции... ну тут все зависит от задачи.
Сюрприз, это уж точно). Т\П модифицируется по условию: если т\п != цена позиции + N. Для меня было бы проще запомнить в переменную, но после переоткрытия, сделки новые могут ещё быть. Как, в таком случае посчитать среднюю цену сделок, составляющих позицию, совершённых до и после лиринга, чтобы от неё считать т\п? Точнее спросить, как найду те сделки, что были до переоткрытия и соединю их со сделками совершёнными посл клиринга?
Сюрприз, это уж точно). Т\П модифицируется по условию: если т\п != цена позиции + 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_buffers4#property indicator_plots1//--- построение Middle #property indicator_label1"Middle"#property indicator_type1DRAW_LINE#property indicator_color1clrMediumSeaGreen#property indicator_style1STYLE_SOLID#property indicator_width11//--- построение Upper #property indicator_label3"Upper"#property indicator_type3DRAW_LINE#property indicator_color3clrMediumSeaGreen#property indicator_style3STYLE_SOLID#property indicator_width31//--- построение Lower #property indicator_label2"Lower"#property indicator_type2DRAW_LINE#property indicator_color2clrMediumSeaGreen#property indicator_style2STYLE_SOLID#property indicator_width21//--- индикаторные буферы double UpperBuffer[];
double LowerBuffer[];
double MiddleBuffer[];
double Buffer[];
inputint bands_period=20; // период скользящей средней inputint bands_shift=0; // сдвиг inputdouble deviation=2.0; // кол-во стандартных отклонений inputENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // тип цены //--- переменная для хранения хэндла индикатора iBands int handle;
//--- будем хранить количество значений в индикаторе Bollinger Bands int bars_calculated=0;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- 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 |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &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 | //+------------------------------------------------------------------+ voidOnDeinit(constint reason)
{
//--- почистим график при удалении индикатора Comment("");
}
//+------------------------------------------------------------------+
Понятно что смещение будет в сторону большего лота, но это-же всё равно средняя цена, как если бы на хедж счёте применить формулу
Или нет?
Вроде да:) Проверьте, если не уверены!
Вроде да:) Проверьте, если не уверены!
Не уверена, но проверить как. Может быть забредёт тот, кто точно знает)
Та я про него-ж ФОРТС) Если закрылась по 4657 то и открылась по 4657
Ну в том случае, если цена закрытия полностью совпадает с ценой позиции, тогда - да, но это как сломанные часы, которые дважды в день точное время показывают. Чаще всего цена позиции после переоткрытия не будет совпадать с ценой позиции до клиринга.
Не уверена, но проверить как. Может быть забредёт тот, кто точно знает)
Эм.. совершите 3 сделки на демо разным лотом и посмотрите цену позиции, потом тоже самое по формуле... и все:)
Чаще всего цена позиции после переоткрытия не будет совпадать с ценой позиции до клиринга.
Вот дела... значит если функция модификации т\п производит расчёт цены т\п относительно цены позиции, то после клиринга мой т\п может оказаться совсем не там где должен быть. Как-же тогда поставить правильно т\п?
Вот дела... значит если функция модификации т\п производит расчёт цены т\п относительно цены позиции, то после клиринга мой т\п может оказаться совсем не там где должен быть. Как-же тогда поставить правильно т\п?
ТП останется на том же месте! Просто цена позиции изменится. Т.е. позиция закрывается - Вы получаете прибыль/убыток по позиции, и позиция открывается заново (в том же объеме, что и был). Но, если у позиции был ТП или СЛ - он останется на том же уровне, что и до закрытия. А вот если Вы захотите рассчитать ТП после клиринга, то да - цена позиции подкинет сюрприз.
В таком случае нужно искать сделки на закрытие позиции. И смотреть, было ли переоткрытие позиции. Короче, в таком случае нужно перед модификацией проверять все сделки на предмет закрытия по клирингу. Либо же просто запоминать в переменную начальную цену позиции... ну тут все зависит от задачи.
ТП останется на том же месте! Просто цена позиции изменится. Т.е. позиция закрывается - Вы получаете прибыль/убыток по позиции, и позиция открывается заново (в том же объеме, что и был). Но, если у позиции был ТП или СЛ - он останется на том же уровне, что и до закрытия. А вот если Вы захотите рассчитать ТП после клиринга, то да - цена позиции подкинет сюрприз.
В таком случае нужно искать сделки на закрытие позиции. И смотреть, было ли переоткрытие позиции. Короче, в таком случае нужно перед модификацией проверять все сделки на предмет закрытия по клирингу. Либо же просто запоминать в переменную начальную цену позиции... ну тут все зависит от задачи.
Сюрприз, это уж точно). Т\П модифицируется по условию: если т\п != цена позиции + N. Для меня было бы проще запомнить в переменную, но после переоткрытия, сделки новые могут ещё быть. Как, в таком случае посчитать среднюю цену сделок, составляющих позицию, совершённых до и после лиринга, чтобы от неё считать т\п? Точнее спросить, как найду те сделки, что были до переоткрытия и соединю их со сделками совершёнными посл клиринга?
Сюрприз, это уж точно). Т\П модифицируется по условию: если т\п != цена позиции + N. Для меня было бы проще запомнить в переменную, но после переоткрытия, сделки новые могут ещё быть. Как, в таком случае посчитать среднюю цену сделок, составляющих позицию, совершённых до и после лиринга, чтобы от неё считать т\п? Точнее спросить, как найду те сделки, что были до переоткрытия и соединю их со сделками совершёнными посл клиринга?
Идентификатор позиции не поменяется. По нему ищите сделки.
Пожалуйста, помогите с устранением ошибки.
Текст ошибки "2018.07.05 15:21:32.080 StBB0 (EURUSD,M5) array out of range in 'StBB0.mq5' (139,33)"
Непонятно почему рассчитываются значения для всего массива, хотя явно указал только первые 5 свечей (замена на values_to_copy не помогает).
Пожалуйста, помогите с устранением ошибки.
Текст ошибки "2018.07.05 15:21:32.080 StBB0 (EURUSD,M5) array out of range in 'StBB0.mq5' (139,33)"
Непонятно почему рассчитываются значения для всего массива, хотя явно указал только первые 5 свечей (замена на values_to_copy не помогает).
Ошибка то где? Выделите строку цветом.