Что Вы об этом думаете?

 
Strategy Tester Report
FX2

Символ EURUSD (Euro vs US Dollar) 
Период 1 Час (H1) 2005.11.15 00:00 - 2005.12.01 00:00 
Модель Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика) 
Параметры Lots=1;  
 
Баров в истории 727 Смоделировано тиков 20690 Качество моделирования 88.43% 
 
Начальный депозит 10000.00     
Чистая прибыль 23916.00 Общая прибыль 92509.75 Общий убыток -68593.75 
Прибыльность 1.35 Матожидание выигрыша 17.01   
Абсолютная просадка 380.00 Максимальная просадка (%) 2850.00 (14.4%)   
 
Всего сделок 1406 Короткие позиции (% выигравших) 703 (59.46%) Длинные позиции (% выигравших) 703 (60.03%) 
 Прибыльные сделки (% от всех) 840 (59.74%) Убыточные сделки (% от всех) 566 (40.26%) 
Самая большая прибыльная сделка 690.00 убыточная сделка -780.00 
Средняя прибыльная сделка 110.13 убыточная сделка -121.19 
Максимальное количество непрерывных выигрышей (прибыль) 7 (1350.00) непрерывных проигрышей (убыток) 7 (-2820.00) 
Максимальная непрерывная прибыль (число выигрышей) 1650.00 (5) непрерывный убыток (число проигрышей) -2820.00 (7) 
Средний непрерывный выигрыш 2 непрерывный проигрыш 1 



Сделал я, всета-ки, этого эксперта!!! Что вы думаете о том, как себя поведет этот эксперт в реале?

 
Протрите свои розовые очки, юноша. 1400 сделок за полмесяца - это 100 в день или 4 в час, а если учесть, что в ноябре часами был полный штиль, а потом крупные движения, времени для пипсовки было очень мало. Посмотрите внимательно результаты и пройдитесь с карандашиком по графику, нирвану как рукой снимет.
 
Не нужно разбивать людям надежды. Придет время - сами поймут.
 
17 пунктов на сделку при ордерах в 1 лот - это самоубийственный советник. Чтобы он зарабатывал, необходима идеальная связь, исполнение без реквот и проскальзываний и еще одна малость - чтобы рынок и дальше себя вел так же как на истории...
 
Dealer,

В своё время я сделал не менее десятка подобных советников на MQL2. Но позже выяснялось, что в реальной торговле они не работают. Среди причин - требование ДЦ открытия позиции по 2-му касанию, запрет на открытие на разрывах цен, запаздывание при сильных движениях, не правильные рез. тестирования по причине тестирования на таймфреймах более 1-минутных и по OHLC и т.д.

Если выложишь код, то можно повнимательней посмотреть, указать на организационные ошибки. А возможно и довести до работоспособного состояния.
 
Извини, SK, но я не могу опубликовать этот код...
 
Dealer,
!:)
Так не получится. И рыбку съесть и лапки не замочить:)

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

Обычно такие новоявленные разработки свежеиспеченные программисты пытаются продавать, а в качестве рекламы выставляют скриншот, с которого длинная, неуклонно ползущая вверх линия лапши переползает сначала на уши, а потом и в самое сердце малоопытного потребителя. Так появляются сайты, на кот. за 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