Вопрос к профессионалам - страница 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()
}

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

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

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

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

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

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

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

Не так давно открыл небольшой памм-счет в Альпари. За месяц советник увеличил депозит примерно на 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);  }
        
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ 
 
Причина обращения: