Индикаторы: Rabbit - страница 12

 

Конечно. А вот что было 31 декабря:


 

JonKatana,

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

//-------------------------------------------
//Данный советник предназначен для прогона по истории.
//Позволяет проверить какие комбинации отложенных ордеров на каких уровнях
//дадут максимальную прибыль.
//
//Чтобы включить определенный тип ордеров, присвойте ему 1, выключить - 0
//Пояснение к названию ордеров:
//Flat - устанавливаются на ближайших к текущей цене уровнях
//Step - устанавливаются на последующих от Flat уровнях вплоть до Levels
//Straight - прямые ордера (BuyStop, SellStop)
//Reverse - обратные ордера (BuyLimit, SellLimit)
//Half(Tp/Sl)- имеющие половинные от шага(Step) уровни тп или сл соответственно
//Пример: StepReverseHalfTp - СеллЛимиты/БайЛимиты с тп равным Step/2, устанавливаются на каждый уровень кроме ближайших
//
//Глобальные множители tpMult и slMult увеличивают тп и сл соответственно для ВСЕХ ордеров.
//Пример: ордер FlatStraightHalfTp имеет тп=0.5*Шаг и сл=1*Шаг при стандартных tpMult=1, slMult=1
//при tpMult=1, slMult=2 этот ордер откроется с тп= 0.5*Шаг, сл= 2*Шаг
//-------------------------------------------
extern string comment1 = "Равноценные ордера" ;           
extern int FlatReverseFull = 0;                    
extern int FlatStraightFull = 0;
extern int StepReverseFull = 0;
extern int StepStraightFull = 0;
extern string comment2 = "Ордера с половинным ТП" ;
extern int FlatReverseHalfTp = 0;
extern int FlatStraightHalfTp = 0;
extern int StepReverseHalfTp = 0;
extern int StepStraightHalfTp = 0;
extern string comment3 = "Ордера с половинным СЛ" ;
extern int FlatReverseHalfSl = 0;
extern int FlatStraightHalfSl = 0;
extern int StepReverseHalfSl = 0;
extern int StepStraightHalfSl = 0;
extern string comment4 = "Глобальные множители ТП и СЛ" ;
extern int tpMult = 1;
extern int slMult = 1;
extern bool MoneyManagement = 0;
//Блок переменных для скрипта открытия ордеров
double Up=0;
double Down=0;
int Levels=10;
int Step=0;
double Vol=0.1;
int Spread=2;
//Блок переменных советника
datetime lastDayTrade, R;
int objects, iStopLevel, i;
double dStopLevel, dSpread;
string iStep, sym;
int init() 
{
   if(tpMult < 1) tpMult =1;
   if(slMult < 1) slMult =1;
   sym = Symbol();
   iStopLevel =MarketInfo(sym,MODE_STOPLEVEL);
   dStopLevel = iStopLevel*Point;
   Spread = MarketInfo(sym, MODE_SPREAD);
   dSpread = Spread*Point;
   
   return(0);
}
  
int start()
{
   //Выставляем ордера в 6:00 каждый день (выставить в соответствии со своим GMT)
   if(lastDayTrade!=TimeDayOfYear(Time[0]) && Hour()==6)
   {
      lastDayTrade=TimeDayOfYear(Time[0]);
      //upLevel, downLevel используются для нахождения ближайших уровней от текущей цены
      double upLevel, downLevel;
      double prices[28];
      
      //Удаляем лишние линии на графике
      ObjectsDeleteAll();
      //Вызываем индикатор Rabbit. Обратите внимание на название. Переименуйте соответственно.
      iCustom(sym,0, "Rabbit",0, 14, 0, 16, White, DarkGreen, 0, 0);
      
      iStep = StringSubstr(ObjectDescription("S"), 7);   //Находим шаг уровней из обьекта "S" индикатора Rabbit
      Step = StrToDouble(iStep)*10000;                   //Приводим шаг к целому числу
      if(Step < (iStopLevel*2+Spread)) return (0);       //Если шаг меньше 2*стопЛевела+спрэда - в этот день не торгуем
                                                         //( иначе половинные ордера не будут работать)
      
      //Находим все горизонтальные линии на графике (уровни Rabbit) и сохраняем их цены
      objects = ObjectsTotal(OBJ_HLINE);
      for(i=0; i<objects; i++)
      {
         prices[i] = ObjectGet(ObjectName(i), OBJPROP_PRICE1);
      }
   
      //Ищем цены ближайшие к текущей
      ArraySort(prices);
      int index = ArrayBsearch(prices, Bid);
      if(Bid-prices[index] <= /*0.33*Step*Point*/dStopLevel+dSpread) //Если цена ближе чем стопЛевел+спрэд к проверяемому уровню, используем следующий
         downLevel = prices[index-1];                                //(можно вместо этого проверить на нахождение в пределах 1/3 шага от уровня)
      else
         downLevel = prices[index];
      if(prices[index+1]-Bid <= /*0.33*Step*Point*/dStopLevel+dSpread)
         upLevel = prices[index+2];
      else
         upLevel = prices[index+1];
      
      //Инициализация скриптовых переменных
      Up = NormalizeDouble(upLevel,4);
      Down = NormalizeDouble(downLevel,4);
      //Количество уровней варьируется в зависимости от ATR
      Levels = iATR(Symbol(), PERIOD_D1, 30, 0)/StrToDouble(iStep);
      if(Levels < 2) Levels = 2; //Как минимум 2 уровня
      
      if(MoneyManagement)
         OptimizeLots();
      //Запуск скрипта для тестирования.
      Script();
   }
  return(0);
}
void OptimizeLots()
{
      //Выбираем лот так, чтобы 70% от баланса (с учетом других открытых ордеров) давало возможность просидеть 666 пунктов убытка.
      Vol=NormalizeDouble( (AccountBalance()*0.7)/6660,1);
      if(Vol<0.1) Vol=0.1;
}
  
void Script()
{
      string expDate = StringConcatenate(Year(),".",Month(),".",Day()," ",23,":",01); 
      R=StrToTime(expDate);
      
      double P=Point;
      double buyPrice, sellPrice, modifiedStepSl = Step*slMult*P, modifiedStepTp = Step*tpMult*P;
      
      if(FlatReverseFull==1)
         ReverseOrders(0, 1, 1, modifiedStepSl, modifiedStepTp);
      if(FlatStraightFull==1)
         StraightOrders(0, 1, 1, modifiedStepSl, modifiedStepTp);
      if(StepReverseFull==1)
         ReverseOrders(Levels, 1, 1, modifiedStepSl, modifiedStepTp);
      if(StepStraightFull==1)
         StraightOrders(Levels, 1, 1, modifiedStepSl, modifiedStepTp);
         
      if(FlatReverseHalfTp==1)
         ReverseOrders(0, 1, 0.5, modifiedStepSl, modifiedStepTp);
      if(FlatStraightHalfTp==1)
         StraightOrders(0, 1, 0.5, modifiedStepSl, modifiedStepTp);
      if(StepReverseHalfTp==1)
         ReverseOrders(Levels, 1, 0.5, modifiedStepSl, modifiedStepTp);
      if(StepStraightHalfTp==1)
         StraightOrders(Levels, 1, 0.5, modifiedStepSl, modifiedStepTp);
         
      if(FlatReverseHalfSl==1)
         ReverseOrders(0, 0.5, 1, modifiedStepSl, modifiedStepTp);
      if(FlatStraightHalfSl==1)
         StraightOrders(0, 0.5, 1, modifiedStepSl, modifiedStepTp);
      if(StepReverseHalfSl==1)
         ReverseOrders(Levels, 0.5, 1, modifiedStepSl, modifiedStepTp);
      if(StepStraightHalfSl==1)
         StraightOrders(Levels, 0.5, 1, modifiedStepSl, modifiedStepTp);
}
void StraightOrders(int levels, double slModifier, double tpModifier, double modifiedStepSl, double modifiedStepTp)
{
   double buyPrice, sellPrice;
   while(true)
   {
       buyPrice = Up+levels*Step*Point;
       sellPrice = Down-(levels*Step+Spread)*Point;
       OrderSend(sym,OP_BUYSTOP,Vol,buyPrice,0,buyPrice-slModifier*modifiedStepSl,buyPrice+tpModifier*modifiedStepTp,0,0,R);
       OrderSend(sym,OP_SELLSTOP,Vol,sellPrice,0,sellPrice+slModifier*modifiedStepSl,sellPrice-tpModifier*modifiedStepTp,0,0,R);
       levels--;
       if(levels <=0) break;
   }
}
void ReverseOrders(int levels, double slModifier, double tpModifier, double modifiedStepSl, double modifiedStepTp)
{
   double buyPrice, sellPrice;
   while(true)
   {
      buyPrice = Down-levels*Step*Point;
      sellPrice = Up+(levels*Step-Spread)*Point;
      OrderSend(sym,OP_SELLLIMIT,Vol,sellPrice,0,sellPrice+slModifier*modifiedStepSl,sellPrice-tpModifier*modifiedStepTp,0,0,R);
      OrderSend(sym,OP_BUYLIMIT,Vol,buyPrice,0,buyPrice-slModifier*modifiedStepSl,buyPrice+tpModifier*modifiedStepTp,0,0,R);
      levels--;
      if(levels <=0) break;
   }
}
 
Уточнение к разделу управления капиталом: лот только увеличивается, не уменьшаясь! Например, при депозите 40 000 рублей начальный лот 0.20. И далее ждем двух событий - либо маржин-кола, либо увеличения депозита до 42 000 рублей. По достижении этой суммы лот увеличивается до 0.21 и далее ждем опять только двух событий - либо маржин-кола, либо увеличения депозита до 44 000 рублей. Уменьшать лот нельзя ни при каких просадках, только увеличивать! Иначе вместо роста капитала будет топтание на месте или меленное сползание к нулю.
 
JonKatana:
Уточнение к разделу управления капиталом: лот только увеличивается, не уменьшаясь! Например, при депозите 40 000 рублей начальный лот 0.20. И далее ждем двух событий - либо маржин-кола, либо увеличения депозита до 42 000 рублей. По достижении этой суммы лот увеличивается до 0.21 и далее ждем опять только двух событий - либо маржин-кола, либо увеличения депозита до 44 000 рублей. Уменьшать лот нельзя ни при каких просадках, только увеличивать! Иначе вместо роста капитала будет топтание на месте или меленное сползание к нулю.
void OptimizeLots()
{
      double currentCapability = NormalizeDouble( (AccountBalance()*0.7)/6660,1);
      if(currentCapability > Vol) 
         Vol=currentCapability;
      if(Vol<0.1) Vol=0.1;
}
Данный вариант,к сожалению, сливает. Предыдущий бы позволил пересидеть... У вас наверняка история реальных котировок за те 110 дней, не могли бы вы прогнать советник на вашем терминале и выложить стейт ? Я историю котировок скачал и доверия она не внушает, ибо за 10/2010 месяц стабильно сливает депозит. Если подтвердится, и советник сливает на вашем терминале, значит проблема в советнике.


p.s. поздравляю с сегодняшними 35 пунктами ))

 

Статистика за октябрь выглядит так (в пунктах от конца к началу месяца): +21, +34, +36, -34, +65, +21, +34, +34, +20, +60, +20, -57, -17, -36, +20, +153, +130, +14, +20, -30. Итого +508 пунктов! Слить на этом участке никак не получится - максимальная просадка 57 + 17 + 36 = 110 пунктов, что очень далеко до 666. За октябрь капитал удвоился, увеличившись с 93 000 рублей до 191 000 рублей!

 

1. Наблюдая в последнее время за движениями цены, заметил что возможно было бы выгодней ставить на ближайших уровнях только обратные ордера, без половинных прямых.  Прогнал советник по истории, так и есть... Очень часто цена касается ближайшего уровня и почти сразу возвращается, не доходя до половины следующего. Вот и на этой неделе уже 3 дня как такое безобразие творится )))

2.  Если шаг довольно большой (как сегодня, 47 п), возможно ли ставить ордера на полу-уровнях вместо целых ? Ибо стратегия только выигрывает, если цена пройдет как можно больше уровней.

 
На оба вопроса - нет. Был такой вариант - в результате на одних первых уровнях получается количество пунктов, близкое к 0. За 90 дней теста получалось +6 пунктов - вероятность прохождения первого перевернутого уровня в любом направлении равна 50%, поэтому любой ОДИН ордер - хоть прямой, хоть перевернутый, прибыли не дает.

Уровни работают только в том виде, в каком есть. Пусть вас не смущает большой шаг - на тестовом периоде были Step размером больше 60, и даже 80 пунктов, и наоборот, 11 и 12 пунктов - и все равно уровни работали отлично. В моем ДЦ стоп-левелы равны спреду, поэтому при любом Step возможно выставление ордеров по скрипту Angel Wings.

Кстати, для этого и нужна раздвижка на спред - Rabbit строит уровни на основании цены Bid, потому что Ask не сохраняется в истории. Поэтому все цены открытия должны быть приведены к Bid, так как цена настолько точно чувствует уровни Rabbit, что часто касается уровня пункт в пункт и разворачивается - если не делать сдвиг на спред, ордер не откроется или откроется только один из пары (если речь о первых уровнях).

 

JonKatana:
 ... вероятность прохождения первого перевернутого уровня в любом направлении равна 50%, поэтому любой ОДИН ордер - хоть прямой, хоть перевернутый, прибыли не дает.

Кстати, для этого и нужна раздвижка на спред - Rabbit строит уровни на основании цены Bid, потому что Ask не сохраняется в истории. Поэтому все цены открытия должны быть приведены к Bid, так как цена настолько точно чувствует уровни Rabbit, что часто касается уровня пункт в пункт и разворачивается - если не делать сдвиг на спред, ордер не откроется или откроется только один из пары (если речь о первых уровнях).


1. То есть вы опираетесь на математическую вероятность - имея 2 ордера как сейчас, есть 3 вероятности по 33% (-0.5; 0; +1.5), в итоге дающие + ?

2. Подгонка к Bid в скрипте  AngelWings  имеет неприятную особенность - стоплосс больше тейка. Сл равен Шаг+2, тп равен Шаг-2, итого открывая на ближайшем уровне 2 ордера - 1 половинный прямой, 1 полный обратный и,если цена пошла обратно, имеем не 0, как ожидалось, а -4 пункта.

3. Поведение этой пары со временем изменится. Вы собираетесь соответственно подстраивать алгоритм или будете использовать этот до конца ?

4. Почему именно 7 утра ? ведь это посреди сессии сидней-токио, до лондонской еще 4 часа. Для того чтобы поймать кусок флэта до того, как начнутся большие движения ?

 

1. Это не математическая вероятность, а результат наблюдения - это наиболее прибыльный способ выставления ордеров на первом уровне. Одни только первые ордера принесли (без учета последней недели) +640 пунктов прибыли. Любые другие комбинации приносят либо убыток, либо значительно меньшую прибыль, приближающуюся к нулю.

И уровней всегда два - по обе стороны от цены, поэтому вероятности такие, если отбросить симметричные варианты: -0.5, -0.5, -1, 0, +1, +1.5, +3. Четыре исхода из семи хороши - три приносят прибыль, один не меняет баланс. К тому же минус обычно ограничивается -0.5, когда начинается тренд, а это чаще всего обычный или маленький шаг Rabbit в 20-30 пунктов. Зато прибыль на флете, когда цена часто даже не задействует вторые уровни за весь день, бывает при большИх размерах Step в 50-60 пунктов, когда цене просто не хватает волатильности, чтобы достичь дальних уровней. Поэтому общая прибыль постоянно растет.

2. Да, но по-другому можно только на бесспредовых ДЦ.

3. Поведение EURUSD никак не влияет на работоспособность Angel Wings, потому что главную роль играют уровни Rabbit, а они автоматически подстраиваются под цену независимо от характера движения и размаха за день.

4. Обычно в это время прекращаются ночные движения, а дневные еще не начались, поэтому и для ловли флета и для выставления ордеров время подходит хорошо. Можно ставить ордера от 6:30 и до 7:30 или даже от 6 до 8 - мне удобнее в 7.

 
Немного не в тему: сегодня перечитал мой контракт с ДЦ и поразился сколько лазеек они себе оставили... Чуть ли не открытым текстом говорят: За компанией всегда остается право закрыть/отменить любой ордер(даже ретроактивно) по собственной инициативе и клиент не имеет права оспаривать это решение... Неужели все настолько хреново? Неужели они не заинтересованы работать с клиентом как можно дольше - ведь они получают прибыль из спредов, и чем больше лот которым торгуют(и, собственно, больше баланс на счету), тем прибыльней им ?
Причина обращения: