Здравствуйте, гость ( Вход | Регистрация )

26 страниц V « < 14 15 16 17 18 > »   
Ответить в эту темуОткрыть новую тему
> Perceptron, Нейронная сеть
NoName
сообщение 3.8.2007, 14:58
Сообщение #151





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Цитата(leonid553 @ 3.8.2007, 12:34) *


------Проверяем условие на покупку-------------
if ( (Stochastic_1<En0_low) &&
(Stochastic_0>En0_low) )
----------------------------------------------------------
Но при этом у нас получается - что СТохастик просто перепрыгивает через границу конверта! - НА ДВУХ ПОСЛ. ТИКАХ!

Вот в этом условии мы берём значения с первого и нулевого баров. Какие тут два последние тика ?? Я это имел ввиду.
Код
if (isNewBar)
{ }
я убрал!

Если убрал, то будет работать на каждом тике. Но условие от этого не меняется ведь...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 3.8.2007, 15:56
Сообщение #152





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Ок! Тогда вот что!
Пусть у нас нет открытых сделок и стохастик пересекает изнутри нижнюю границу канала.
Рис. 1
По сути тактики ST+ENV у нас в этот момент не должна открываться позиция. Поскольку позиция у нас должна открываться - только тогда, когда стох пересекает границу снаружи внутрь!
А теперь рассмотрим "под микроскопом" участок - обведенный синим
эллипсом. Рис. 2
Потиковый график. Стох пересекает нижнюю границу канала и на этой границе ходит "туда-сюда" и мы получаем абсолютно ненужный нам вход!
Т.к. обязательно будет выполнено условие
if ( (Stochastic_1<En0_low) &&
(Stochastic_0>En0_low) )
Как с этим бороться? Нечасто такое бывает - но бывает в 5-8 %-х сделок!
Есть вот соображение....


Эскизы прикрепленных изображений
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 3.8.2007, 16:19
Сообщение #153





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



В одной из статей на форуме MQ нашел пример того - как вроде бы этот вопрос решается.
Возможно не совсем -то - смотрю сейчас.
"Важное замечание: Для исключения из анализа незначительных(мелкие 'бугорки' на графике) изменений индикатора MACD введем дополнительный контроль за размером рисуемых 'бугров' в виде следующего условия – величина индикатора должна составлять не менее 5 единиц минимальной цены (5*Point, что для USD/CHF равно 0.0005, для USD/JPY = 0.05)."

http://articles.mql4.com/ru/82

if (MacdCurrent<0 && MacdCurrent>SignalCurrent
&& acdPrevious MathAbs(MacdCurrent)>(MACDOpenLevel*Point)
&& MaCurrent>MaPrevious)
{ ticket=
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 5.8.2007, 7:09
Сообщение #154





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Вот ещё один момент . Мы как-то его уже выясняли. Но пришла пора вернуться опять.
Дело в том, что стохастик в силу своей структуры шкалы - не является симметричным инструментом!
Динамический диапазон расчета стохастика идет в однополярной шкале. Со всеми вытекающими. И даже если мы сделаем шкалу двухполярной, - делу это не поможет!
Не только шкала тут влияет на структуру. Но и методика расчета самого индикатора.
Это оч. хорошо заметно, когда мы вешаем на стохастик конверт.
Обрати внимание, что динамический диапазон (т.е. амплитуда) колебаний верхней границы конверта существенно больше, чем амплитуда колебаний нижней границы!
И это при общих внешних параметрах.
Что же получается? В ветке "Нест. тактика" на посл. странице я выложил графики балансов в различных режимах.
при покупке у нас задействована ENV_Low и практически весь профит системы определяется именно этим режимом! - до 70% профитных сделок.
При продаже у нас задействована ENV_Up и практически все убытки системы приходятся именно на этот режим! - до 75% убыточных сделок! И отдельная оптимизация мало помогает.
Понятно, что здесь всему виной - амплитуда верхней границы канала Envelopes, которая при сделках в SELL дает зачастую убыточные сигналы.

Можно, конечно, вместо конверта применить МА c симметричным отклонением up и low.
Есть у нас и такая версия советника. Та, что ты прислал - последняя, для ускоренной оптимизации с вызовом отдельного твоего индикатора "i-StochEnv" . Посмотрел - погонял.
Но статистически обнаружилось, что для сделок BUY лучше всего подходит, всё-таки, нижняя граница конверта - Env_low.
А вот для коротких позиций похоже придется вместо Env_up вставлять в советник верхнее отклонение Env_up=iMaOnArray()
В связи "с вышеизложенным" встает вопрос.
(продолж. следует)


Эскизы прикрепленных изображений
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 5.8.2007, 8:17
Сообщение #155





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



При использовании "ускоренной" версии с МА - после оптимизации режима ONLY short и последующем прогоне в режиме LONG & SHORT число прибыльных сделок SELL получилось 62%.
Но вот при этом число прибыльных сделок BUY стало = 45% !
Т.е. нужно по отдельности вводить внешние параметры для длинных и коротких сделок.
Пож. обьясни непонятные моменты.
вроде бы в этой твоей версии границы канала работают по ценам открытия! А вот стохастик работает по всем тикам! Это так?
Почему в double Stochastic[2]; - в скобках стоит двойка?
Почему везде скобки квадратные а не круглые?
Что такое вот это ?--
Код
string st="";
if (ZeroBarOrd) st="_true";
else st="_false";

Что за условие ? -
Код
if (!ZeroBarOrd) {  ....  


Чтобы тебе не искать - привожу здесь весь кусочек кода -
Код
int start()
  {

bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }  

int _Order=isExpertOrder();


if (isNewBar) {
if (_Order!=0) ZeroBarOrd=true;  //есть ордер
else           ZeroBarOrd=false; //нет ордера
}

/  

//====================================================================

double Stochastic[2];

Env_low[0]    = iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,Env_shift,2,0);
Env_up[0]     = iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,Env_shift,1,0);
Stochastic[0] = iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,Env_shift,0,0);
Stochastic[1] = iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,Env_shift,0,1);
//----------------------------------------------------------------------------------------------

string st="";
if (ZeroBarOrd) st="_true";
else st="_false";

        
if (!ZeroBarOrd) {        
//----------------------------------------------------------------------------------------------

  //----проверяем условие на покупку-----
  if   (  (Stochastic[1]<Env_low[0])  &&


На графике - обычная версия и версия индикатора с МА. Хорошо видно что при версии с МА - сделки в SELL работают безъупречно!


Эскизы прикрепленных изображений
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 6.8.2007, 7:40
Сообщение #156





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Привет! Попробую по порядку.

Цитата(leonid553 @ 5.8.2007, 11:17) *

вроде бы в этой твоей версии границы канала работают по ценам открытия! А вот стохастик работает по всем тикам! Это так?


В этой версии используется внешний индикатор. Этот индикатор работает на всех тиках.

Цитата(leonid553 @ 5.8.2007, 11:17) *

Почему в double Stochastic[2]; - в скобках стоит двойка?


Это объявлен массив с именем Stochastic и размером в два элемента. Т.е для обращения к первому элементу массива используем [0], а ко второму [1]. Далее в этот массив записываются значения индикатора на нулевом и первом барах соответственно.

Цитата
Что такое вот это ?--

string st="";
if (ZeroBarOrd) st="_true";
else st="_false";


Это блокировка открытия нескольких ордеров на одном баре. Бывает ситуация когда позиция открывшись в скором закрывается по СЛ или ТП, а сигнал на открытие может быть ещё действительным. В этот момент открывалась следующая позиция в том же направлении, что немного расходится со смыслом стратегии. Вот код, который приведен выше, препятствует такому открытию. Работает он по аналогии с кодом который отслеживает появление нового бара (см. посты выше).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.8.2007, 11:38
Сообщение #157





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Ок! Благодарю!
Ещё вопрос. Вот сегодня на счету с советниками ST+ENV имела место открытая позиция по USDCHF.
В это время был сигнал на открытие вниз позиции по GBPUSD,
но позиция сразу не открылась, а открылась (на этой же свече) только тогда, когда первая (по USDCHF) закрылась!
И мы сильно запоздали с хорошим входом!
Видимо так случилось, потому что в коде советника -

int Orders=OrdersTotal (); //получаем кол-во открытых ордеров
if (Orders==0) //если нет открытых ордеров
{
//---------проверяем условие на покупку----------------------------
if (
(Stochastic_1<En0_low) &&
(Stochastic_0>En0_low) )

Т.е. в терминале по условию не должно быть открытых ордеров. Получается, что советники будут работать только по очереди?
Как решить эту проблему?
Что ниб. вот такое // for (int c=0; c<OrdersTotal(); c++) ? - вставить?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 6.8.2007, 15:20
Сообщение #158





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Именно!
Я же говорил тебе не использовать эту версию на демо.
Цитата
Как решить эту проблему?

Проблема уже решена в той версии, которую я тебе присылал. Используй либо её, либо переделай существующую по аналогии.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.8.2007, 16:48
Сообщение #159





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Ок!
Вот ещё проблема с мультивалютной версией! В ОНЛАЙНЕ.
Первая пара работает нормально! а ВОТ ВТОРАЯ - НЕ ХОЧЕТ ВКЛЮЧАТЬСЯ!
Пока пробую сам разобраться!
Пож. скажи что делает этот блок?--
------------------------------------------------------------------
/---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет; |
// true - есть ордера данного эксперта; |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
//--
bool result=false;

int _OrdersTotal=OrdersTotal();
//--
if (_OrdersTotal>0) {
for (int n=0; n<_OrdersTotal; n++) {

if (OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) {
if (OrderMagicNumber()==VersionID)
{ result=true; break; } //Найден ордер принадлежащий эксперту
else
{ result=false; }
}
}
}
else { result=false; }
//---------------------

return(result);
}
----------------------------------------------------
Желательно подробнее!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.8.2007, 19:10
Сообщение #160





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Возможно причина в функции OrderSend, кот. мы используем для открытия позиций.
------------------------------------------------------------------------
if (OrderSend("USDCHF", OP_SELL, Lots, Bid, 3, Ask + sl_USDCHF * Point, Bid-tp_USDCHF* Point,"M_2", MagicCHF, 0, Red) > 0) break;
/////////////////////////////////////////////////////////////
Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().
Замечания.
При открытии рыночного ордера (OP_SELL или OP_BUY) в качестве цены открытия могут использоваться только самые последние цены Bid (для продажи) или Ask (для покупки).
Если операция проводится по финансовому инструменту, отличному от текущего, то для получения последних котировок по этому инструменту необходимо воспользоваться функцией MarketInfo() с параметром MODE_BID или MODE_ASK.
--------------------------------------------------------------------------------
А мы, получается , - не берем в наст. момент котировки по второй паре!
Непонятно ещё, - где указан тф по второй паре.
Надо сделать примерно так:
Код
RefreshRates();
          CurAskPriceOne = MarketInfo("USDCH", MODE_ASK);
          CurAskPriceTwo = MarketInfo("GBPUSD", MODE_ASK);  
                  
                  
         // открывам пару
         // 1 ордер
         ticket=OrderSend("GBPUSD",OP_BUY,Lots,CurAskPriceOne,3,0,0,"one order",101,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("One order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY EURUSD order : ",GetLastError());
        
        
         // 2 ордер
         ticket=OrderSend("USDCHF",OP_BUY,Lots,CurAskPriceTwo,3,0,0,"second order",505,0,Blue);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Second order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY USDCHF order : ",GetLastError());
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

26 страниц V « < 14 15 16 17 18 > » 
Ответить в эту темуОткрыть новую тему

 



- Текстовая версия Сейчас: 7.9.2024, 8:23