Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 614

 
yan720:
Спасибо, что откликнулись. Если не сложно, пришлите, плз, советник, о котором Вы говорите (или его кусок, который именно с каналом) - интересно посмотреть другую реализацию.

Я не могу разобраться в том, что смастерил несколько лет назад. Он почему-то не работает, хотя помню, что раньше работал и торговал. Давайте я разберусь в коде сначала, исправлю его, а потом отправлю. Может завтра. Просто не охота позориться, если вдруг там какие-то детские ошибки. 

 
yan720:

Общая идея, конечно, такая. А как определять ширину канала (дипазон в Вашем случае)? У меня это делается через размер средней свечи плюс это всё завязано на длину канала, поскольку наличие канала проверяется не на жёстком количестве баров, а, например, на длине от 10 до 30 баров.

Меня интересует вопрос именно выбора ширины от длины...

Можно сделать в одном индюке несколько внешних параметров для ширина канала. И для каждого параметра производить отдельные вычисления.

 

Для длины аналогично.

 
Example2:
Здравствуйте. Корзиночный советник, при наступлении условии должен закрыть все ордера, но он сначала закрывает ордер, потом пытается закрыть его снова (сервер выдает ошибку "Неверный тикет") и только потом идет дальше. Вот пример кода и сам советник.

У Вас в функции CloseOrders(), если ордер закроется, цикл while(cnt<=5 ) еще раз направит код на закрытие ордера, и естественно выйдет ошибка, тогда выход происходит через if().. break; 

                    int cnt=0;
                    while(cnt<=5){
                      Result[0]=OrderClose(OrderTicket(),OrderLots(),MarketInfo("USDCAD",MODE_BID),slip,Blue);
                      if(!Result[0]){
                        Answer=ERRORS(GetLastError());
                        if (Answer==1)continue; cnt++;
                        if (Answer==2)break;
                      }
                    }

В функции ProtectionClose() Вы уже добавили строки с корректным выходом из  while

 if(Result[0])break;
 }continue;
Попробуйте здесь покопать.
 
pu6ka:

У Вас в функции CloseOrders(), если ордер закроется, цикл while(cnt<=5 ) еще раз направит код на закрытие ордера, и естественно выйдет ошибка, тогда выход происходит через if().. break; 

В функции ProtectionClose() Вы уже добавили строки с корректным выходом из  while

Попробуйте здесь покопать.

 


Но в случае который я описал ордера закрывает именно функция ProtectionClose(), в этом то и загвоздка. А ту ошибку я исправлю.
 
Example2:

Но в случае который я описал ордера закрывает именно функция ProtectionClose(), в этом то и загвоздка. А ту ошибку я исправлю.

Я глубоко код не копал, прогнать в тестере не смог, индикатора нет.

Но, например, Ваши функции OpenUsdbuy(); OpenSellusd() идут подряд.

OpenSellusd() открывает GBPUSD, EURUSD, AUDUSD, NZDUSD и т.д. Их же Вы первыми начинаете закрывать в обратном порядке  NZDUSD, AUDUSD и т.д.

 

В коде который Вы выкладывали, в функции ProtectionClose()  только в трех парах есть выход из while в двух вариантах: USDCAD, USDCHF, USDJPY.

В остальных валютах из  while() можно выйти только по ошибке if(!Result[..])

 
FOReignEXchange:

Можно сделать в одном индюке несколько внешних параметров для ширина канала. И для каждого параметра производить отдельные вычисления.

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

 
pu6ka:

Я глубоко код не копал, прогнать в тестере не смог, индикатора нет.

Но, например, Ваши функции OpenUsdbuy(); OpenSellusd() идут подряд.

OpenSellusd() открывает GBPUSD, EURUSD, AUDUSD, NZDUSD и т.д. Их же Вы первыми начинаете закрывать в обратном порядке  NZDUSD, AUDUSD и т.д.

 

В коде который Вы выкладывали, в функции ProtectionClose()  только в трех парах есть выход из while в двух вариантах: USDCAD, USDCHF, USDJPY.

В остальных валютах из  while() можно выйти только по ошибке if(!Result[..])


Спасибо за подсказку, реально забыл дальше выход из цикла проставить, теперь то точно должно работать, если хотите, то могу индикатор выложить в качестве благодарности.
 
yan720:

Общая идея, конечно, такая. А как определять ширину канала (дипазон в Вашем случае)? У меня это делается через размер средней свечи плюс это всё завязано на длину канала, поскольку наличие канала проверяется не на жёстком количестве баров, а, например, на длине от 10 до 30 баров.

Меня интересует вопрос именно выбора ширины от длины...

Вот эта длина 10 баров и есть основополагающая цифра. То-есть не меньше 10... а если больше, то значит такая судьба. Вот это и вынеси во внешние, чтобы была возможность поэкспериментировать. То что я назвал диапазоном, пусть будет средним размером свечи, не суть важно, но это лучше тоже вынести во внешние. Возможно захочешь назначить и максимальный ср. размер и минимальный, тогда надо будет поставить две переменные Max_ и Min_ Потом на каждом баре проверяешь средний размер свечи за эти 10 баров и если устраивает рисуешь трендовые поверху и понизу на протяжении 10ти баров. А на следующем баре можно проверять уже 11 баров и если условие не нарушено, то ObjectSet(...); для первой координаты меняется только OBJPROP_PRICE1 а для второй и OBJPROP_PRICE2 и OBJPROP_TIME2 и так на каждом баре. Или можно уже ничего не пересчитывать считая канал уже сформированным и ждать пробоя этого канала. Это уже по желанию.

Ну, а в моём случае, я предложил облегчённый вариант от фонаря назначить высоту канала и минимальное количество баров так-же.


yan720:

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

Ну во первых никакой разницы не будет от того что параметры во внешних или вшиты внутрь. А во вторых, если не задавать ширину канала, то с чем будешь сравнивать то что посчитал за указанные тобой 10 баров? Как ты хочешь определять канал это или не канал? И третье, имхо, средний размер свечи не адекватно будет работать. Вот если все 10 баров бычьи но средний размер бара не больше контрольного. Это канал или нет? Может и канал, но только наклонный, а мы разбираем горизонтальный согласно твоего рисунка.
 
yan720:

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

Ну есть мысля ловить 2 подряд верхних фрактала или  2 iHighest-а, состоящих ну, например,  из 5-10 свечей. Ловим это дело в определённом диапазоне длины. Если значения этих пиков близки друг к другу, то между этими двумя пиками ищем iLowest.  Всё это можно запихнуть в один цикл.

Аналогично  искать сначала два нижних пика, а потом между ними верхний. 

Далее плясать от этих найденных пиков. Для начала чертим уровни по ним. Потом учим код думать дальше.

Такой вариант избавит нас от такого внешего параметра, как Ширина_канала.  

Как ни крути, но хоть какие-то параметры для длины нужны, мне думается.

Причина обращения: