Советники: 20PRExp-3

 

20PRExp-3:

Советник 20PRExp-3 основан на системе прорыва волантильности внутри дня. Добавлены фильтры обьёма и Stochastik. Стратегия выхода:трейлинг-стоп, скользящие стопы.

Author: Сергей

 
Тестировал встроенным тестером. Кто может протестируйте по серьёзнее или подскажите как.Пока сам не знаю.
 

Рекомендация может быть простейшая - потестировать на котировках из History Center.
Результат работы советника на истории в 1 месяц - это очень часто может оказаться просто удачным сочетанием параметров и котировок.
Попробуйте просто другие котировки (котировки другого брокера) за тот же период времени. У меня за тот же самый период времени баланс крутится около начального значения.

 
Вроде нормально.Поставь на демо счет.И сам все увидешь.
 
7753191:
Вроде нормально.Поставь на демо счет.И сам все увидешь.

Он идёт в вверх только на период 5 Минут (М5) 2007.01.02 00:00 - 2007.01.25 00:00 (2007.01.01 - 2007.01.25).
Во всех остальных временных рамках и таймфреймах он идёт вниз как сбитый самолёт.
Если знаете как настроить его правильно прошу подскажите.
 
asoulman:
7753191:
Вроде нормально.Поставь на демо счет.И сам все увидешь.

Он идёт в вверх только на период 5 Минут (М5) 2007.01.02 00:00 - 2007.01.25 00:00 (2007.01.01 - 2007.01.25).
Во всех остальных временных рамках и таймфреймах он идёт вниз как сбитый самолёт.
Если знаете как настроить его правильно прошу подскажите.
Как сбитый самолёт, эт наверное потому, что делает по нескольку сотен сделок подряд - на одной свече. Куча спрэдов вылетает в трубу. У меня и на вышем периоде такая трабла. Нужно логику подрихтовать. Посмотрите, может та же ситуация
 
Выложил новую версию.Немного подчистил.
Уберите в коде стохастик. И можно на любом таймфрейме тестить. Правда на евре что-то неважно.
 
Sergey2005TR:
Выложил новую версию.Немного подчистил.
Уберите в коде стохастик. И можно на любом таймфрейме тестить. Правда на евре что-то неважно.
Прогнал советник за 2006 гот на GBPUSD M5. Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика). Слил 30%.
 
Sergey2005TR!
У тебя в коде написано следующее:
Старт со�етника
...
код, код код
потом
OpenPosition();
прочи�
код...
стоп работы со�
етника
Понимаешь что происходит при такой организации кода?
старт советника запускается каждый тик. На каждом тике советник у тебя сначала выполняет какие-то действия, потом открывает сделку (функция OpenPosition(); )
потом доходит до конца кода, потом ждёт следующего тика, отпять старт, опять действия, снова открытие сделки, действия и ожидание нового тика. И так цикл.
Тебе в советника надо вставить условие проверки количества сделок открытых на текущей свече.

Могу подсказать решение этого вопроса.
//==== Контроль времени последнего открытого ордера ============
total = OrdersTotal();
for ( i = 0; i<total; i++ )//Цикл. Проходим по всем ордерам от 0 до total
{//Начало цикла
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
Print("Ошибка ", GetLastError(), " при выборе ордера номер ",i);
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)// выбрали очередной ордер
{//начало работы с выбранным ордером
if(OrderSymbol()!=SMB) continue; // Если не наш - смотрим следующий
if(OrderOpenTime()>=OldTime)//если время открытия у этого ордера больше чем у последнего открытого, то...
{
OldTime=OrderOpenTime();//запоминаем время последнего открытого ордера
}
}//Конец работы с выбранным ордером
}//Конец цикла

if(OldTime>=Time[0]) NewOrder=false;
if(OldTime<Time[0]) NewOrder=true;
//==== Конец "Контроль времени последнего открытого ордера" ====

// Если данное условие (NewOrder==false) сработает,
if(NewOrder==false) {Comment("На этой свече уже открылась сделка. Ждём следующую свечу.");return(0);}
// то весь дальнейший код выполняться не будет, так как return(0) прерывает работу советника

if ((NewOrder==true) OpenPosition();
При такой постановке вопроса у тебя на одной свече будет открываться одна сделка. Что следует сделать далее?
Надо организовать код примерно так:

должна быть переменная, которая следит за количеством рыночных ордеров например:
//           В данный блок встроен счётчик количества рыночных ордеров
// sss - счётчик рыночных ордеров

sss=0;// сначала обнуляем его
total = OrdersTotal();
for ( i = 0; i<total; i++ )//Цикл. Проходим по всем ордерам от 0 до total
{//Начало цикла -------------------------------
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
Print("Ошибка ", GetLastError(), " при выборе ордера номер ",i);
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true)// выбрали очередной ордер
{//начало работы с выбранным ордером
if(OrderSymbol()!=SMB) continue; // Если не наш - смотрим следующий
if(OrderType()==OP_BUY) // если он открытый в покупку, то...
{
sss++;
//----------------- закрываем ордер
if(CloseBuy==true)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Black);
CloseBuy=false;
}
}
if(OrderType()==OP_SELL)// если он открытый в продажу, то...
{
sss++;
//----------------- закрываем ордер
if(CloseSell==true)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Black);
CloseSell=false;
}
}

} // конец работы с выбранным ордером


}// Конец цикла, мы просмотрели все ордера. -----------


В самом начале кода советника можно сделать следующее
extern int MaxOrderov = 3;//сколько можно открыть ордеров максимум

тогда после этих циклов команда открытия позы будет выглядеть так:

if ((NewOrder==true)&&(sss<MaxOrderov))//Если можно открыть ещё ордер

OpenPosition();

.........

Словом, думаю идею ты понял

Там в коде что я привёл, стоят приказы на принудительное закрытие ордеров. Не обращай на это внимание - я лишь хотел проиллюстрировать сказанное а куски кода взял из одного из своих советников
 
Tebe nuzhno zakochat' istoriyu kotirovok, zatem ispol'zuya skrip - period_converter - konvertnut' minutki v 5-ti, 15-ti, 30-ti minutinie grafiki

Sergey2005TR :Тестировал встроенным тестером. Кто может протестируйте по серьёзнее или подскажите как.Пока сам не знаю.
 

Решил потестить а он открывает при условии закрытия позиции, но в обратную т.е. в шорт не идет =))


OrderSend не связан. (GetTradeSignal)


//+------------------------------------------------------------------+
//| Открытие позиции                                                 |
//+------------------------------------------------------------------+
void OpenPosition() 
  {
   double ldStop = 0, ldTake = 0;
   int    bs = GetTradeSignal();
   for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
     {
       OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
       if(OrderSymbol() != Symbol())
           continue;
       if(OrderType() == OP_BUY )  
           total++;
       if(OrderType() == OP_SELL ) 
           total++;
     }
   if(total < 1 &&Hour() > 6) 
     {
       if(bs > 0)
         {
           if(TakeProfit != 0) 
               ldTake = Ask + TakeProfit*Point;
           OrderSend(Symbol(), OP_BUY, Lots() ,Ask, 3, MLM, ldTake, 
                     "Pipsover", 888, 0, Blue);
         }
       if(bs < 0)
         {
           if(TakeProfit != 0) 
               ldTake = Bid - TakeProfit*Point;
           OrderSend(Symbol(), OP_SELL, Lots() ,Bid, 3, MLP,ldTake, 
                     "Pipsover", 888, 0, Red);
         }
     }
   total = 0;  
  }
Причина обращения: