[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 660

 
Craft:


Анатолий, большое спасибо, жаль здесь нельзя вставить иконку, как в Скайпе с поклоном. Всё просто и элегантно получилось. Из общения с другими программами тех. анализа, понимаю, что так и должно быть, но практики работы с mql пока не хватает. Спасибо за подсказку с выделением в метод - по разбираюсь.

На послед, не подскажите как избежать, множественного выставления ордеров на одном баре этим советником? Добрые люди уже давали подсказки, но надушу не легли.

Попробовал решить вашу проблему, и вот что получилось. Впрочем обо всем по порядку. 

Кто виноват и что делать? Или откуда растут ноги…

У вас в советнике, для открытия позиции (и соответственно закрытия предыдущей) используются разные настройки индикатора CCI. Для покупки, свои настройки, для продажи свои. Насколько я понял в этом и есть фишка. Например при up-тренде, выгодней использовать менее чувствительные настройки для покупки, чтобы дать прибыли «расти» (то есть имеет смысл держать позицию по тренду по дольше). В то время для продаж (при up-тренде) нужны более чувствительные настройки, для быстрых входов/выходов, при попытках например поймать коррекцию (соответственно быть в рынке с позицией против тренда по меньше времени). Все очень логично, и идея тоже не лишена здравого смысла, но возникает при такой системе один нюанс, что делать, если из-за разностей настройки (по сути, для терминала это два индикатора) возникает два противоположенных сигнала одновременно?

Про голубые стрелочки…

Советник на одном баре получает одновременно сигнал для покупки, и для продажи, а так как я писал выше, при открытии одной позиции противоположенная должна быть закрыта. Вот и получается такая картинка, дается команда купить, и закрыть продажу, так как продажи к тому моменту нет, то советник открывает BUY. На следующем тике, генерируется противоположенный сигнал, продать, и соответственно только что открытая покупка закрывается. Еще одно наблюдение, вы заметили что «колбасит» исключительно покупки (кучи голубых стрелочек)? Реализация методов купли/продажи насколько я понял, взята из учебника, а там есть такая особенность, что по завершению операции происходит выход из метода start(), оператором return, то есть за один тик может произойти только одно открытие/закрытие. Так вот, при получении «двойного сигнала», происходит закрытие всех сделок (блок закрытия  описан первым), далее блок открытия сделок, а в нем покупка описана первой!!!, а после покупки происходит выход из start(), так что советник просто не успевает добраться до продаж :))) и зацикливается до тех пор пока не получит «нормальный» одиночный приказ.

Про способы решения…

Способов решения не мало.
1. Дедовский.
Для начала можно «убить» идею, и просто задавать одинаковые параметры для покупок и продаж, и проблема исчезнет сама собой.

2. Сложный.
Нужно вписать алгоритм определения основного тренда в советник, и соответственно придавать разный «вес» сделкам. Так при поступлении разнонаправленных сигналов, предпочтение отдавать тому, у которого больший «вес» (то есть тому, который по тренду).

3. Без названия.
При поступлении разнонаправленных сигналов…
Ничего не делать. 

if(Opn_B && Opn_S)return;

Именно такой вариант в прикрепленном ниже файле.
Надеюсь все понятно объяснил.
Удачи :)))

 

Файлы:
11_3_1.mq4  13 kb
 

Пост Volfram'a удален за размножение в нескольких ветках.

Volfram, Вы создали специально для этой цели свою ветку. Вам уже ответили; этого недостаточно?

P.S. Скажу Вам по секрету, Volfram: отсутствие явного интереса к Вашей идее неявно свидетельствует о том, что эта идея не заслуживает внимания. Соответственно и не нашлось желающих реализовывать ее "забисплатно".

 
ToLik_SRGV:

2. Сложный.
Нужно вписать алгоритм определения основного тренда в советник, и соответственно придавать разный «вес» сделкам. Так при поступлении разнонаправленных сигналов, предпочтение отдавать тому, у которого больший «вес» (то есть тому, который по тренду).

3. Без названия.
При поступлении разнонаправленных сигналов…
Ничего не делать.

Именно такой вариант в прикрепленном ниже файле.
Надеюсь все понятно объяснил.
Удачи :)))

Можно и мне добавить свою веху... :)

Я тож начинал с учебника. Можно сделать проще: Достаточно убрать закрытие бай при сигнале селл и закрытие селл при сигнале бай, т.е. не использовать свинговую торговлю, реализованную в учебнике Сергея Ковалёва... Отслеживание позиций проводить не по тикету, а по магику. Поначалу я так и сделал и спокойненько тестировал свои идеи. Далее уже написал свои функции для работы...

ЗЫ. Код не смотрел, посему могу ошибаться применительно к данному советнику...

 

никак не соображу как найти экстремумы функции

есть у меня массив данных который хранит значения:

как найти переломы - экстремумы используя массив данных из 250 элементов и сохранить только номера элементов где находятся эти экстремумы

 

Ребяты, а у меня вот такой вопрос:

В функции определения тренда явно указано, что если АС на первом баре больше, чем АС на втором баре (т.е. увеличивается), но тренд нисходящий (другие индюки кажут вниз), то в таком случае возвращать ноль, т.е. нет тренда вниз... Но советник упорно игнорирует, в чём может быть причина?


Ф-ция опр. тренда:

int Trend_BBOsMA (string sy, int tf)
{
   if (sy=="" || sy=="0") sy=Symbol();
double
   BB    =iCustom(sy,tf,"BB_MA",13,13,0,1),
   OsMA  =iOsMA  (sy,tf,9,21,5,PRICE_CLOSE,1),
   AC1   =iAC(sy,tf,1),
   AC2   =iAC(sy,tf,2),
   AC3   =iAC(sy,tf,3);
   
   if (BB>0 && OsMA>0 && AC1>AC2) return(1);
   if (BB<0 && OsMA<0 && AC1<AC2) return(-1);
   else return(0);
}

Проверка на открытие доливок (в самом начале проверка тренда, на которую не реагирует: trH1 и trM15 ) - дальше эксперименты с условиями, не обращайте внимания, но код рабочий...

//============================================================================================== 
   // Доливка 1
//==============================================================================================  
//------------------------- Покупка 1 ------------------------   
   if (AddPose1 &&
         trH1==1 &&                  // Если часовой и 
         trM15==1 &&                 // пятнадцатиминутный тренды восходящие
         Mom5_1>Mom5_2 &&              // найден разворот
         Mom5_2<=Mom5_3 &&             // Моментума
//         Mom5_2<=100.0 &&
//         DeM5_1<=0.6 &&                  // и Демаркер в зоне перепроданности
//         AC1>AC2 &&                    // Ускорение вверх ----------------------- ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_BUY, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==10 || trM15==10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Buy_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL, OP_BUY, Lots_New, 0, 0, Magic, New_Comm);
         }
//------------------------- Продажа 1 ------------------------   
   if (AddPose1 && 
         trH1==-1 &&                 // Если часовой и 
         trM15==-1 &&                // пятнадцатиминутный тренды нисходящие
         Mom5_1<Mom5_2 &&              // найден разворот
         Mom5_2>=Mom5_3 &&             // Моментума
//         Mom5_2>=100.0 &&
//         DeM5_1>=0.4 &&                  // и Демаркер в зоне перекупленности
//         AC1<AC2 &&                    // Ускорение вниз ------------------------ ВОТ ЗДЕСЬ УБРАЛ
         SecondsAfterOpenLastPos(NULL, OP_SELL, 511)>=4*60
      )
         {
            Magic=511;          // Задаём магик... 
            Lots=GetSizeLot();
            divider=1;
//            if (trH1==-10 || trM15==-10) divider=2;
            Lots_New=NormalizeLot(Lots/divider, true, NULL);
            New_Comm="Sell_M5_Стратегия_1_Доливка1";   // Задаём комментарий для позиции
            OpenPosition(NULL,OP_SELL,Lots_New,0,0,Magic,New_Comm);
         }
//==============================================================================================

Мож кто что увидит, что мне не видно? Спасибо.

 
На скриншоте не видно индикатора BB_MA. И в верхнем коде нет проверок направления тренда. Переменная ВВ будет всегда содержать одно значение. Насколько я понял, индикатор ВВ_МА - это скользящая средняя. Чтоб определить направление скользящей нужно иметь 2 значения на разных свечках, например на первой и второй свече и сравнивать эти значения между собой. Поэтому можно сказать, что верхний код выполняет свою задачу лишь отчасти.
 
IgorM:

никак не соображу как найти экстремумы функции

есть у меня массив данных который хранит значения:

как найти переломы - экстремумы используя массив данных из 250 элементов и сохранить только номера элементов где находятся эти экстремумы


  Организуем цикл, в котором проходим по значениям массива. Значение в предыдущей ячейке массива сравниваем со значением в текущей ячейке. Если оно больше, то переходим к следующей итерации цикла. Короче, до тех пор, пока значение в каждой последующей ячейке массива растёт, продолжаем перебор. Как только оно стало меньше предыдущего, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали пик. Теперь тенденция едет вниз. Теперь выполняем перебор до тех пор, пока в очередной ячейке ни обнаружится значение больше, чем в предыдущей. Как только это произошло, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали дно впадины. Можно вносить номера в разные массивы,чтоб отфильтровать пики от впадин. Словом, после полного перебора всех значений массива, мы получим отсортированные данные (искомые номера ячеек в одном/двух других массивах)
 
drknn:

  Организуем цикл, в котором проходим по значениям массива. Значение в предыдущей ячейке массива сравниваем со значением в текущей ячейке. Если оно больше, то переходим к следующей итерации цикла. Короче, до тех пор, пока значение в каждой последующей ячейке массива растёт, продолжаем перебор. Как только оно стало меньше предыдущего, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали пик. Теперь тенденция едет вниз. Теперь выполняем перебор до тех пор, пока в очередной ячейке ни обнаружится значение больше, чем в предыдущей. Как только это произошло, номер предыдущей ячейки запоминаем в заранее объявленный массив, так как произошёл перелом тенденции - мы отыскали дно впадины. Можно вносить номера в разные массивы,чтоб отфильтровать пики от впадин. Словом, после полного перебора всех значений массива, мы получим отсортированные данные (искомые номера ячеек в одном/двух других массивах) 

угу значит надо через while попробовать - это до первого пика, а потом ........ - опять не соображу
 
drknn:
На скриншоте не видно индикатора BB_MA. И в верхнем коде нет проверок направления тренда. Переменная ВВ будет всегда содержать одно значение. Насколько я понял, индикатор ВВ_МА - это скользящая средняя. Чтоб определить направление скользящей нужно иметь 2 значения на разных свечках, например на первой и второй свече и сравнивать эти значения между собой. Поэтому можно сказать, что верхний код выполняет свою задачу лишь отчасти.

Нет, BB_MA - это я так для краткости для себя назвал Bears&Bulls_MA, который складывает значения сил быков и медведей и выводит их как гистограмму, что-то типа макдака или ему подобных. Всегда, когда гистограмма выше нуля - тренд вверх, ниже - вниз...

Посему, проверка направления тренда - это:

if (BB>0 && OsMA>0 && AC1>AC2) return(1);

для UP и

if (BB<0 && OsMA<0 && AC1<AC2) return(-1);

для DOWN, ну и

 else return(0);

для Flat.

Т.е. функция возвращает 1 если Bears&Bulls_MA выше ноля, OsMA выше ноля и значение первого бара АС больше значения второго бара АС,

для тренда вниз - наоборот... Ну и для флета все остальные разногласия в графиках (пока..., далее, как с этим разберусь, подключу проверку движения с ускорением/замедлением и разворот).

Открываться позиции должны только при однозначном "тренд вверх" или "тренд вниз"... В принципе, всё работало, пока я не добавил АС для контроля скорости движения валюты, дабы исключить (частично) открытия поз в конце движения, на истощении тренда или коррекции.

Пока не работает... и именно АС

 
IgorM:

угу значит надо через while попробовать - это до первого пика, а потом ........ - опять не соображу

  Нет - цикл нужно делать через for. Ща попробую скриптик такой набросать. Идея-то вобщем-то осуществима.
Причина обращения: