В своё время я сделал не менее десятка подобных советников на MQL2. Но позже выяснялось, что в реальной торговле они не работают. Среди причин - требование ДЦ открытия позиции по 2-му касанию, запрет на открытие на разрывах цен, запаздывание при сильных движениях, не правильные рез. тестирования по причине тестирования на таймфреймах более 1-минутных и по OHLC и т.д.
Если выложишь код, то можно повнимательней посмотреть, указать на организационные ошибки. А возможно и довести до работоспособного состояния.
!:)
Так не получится. И рыбку съесть и лапки не замочить:)
Вообще-то, об этом много говорят и на разных форумах и здесь, и мой опыт подтверждает, что не стоит прятать свои разработки. Лучше в содружестве с кем-нибудь сделать работающий советник, чем в одиночку заблуждаться. Это лучше даже при условии, что код попадёт в руки тысяч людей. Ну и что с того?
Неужели желание потешить чувство собственной важности (мол, у меня есть, я сам сделал, никому не дам) должно брать верх над над здравым смыслом?
Обычно такие новоявленные разработки свежеиспеченные программисты пытаются продавать, а в качестве рекламы выставляют скриншот, с которого длинная, неуклонно ползущая вверх линия лапши переползает сначала на уши, а потом и в самое сердце малоопытного потребителя. Так появляются сайты, на кот. за 30$ можно купить 30 кг иллюзий.
Dealer, твой советник мне не нужен, даже бесплатно. Просто если в другой раз ты захочешь спросить, то готовься показать хотя бы тот фрагмент кода, о кот. спрашиваешь:)
А впрочем.. может я и правда отстаю от жизни..:)
Наверное, я сглупил... :)
void Strateg () { int ticket; double lot; Print("Ура-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а"); lot=1; ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,0,"My order #2",16384,0,CLR_NONE); ticket=OrderSend(Symbol(),OP_BUY,lot,Ask,3,0,0,"My order #2",16383,0,CLR_NONE); lmax=Ask+9*Point; lmin=Bid-9*Point; return; } int start() { int cnt=0, ticket, total, i; bool flag; int lim=3; total=OrdersTotal(); if (max<Bid) max=Bid; if (min>Ask) min=Ask; if (((max-Bid)>=lim*Point)&&(Bid>lmax)) //цена пошла вниз, надо продавать { for (i=total;i>=0;i--) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) if (OrderType()==OP_BUY) flag= OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); Strateg(); Print("Удачная продажа: ",flag);} if (((Ask-min)>=lim*Point)&&(lmin>Ask)) //цена пошла вверх, надо покупать {for (i=total;i>=0;i--) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) if (OrderType()==OP_SELL) flag= OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); Strateg(); Print("Удачная покупка",flag);} } // конец.
1. Вообще говоря, это дело вкуса, но в представленном виде код трудно воспринимается, поэтому я его немного переписал и определил некот. переменные.
//==================================================================================================================== void Strateg () { int ticket; double lot; Print("Ура-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а-а"); lot=1; ticket=OrderSend(Symbol(),OP_SELL,lot,Bid,3,0,0,"My order #2",16384,0,CLR_NONE); ticket=OrderSend(Symbol(),OP_BUY, lot,Ask,3,0,0,"My order #2",16383,0,CLR_NONE); double lmax=Ask+9*Point; double lmin=Bid-9*Point; return; } //==================================================================================================================== int start() { double max, min, lmax, lmin; int cnt=0, ticket, total, i; bool flag; int lim=3; total=OrdersTotal(); if (max<Bid) max=Bid; if (min>Ask) min=Ask; //-------------------------------------------------------------------------------------------------------------------- if (((max-Bid)>=lim*Point)&&(Bid>lmax)) //цена пошла вниз, надо продавать { for (i=total;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_BUY) { flag= OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE); } } Strateg(); Print("Удачная продажа: ", flag); } //-------------------------------------------------------------------------------------------------------------------- if (((Ask-min)>=lim*Point)&&(lmin>Ask)) //цена пошла вверх, надо покупать { for (i=total;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderType()==OP_SELL) { flag= OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE); } } Strateg(); Print("Удачная покупка", flag); } //-------------------------------------------------------------------------------------------------------------------- return; } //====================================================================================================================
2. В целом идея понятна. Но и вызывает вопросы.
По условию
((max-Bid)>=lim*Point)&&(Bid>lmax)
т.е после того, как Бид всё время поднимался и подмался он немного откатился назад (на 3п), и при этом остаётся выше некоторой величины,
double lmin=Bid-9*Point;
представляющей место, кот. ниже предыдущего открытия на 9п, то ..
снова открыть ...(?) 2 ордера.
Наверное, имелось ввиду, что открываться вниз надо на верхушке, при первых признаках разворота, а, соответственно, вверх - в "низушке":) при первых признаках разворота.
Если идея именно такая, то она характеризует принцип, соблюдать который хотят все трейдеры. Вопрос только в том, что не все могут это сделать - как правило, не могут определить этот экстемум - верхушку.
По моим представлениям, в приведенном коде допущена логическая (или уж не знаю как назвать) ошибка:
на верхушке открывается одновременно 2 противоположных ордера. Наверное, имелось ввиду что-то другое, но написано так. Наверное, надо бы там (на верхушке) открыть только один ордер, Sell.
3. О девяти пунктах.
По всей вероятности, имеется ввиду, что горки получаются такие, кот. больше 9п. Как этот алгоритм будет работать на валюте, кот. традиционно малоподвижна, у кот. горки по 5 - 7пп?
Наверное, никак.
Как этот алгоритм будет работать на сильном рынке?
В чём вообще заключён заработок? В разнице закрытий противоположных ордеров?
Если в момент 30 вверх, 5 вниз и снова 30 вверх.. и там остался ==будет убыток. К тому же открыться-закрыться на быстром рынке не просто (частые отказы брокера).
4. Не очень понятно.. Сколько допускается односторонних ордеров? Приведенный код никак этот показатель не ограничивает. До бесконечности? А если выключится свет или порвётся связь, а рынок развернётся?
5. Теоретический тестер даёт несколько идеализированные условия, практика показывает, что любые отклонения от теории носят случайный характер, но они губительны. Скажем, если на счёте 700$, то (-1000) и (+1000) сколько будет? 700 и останется? Нет, будет 0 (ноль), потому что когда колебнётся в сторону (-1000), то дойдёт до нуля и счёт закроют, никаких (+1000) не будет. Эту вероятность обычно просчитывают и разумно (расчётно) ограничивают число лотов и количество ордеров.
Можно было бы продолжить, но полагаю, пока достаточно.
Сама идея может работать, но надо внимательней отнестись и к алгоритму и к коду.
1. Для расчёта "3х пунктов" и "9и пунктов", чтобы понять сколько сейчас лучше применить, можно использовать каналы регрессии, ведь ситуация постоянно меняется.
2. Всё же не открывать одновременно 2 противоположных ордера - чистая потеря спреда.
3. Применить многократно рекомендуемые на форуме проверки наличия ордеров, обновления курсов и пр.
double lmax=Ask+9*Point;
означает, что закрыться призаработке не меньше, чем 9п ..
Это тоже неправильно. Вообще, надо исходить из того, что никакие жёсткие цифры в коде появляться не должны. Они должны вычисляться, что бы они не означали.
В данном случае разумно применить условие касания верхней границы канала, в котором некоторое время движется тренд. И эта цифра может оказаться и 9 и 7 и 5 и 15 и 25. Её надо вычислить.
Вообще, работа программиста сводится к тому, чтоб понять сущность обрабатываемого процесса и выделить наиболее харатерные его признаки. На них и сориентироваться.
----------
Не знаю, что ты имел ввиду, говоря, что сглупил, но с таким кодом выходить на рынок - это самоубийство.
Первое, что не получится - слишком частое открытие/закрытие. Брокеры повзрываются от напряжения сил для постоянного обслуживания одного-единственного твоего счёта.
1. При любом колебании рынка убыток будет постоянен (-40п.)
2. В любом случае будет положительный результат на одной из открытых сделок.
Потом, после некоторого колебания рынка, (когда курс достиг локальной верхушки) закрывается прибыльная позиция. Когда-же курс вернется на исходную позицию, закрывается втораяпозиция(пусть даже на счету этой позиции будет 0 или даже в минусе, но, разумеется меньше, чем прибыль от ранее закрытой сделки). В результате имеем: 1 прибыльную сделку и одну закрытую по-нулям, следовательно имеем прибыль.
Эта схема была первая, и идеализированная, вдальнейшем она подвергалась изменениям, и в конце концов приобрела нынешний вид. В частности, чтобы не терять время, при закрытии одной прибыльной позиции стал открывать опять две противоположные. Впоследствии буде так: две закрыл - две открыл.
По поводу логической ошибки: мне показалось интересным твое предложение и я хотел его реализовать, но я вспомнил почему я так раньше не сделал: иногда, не помню точно при каких условиях,(вероятно при небольших колебаниях) складывается ситуация, скапливаются 3-4 открытых позиции в одну сторону(причем убыточные). Это говорит о том , что программа неправильно определяет локальные верхушки. Вот, вспомнил когда это происходит: допустим, идет рост графика. В какой-то момент валюта теряет три пункта, срабатывает система(т.е. закрывается прибыльная сделка и открываются еще 2).В этот момент график меняет направление, и опять растет. И т.д. пока не скопится 3-4 односторонних убыточных позиций.
В этом случае убытки несколько гасятся теми прибыльными позициями, которые были закрыты в течение накопления убытков. Если-же открывать позиции только в одну сторону, то убытки могут быть более значительными, а следовательно и риск больше.
Девять пунктов я вывел чисто экспериментальным путем, и это число не имеет принципиального значения, разве что оно должно покрывать расходы(2 пункта при покупке для каждой сделки) и принести некоторую прибыль. А на валюте с малыми колебаниями, по-моему, что с экспертом, что без такового смысла играть нет никакого.
По идее допускается два ордера в одну сторону и третий в другую. Но как я показал выше, бывают ситуации, когда в одну сторону скапливается до 4-х позиций(больше я не видел)
Идею о том, что ордера могут быть принудительно закрыты, я поддерживаю. Надо проверить вероятность такого поворота событий и меры, которые предпримет ДЦ в этом случае. По-моему они закрывают самую убыточную сделку, а прибыльная так и продолжает расти.(или я не правильно понял твою историю)
А насчет применения каких-то там каналов и т.д. я против, потому что сама идея советника не опирается на прогнозирование поведения рынка. А насчет "Применить многократно рекомендуемые на форуме проверки наличия ордеров, обновления курсов и пр. " я вообще ничего не понял, если можно поясни.
За сотрудничество огромное спасибо, может совместными усилиями чего-нибудь добьемся.
P.S. Если ты не против, то мне было-бы удобней общаться при помощи электронной почты:
E-mail: rostovskaya21@mail.ru
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сделал я, всета-ки, этого эксперта!!! Что вы думаете о том, как себя поведет этот эксперт в реале?