Вопрос к профессионалам - страница 2

 

Вот советник, кот. отрисовывает на графике стрелками два последних минимума и два последних максимума. Отрисовывает стрелками. (Стрелки, - это не входы!, а экстремумы)

Программно это, в конечном итоге, выведено так:

a = LastUpPos;//номер последнего Up-бара 
  b = PreLastUpPos;//номер предпоследнего Up-бара 
   c = LastDownPos;//номер последнего Down-бара   
    d = PreLastDownPos;//номер предпоследнего Down-бара 
// a_ = High[LastUpPos]; b_ = High[PreLastUpPos];
 //c_ = Low[LastDownPos]; d_ = Low[PreLastDownPos];
   a_ = iHigh(NULL,0,LastUpPos);      //цена макс. знач последнего Up-бара
   b_ = iHigh(NULL,0,PreLastUpPos);   //цена макс. знач. предпосл. Up-бара 
   c_ = iLow(NULL,0,LastDownPos);     //цена мин. знач.последнего Down-бара
   d_ = iLow(NULL,0,PreLastDownPos);  //цена мин. знач.предпосл. Down-бара

Желающие могут соотв. изменить там условия входов, - причем можно строить(задавать)  различные фигуры (по 4 точкам abcd )  и менять условия входов в соотв. с конфигупацией.


Файлы:
model_01.mq4  18 kb
 
FOReignEXchange писал(а) >>

Ну так попробуйте с помощью Функций iLowest и iHighest найти те точки,которые отмечены на графике. Как это Вы сделаете? Никак не сделаете, так как цена может 10 баров подряд падать и фрактал появится только на 11-ом баре(соответственно будет всего один пик на 11 барах), а может на этих 11 барах сформировать 3 или даже больше фракталов(соответственно будет 3 или более пиков на 11 барах). Поэтому тут парами строк кода не обойтись.

Легко. Посмотрите ЗигЗаг, Вам на многое откроются глаза.

 
   i=100;
   While (i>0)
         {
         i--;
         if (High[i-1]>High[i-2] && High[i-1]>High[i])
            {
            n=i-1;
            Alert ("Номер бара на максимуме=",n);
            }
         }


Вот этот код выведет на печать номера баров на которых сформировались максимумы на фракталах за последние 100 баров. Примерно в этом направлении и надо искать пики, а не функциями iLowest или iHighest.

ИМХО.

 

Функция возвращает фрактал по его номеру. Нумерация для верхних и нижних фракталов раздельная. Может пригодиться при разработке советников, которые для принятия решения о входе в рынок анализируют взаимное расположение какого то количества последних фракталов. Сделана путём переделки функции KimIV.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru  & khorosh        |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.02.2009                                                     |
//|  Описание : Возвращает фрактал по его номеру.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
double GetFractal(string sy="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    i, k=iBars(sy, tf), kf;
  for (i=3; i<k; i++) {
    if(mode==MODE_LOWER){
    f=iFractals(sy, tf, MODE_LOWER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iLow(sy,tf,i));
     } 
    }
    if(mode==MODE_UPPER){
    f=iFractals(sy, tf, MODE_UPPER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iHigh(sy,tf,i));
      }
    }
  }
  Print("GetFractalBar(): Фрактал не найден");
  return(-1);
}
// например 5-й верхний фрактал на ТФ М15  fracUp_5=GetFractal("0", 15, 5, MODE_UPPER);
// а 2-й нижний фрактал на ТФ Н1           fracLow_2=GetFractal("0",60,2,MODE_LOWER); 

 
Stellarspace писал(а) >>

Уважаемые профи!

Чтобы сравнить, например, два соседних бара, нужно один обозначить i+1, второй i+2. А как сравнить два максима или два минимума обозначенные ниже на рисунке точками?

Видимо затронул интересный вопрос. Привожу код индикатора:

#property indicator_chart_window // Индик. рисуется в основном окне
#property indicator_buffers 2 // Количество буферов
#property indicator_color1 DarkBlue // Цвет первой линии
#property indicator_color2 Crimson // Цвет второй линии
extern int History =50; // Колич. баров в расчётной истории

double MaxA[], // Массив MaxA
MinA[]; // Массив MinA


double Buf_MaxA[], // Объявление индикаторного массива Buf_Max
Buf_MinA[]; // Объявление индикаторного массива Buf_Min

//-------------------------------------------------------------------

int init() // Специальная функция init()

{
SetIndexBuffer(0,Buf_MaxA); // Назначение массива буферу
SetIndexStyle (0,DRAW_ARROW,STYLE_SOLID,4); // Стиль линии
SetIndexArrow(0, 158); // Порядковый номер линии и номер значка
SetIndexLabel(0,"MAX"); // Имя линии индикатора
SetIndexBuffer(1,Buf_MinA); // Назначение массива буферу
SetIndexStyle (1,DRAW_ARROW,STYLE_SOLID,4); // Стиль линии
SetIndexArrow(1, 158); // Порядковый номер линии и номер значка
SetIndexLabel(1,"MIN"); // Имя линии индикатора

return; // Выход из спец. ф-ии init()
}

//-------------------------------------------------------------------

int start() // Специальная функция start()

{

int counted_bars=IndicatorCounted(); // Количество просчитанных баров

int i=Bars-counted_bars-1, // Индекс первого непосчитанного
k; // Индекс k


double HighA=0, // Максимум A
HighB=0, // Максимум B
HighC=0, // Максимум C
LowA=0, // Минимум A
LowB=0, // Минимум B
LowC=0; // Минимум C

//-------------------------------------------------------------------

if (i>History-1) // Если много баров то
i=History-1; // рассчитывать заданное колич


SetIndexDrawBegin(0,Bars-History+1); // Установка первого бара от которого должна
// начинаться отрисовка индикаторной линии
ArrayResize(MaxA,History); // Установка массива MaxA
ArrayResize(MinA,History); // Установка массива MinA
ArrayInitialize(MaxA,0); // Инициализация элементов в массиве MaxA
ArrayInitialize(MinA,0); // Инициализация элементов в массиве MinA

//-------------------------------------------------------------------

for (i=0; i<History-1; i++) // Цикл от 0-ого бара до History-1

{

HighA=High[i+2]; // Вычисляем HighA
HighB=High[i+1]; // Вычисляем HighB
HighC=High[i+0]; // Вычисляем HighC
LowA=Low[i+2]; // Вычисляем LowA
LowB=Low[i+1]; // Вычисляем LowB
LowC=Low[i+0]; // Вычисляем LowC

//-------------------------------------------------------------------

for (k=0; k<i; k++) // Цикл от 0-ого бара до History-1,
// для операций с максим. и мин.

{

if (MaxA[i+1]>0||MinA[i+1]>0)break; // Если рассчет цикла завершен, выход

//-------------------------------------------------------------------

if (HighA<=HighB && HighB>=HighC && LowB>High[k]) // Задается условие

{
MaxA[i+0]=HighB; // для поиска MaxA
Buf_MaxA[i+1]=MaxA[i+0]; // Buf_MaxA получает значение MaxA
}

if (LowA>=LowB && LowB<=LowC && HighB<Low[k]) // Задается условие

{
MinA[i+0]=LowB; // для поиска MinA
Buf_MinA[i+1]=MinA[i+0]; // Buf_MinA получает значение MinA
}

//-------------------------------------------------------------------
}
}

return(0); // Выход из спец. ф-ии start()
}

//-------------------------------------------------------------------

int deinit() // Специальная функция deinit()
{
return(0); // Выход из спец. ф-ии deinit()
}

//+------------------------------------------------------------------+

Если кто знает, напишите, как, например, найти максимальный максимум из трех последовательно идущих (обозначеных точками) максимумов.

[Deleted]  
Всё это прикольно. Но причём тут профи??? (см. название темы). Зелени отводится другой пост!!
 

Что на этом профи и закончились? Вы только способны мыслить высокими материами, а когда дело доходит до чего-то реального так все умалкают.

 
Лично я могу написать то, что Вам надо, но тратить полдня на написание кода, который мне ничего не даст я не хочу. Что Вы хотите, чтобы Вам написали код и выложили на блюдечке?  Кто будет терять кучу своего времени просто так? И вообще что Вам надо? Я не понимаю. Понятно, что надо найти номера баров на пиках. А дальше что?
 

Добрый вечер всем.

Оч. большая неприятнось случилось пару часов назад. .

Не так давно открыл небольшой памм-счет в Альпари. За месяц советник увеличил депозит примерно на 11 процентов.

Сегодня я вручную открыл две арбитражные позиции BUY USDCHF + BUY USDCAD

И повесил советник - "Парный трейлингстоп". Где предусмотрел условия закрытия либо по виртуальному парному тралу, либо по достижении заданного суммарного профита/убытка.

Через 30 минут обе позиции закрылись по тралу.

По условиям советника сделки должны были открыться опять.

Они открылись. И потом сразу закрылись. И опять открылись. И тут же закрылись.

И так почти 450 раз - до тех пор, пока я минут через 30 случайно не заглянул в терминал! И обнаружил,

что за 450 раз (аск-бид) - сильно уменьшили размер депозита.

Советник в закачке.

Файлы:
 

Судя ро всему, здесь виноват блок закрытия позиций арбитражной пары инструментов по заданному суммарному профиту/убытку. Поскольку ничто иное там в коде позиции не закрывает.

Вот этот блок:

(используются ф-и И.Кима)

// Закрытие позиций по заданному суммарному профиту/убытку

 if (

 ( Close_Profit ==true  &&   TRADE_START==true    &&
// если выключатель блока закрытия включен и  
 (GetProfitOpenPosInCurrency(Symbol_1,-1,MagicNumber ) +
  GetProfitOpenPosInCurrency(Symbol_2,-1,MagicNumber ) 
     >= CloseProfit)) // суммарный профит больше заданного значения
   || // или 
  ( Close_Profit ==true  &&   TRADE_START==true    && 
 (GetProfitOpenPosInCurrency(Symbol_1,-1,MagicNumber ) +
  GetProfitOpenPosInCurrency(Symbol_2,-1,MagicNumber )
    <= -1*CloseLoss)) //суммарный убыток больше заданного значения      
        
 ){ // закрываем позиции 
    ClosePosFirstProfit(Symbol_1,-1, MagicNumber);
    ClosePosFirstProfit(Symbol_2,-1, MagicNumber);  }
        
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+