Нужно, чтобы рисовал фракталы с периодом, причем по типу "зигзага", чтобы последовательно шли нижний верхний нижний фракталы и так далее.
Но по итогу на графике все равно проскакивают повторяющиеся фракты
Основа взята со стандарного индюка фрактала. Скриншот ниже с повторным фракталом на периоде 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_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_type2DRAW_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 datainputint period = 5;
int per = period;
//---- indicator buffersdouble ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high priceint ExtArrowShift=-10;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
if(per % 2 == 0) per++; //период фракталов только нечетный//---- indicator buffers mappingSetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_ARROW,217);
PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawingPlotIndexSetInteger(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
}
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int i,limit;
//---if(rates_total < per)
return(0);
//---if(prev_calculated < per + (per - 1) / 2)
{
limit = (per - 1) / 2;
//--- clean up arraysArrayInitialize(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 Fractalif(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
ExtUpperBuffer[i] = EMPTY_VALUE;
high_f = false;
}
//---- Lower Fractalif(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);
}
//+------------------------------------------------------------------+
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);
}
Никак не могу понять на основании чего возвращается определенное значение prev_calculated?
как оно вообще вычисляется
Это то значение, которое вернула функция OnCalculate() на прошлой итерации. Об этом прямо написано в документации:
Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.
Здравствуйте!
Да. Нет никакого смысла переводить время в строку, т. к. время - это число секунд. С этим числом работать гораздо проще, чем со строками, и быстрее.
Вы одно поправили, а другое испортили))
Во второй части вместо:
верните:
В предыдущей попытке эта строка у Вас была правильной.
Спасибо за ответы! Я оба варианта пробовал.
Не понимаю в чем подвох - все равно при закрытии по стопу тут же заходит:
Произнесите вслух ваше условие и поймёте в чём дело)
По идее там != везде условие, то есть наоборот > должно стоять, если я правильно понял о чем Вы. Но все варианты прогнал - все равно заходит.
Помогите разобраться с логикой, найти ошибку
Подробно закомментировал код.
Нужно, чтобы рисовал фракталы с периодом, причем по типу "зигзага", чтобы последовательно шли нижний верхний нижний фракталы и так далее.
Но по итогу на графике все равно проскакивают повторяющиеся фракты
Основа взята со стандарного индюка фрактала. Скриншот ниже с повторным фракталом на периоде 5
Подскажите, как в MQL4 получить объем открытых позиций по символу, если SYMBOL_SESSION_INTEREST не поддерживается? Спасибо!
Пробежать в цикле по всем позициям, и посчитать их совокупный объём: OrderLots()
Никак не могу понять на основании чего возвращается определенное значение prev_calculated?
как оно вообще вычисляется
Никак не могу понять на основании чего возвращается определенное значение prev_calculated?
как оно вообще вычисляется
Никак не могу понять на основании чего возвращается определенное значение 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