Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 оптимизация Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
emptymail



Зарегистрирован: 05.01.2008
Сообщения: 5

СообщениеДобавлено: Пт Янв 25, 2008 11:06 pm Ответить с цитатой Вернуться к началу

наверное, всё таки сюда...
есть, к примеру, три сигнала для входа и три сигнала для выхода.
хочу сделать их полный перебор с оптимизацией параметов, используемых для генерации этих сигналов. чтобы не быть голословным - примерно так я себе представил:
Код:

_SECTION_BEGIN("MyTest_001");

ToolTip = "";
Plot(Close,"module: " + _DEFAULT_NAME() +  "           Close" + "", colorBlack, styleBar);
//   ну вот нравятся мне часовые графики
TimeFrameSet(inHourly);
//   Размер стартового капитала
VarSet("StartCapital", 30000);
SetOption("InitialEquity", VarGet("StartCapital"));
//   Торгуем только целым размером позиций
RoundLotSize = 1;   
//   Торгуем одним контрактом
SetPositionSize(1, spsShares);
//   комиссия
SetOption("CommissionMode", 3);
//   размер комиссии
SetOption("CommissionAmount", 0);
// фьючерсы
//SetOption("FuturesMode", 1);



////      ************************   ВХОДЫ   -   НАЧАЛО

//   ***   НАЧАЛО   -   Сигнал входа № 1   (пересечение MA, открытие позиции на следующем баре)
function EnterLong_Variant_1()
{
   PeriodForFastMA   = Optimize("PeriodForFastMA", 2, 2, 7, 1);
   PeriodForSlowMA   = Optimize("PeriodForSlowMA", 5, 3, 8, 1);
   FastMA   =   MA(Close, PeriodForFastMA);
   SlowMA   =   MA(Close, PeriodForSlowMA);
Plot(FastMA, "\nFastMA", colorRed, styleDashed);
Plot(SlowMA, "\nSlowMA", colorGreen, styleDashed);
   result_EnterLong_Variant_1   =   Cross(FastMA, SlowMA);
   return result_EnterLong_Variant_1;
};
//   ***   КОНЕЦ   -   Сигнал входа № 1

//   ***   НАЧАЛО   -   Сигнал входа № 2   (пересечение EMA, открытие позиции на следующем баре)
function EnterLong_Variant_2()
{
   PeriodForFastEMA   =   Optimize("PeriodForFastEMA", 2, 2, 7, 1);
   PeriodForSlowEMA   =   Optimize("PeriodForSlowEMA", 5, 3, 8, 1);
   FastEMA   =   EMA(Close, PeriodForFastEMA);
   SlowEMA   =   EMA(Close, PeriodForSlowEMA);
Plot(FastEMA, "\nFastEMA", colorRed, styleLine);
Plot(SlowEMA, "\nSlowEMA", colorGreen, styleLine);
   resultEnterLong_Variant_2   =   Cross(FastEMA, SlowEMA);
   return resultEnterLong_Variant_2;
};
//   ***   КОНЕЦ   -   Сигнал входа № 2

//   ***   НАЧАЛО   -   Сигнал входа № 3   (открытие позиции на _текущем_ баре)
function EnterLong_Variant_3()
{
   MultiplierForATR_forEnter3   =   Optimize("MultiplierForATR_forEnter3", .1, .1, 2, .1);
   ATR_Period_forEnter3         =   Optimize("ATR_Period_forEnter3", 1, 1, 5, 1);
   resultEnterLong_Variant_3   =   Open > Ref(High, -1) + MA(ATR(MultiplierForATR_forEnter3), ATR_Period_forEnter3);
   return resultEnterLong_Variant_3;
};
//   ***   КОНЕЦ   -   Сигнал входа № 3

////      ************************   ВХОДЫ   -   КОНЕЦ




////      ************************   ВЫХОДЫ   -   НАЧАЛО

//   ***   НАЧАЛО   -   Сигнал выхода № 1      -   выход через N баров   -   взято из хелпа
function ExitLong_Variant_1()
{
   NbarsExit   =   Optimize("NbarsExit", 3, 3, 10, 1);
   ApplyStop( stopTypeNBar, stopModeBars, NbarsExit);
};
//   ***   КОНЕЦ   -   Сигнал выхода № 1

//   ***   НАЧАЛО   -   Сигнал выхода № 2      -   реализация выхода "Люстра"   -   взято из хелпа
function ExitLong_Variant_2()
{
   MultiplierForATR_forExit2   = Optimize("MultiplierForATR_forExit2", 1, 1, 5, 1);
   ATR_Period_forExit2         = Optimize("ATR_Period_forExit2", 1, 1, 5, 1);
   ApplyStop(   stopTypeTrailing,
            stopModePoint,
            MultiplierForATR_forExit2 * MA(ATR(ATR_Period_forExit2), ATR_Period_forExit2),
            True, True );
};
//   ***   КОНЕЦ   -   Сигнал выхода № 2

//   ***   НАЧАЛО   -   Сигнал выхода № 3      -   выход должен осуществляться на текущем баре
function ExitLong_Variant_3()
{
   MultiplierForATR_forExit3   =   Optimize("MultiplierForATR_forExit3", .1, .1, 2, .1);
   ATR_Period_forExit3         =   Optimize("ATR_Period_forExit3", 1, 1, 5, 1);
   resultExitLong_Variant_3   =   Open < Ref(Low, -1) -  MA(ATR(MultiplierForATR_forExit3), ATR_Period_forExit3);
   return resultExitLong_Variant_3;
};
//   ***   КОНЕЦ   -   Сигнал выхода № 3

////      ************************   ВЫХОДЫ   -   КОНЕЦ




switch   (Optimize("Variant", 1, 1, 9, 1))
{
   case 1:
         Buy      =   EnterLong_Variant_1();
         ExitLong_Variant_1();
      break;
   case 2:
         Buy      =   EnterLong_Variant_1();
         ExitLong_Variant_2();
      break;
   case 3:
         Buy      =   EnterLong_Variant_1();
         Sell   =   ExitLong_Variant_3();
      break;
   case 4:
         Buy      =   EnterLong_Variant_2();
         ExitLong_Variant_1();
      break;
   case 5:
         Buy      =   EnterLong_Variant_2();
         ExitLong_Variant_2();
      break;
   case 6:
         Buy      =   EnterLong_Variant_2();
         Sell   =   ExitLong_Variant_3();
      break;
   case 7:
         Buy      =   EnterLong_Variant_3();
         ExitLong_Variant_1();
      break;
   case 8:
         Buy      =   EnterLong_Variant_3();
         ExitLong_Variant_2();
      break;
   case 9:
         Buy      =   EnterLong_Variant_3();
         Sell   =   ExitLong_Variant_3();
      break;
   default:
      break;
}

Short = Cover = 0;


_SECTION_END();

но что то я не учёл - и как этот код не так работает Sad
посему вопросов несколько:
1. можно ли каким то образом, вызывать функции в теле цикла, то есть, по моему разумению нужно будет каким-то образом формировать имя функции? или как?
2. каким образом в строках, например,
Код:
   PeriodForFastMA   = Optimize("PeriodForFastMA", 2, 2, 7, 1);
   PeriodForSlowMA   = Optimize("PeriodForSlowMA", 5, 3, 8, 1);

избежать того, чтобы период медленной MA был меньше периода быстрой MA?
понятно, что при небольших вычислениях это по барабану, а вот если оптимизируемый параметр изменяется, например, с 0.01 до 3.00 с шагом 0.01 - а параметров три-четыре - то можно состариться, прежде чем обретётся просветление Smile

или я вообще не в ту сторону копаю?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Янв 26, 2008 11:16 pm Ответить с цитатой Вернуться к началу

Цитата:
но что то я не учёл - и как этот код не так работает

На первый взгляд все правильно.
У меня сомнение вызывает только использование ApplyStop внутри функции...
Правда я бы написало это совесем не так
Код:

BuyMode = Optimize("BuyMode", 1, 1, 3, 1);
ExitMode = Optimize("BExitMode", 1, 1, 3, 1);
if(BuyMode==1)
{
   .....
}
else if(BuyMode==2)
{
   .....
}
else
{
   .....
}
if(exitMode==1)
{
   .....
}
.......

Цитата:
1. можно ли каким то образом, вызывать функции в теле цикла, то есть, по моему разумению нужно будет каким-то образом формировать имя функции? или как?

Возможно не правильно понял. Функцию вызывать нет проблем
Вот например
Код:

SetBarsRequired(100000,0);
GraphXSpace = 3;

// Параметры

revers = Param("Revers", 300, 5, 500, 1)*TickSize;


Trend[0] = 1;                        // тренд вверх
Rev[0] = C[0] - Revers;            // Первое значение Rev
PE[0] = C[0];
k = 1;
OldRP = C[0];
SwingLine = Null;
SwingLine[0] = C[0];


function ZigLine(k, i)
{
   d = i - k;
   Amp = C[i] - C[k];
   Step = Amp/d;
   SwingLine[k] = C[k];
   SwingLine[i] = C[i];


   for(j = k+1; j < i; j++)
   {
      SwingLine[j] = SwingLine[j-1]+ Step;
   }
   return SwingLine;
}



for(i = 1; i < BarCount; i++)
{
   if(Trend[i-1] == 1)                        //Up Trend
   {
      if(C[i] > PE[i-1])                        //Новый High
      {
         Trend[i] = 1;
         PE[i] = C[i];

         CE = i;

         ZigLine(k, i);

         Rev[i] = PE[i] - Revers;
      
      }
      else
      {
         if(C[i] < Rev[i-1])                  //Реверс
         {
            Trend[i] = -1;
            PE[i] = C[i];

            k = CE;
            CE = i;

            ZigLine(k, i);

            Rev[i] = PE[i] + Revers;
         }
         else                                       //Нет нового high и реверса
         {
            Trend[i] = 1;
            PE[i] = PE[i-1];
            Rev[i] = Rev[i-1];
         }
      }
   }
//======================================
   else                                             //Down Trend
   {
      if(C[i] < PE[i-1])                        //Новый Low
      {
         Trend[i] = -1;
         PE[i] = C[i];

         CE = i;

         ZigLine(k, i);

         Rev[i] = PE[i] + Revers;
      }
      else
      {
         if(C[i] > Rev[i-1])                  //Реверс
         {
            Trend[i] = 1;
            PE[i] = C[i];

            k = CE;
            CE = i;

            ZigLine(k, i);

            Rev[i] = PE[i] - Revers;
         }
         else                                       //Нет нового Low и реверса
         {
            Trend[i] = -1;
            PE[i] = PE[i-1];
            Rev[i] = Rev[i-1];
         }
      }
   }
}



Plot(Rev, "NRTR WATR", ParamColor("Color", colorBlue ), ParamStyle("Style Revers", styleDashed) );
Plot(SwingLine, "ZigZag", IIf(Trend == 1, 27, 4), ParamStyle("Style Swing", styleThick) );

Цитата:
2. каким образом в строках, например
...
избежать того, чтобы период медленной MA был меньше периода быстрой MA?

Делай так
Период_быстрой = опт(.....)
Разница_между_быстрой_и_медл = опт(...)

медленная = MA(Период_быстрой);
быстрая = MA(Период_быстрой + Разница_между_быстрой_и_медл);

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen