Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум трейдеров рынка ФОРЕКС (FOREX). Анализ Форекс _ MQL программирование _ Perceptron

Автор: leonid553 23.3.2007, 11:29

Yury V. Reshetov
Нейронная сеть

Что такое нейронная сеть или Perceptron? Это алгоритм использующий уравнение линейного неравенства (линейного фильтра), с помощью которого можно причислить исследуемый объект к тому или иному классу или же наоборот исключить его из этого самого класса объектов. Само неравенство выглядит так:
w1 * a1 + w2 * a2 + ... wn * an > d
где:
1. wi - весовой коэффициент с индексом i;
2. ai - численное значение признака с индексом i исследуемого объекта;
3. d - пороговое значение, чаще всего равное 0.
Дело в том, что геометрически плоскость описывается линейным уравнением. Например, в трехмерном пространстве относительно координат X, Y и Z уравнение плоскости имеет вид:
A * X + B * Y + C * Z + D = 0
Координаты всех точек, расположенных по одну сторону от плоскости, в этом самом пространстве, удовлетворяют неравенству:
A * X + B * Y + C * Z + D > 0
А координаты всех точек лежащих по другую сторону от плоскости, удовлетворяют неравенству:
A * X + B * Y + C * Z + D < 0
Таким образом, если нам известно уравнение некой плоскости и координаты любых точек, то мы можем разделить множество всех точек пространства на два множества точек, разделяемых этой самой плоскостью.

ПОСТАНОВКА ЗАДАЧИ
Если мы разделим объекты на два класса: открываемые длинные позиции и короткие позиции, а в качестве признаков возьмем значения индикаторов или осцилляторов технического анализа, то остается лишь выяснить уравнение плоскости и попытаться с ее помощью произвести идентификацию. Постановка задачи ясна.
Множества точек пересекаются в пространстве и провести четкую разделительную черту между ними невозможно. Единственным и приемлемым решением здесь является линия, которая будет отделять оба множества точек таким образом, чтобы с ее помощью большинство красных объектов оказалось по одну сторону, а синих по другую. На сей раз, мы имеем дело с задачей оптимизации, то есть поиском уравнения разделяющей плоскости или линии, способной максимально разделить два класса объектов друг от друга, но с вероятностью того, что часть точек, принадлежащих одному классу, будет ошибочно идентифицировано, как принадлежащих к классу другому.
Попробуем теперь определиться с постановкой задачи, которую мы собираемся решить. Элементарно, что нужно знать трейдеру для прибыльной торговли - это направление движения котировок. То есть если котировки пойдут вверх, то следует открыть длинную позицию. Если вниз, то необходимо открывать позицию короткую. Следовательно, два класса объектов у нас уже есть, а именно, направление движения котировок. Для того, чтобы принять решение, следуя техническому анализу, трейдеры прибегают к исследованию так называемых технических индикаторов или осцилляторов. Мы также будем исследовать осциллятор.

Поскольку технические осцилляторы - это гистограммы, значения которых отклоняются от горизонтальной линии, то соответственно и нейронная сеть нам понадобится с линейным фильтром. В качестве признаков объекта, будем брать паттерны, то есть значения осциллятора в четырех точках, взятые с шагом в семь периодов вглубь истории, начиная от текущего момента.



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне
Прикрепленное изображение в новом окне

Автор: leonid553 23.3.2007, 11:43


На вышеприведенном рисунке значения осциллятора обведены кружочками. Присвоим их идентификаторам a1, a2, a3 и a4 и будем подставлять в уравнение разделительной плоскости и сравнивать полученное значение с нулем, чтобы узнать, с какой стороны будет находиться паттерн.

Осталось только получить само уравнение плоскости, которое будет разделять паттерны, предшествующие движению цены вверх, от паттернов, предшествующих движению цены вниз.

Для этой цели будем использовать встроенный в торговый терминал MetaTrader4 генетический алгоритм, предназначенный для ускорения процессов оптимизации. Проще говоря, мы будем подбирать значения весовых коэффициентов линейного фильтра таким образом, чтобы в результате получить уравнение разделительной линии для максимального значения баланса оптимизацией стратегии на исторических данных.
Для этой цели нам понадобится, как минимум, формулировка торговой стратегии, с помощью которой можно будет реализовать алгоритм и переложить его в код советника для MetaTrader4.
Теоретически торговая система должна предусматривать сигналы, как для входа в рынок, так и для выхода из него. Впрочем, выходы по сигналам не являются обязательными и их можно исключить с помощью:
Расстановки стоп-ордеров - takeprofit и stoploss;
Разворотом позиции в противоположном направлении при получении сигнала о изменении направления тенденции рынка.
Чтобы не усложнять торговую систему, мы будем использовать выходы по защитным стопам - stoploss и по сигналам разворотов. В этом случае нейросеть будет выдавать на выходе только два сигнала по значениям признаков объектов, а именно:
Котировки вероятнее всего будут двигаться в сторону повышения;
Котировки вероятнее всего будут двигаться в сторону понижения.
Таким образом упрощается задача идентификации объектов для нейронной сети путем разделения их всего на два класса. Оптимизацию торговой системы также можно упростить, исключив из управления ордерами фиксацию прибылей по takeprofit, то есть избавить ее от подбора еще одного входного параметра. В этом случае достаточно воспользоваться трейлинг-стопами, то есть постепенными подтягиваниями stoploss в прибыльную сторону до тех пор, пока нейросеть не даст противоположный сигнал или пока она не ошибется. Любая ошибка нейросети приведет к срабатыванию защитного стопа. При этом сама система управления ордерами усложняется. Быстрый разворот позиции в обратном направлении лучше всего выполнить через встречный ордер с удвоенным количеством лотов и последующим закрытием встречной позиции. Этот маневр позволяет совершить все операции по развороту сразу же, как только будет получен сигнал от нейросети.
Чтобы сократить количество ложных срабатываний от сигналов нейросети, их считывание и принятие решений будем производить только по сформировавшимся барам и по ценам открытия этих самых баров.
Решение задачи

Ниже приведен исходный код советника, реализующего данную торговую стратегию:



//+------------------------------------------------------------------+
//| ArtificialIntelligence.mq4 |
//| Copyright й 2006, Yury V. Reshetov |
//| http://reshetov.xnet.uz/ |
//+------------------------------------------------------------------+
#property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499 http://reshetov.xnet.uz/"
#property link "http://reshetov.xnet.uz/"
//---- input parameters
extern int x1 = 120;
extern int x2 = 172;
extern int x3 = 39;
extern int x4 = 172;
// StopLoss level
extern double sl = 50;
extern double lots = 0.1;
extern int MagicNumber = 888;
static int prevtime = 0;
static int spread = 3;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(Time[0] == prevtime)
return(0);
prevtime = Time[0];
//----
if(IsTradeAllowed())
{
spread = MarketInfo(Symbol(), MODE_SPREAD);
}
else
{
prevtime = Time[1];
return(0);
}
int ticket = -1;
// check for opened position
int total = OrdersTotal();
for(int i = 0; i < total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
// check for symbol & magic number
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
int prevticket = OrderTicket();
// long position is opened
if(OrderType() == OP_BUY)
{
// check profit
if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point))
{
if(perceptron() < 0)
{
// reverse
ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3,
Ask + sl * Point, 0, "AI", MagicNumber,
0, Red);
Sleep(30000);
if(ticket < 0)
{
prevtime = Time[1];
}
else
{
OrderCloseBy(ticket, prevticket, Blue);
}
}
else
{
// trailing stop
if(!OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - sl * Point, 0, 0, Blue))
{
Sleep(30000);
prevtime = Time[1];
}
}
}
// short position is opened
}
else
{
// check profit
if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point))
{
if(perceptron() > 0)
{
// reverse
ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3,
Bid - sl * Point, 0, "AI", MagicNumber,
0, Blue);
Sleep(30000);
if(ticket < 0)
{
prevtime = Time[1];
}
else
{
OrderCloseBy(ticket, prevticket, Blue);
}
}
else
{
// trailing stop
if(!OrderModify(OrderTicket(), OrderOpenPrice(),
Ask + sl * Point, 0, 0, Blue))
{
Sleep(30000);
prevtime = Time[1];
}
}
}
}
// exit
return(0);
}
}
// check for long or short position possibility
if(perceptron() > 0)
{
//long
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0,
"AI", MagicNumber, 0, Blue);
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
}
else
{
// short
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0,
"AI", MagicNumber, 0, Red);
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
}
//--- exit
return(0);
}
//+------------------------------------------------------------------+
//| The PERCEPRRON - a perceiving and recognizing function |
//+------------------------------------------------------------------+
double perceptron()
{
double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 = iAC(Symbol(), 0, 0);
double a2 = iAC(Symbol(), 0, 7);
double a3 = iAC(Symbol(), 0, 14);
double a4 = iAC(Symbol(), 0, 21);
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}
//+------------------------------------------------------------------+}
Осталось только подобрать весовые коэффициенты линейного уравнения разделительной плоскости для нейросети.

klot писал:

Спасибо! Всё досупно и правильно написано.
Я тут немного модернизировал Вашего советника, - попробовал сделать "многослойную сеть" из 4-х перцептронов.У каждого свой состав входов и каждый обучался отдельно на максимальную прибыль. Потом, 5-й обобщал результаты (обучался на минимизацию просадки) предыдущих 4-х. Получилось не плохо, много сделок и просадка не большая.
А вообще, мне нравиться, эту тему я давно изучаю. Правда зашел через "парадный вход" начал с самых истоков. Если есть желание посотрудничать обсуждение идёт тут: http://www.fxexpert.ru/forum/index.php?showtopic=656

Yury V. Reshetov
Я тоже попробовал 5-ти слойку. Первые 4 имеют по 5 входов, на каждый из которого поступают нормированные значения с отдельно взятого индикатора (на каждый слой свой индикатор). 5-й слой 4-х входовый и также обобщающий. Результаты весьма неплохие получаются. Самое главное, что вне репрезентативной выборки ведет себя очень стабильно по сравнению с однослойкой.
Удобно тем, что каждый слой можно обучать по отдельности. Осталось только полностью автоматизировать весь процесс обучения на истории.
Лучший вариант - это взять сразу 4 компьютера и распараллелить процессы обучения. Потом собрать результаты с 4 слоев воедино и обучить последний слой.

Автор: leonid553 23.3.2007, 12:03

GBPJPY, H1
Тест за янв-февр-март после оптимизации за ноябрь-дек. 2006г(по ценам откр.):

Баров в истории 2348
Начальный депозит 1000.00
Чистая прибыль 3911.07
Общая прибыль 5859.70
Общий убыток -1948.63
Прибыльность 3.01
Матожидание выигрыша 35.23
Абсолютная просадка 50.84
Максимальная просадка 177.91 (1.49%)
Относительная просадка 1.49% (177.91)
Всего сделок 111
Короткие позиции (% выигравших) 46 (63.04%)
Длинные позиции (% выигравших) 65 (61.54%)
Прибыльные сделки (% от всех) 69 (62.16%)
Убыточные сделки (% от всех) 42 (37.84%)
Самая большая
прибыльная сделка 514.66
убыточная сделка -55.72
Средняя
прибыльная сделка 84.92
убыточная сделка -46.40
Максимальное количество
непрерывных выигрышей (прибыль) 7 (349.35)
непрерывных проигрышей (убыток) 3 (-150.10)
Максимальная
непрерывная прибыль (число выигрышей) 632.37 (2)
непрерывный убыток (число проигрышей) -150.10 (3)
Средний
непрерывный выигрыш 2
непрерывный проигрыш 1


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 23.3.2007, 15:05

to NoName:
Твоя последняя версия "ST+ENV" - с переворотом, работает оч. прилично! Сам не ожидал!
Выгребает тренд - почти до дна!
Появилась мысль вставить в советник перцептрон с вызовом другого индикатора! Чтобы уменьшить число убыточных, нетрендовых входов.

Автор: NoName 23.3.2007, 21:09

Цитата
to NoName:
Твоя последняя версия "ST+ENV" - с переворотом, работает оч. прилично! Сам не ожидал!
Выгребает тренд - почти до дна!
Появилась мысль вставить в советник перцептрон с вызовом другого индикатора! Чтобы уменьшить число убыточных, нетрендовых входов.


А я так и не смог от неё ничего путнего получить. Как не крутил - на бэктесте всё сливает, зараза. Так что подгонка, как говорится, на лицо wink.gif
На счёт перцептрона, а почему бы в сеть не подать сигналы самих "ST+ENV", без вызовов всяких индикаторов? Я примерно представляю как это программно описать, нужно будет индикатор состряпать. Но этим если и заниматься, то нужно создавать нормальную нейросеть, а то этот советник уж больно примитивный smile.gif

P.S. Наверное неплохо бы ветку отдельную сделать для этого. И сообщения последние туда перенести. А то ты немного не туда забрёл wink.gif Я вот только через пол дня обнаружил твои посты и то случайно smile.gif

Автор: leonid553 24.3.2007, 19:46

"А я так и не смог от неё ничего путнего получить. Как не крутил - на бэктесте всё сливает, зараза. Так что подгонка, как говорится, на лицо "
---------------------------------------------------------------------------

Я тоже изначально не мог получить удовлетворительных результатов. Но потом дошло, в чем тут дело!!
Посмотрел в визуале работу нейро советника и обнаружил - как грамотно он работает при трендовом рынке.
По аналогии предусмотрел аналогичную комбинацию внешних параметров в ST+ENV, отказался от тейкпрофита (ну почти, сделал его = 250/300). Заменил его тралом, оптимизировал шаг трала - Tr/Step .
При этом обнаружилось, что теперь и наш советник "выгребает тренд" оч. неплохо!
Имеются, конечно "отдельные недостатки" - о них я писал в НЕСТАНДАРТНОЙ ТАКТИКЕ.
-----------------------------------------------------------------------------------
"На счёт перцептрона, а почему бы в сеть не подать сигналы самих "ST+ENV", без вызовов всяких индикаторов? Я примерно представляю как это программно описать, нужно будет индикатор состряпать. Но этим если и заниматься, то нужно создавать нормальную нейросеть, а то этот советник уж больно примитивный "
-----------------------------------------------------------------------------------
Поскольку индикатор ты уже "состряпал", то я вижу примерно такой сценарий:
Решетов писал:
"Я тоже попробовал 5-ти слойку. Первые 4 имеют по 5 входов, на каждый из которого поступают нормированные значения с отдельно взятого индикатора (на каждый слой свой индикатор). 5-й слой 4-х входовый и также обобщающий. Результаты весьма неплохие получаются. Самое главное, что вне репрезентативной выборки ведет себя очень стабильно по сравнению с однослойкой."

Поэтому наш ST+ENV будет давать только сигналы на вход и сопровождать позицию, как "базовый" узел.
А достоверность его сигналов будет проверяться (для начала) однослойной нейро структурой с др. индикатором.
Причем работу однослойки желательно постоить на меньшем тф, чем тот на кот. работает ST+ENV!. Чтобы "не задерживаться со входом.
А на счет того - как программно подать в сеть сигналы самого ST+ENV, - увы...
Не могу пока сообразить. sad.gif

Автор: NoName 24.3.2007, 21:47

Цитата
Поскольку индикатор ты уже "состряпал", то я вижу примерно такой сценарий:
Решетов писал:
"Я тоже попробовал 5-ти слойку. Первые 4 имеют по 5 входов, на каждый из которого поступают нормированные значения с отдельно взятого индикатора (на каждый слой свой индикатор). 5-й слой 4-х входовый и также обобщающий. Результаты весьма неплохие получаются. Самое главное, что вне репрезентативной выборки ведет себя очень стабильно по сравнению с однослойкой."

Поэтому наш ST+ENV будет давать только сигналы на вход и сопровождать позицию, как "базовый" узел.
А достоверность его сигналов будет проверяться (для начала) однослойной нейро структурой с др. индикатором.
Причем работу однослойки желательно постоить на меньшем тф, чем тот на кот. работает ST+ENV!. Чтобы "не задерживаться со входом.
А на счет того - как программно подать в сеть сигналы самого ST+ENV, - увы...
Не могу пока сообразить. sad.gif


То что я состряпал - это не для сети делалось.
На счёт подачи сигналов (не только ST+Env) думаю уже не один день. Пока вижу это так:
представь что в момент возникновения сигнала, когда мы совершаем сделку, на график наносится стрелочка в этом месте. Получится два вида стрелочек, вверх (при покупке) и вниз (при продаже). Мы будем иметь график, на котором будут проставлены стрелочки по всей истории (заданной). Далее нужно выгрузить в файл весь ценовой ряд, которому необходимо поставить в соответствие наши сигналы. Там где стрелка вверх мы будем ставить 1, там где вниз поставим (-1), а там где стрелочек нет - 0. И вот в таком виде эти данные нужно скормить Нейрошелу.
Меня останавливает вот что. Тактика ST+ENV подразумевает работу внутри бара. Если мы будем подавать сигналы по закрытию бара, то будет упускаться значительная часть движения (или же сигнала не окажется вовсе, т.к. не редко бывает что вход и выход получаются в пределах одного бара при сильных движениях). Ну а подавать в нейросеть минутки - мне кажется что это глупость.
Возможно, что хорошим выходом из этой ситуации будет использования меньшего ТФ, то есть вместо минуток подавать М5 или М15, но смотреть при этом на Н4. Скорее всего к оптимальному результату можно прийти только методом проб и ошибок.


Автор: leonid553 25.3.2007, 12:23

Вот такая ещё идея .
ПО вышеприведенному советнику.
Там перцептрон обрабатывает значения индикатора AO, взятые из четырех точек. И потом выдает суммарный итог - "+" или "-".
Если нам ввести дополнително еще:
-----------------------------------------------------------------
double perceptron_2()
{
double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 = iRVI(Symbol(), 0, RVI_period,MODE_MAIN,0);
double a2 = iRVI(Symbol(), 0, RVI_period,MODE_MAIN,7);
double a3 = iRVI(Symbol(), 0, RVI_period,MODE_MAIN,14);
double a4 = iRVI(Symbol(), 0, RVI_period,MODE_MAIN,21);
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}
--------------------------------------------------------------------------
а потом еще:
-----------------------------------------------------------------------
double perceptron_3()
{
double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 = iCCI(Symbol(), 0,CCI_period, PRICE_CLOSE, P_1);
double a2 = iCCI(Symbol(), 0,CCI_period, PRICE_CLOSE, P_2);
double a3 = iCCI(Symbol(), 0, CCI_period, PRICE_CLOSE, P_3);
double a4 = iCCI(Symbol(), 0,CCI_period, PRICE_CLOSE, P_4);
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}
----------------------------------------------------------------------------
и наконец ещё:
double perceptron_4() .... ..... ....
double a1 = iStochastic(Symbol ..... .....
-----------------------------------------------------------------------------
А ДАЛЕЕ заявить последний - суммирующий :
double perceptron_SUM,
на входы которого и подать значения предыдущих выходов?
Непонятно только как организовать:

double a1 = iРerceptron_1(......
double a1 = iРerceptron_2(......
и т.д.
А в код самого советника вставить именно - полученное значение последнего, суммирующего перцептрона!

Автор: NoName 25.3.2007, 12:57

Я ведь тебе предлагал уже это по аське! Можно вообще все индикаторы туда засунуть. Можно, также, брать не просто значения с определенных баров, а например, изменение на последнем и предпоследнем баре (например, Close[1]-Close[0]) - тоже может получиться интересный результат.
В любом случае при использовании нескольких перцептронов нужно учитывать "размерность" индикаторов. Т.к. у одних область определения от 0 до 100, у других от 0 до 1, у третих -100 - +100 и т.д. Нужно все показания приводить к одному виду, иначе, последний результирующий перецептрон будет считать показания индикатора с маленькими числами "незначительными".



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

Код
double perceptron_SUM () {

double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 = perceptron_1 ();
double a2 = perceptron_2 ();
double a3 = perceptron_3 ();
double a4 = perceptron_4 ();
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}


Вот только переменные весовых коэффициентов для разных прецептронов, наверное, должны быть разными.


Автор: leonid553 25.3.2007, 13:01

Либо подбирать индикаторы , средняя линия которых равна нулю!

Автор: leonid553 25.3.2007, 14:04

Понятно теперь стало - почему в реале советник с индикатором WPR постоянно сливает!
Я там не предусмотрел, что его шкала находится только в +зоне.
И оптимизация , конечно, получилась случайной!
Особенно это заметно при оптимизации параметра SL.
Сейчас вот исправил в коде условие на вход - и результаты меняются на глазах!
Прибыль увеличивается не быстро, зато становится гораздо надежней!
Графики идут плавно, без провалов.
Кроме того, вспомнилась твоя идея - задавать "запрещенный" диапазоп выходного значения перцептрона. Чтобы советник - в этом диапазоне отдохнул, подумал немного "как дальше с этим жить...". smile.gif
Вот график оптимизации , GBPUSD, стохастик, M30, с янв. 2007г.



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 25.3.2007, 14:52

А вот результат оптимизации от пред. поста
Качество моделирования 89.96%
Начальный депозит 1000.00
Чистая прибыль 1736.52
Общая прибыль 2315.04
Общий убыток -578.52
Относительная просадка 15.19% (203.20)
Всего сделок 50
Короткие позиции (% выигравших) 28 (82.14%)
Длинные позиции (% выигравших) 22 (86.36%)
Прибыльные сделки (% от всех) 42 (84.00%)
Убыточные сделки (% от всех) 8 (16.00%)
Самая большая
прибыльная сделка 325.52
убыточная сделка -72.96
Средняя
прибыльная сделка 55.12
убыточная сделка -72.31
Максимальное количество
непрерывных выигрышей (прибыль) 11 (675.08)
непрерывных проигрышей (убыток) 2 (-144.36)
Максимальная
непрерывная прибыль (число выигрышей) 675.08 (11)
непрерывный убыток (число проигрышей) -144.36 (2)


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 26.3.2007, 15:40

Не всё, однако, так хорошо!
Результат был получен при оптимизации от 1 янв. до 16 марта. При прогоне до сег. дня - 26 марта - обнаружилось подряд 5 лосей!
Стал разбираться - прогнал с 2004 года, результат(фунт, м30):
668 сделок =+375-313, общий профит=+45 пипсов !
Причем короткие 412 сделок, длинные - 276.
Обнаружилось вот что:
Поскольку в советнике использован вызов стохастика, я взял точку отсчета - среднюю линию стохастика = 50.
Но - вот тут и присутствует ошибка!
Значения перцептрона у нас в коде заданы либо <50, либо >50, - но при положительной, однополярной шкале стохастика на выходе перцептрона почти всё время будут получаться значения - больше 50-ти (независимо от положения) - это очевидно! И в результате невпопад открываются короткие сделки! Да и значения перцептрона при этом надо задавать либр выше, либо ниже уровней перепроданности/перекупл-ти.
Выход - изменить шкалу стохастика на двухполярную. Или брать другой индикатор!

Автор: NoName 26.3.2007, 16:55

Цитата
Поскольку в советнике использован вызов стохастика, я взял точку отсчета - среднюю линию стохастика = 50.
Но - вот тут и присутствует ошибка!


А нельзя ли сдесь привести код функции Perceptron () ?
Не совсем представляю как ты взял эту точку отсчёта от уровня 50.

Автор: leonid553 26.3.2007, 18:18

вот так сделал для текущей buy-позиции:
int ticket = -1;
// check for opened position - контроль откытых позиций
int total = OrdersTotal();
for(int i = 0; i < total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
// check for symbol & magic number
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
int prevticket = OrderTicket();
// long position is opened - длинная позиция открылась
//далее проверяется условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ
//БОЛЬШЕ РАЗМЕРА СТОПЛОССА И ЗНАЧЕНИЕ ПЕРЦЕПТРОНА <50 - ПЕРЕВОРАЧИВАЕМСЯ
if(OrderType() == OP_BUY)
{
// check profit
if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point))
{
if(perceptron() < 50)
{
// reverse
ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3,
Ask + sl * Point, 0, "AI", MagicNumber,
0, Red);
Sleep(30000);
if(ticket < 0)
{
prevtime = Time[1];
}
else
{
OrderCloseBy(ticket, prevticket, Blue);
}

Автор: leonid553 26.3.2007, 18:35

Похоже, я тут вообще не в кон задал
if(perceptron() < 50)
- надо подумать здесь!

Автор: NoName 26.3.2007, 19:35

Цитата
Похоже, я тут вообще не в кон задал
if(perceptron() < 50)
- надо подумать здесь!


Конечно не в кон smile.gif Я почему и попросил функцию Perceptron().
Ну вобщем не важно уже, ты понял сам в чём дело.

Предлагаю проблему решить таким путём:

Код

double perceptron()
  {
   double w1 = x1 - 100;
   double w2 = x2 - 100;
   double w3 = x3 - 100;
   double w4 = x4 - 100;
   double a1 =  iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 0)   - 50;
   double a2 =  iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 7)   - 50;
   double a3 =  iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 14) - 50;
   double a4 =  iStochastic(NULL,0, Kperiod, Dperiod, slowing, MODE_SMA, 0, MODE_MAIN, 21) - 50;
   return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }


От значения стохастика отнимаем наш уровень 50 и получаем двухполярный стохастик с областью определения от -50 до +50.
Среднюю линию, в таком случае, можно считать равной нулю.

Автор: NoName 26.3.2007, 20:05

Вот, модернизировал для наглядности wink.gif

Прикрепленное изображение в новом окне


Вверху стандартный, внизу полярный.

Индикатор прилагаю:
Прикрепленный файл  StochasticPolar.rar ( 1.04 килобайт ) Кол-во скачиваний: 671


Автор: leonid553 27.3.2007, 9:49

Благодарю, Андрей.
Вставил этот кусочек кода.
чтобы избежать подгонки при оптимизации решил оптимизировать по всей доступной истории.
С мая 2004г. закачаны минутки с Альпари по всем тф. А с янв. 2007г - текущие котировки Лайта.
Результат получился - от +6000 до +8500 (м30 и н1)
Даже "побаловался" с контрольными точками.
Не думаю, что на этот раз имеет место подгонка! Три года - это не месяц-два, и подгонка здесь мало вероятна!
Причем прибыль идет оч. последовательно вверх, но в неком диапазоне - почти идеальном канале - обозначил на графике баланса зел. линиями. (без ММ)
Оч . жаль, однако, что пока внутри этого канала ситуация ещё не определена.
Это напоминает мне муравьев - которые тащат соломинку в муравейник. Всякий из нас часто такое наблюдал в детстве. Каждый муравей тянет соломинку в с свою сторону , но в сумме соломинка непостижимом образом всё-таки движется в сторону муравейника!
Если взять и разбить этот общий полученный профитный результат по месяцам - то картина не очень впечатляет.
Однако в сумме мы имеем достаточно надежный общий профит!
Осталось теперь перейти к деталям. И внутри нашего канала свести к минимуму просадку, либо (менее желательно) увеличивать профит.
Вот еще проблема, впрочем, небольшая осталась.



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 27.3.2007, 10:08

А Проблема вот в чем:
---------------------------------------------------------------------------------
// long position is opened -длинная позиция открылась
//далее проверяется условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ
//БОЛЬШЕ РАЗМЕРА СТОПЛОССА И ЗНАЧЕНИЕ ПЕРЦЕПТРОНА <25 - ПЕРЕВОРАЧИВАЕМСЯ
if(OrderType() == OP_BUY)
{
// check profit
if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point))
{
if(perceptron() < 25)
{
// reverse
-----------------------------------------------------------------------------------
для короткой позиции , соответственно, наоборот:
if(perceptron() > -25)
{
// reverse
Изначально это значение перцептрона было=0, но я для стохастика таким образам обозначил переворот позиции на условных границах зон перекупл/перепрод.
И оказалоссь, что на конечном результате эти мои изменения вообще не сказываются!
Но ведь должны!
Вот только сейчас в коде - в самом конце обнаружилось ещё:
}
// check for long or short position possibility - возможность контроля длинной/короткой позиции
if(perceptron() > 50)
{
//long
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0,
"ST", MagicNumber, 0, Blue);
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
}
else
{
// short
ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0,
"ST", MagicNumber, 0, Red);
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
}
//--- exit
return(0);
--------------------------------------------------------------------------------
Здесь я забыл поменять.
И ещё - мне непонятен механизм входа при самой первой сделке, т.е. при включении советника. А это, между тем, тоже существенно!

Автор: NoName 27.3.2007, 10:57


Код

// check for opened position
   int total = OrdersTotal();  
//----
   for(int i = 0; i < total; i++)
     {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
       // check for symbol & magic number
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         {
           int prevticket = OrderTicket();
           // long position is opened
           if(OrderType() == OP_BUY)
             {
               // check profit
               if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point))
                 {              
                   if(perceptron() < 0)
                     { // reverse
                    
                  ...
                  ...
                  ...
  
                     }
                 }  
             }
           // exit
           return(0);
         }
     }


В момент запуска у нас открытых позиций нет. Поэтому советник выполняя вышеприведенный блок не обнаружит ордера на текущем символе да ещё и со своим Magic'ом
Код
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)  

А значит пропускаются все дальнейшие проверки и действия в данном блоке.
И условия на вход проверяются в блоке, который ниже:

Код

// check for long or short position possibility
   if(perceptron() > 0)
     { //long
       ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, "AI",
                          MagicNumber, 0, Blue);
       //----
       if(ticket < 0)
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }
   else
     { // short
       ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, "AI",
                          MagicNumber, 0, Red);
       if(ticket < 0)
         {
           Sleep(30000);
           prevtime = Time[1];
         }
     }



Автор: leonid553 27.3.2007, 11:16

бдагодарю.
Сейчас разберусь!
Только что пришла ещё вот какая мысль.
В авторскои версии использован индикатор АО.
но там граничные значения шкалы - от +0.005 до -0.005
Более того - сейчас на графике фунта крайние значения от +0.003515 до -0.003200 !
И конечно , вес контрольных точек до 200 единиц оправдан!
Но у нас то - граничные значения шкалы от +50 до -50 !
И придавая вес = от единиц до 200 мы в итоге получаем все что можно, но только не то что нужно!
Какие уж тут +25 и -25 в итоге , если разброс значений Х1-Х4 составляет у нас от десятков единиц до 10 тысяч!
Похоже опять не в кон!
Надо задавать весовые коэффициенты, видимо от 0.05 до 1 ? Либо опять по новой менять шкалу стохастика.
Как считаешь?

Автор: NoName 27.3.2007, 11:19

Цитата
чтобы избежать подгонки при оптимизации решил оптимизировать по всей доступной истории.
С мая 2004г. закачаны минутки с Альпари по всем тф. А с янв. 2007г - текущие котировки Лайта.
Результат получился - от +6000 до +8500 (м30 и н1)
Даже "побаловался" с контрольными точками.
Не думаю, что на этот раз имеет место подгонка! Три года - это не месяц-два, и подгонка здесь мало вероятна!


ИМХО
Оптимизация уже сама по себе подразумевает подгонку! Ты перебираешь всевозможные параметры с целью получения максимальной прибыли. И получаешь в результате те параметры на которых прибыль максимальна. Но это совершенно не значит что была выявлена какая-то закономерность. Большой период оптимизации немного снижает, но совсем не исключает подгонку. Прояснить ситуацию может только форвард-тест! Вот почему было не сделать оптимизацию с 2004 по янв 2007, а период с января по сегодня оставить для теста ???
Мне кажется что только по результатам теста за эти три месяца можно судить о надёжности параметров полученных при отимизации до этого периода!

Автор: NoName 27.3.2007, 11:40

Цитата
В авторскои версии использован индикатор АО.
но там граничные значения шкалы - от +0.005 до -0.005
Более того - сейчас на графике фунта крайние значения от +0.003515 до -0.003200 !
И конечно , вес контрольных точек до 200 единиц оправдан!
Но у нас то - граничные значения шкалы от +50 до -50 !
И придавая вес = от единиц до 200 мы в итоге получаем все что можно, но только не то что нужно!
Какие уж тут +25 и -25 в итоге , если разброс значений Х1-Х4 составляет у нас от десятков единиц до 10 тысяч!
Похоже опять не в кон!
Надо задавать весовые коэффициенты, видимо от 0.05 до 1 ? Либо опять по новой менять шкалу стохастика.
Как считаешь?


Я думаю что нет никакой разницы в значении весовых коэффициентов.
Если посмотреть на конечную формулу
Код
return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);

то из неё видно что если у нас стох ниже 0, то и соответствующее слагаемое приймет отрицательное значение, будь весовой коэффициент хоть 1 хоть 100. А окончательное решение мы принимаем по сумме этих коэффициентов, если значение отрицательных больше - то пойдём вниз, иначе вверх. Главное что бы не оказалось что один коэффициент будет 1 а другой 100, вот тогда точно получим всё что можно wink.gif

Автор: leonid553 27.3.2007, 12:49

Вставил вот этот кусочек!
double a1 = iStochastic(NULL,0, Stochastic_period, Dperiod, 3, MODE_SMA, 0, MODE_MAIN, P_1)- 50;
double a2 = iStochastic(NULL,0, Stochastic_period, Dperiod,3, MODE_SMA, 0, MODE_MAIN, P_2)- 50;
double a3 = iStochastic(NULL,0, Stochastic_period, Dperiod,3, MODE_SMA, 0, MODE_MAIN, P_3) - 50;
double a4 = iStochastic(NULL,0, Stochastic_period, Dperiod, 3, MODE_SMA, 0, MODE_MAIN, P_4) - 50;
Однако, когда вызываю график - то там по прежнему шкала от 0 до 100


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: NoName 27.3.2007, 12:58

Всё правильно. Шкала и не изменится, т.к вызывается стандартный индикатор. А дальше мы уже крутим его значениями как хотим, это никак не может изображаться на графике.

Автор: leonid553 28.3.2007, 8:33

В соотв. с вышеизложенными резонами подготовил пока два варианта советника - со стохастиком (ниж. график баланса) и с инд. WPR( верх. график)
Оптимизировал за период с с 2004г. по дек. 2006.
Далее зарядил тестер с янв. 2007 - и по обоим вариантам получилась прибыль , примерно по 200-500 пипсов в месяц в среднем - за янв. , февраль и март !
Переоптимизировал по всей истории - с 2004 по сей день.
Результаты - на графике.
С инд. WPR:
Сделок 637=+399-238
Чист.. прибыль=+4990
Отн. просадка =-1400
Непр. выигрышей=14
-------проигрышей=11
процент выигр. позиций=63%
-------------------------------------------------
С инд. Стохастик ситуация чуть лучше:
Качество моделирования 89.47%
Начальный депозит 10000.00
Чистая прибыль 8040.52
Общая прибыль 27672.92
Общий убыток -19632.40
Абсолютная просадка 469.84
Относительная просадка 10.11% (1071.60)
Всего сделок 692
Короткие позиции (% выигравших) 349 (65.62%)
Длинные позиции (% выигравших) 343 (65.31%)
Прибыльные сделки (% от всех) 453 (65.46%)
Убыточные сделки (% от всех) 239 (34.54%)
Самая большая прибыльная сделка 555.16
убыточная сделка -86.00
Максимальное количество непрерывных выигрышей (прибыль) 18 (1299.24)
непрерывных проигрышей (убыток) 8 (-664.96)
---------------------------------------------------------------------------------------------------
Далее, видимо, нужно отследить участки графиков, где линии балонсов идут в разные стороны и выяснить - почему так случилось!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: NoName 28.3.2007, 9:41

Цитата
Оптимизировал за период с с 2004г. по дек. 2006.
Далее зарядил тестер с янв. 2007 - и по обоим вариантам получилась прибыль , примерно по 200-500 пипсов в месяц в среднем - за янв. , февраль и март !


Вот это уже хороший результат! И данный советник реальный кандидат для постановки на демо тестированиеsmile.gif

Автор: leonid553 28.3.2007, 10:35

Да, пожалуй...
Но хотелось бы уж сразу многослойку заряжать на демотест!
(Хочется ведь - чтобы было "много и сразу !"...)
Вот ещё одна идея попутно пришла. smile.gif
До сих пор мы использовали индикаторы, в кот. вершины(впадины) соответствуют вершинам(впадинам) на графике цены .
Т.е. экстремальные значения индикаторов - появляются на переломах трендовых движений цены!
Однако, если взять индикатор, где переломы тренда будут отображаться не как макс и мин. значений, а как пересечение линии индикатора своей же средней (в нашем случае - нулевой) линии?
Недостаток таких индикаторов - они перерисовываются сразу по неск. барам в соотв. с движением цены.
Но в нашем случае - в советнике - этот момент может напротив, обернуться достоинством! В силу специфики работы перцептрона!
У нас получаются , как бы, качели - при правильно подобранных весовых коэффициентах мы будем получать сигналы на вход - в сторону наклона качелей! При этом - в самом начале трендового движения!
Вспомнилось, что в "НЕСТАНДАРТНОЙ" тактике TURAMI предлагал использовать такой индикатор - из группы индикаторов Алекса.
Вставил этот индикатор в советник.
Индикатор - в закачке...


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне


Прикрепленные файлы
Прикрепленный файл  105460_ang_Itpm3_v1.rar ( 1.4 килобайт ) Кол-во скачиваний: 462

Автор: leonid553 28.3.2007, 17:27

to NoName:
Что-то никак не подберу параметры с индикатором Алекса.
Закралось подозрение - что неправильно заявил iCustom.
Пож. исправь - если не трудно! -
double a1 = iCustom(NULL,0,"ang_DItpm3-v1",hr,ss,11,0,P_1);
Нашелся и еще один кандидат на тестирование.
Версия с индикатором Фишера.
После обучения на трехлетней истории тест дал с янв. 2007г. +1240 пипсов !
А вот общий итог(с мая 2004г):
--------------------------------------------------------------------------------------------
Начальный депозит 1000.00
Чистая прибыль 6222.84
Общая прибыль 28094.56
Общий убыток -21871.72
Матожидание выигрыша 8.11
Максимальная просадка 1315.32 (19.24%)
Относительная просадка 26.64% (356.44)
Всего сделок 767
Короткие позиции (% выигравших) 377 (58.62%)
Длинные позиции (% выигравших) 390 (60.77%)
Прибыльные сделки (% от всех) 458 (59.71%)
Убыточные сделки (% от всех) 309 (40.29%)
Самая большая прибыльная сделка 369.64
убыточная сделка -72.80
Максимальное количество непрерывных выигрышей (прибыль) 11 (668.52)
непрерывных проигрышей (убыток) 10 (-712.16)
--------------------------------------------------------------------------------------------------------
В закачке - советник, тест с параметрами и индикатор Фишера.
На графиках баласа видно - что , например, в самом начале истории на стохастике и WPR идет небольшой слив, в то время как на Фишере (нижний) в этот период напротив - активно растет профит!
При многослойке это , возможно даст нам любопытный результат!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне


Прикрепленные файлы
Прикрепленный файл  _____________3_.rar ( 40.73 килобайт ) Кол-во скачиваний: 516

Автор: NoName 28.3.2007, 19:59

Цитата
Закралось подозрение - что неправильно заявил iCustom.
Пож. исправь - если не трудно! -
double a1 = iCustom(NULL,0,"ang_DItpm3-v1",hr,ss,11,0,P_1);


По ходу всё правильно.
Попробуй сделать так:
Код

double a1 = iCustom(NULL,0,"ang_DItpm3-v1",hr,ss,11,0,P_1);
Comment (a1);

В левом верхнем углу графика посмотри что он тебе возвращает и сравни со значением в "Окне данных".

Автор: leonid553 28.3.2007, 20:06

Благодарю.

Автор: leonid553 29.3.2007, 10:01

При реализации очередной идеи обнаружилось очередная "непонятность"!
Бывает, что при трендовом рынке советник иногда с "ослиным" упрямством выдает сигналы на вход против тренда - и соответственно получаются лоси.
Стал разбираться с "этим делом".
Зарядил трендовый индикатор (с двухполярной шкалой). Вставил в код:
----------------------------------------------------------------------------
int start()
{
Comment(perceptron());
-------------------------------------------------------------------------
И увидел в лев. верх. углу - что при UP-тренде, когда значения индикатора (даже от 0 до 21 бара) находятся в положительной зоне шкалы - то перцептрон выдает оч. часто отрицательные значения!
Вот график визуального режима - живой пример! (см. ниже)
Но ведь весовые все коэф-ты больше 0 - от 10 до 100!
Так не может быть по определению!
Значение индикатора в текуший момент и предшествующие 7-14-21 были и есть положительные , а перцепртрон вот сейчас отображает "-0.2186" !
Надо покупать, а у нас сигнал в SELL !


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 29.3.2007, 10:17

Причина этого несоответствия , возможно, заложена в строчках кода:
---------------------------------------------------------------------------
double perceptron()
{
double w1 = x1 - 100;
double w2 = x2 - 100;
double w3 = x3 - 100;
double w4 = x4 - 100;
----------------------------------------------------------------------------
А почему, собственно (х-100) ?
Возможно для авторской версии с индикатором АС для этого есть резоны?
А для других индикаторов необходимо подбирать иное число - в зависимости от размерности шкалы? И от исходного принципа работы применяемого индикатора?
На графике - индикаторы АС и инд. BullsPower (в советнике- сейчас)


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 29.3.2007, 11:21

Да, действительно, - для каждого индикатора нужно осмысленно подбирать (х-100)
сделал так в версии советника с инд. BullsPower !
И дело сразу пошло чуть лучше! По крайней мере число профитных сделок в BUY - возросло существенно!
Далее , видимо, следует добавить iBearsPower, иначе затея теряет смысл!
Сделал это.
----------------------------------------------------------------------------------
double perceptron()
{
double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 =iBullsPower(Symbol(), 0,Bulls_period, PRICE_CLOSE, P_1);
double a2 = iBullsPower(Symbol(), 0,Bulls_period, PRICE_CLOSE, P_2);
double a3 = iBearsPower(Symbol(), 0,Bears_period, PRICE_CLOSE, P_3);
double a4 = iBearsPower(Symbol(), 0,Bears_period, PRICE_CLOSE, P_4);
--------------------------------------------------------------------------
double w5 = x5 - 100.0;
double w6 = x6 - 100.0;
double w7 = x7 - 100.0;
double w8 = x8 - 100.0;
double a5 =iBearsPower(Symbol(), 0,Bears_period, PRICE_CLOSE, P_1);
double a6 = iBearsPower(Symbol(), 0,Bears_period, PRICE_CLOSE, P_2);
double a7 = iBearsPower(Symbol(), 0,Bears_period, PRICE_CLOSE, P_3);
double a8 = iBearsPower(Symbol(), 0,Bears_period, PRICE_CLOSE, P_4);
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4 +w5 * a5 + w6 * a6 + w7 * a7 + w8 * a8);
}
--------------------------------------------------------------------------------------

Автор: NoName 29.3.2007, 11:39

Цитата
А почему, собственно (х-100) ?


Честно говоря, мне тоже не понятен этот ход.

Автор: leonid553 29.3.2007, 12:51

Разберемся, надеюсь!
Главная всё-же, проблема - это работа трейлинга "лошадиными дозами" !
Ну ни в какие ворота не лезет!
На КАЖДОЙ профитной сделке мы теряем от 60 до 120 пипсов профита! - в среднем 70-80 пипсов!
Шаг трала завязан на величину стоплосса.
Можно чуть улучшить ситуацию, если перейти на меньший тф - м30 , тогда по ценам закрытия стоплосс будет иногда подтягиваться почаще.
Но при этом начинают "мельчать" показания индикаторов - и значит возрастает фактор случайности. Не выход!
Нужно срочно что-то с этим делать!

Автор: NoName 29.3.2007, 15:28

Ну эту проблему можно решить с помощью трейлинга от Кима. Стандартный выкинуть из кода, а новый что-бы выполнялся на каждом тике. Но вообще мне не нравится вся торговая логика данного советника

Код

if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point))
...
//и только потом торговые операции!

На мой взгляд не правильно это. Чес слово - рекламный трюк wink.gif

Автор: leonid553 29.3.2007, 15:42

А я пытался экспериментировать с (sl * Point) в трале, но успеха не добился!
С тралом Кима нужно и библиотеку прилагать.
А если вот такой вариант? -


Прикрепленные файлы
Прикрепленный файл  _______________________.________.rar ( 4.47 килобайт ) Кол-во скачиваний: 239

Автор: NoName 29.3.2007, 16:26

Цитата
С тралом Кима нужно и библиотеку прилагать.


Не обязательно. В последних версиях своих советников я вставлял код трала прямо в советник, что бы можно было обходиться без внешних файлов и без вызовов функций. Можно кусок кода скопировать прямо оттуда и вставить в самом конце функции Start() обьявив внешние переменные трала и подправить Magic.

Автор: leonid553 29.3.2007, 18:05

Сделал.
extern int ExpertID =1111;
А как быть с :
extern int MagicNumber = 838; ?
Теперь как-то он стал работать непонятно!
хотя и чуть лучше - профитнее.
Но там же в коде есть:
else
{
// trailing stop
if(!OrderModify(OrderTicket(), OrderOpenPrice(),
Bid - sl * Point, 0, 0, Blue))
{
Sleep(30000);
prevtime = Time[1];
-------------------------------------------------------------------------------------------
Это наверное как-то влияет?

Автор: NoName 29.3.2007, 18:31

Конечно влияет!
Пришли советник, попробую поправить.

Автор: leonid553 29.3.2007, 18:54

вот он:


Прикрепленные файлы
Прикрепленный файл  N0_NO_N0_MULTY.rar ( 2.47 килобайт ) Кол-во скачиваний: 239

Автор: leonid553 30.3.2007, 8:26

Поработал пока с версией советника с инд. Фишера .(закачка в пост 30)
По евроиене, h1 (любимая моя пара!)
Результат с сентября 2005 г.

---Символ EURJPY (Euro vs Japanese Yen)
Период 1 Час (H1) 2005.09.12 09:00 - 2007.03.28 16:59
Модель - По ценам открытия (быстрый метод на сформировавшихся барах)
Параметры RangePeriods=11; PriceSmoothing=0.4; IndexSmoothing=0.5;
x1=225; x2=54; x3=9; x4=63; sl=57;
lots=0.1; MagicNumber=833;
P_1=0; P_2=7; P_3=14; P_4=21;

Баров в истории 9492 Смоделировано тиков 18873 Качество моделирования n/a

Начальный депозит 10000.00
Чистая прибыль 4224.36
Общая прибыль 8670.18
Общий убыток -4445.81
Прибыльность 1.95 Матожидание выигрыша 15.88
--------------------------------------------------------------
Абсолютная просадка 27.77
Максимальная просадка 308.67 (2.23%)
Относительная просадка 2.33% (262.68)
---------------------------------------------------------------
Всего сделок 266
Короткие позиции (% выигравших) 145 (57.24%)
Длинные позиции (% выигравших) 121 (76.03%)
Прибыльные сделки (% от всех) 175 (65.79%)
Убыточные сделки (% от всех) 91 (34.21%)
Самая большая прибыльная сделка 371.47
убыточная сделка -58.33
Средняя прибыльная сделка 49.54
убыточная сделка -48.86
Максимальное количество непрерывных выигрышей (прибыль) 13 (461.68)
непрерывных проигрышей (убыток) 6 (-308.67)
Средний непрерывный выигрыш 3 непрерывный проигрыш 2
-------------------------------------------------------
Андрей! Обрати внимание на просадки - оч. приличный результат!
А когда будет сделан "разумный" трал, то результаты будут ещё лучше!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне


Прикрепленные файлы
Прикрепленный файл  StrategyTester_EURJPY_H1.rar ( 12.78 килобайт ) Кол-во скачиваний: 221

Автор: NoName 30.3.2007, 8:50

Да, действительно, просадка около 2% - отличный результат smile.gif

Вот вариант советника с "разумным" тралом:
Прикрепленный файл  N0_NO_N0_MULTY.rar ( 2.17 килобайт ) Кол-во скачиваний: 623


Автор: leonid553 30.3.2007, 9:09

Благодарю! Оч. кстати!
Решил выяснить - почему в строчках кода
double w1 = x1 - 100.0;
заявлено именно (х-100)
Вспомнил, что Решетов рекомендовал применять весовые коэффициэнты не более 200.
Вопрос сразу прояснился!
Получается, что при такой записи - весовые коэф-ты у нас получаются двухполярными!
Также как и шкала индикатора!
В результате имеем своего рода расширение "динамичечкого диапазона" значений индикатора.
Положительные значения при этом увеличиваются при х>100, а отрицательные также по абсолютной величине увеличиваются при х.>100. Т.е. уменьшаются.
При х<100 - динамический диапазон, напротив, сужается!
Тут надо ещё посоображать...

Автор: leonid553 30.3.2007, 19:35

Руки до всего не доходят! - времени не хватает!
Ну ладно...
Оптимизировал по всей доступной истории (с 2005г) EURJPY, H1 по трем версиям - Стохастик, WPR, Фишер.
Репрезентативная выборка показала устойчивый профит за янв-февр.-матр - в среднем 200-500 пипсов ежемесячно.
Периодичность - примерно одна сделка в день.
Пришла пора попробывать на систему на "многослойке"!
По фунту и по евроиене все версии уже "приплясывают" в ожидании!
Поэтому предлагаю сделать значения Х1-Х2-Х3-Х4 - фиксированные для каждого индикатора, т.е.примерно так:
double perceptron_1()
{
double w1 = 225 - 100.0;
double w2 = 54 - 100.0;
double w3 = 9 - 100.0;
double w4 = 63 - 100.0;
.......
Т.к. данная версия нужна будет только для конкретной торговли, а не для оптимизации.
И так по каждому индикатору -
double perceptron_2()
...
double perceptron_3()
...
double perceptron_4()
....

Автор: leonid553 30.3.2007, 20:16

Вроде так(значения х1-х4 еще не подставил):
----------------------------------------------------------------------------------------------
The PERCEPRRON - a perceiving and recognizing function |
//+------------------------------------------------------------------+
double perceptron()
{
//----------------------------------------------------------------------
double f1 = y1 - 100.0;
double f2 = y2 - 100.0;
double f3 = y3 - 100.0;
double f4 = y4 - 100.0;
return (p_1 * f1 + p_2 * f2 + p_3 * f3 + p_4 * f4);
}


// ---------------------------------------------------------------------------
double p_1()
{
double w1 = x1 - 100.0;
double w2 = x2 - 100.0;
double w3 = x3 - 100.0;
double w4 = x4 - 100.0;
double a1 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, P_1);
double a2 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, P_2);
double a3 = iStochastic(Symbol(), 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN,P_3);
double a4 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, P_4);
return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}
//-----------------------------------------------------------------------------
double p_2()
{
double r1 = x1 - 100.0;
double r2 = x2 - 100.0;
double r3 = x3 - 100.0;
double r4 = x4 - 100.0;
double b1 = iWPR (Symbol(), 0,WPR_period, P_1);
double b2 = iWPR(Symbol(), 0,WPR_period, P_2);
double b3 = iWPR(Symbol(), 0, WPR_period, P_3);
double b4 = iWPR(Symbol(), 0,WPR_period, P_4);
return (r1 * b1 + r2 * b2 + r3 * b3 + r4 * b4);
}
//-------------------------------------------------------------------------
double p_3()
{
double v1 = x1 - 100.0;
double v2 = x2 - 100.0;
double v3 = x3 - 100.0;
double v4 = x4 - 100.0;
double c1 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,P_1);
double c2 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,P_2);
double c3 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,P_3);
double c4 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,P_4);
return (v1 * c1 + v2 * c2 + v3 * c3 + v4 * c4);
}
//---------------------------------------------------------------------------
double p_4()
{
double e1 = x1 - 100.0;
double e2 = x2 - 100.0;
double e3 = x3 - 100.0;
double e4 = x4 - 100.0;
double d1 = iAC(Symbol(), 0, P_1);
double d2 = iAC(Symbol(), 0, P_2);
double d3 = iAC(Symbol(), 0, P_3);
double d4 = iAC(Symbol(), 0, P_4);
return (e1 * d1 + e2 * d2 + e3 * d3 + e4 * d4);
}
-------------------------------------------------------------------------------------------------
Не компиллируется! Пишет:
'p_1' - variable not defined
'p_2 ----------------------------
'p_3 ---------------------------
'p_4 ----------------------------

Автор: NoName 30.3.2007, 20:50

Проблема в последнем результирующем слое.
p_1, p_2 ... - это функции, значит после них нужно поставить скобки.
Вот так будет правильно:

Код

double perceptron()
{
//----------------------------------------------------------------------
double f1 = y1 - 100.0;
double f2 = y2 - 100.0;
double f3 = y3 - 100.0;
double f4 = y4 - 100.0;
return (p_1() * f1 + p_2() * f2 + p_3() * f3 + p_4() * f4);
}


Интересная картина получается, однако. Даже, затрудняюсь представить конечный результат. Последний слой будет оценивать результаты работы остальных трёх и принимать окончательное решение. Чувствую что количество входов в рынок при такой архитектуре станет меньше. Дай Бог, что бы отбрасывались только убыточные входы wink.gif

Автор: leonid553 31.3.2007, 8:43

ДА, ДЕЙСТВИТЕЛЬНО!
С р_1() всё получилось



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 31.3.2007, 9:05

Вставил оптимизированные параметры для каждого индикатора.
Теперь следует разобраться с
double f1 = y1 - 100.0;
double f2 = y2 - 100.0;
double f3 = y3 - 100.0;
double f4 = y4 - 100.0;
return (p_1() * f1 + p_2() * f2 + p_3() * f3 + p_4() * f4);
----------------------------------------------------------------------------------
Понятно, что первый тест с лета - не дал приличного результата, хотя общий профит наблюдается!
Предположим, что мы желаем воспользоваться не сразу всеми - а лишь одним индикатором - стохастиком.
Пусть он у нас будет - как от р_1(STOCHASTIC)
тогда , видимо надо задать весовые коэт-ты остальных функций =100 , т.е. =0 в итоге:
double f1 = y1 - 100.0;
double f2 = y2 - 100.0=100-100=0;
double f3 = y3 - 100.0=100-100=0;
double f4 = y4 - 100.0=100-100=0;
тогда будет,

return (p_1() * f1 + p_2() * 0 + p_3() *0+ p_4() *0)=return (p_1() * f1) ;

И если при этом мы зададим f1=1(у1=101), или, иначе говоря:
double f1 = y1 - 100.0= 101-100=1;
то в результате теста должны получить результат , соответствующий индикатору Stochastic ( при этом необходими также задать соответствующийй sl - стоплосс)
Так вот!
Так не получается!

Автор: leonid553 31.3.2007, 9:42

Не могу понять, в чем дело!
сделал так с индикатором WPR.
А вот здесь результат сошелся с тестом версии WPR !

С индикаторм фишера - опять всё не так!

А с индикаторм АС - РЕЗУЛЬТАТ СОШЕЛСЯ ТОЖЕ!

нИЧЕГО НЕ ПОНИМАЮ!

Автор: leonid553 31.3.2007, 10:10

Поскольку тесты с WPR и АС соответствуют здравому смыслу решил пока оставить весовые коэф-ты стохастика и Фишера равными нулю (у1=у3=100).
После чего слегка оптимизировал стоплосс и весовые коэф-ты индикаторов АС и WPR
Любопытно, что число сделок (с 2004г.) возрасло.
По параметру SL результат оптимизируется. А вот по весам - почти не реагирует! (у2=у4=101)
----------------------------------------------------------------------------
Начальный депозит 10000.00
Чистая прибыль 5770.04
Общая прибыль 30794.36
Общий убыток -25024.32
Прибыльность 1.23
Матожидание выигрыша 5.94
Абсолютная просадка 759.76
Относительная просадка 10.80% (1119.00)
Всего сделок 972
Короткие позиции (% выигравших) 469 (60.55%)
Длинные позиции (% выигравших) 503 (61.03%)
Прибыльные сделки (% от всех) 591 (60.80%)
Убыточные сделки (% от всех) 381 (39.20%)
Самая большая
прибыльная сделка 369.76
убыточная сделка -67.56
Максимальное количество
непрерывных выигрышей (прибыль) 13 (813.04)
непрерывных проигрышей (убыток) 10 (-661.08)
-----------------------------------------------------------------------------
При этом отмечу, что прибыль при этом "двухслойном варианте" достигла =+5770,
в то время как по отдельности в однослойках результаты были =+5400 и = +5001 по АС и WPR соответственно !
Сейчас ещё и ММ вставлю ... для моральной поддержки ..! smile.gif


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: NoName 31.3.2007, 10:11

Попробовал тоже так сделать. Стохастик у меня сошелся, правда не с первого разаsmile.gif
Смотри внимательно настройки индикаторов в конкретном советнике, и выставляй такие же в общем советнике. В стохастике, я, например, не обратил внимания на период. Когда поправил - всё сошлось. Весовые коэффициенты, естественно так же должны быть одинаковыми!

Автор: leonid553 31.3.2007, 10:17

ОК! Понял.

Автор: leonid553 31.3.2007, 14:08

Исправил все недоработки. Система заработала так, как и положено!
В часности, обнаружилось, что в коде у стохастика надо добавить - двухполярную шкалу:
double a1 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0)-50;
double a2 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 7)-50;
double a3 = iStochastic(Symbol(), 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN,14)-50;
double a4 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 21)-50;
---------------------------------------------------------------------------------------------------------------
И ещё там (0-7-14-22) надо заменить на (0-7-14-21) - не знаю как так случилось!
Получается, что система работает наилучшим образом тогда, когда индикаторы друг другу "не мешают"!
За исключ. вышеописанного варианта АС+WPR !

Вроде бы нахожу этому обьяснение. mad.gif
Но пока - посмотри на график.
это кусочек работы со стохастиком , у=101(у остальных у=100)
Стох - самая прибыльная версия (+8786$ с мая 2004г) и поэтому предлагаю "плясать" именно от неё!
Здесь видно , что идут подряд две убыточных, лосевых сделки - против тренда, при этом перцептрон меньше нуля.
В то-же время значения инд. Фишера больше нуля и при правильно подобранных весовых коэф-тах, мы , как минимум, запретили бы вход в SELL в такой ситуации.
А в идеале - вошли бы в BUY !


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 31.3.2007, 14:24

Если нам удасться правильно организовать взаимодействие iStochastic и "Fisher_m11", - именно этих двух , то результаты сильно улучшаться! - это ещё мягко сказано!
Причем заметь - со стохастиком частенько так бывает - прёт , как баран, против тренда - и при этом остается самой выгодной версией!

Автор: NoName 31.3.2007, 14:46

Вот идея появилась навскидку. Тоже может дать интересный результат.

Код

double perceptron()
  {
//----------------------------------------------------------------------
   double f1 = y1 - 100.0;
   double f2 = y2 - 100.0;
   double f3 = y3 - 100.0;
   double f4 = y4 - 100.0;

      return (p_1() * f1 + p_2() * f2 + p_3() * f3 + p_4() * f4);
  }
  
  // ---------------------------------------------------------------------------
  double p_1()
  {
   double w1 = z_1 - 100.0;
   double w2 = z_2 - 100.0;
   double w3 = z_3 - 100.0;
   double w4 = z_4 - 100.0;
   double a1 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
   double a2 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 7);
   double a3 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 14);
   double a4 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 21);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
     }
   //-----------------------------------------------------------------------------
   double p_2()
   {
   double w1 = z_1 - 100.0;
   double w2 = z_2 - 100.0;
   double w3 = z_3 - 100.0;
   double w4 = z_4 - 100.0;
   double a1 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
   double a2 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 6);
   double a3 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 12);
   double a4 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 18);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
     }  
   //-------------------------------------------------------------------------
   double p_3()
    {
   double w1 = z_1 - 100.0;
   double w2 = z_2 - 100.0;
   double w3 = z_3 - 100.0;
   double w4 = z_4 - 100.0;
   double a1 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
   double a2 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 5);
   double a3 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 10);
   double a4 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 15);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
       }
   //---------------------------------------------------------------------------
    double p_4()
   {
   double w1 = z_1 - 100.0;
   double w2 = z_2 - 100.0;
   double w3 = z_3 - 100.0;
   double w4 = z_4 - 100.0;
   double a1 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
   double a2 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 4);
   double a3 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 8);
   double a4 = iStochastic(Symbol(), 0,Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 12);
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
      }
    
//+--------------------------------------------------------------------------------------+

Стохастик привёл только как пример, можно использовать любой другой индикатор. Фишка в выборе "контрольных точек".
Идей много, времени мало sad.gif

Автор: leonid553 31.3.2007, 15:54

Цитата(NoName @ 31.3.2007, 14:46) *

Вот идея появилась навскидку. Тоже может дать интересный результат.

Идей много, времени мало sad.gif

Похоже, именно поэтому ты забыл приложить оптимизированные весовые для р_2 - р_4
smile.gif
(по фунту, напр.)

Автор: leonid553 31.3.2007, 18:30

но даже и в этом случае необходим фильтр - для предотвращения сделок против тренда!
Вот можно попробовать , например , осциллятор Эллиотта или индикатор OsMA.
Причем даже не нужно слишком оптимизировать весовые. Просто взять значения этих индикаторов - плюс и минус и применить к условиям входа.


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 1.4.2007, 8:17

Цитата(NoName @ 31.3.2007, 14:46) *

Вот идея появилась навскидку. Тоже может дать интересный результат.
Стохастик привёл только как пример, можно использовать любой другой индикатор. Фишка в выборе "контрольных точек".
Идей много, времени мало sad.gif

Сделал так. Со стохастиком. Максимум того, что удалось выкрутить - +2500 за историю с 2004г.

Возможно , можно сделать и больше, если оптимизировать отдельно веса каждого набора контрольных точек? Но не намного, думаю, больше.
Да и сил уже не хватило!


Цитата(NoName @ 29.3.2007, 15:28) *


Код

if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point))
...
//и только потом торговые операции!

На мой взгляд не правильно это. Чес слово - рекламный трюк wink.gif

Обьясни нам популярно - почему "рекламный трюк"?
Давай придумаем иную логику работы - по входу и дальнейшему по сопровожнению!
как ты видишь иную логику?

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

Автор: NoName 1.4.2007, 9:59

Цитата
Обьясни нам популярно - почему "рекламный трюк"?


На мой взгляд, это делается для обеспечения красивой кривой баланса. Это я говорю об этой строке
Код

if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point))

Мы закрываемся только тогда когда у нас есть прибыль. Отсюда и хорошее отношение приб./убыт. сделок. Конечно, такой манёвр подразумевает хоть сколько нибудь прибыльную стратегию, иначе постоянно срабатывающий стоплосс даст совсем иную картину.
Вот если прикинуть, чисто теоретически, что мы вошли по сигналу в Бай, и тут же сигнал сменился на противоположный (в данном советнике это совсем не редкость). Правильно ли ждать получения профита (совсем не маленького) для того что бы перевернуться??
Думаю что совсем не правильно!
Так же в этой строке кроется ещё один подводный камень, результат дейтвия которого ты ощутил и сам, когда наблюдал за советником на демо. Представим, что я запустил советник и вошёл в рынок как я описал выше, а ты запустил его на один бар позже меня, когда сигнал был такой как нужно, в итоге я буду ждать прибыли наблюдая как цена уходит в противоположном направлении, а ты будешь в это же время её получать, и всё только потому что тебе ПОВЕЗЛО немного больше чем мне. Подобный эффект "везения", на мой взгляд, нужно исключить.

Что касается иной логики работы, я сейчас сам в поиске таковой. Я уже немного разобрался с NeuroShell для подключения сетей к МТ и сейчас дело стало именно на организации торговли. Пока мне не удалось получить результатов достойных внимания.

Автор: leonid553 1.4.2007, 10:17

Меня вот крайне удручают частые ситуации показанные на графике ниже.
Текущая прибыль (зелёная линия) постоянно преобладает над текущим балансом. И каждый раз при этом все прибыльные сделки, тем не менее, закрываются по подтянувшемуся стоплоссу!
Как с эти бороться?
График - ниже - это версия советника с "разумным тралом". Но и она не оказалась панацеей.
С большим трудом оптимизировал по фунту н1.
По истории с 2004г
---------------------------------------------------------------------------------
Начальный депозит 10000.00
Чистая прибыль 4625.52
Общая прибыль 22424.32
Общий убыток -17798.80
Относительная просадка 10.68% (1078.04)
Всего сделок 528
Короткие позиции (% выигравших) 295 (48.47%)
Длинные позиции (% выигравших) 233 (47.21%)
Прибыльные сделки (% от всех) 253 (47.92%)
Убыточные сделки (% от всех) 275 (52.08%)
Самая большая
прибыльная сделка 561.92
убыточная сделка -66.84
Максимальное количество
непрерывных выигрышей (прибыль) 8 (1149.84)
непрерывных проигрышей (убыток) 9 (-595.32)
--------------------------------------------------------------------------------------------
Может вот здесь что дельное найдется? -
http://community.finlist.org/showthread.php?t=744


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 1.4.2007, 18:49

Kola:
"А чего тут всего четыре входа у перцептрона? Больше не пробовали?
Я делал помощнее перцептрон для анализа цен на много входов трехслойный обучающийся по алгоритму стохастическо-градиентного спуска, только результаты мне не очень надежными показались. Зато тут для анализа используется значение акселератора, может быть так и надо? "

Reshetov:
"Пробовали. Могу даже сообщить, что чем больше входов, тем точнее описание паттерна (впрочем, слишком детальное тоже не к чему), а следовательно результат будет более приближенным к реальности. А вот при попытках увеличения слоев, все наоборот, вроде бы прибыли по тестам растут, но вне выборки оказываются значительно ниже. Сначала было не совсем понятно, почему так происходит, а потом удалось выяснить. Ведь чем больше слоев, тем меньше паттернов приходится на каждый из них, а следовательно почти тоже самое, что и подгонка под оптимизацию с малым количеством сделок."


http://forum.mql4.com/ru/4973/page2

Kola:
А Вы в многослойном какую активационную функцию использовали?

Reshetov:
Для переключения между слоями лучше всего подходит проверка значений основной линии ADX

Автор: leonid553 2.4.2007, 10:35

to NoName:
Из любопытства вставил ММ в версию стохастика по образцу, который ты мне недавно любезно предоставил.
Выбрал любимую свою пару - EURJPY, т.к. график баланса идет вверх здесь наиболее последовательно с минимальной просадкой.
все тесты с сент. 2005г
------------------------------------------------------------------------
Без ММ -

Начальный депозит 1000
Чистая прибыль + 4053
Общая прибыль + 8291
Общий убыток -4237
Максимальная просадка 374
Всего сделок 222
-------------------------------------------------------------------------------
ММ - расчет от размера депозита

Начальный депозит 1000
Чистая прибыль +37181
Общая прибыль +86091
Общий убыток -48909
Максимальная просадка 7356 (16.15%)
--------------------------------------------------------------------------------
ММ - фр/пропорциональный метод

Начальный депозит 1000
Чистая прибыль +12874
Общая прибыль +26946
Общий убыток -14072
Максимальная просадка 1327.(19.52%)
Относительная просадка 26.15% (749.75)
---------------------------------------------------------------------------------
ММ - фр/фиксированный метод

Начальный депозит 1000
Чистая прибыль +186823
Общая прибыль +513424
Общий убыток -326600
Максимальная просадка 81909 (30.37%)
Относительная просадка 54.41% (3190.26)
-------------------------------------------------------------------------------------
Специально взял нач. депо =1000, иначе там уже за 2 млн. прибыль зашкаливает (если депо=10000)
В реале не больно-то поторгуешь с такой просадкой! - см. ниже график баланса от фр/фр метода!
Скрупулезно просмотрел историю сделок. Обнаружилось оч. любопытная закономерность.
По этой паре. ВОТ какая:
Оч. часто убыточные сделки группируюются по две подряд!
И лишь дважды случилось так, что сразу три подряд сделки оказались убыточными!
Что это нам дает?
Здесь, в алгоритме работы эксперта, можно предусмотреть (как вариант) включение режима ММ только после двух подряд убыточных сделок!
При этом общий итог у нас получается зачастую ничуть не меньше, чем с постоянно включенным ММ! tongue.gif
Где-то видел кусочек кода - с похожим условием - вроде на Ониксе - пойду гляну... smile.gif


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 3.4.2007, 12:48

Цитата(NoName @ 1.4.2007, 9:59) *

Цитата
Обьясни нам популярно - почему "рекламный трюк"?


На мой взгляд, это делается для обеспечения красивой кривой баланса. Это я говорю об этой строке
Код

if(Bid > (OrderStopLoss() + (sl * 2  + spread) * Point))

Мы закрываемся только тогда когда у нас есть прибыль. Отсюда и хорошее отношение приб./убыт. сделок. Конечно, такой манёвр подразумевает хоть сколько нибудь прибыльную стратегию, иначе постоянно срабатывающий стоплосс даст совсем иную картину.
Вот если прикинуть, чисто теоретически, что мы вошли по сигналу в Бай, и тут же сигнал сменился на противоположный (в данном советнике это совсем не редкость). Правильно ли ждать получения профита (совсем не маленького) для того что бы перевернуться??
Думаю что совсем не правильно!


Возможно это не совсем правильно.
Но бесконечные перевороты тогда могут присутствовать почти на каждой новой свече! Мы только на одних спредах разоримся!
Между тем,
"Мы закрываемся, т.е. переворачиваемся - только тогда когда у нас есть прибыль"
Те мизерные сделки - профит , которых = спреду, судя по строке кода - в отчете входят в число всех профитных сделок.
Но при этом, не следует забывать - что в этих сделках с мизерным профитом, - текущий профит чуть ранее - превышал размер стоплосса!
- иначе бы стоплосс не подтянулся!
Потом цена развернулась, пошла против нас и этот подтянувшийся стоплосс сработал!
ВОТ вопрос - как защитить этот имевшийся ранее профит?
Закрывать каждую сделку по достижении
OrderStopLoss() + (sl * 2 + spread) * Point)) ?
И тут же по новой входить - в соотв. с текущим сигналом перцептрона?
Рискуем пропустить тренд. sad.gif
По большому счету - сигналы-то , прямо скажем, - почти случайные!

Автор: NoName 3.4.2007, 19:35

Ну какой же это мизер?? Советник будет курить пока размер профита не превысит размер стоплоса.

Вот мне недавно попалась одна дипломная работа по теме нейросетей. Не помню откуда скачал. Всем кто интересуется данной темой очень рекомендую ознакомиться!
Прикрепленный файл  diplom_.rar ( 303.39 килобайт ) Кол-во скачиваний: 8076

Автор: leonid553 4.4.2007, 9:14

Да, действительно.
И сразу обнаружл то, что не сделано в результирующем перцептроне в нашем случае


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 14.4.2007, 10:36

Цитата(NoName @ 3.4.2007, 19:35) *

Ну какой же это мизер?? Советник будет курить пока размер профита не превысит размер стоплоса.



так пусть курят лучше два варианта советника - один из которых работает только в режиме ONLY LONG,а другой - ONLY SHORT
Но это в перспективе...
В продлжение темы отмечу - что никак не получается добится нужных результатов в многослойном варианте!
Привел шкалу индикаторов к "общему знаменателю"!
Оптимизировал каждую версию с одинаковым значением стоплосса!
По отдельности версии работают оч. удовлетворительно - уже вторую неделю приятно посмотреть на счет , "трудятся" эти эксперты по различным парам! см. закачку!!!!!!!!! smile.gif
Но суммирующий вариант - не хочет давать приемливый результат!
Возможно здесь нужно неким образом синхронизировать работу? Но это уже предусмотрено - работа по ценам открытия!
Ещё есть мысль - в суммирующем варианте - вместо общего перцептрона использовать функции "И" - "ИЛИ" - присвоив выходным значениям слагаемых перцептронов индексы =1/=0 , в зависимости от того полож. или отрицательные выходные значения...


Прикрепленные файлы
Прикрепленный файл  Statement_________.rar ( 2.2 килобайт ) Кол-во скачиваний: 193

Автор: NoName 14.4.2007, 12:02

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

Прикрепленное изображение в новом окне

Прикрепленный файл  PerceptronIndicator.rar ( 753 байт ) Кол-во скачиваний: 367


Что бы отображать значения перцептрона с другим индикатором, нужно подставить значения в этом месте:
Код

double a1 = iStochastic(NULL, 0, iPeriod, 3, 3, MODE_SMA, 0, MODE_MAIN, i)    -50;
double a2 = iStochastic(NULL, 0, iPeriod, 3, 3, MODE_SMA, 0, MODE_MAIN, i+7)  -50;
double a3 = iStochastic(NULL, 0, iPeriod, 3, 3, MODE_SMA, 0, MODE_MAIN, i+14) -50;
double a4 = iStochastic(NULL, 0, iPeriod, 3, 3, MODE_SMA, 0, MODE_MAIN, i+21) -50;

Автор: leonid553 14.4.2007, 17:05

Благодарю!
Поставил. Оч. полезная штуковина!
Теперь наглядно видно работу перцептрона на истории!
И Веса теперь изначально можно подбирать не от фонаря - а осмысленно.
iPeriod - в коде - также нужно подставлять в др. индикаторы...

Только он у меня почему-то не работает - так как нужно!
Показывает только отрицательные значения!
А вместо положительных - сплошная штриховка!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: NoName 14.4.2007, 18:08

Дело оказалось в билде MT! На 203-м работает нормально, а на 202 такая же картинка. Если 202 на Windows2000 - вообще падает терминал. Почему так - не пойму, вроде бы простенький индикатор, да и в последнем билде особых изменений нет.

Автор: leonid553 15.4.2007, 8:06

Благодарю! Так и случилось! Сейчас поставил билд 203 и всё стало ОК!

Автор: NoName 15.4.2007, 13:01

Цитата
так пусть курят лучше два варианта советника - один из которых работает только в режиме ONLY LONG,а другой - ONLY SHORT
Но это в перспективе...


В архиве два советника: один открывает только длинные позиции, другой только короткие.
Код пререписал по своему, но принцип работы остался тот же. Только трал заменил тралом от Кима.
Magic формируется автоматически в зависимости от инструмента и ТФ.

Прикрепленный файл  LongShort.rar ( 4.12 килобайт ) Кол-во скачиваний: 424

Автор: leonid553 15.4.2007, 17:20

Поставил.
Сходу удалось получить +2550 за три года.
в лонге.
Зарядил на оптимизацию.
Жду ...

Автор: NoName 15.4.2007, 18:38

Провёл оптимизацию советника LongOnly по фунту на H1 по данным Лайтфорекса. Оптимизация провоилась за 2006. Период с января 2007 по сегодня оставил как экзаменационный.
Отчёты тестов приведены ниже.

Прикрепленное изображение в новом окне

Прикрепленный файл  OnlyLong_Opt_2006.rar ( 42.76 килобайт ) Кол-во скачиваний: 297

Прикрепленное изображение в новом окне

Прикрепленный файл  OnlyLong_Exam_2007.rar ( 16.6 килобайт ) Кол-во скачиваний: 274



P.S. Выше была проверка на выживаемостьwink.gif Вот теперь думаю, для постановки на демо оптимизировать его по сегодня или всё же оставить недельки 2-4 для проверки ???

Автор: leonid553 16.4.2007, 11:53

Слушай!
Что-то мне "тревожно" стало за эти версии!
Сделок должно быть поболе - чем мы "имеем" !
По шорту - зарядил фунтик - так он мне за полтора года выдал всего три сделки ! (ладно - хоть профитных)
В коде мне пока трудновато разобраться!
Дай пож. сюда кусочек - где прописаны условия на вход и прокомментируй, пож. детально!

Автор: NoName 16.4.2007, 12:10

На счёт шорта и меня стали сомнения терзать. Сейчас ещё раз проверю не допустил ли ошибки, если не найду то выложу с комментариями

Автор: leonid553 16.4.2007, 12:18

В любом случ. надо код - для ясности

Автор: NoName 16.4.2007, 14:33

Цитата
Слушай!
Что-то мне "тревожно" стало за эти версии!
Сделок должно быть поболе - чем мы "имеем" !
По шорту - зарядил фунтик - так он мне за полтора года выдал всего три сделки ! (ладно - хоть профитных)
В коде мне пока трудновато разобраться!


Действительно, допустил ошибку. В советнике использовался обычный стохастик вместо двухполярного. Но дело в другом. Когда всё исправил - вообще не могу получить положительного результата! sad.gif

Автор: NoName 16.4.2007, 15:03

Приведу, пожалуй, основной код: ShortOnly

Код

#property copyright "NoName"
#property link      "http://www.tradersforum.net.ru/forum/"
//---- input parameters---------
extern double    x1=88;
extern double    x2=123;
extern double    x3=20;
extern double    x4=107;
//-----------
extern int       iPeriod=10;
extern int       StopLoss=60;
//--------
extern string _Parameters_Trailing = "----- Параметры Трейлинга -----";
extern bool UseTrailing    = false;   // Использовать трейлинг
extern bool ProfitTrailing = false;   // Включать трейлинг когда получен профит
extern int  TrailingStop   = 30;      // Фиксированный размер трала
extern int  TrailingStep   = 2;       // Шаг трейлинга
//========================================================================
//-- Подключаемые модули --
#include  <b-Lots.mqh>
//========================================================================
int      Prefix=1; //для Sell
//------------------------------
color    clModifyBuy  = Green;
color    clModifySell = Blue;
//------------------------------
int  Magic;
int  ExpertBars;
int  Slippage=2;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
Magic=GetMagic()*10+Prefix;
ExpertBars=Bars;                       //при запуске советника записываем кол-во баров в терминале
//----                                         //в переменную ExpertBars
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }
  
//+------------------------------------------------------------------+
double perceptron()
  {
   double w1 = x1 - 100;
   double w2 = x2 - 100;
   double w3 = x3 - 100;
   double w4 = x4 - 100;
   double a1 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 0)-50;
   double a2 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 7)-50;
   double a3 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 14)-50;
   double a4 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 21)-50;
   return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//---------------------                        //| здесь проверяется появление нового бара.
bool isNewBar=false;                      //| когда появится новый бар значения ExpertBars
if (ExpertBars !=Bars)                     //| и Bars не совпадут.  isNewBar станет true
  { ExpertBars=Bars;      
    isNewBar=true; }
//---------------------
if (isNewBar) {                    //если  появился новый бар
bool isExpertSellOrder=false;
int spread= MarketInfo(Symbol(),MODE_SPREAD);    
int _OrdersTotal=OrdersTotal();
for (int i=0; i<_OrdersTotal; i++) {                                       //пробегаем по открытым ордерам
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {        //если ордер успешно выбран
      if (OrderSymbol()==Symbol()) {                                     //если ордер на данном инструменте
        if (OrderMagicNumber()==Magic) {                               //если ордер принадлежит данному эксперту
          if (OrderType()==OP_SELL) {                                     //если ордер на продажу
            isExpertSellOrder=true;                                            // говорим что ордер эксперта присутсвует
            if (Ask < (OrderStopLoss() - (StopLoss * 2  + spread)* Point)) { //если мы имеем прибыль превышающую величину 2-х стоплоссов от уровня текущего стоплосса
                if (perceptron() > 0) {                               //если перцептрон больше 0
                   ClosePosition(1); // закрываем Sell         //закрываем позицию
                  
                 }
               }  
             }    
           }
         }
       }
     }
if (!isExpertSellOrder) {                  // если ордера эксперта не нашлись
  if (perceptron() < 0) Sell();          //  если перцептрон меньше 0 - продаём
}
}

// здесь трал по алгоритму Игоря Кима

return(0);
  }



P.S. Советники заменил на подправленные. Перекачайте.

Автор: leonid553 16.4.2007, 16:01

Тоже исправил шкалу.
Но у меня ещё до исправления - и после исправления
при компиляции есть:
0 error(s), 1 warning(s)
Function "Sell" is not referenced and will be removed from exp-file
в обеих версиях - одно и тож

Автор: NoName 16.4.2007, 16:06

это не ошибка а предупреждение о том что функция Sell не используется и она не будет включена в exp-файл. На работе это не сказывается. В тех советниках, что выложил выше, лишние функции убрал.

Автор: leonid553 16.4.2007, 18:14

никак не могу добиться в шорте профитных результатов!
Тестирую с 2004г.
Или стохастик здесь принципиально не годится для этого режима?
Или против тренда молотит.
Или в конце треда - в лучшем случае вход!

Автор: NoName 16.4.2007, 19:31

С двухполярным стохастиком результат однозначно хуже. Так Long так и Short.

Автор: leonid553 22.4.2007, 8:29

Андрей!
По вопросу защиты текущей прибыли в момент подтягивания стоплосса.
Назовем идею - ОТСЕЧКОЙ
Я всё-таки думаю, - что проще будет сделать так:
Самая Первая сделка советника - пусть идет так, как заложено в алгоритме советника.
А уже далее пусть советник начинает реализовывать ОТСЕЧКУ - причем не двумя сделками - как мы вчера планировали, - а лотами !
Вот смотри :
----------------------------------------------------------------------------------------------------------------
/* long position is opened -длинная позиция открылась
далее проверяется условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ
БОЛЬШЕ РАЗМЕРА СТОПЛОССА И ЗНАЧЕНИЕ ПЕРЦЕПТРОНА <0 - ПЕРЕВОРАЧИВАЕМСЯ */
// check profit
if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point))
{
if(perceptron() < 0)
{
// reverse
ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3,
Ask + sl * Point, 0, "F1", MagicNumber,
0, Red);
------------------------------------------------------------------------------------------------------------------
Обрати внимание, - что переворот здесь реализуется удвоенным лотом (lots * 2)- в результате чего -текущая длинная позиция закрывается а встречная короткая открывается!
Так зачем нам вводить лишнюю сделку, - когда мы можем реализовать ОТСЕЧКУ здесь же, - если заменим (lots * 2) на (lots * 3) !

Далее вводим дополнительное условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ БОЛЬШЕ РАЗМЕРА подтянувшегося СТОПЛОССА - закрываем один лот из текущих двух!
Но лучше конечно закрыть его ,по тейку. Причем предусмотреть ТП во внешних параметрах! - Для экспериментов по оптимизации.
Так возможно будет проще...
Ещё есть мысль использовать трехступеньчатую систему выходов Виктора, - описанную и реализованную в советнике Игоря Кима, - но это в перспективе....

Автор: leonid553 22.4.2007, 9:13

Ещё вот сейчас посмотрел. Кроме стохастика для реализации Отсечки оч. хор. подходит версия с индикаторм Фишера. Версия в открытом доступе есть на стр. 3 в этой ветке - с результатами теста.

Символ GBPUSD (Great Britan vs US Dollar)
Период 1 Час (H1) 2004.06.16 - 2007.03.27
Начальный капитал 1000.00
Чистая прибыль 6222.84
Максимальная просадка 1315.32 (19.24%)
Относительная просадка 26.64% (356.44)
Всего сделок 767
Прибыльные сделки (% от всех) 458 (59.71%)
Убыточные сделки (% от всех) 309 (40.29%

Это при стоплосс=67.
458-309=149 smile.gif

Автор: leonid553 23.4.2007, 13:24

Поставил версию с Отсечкой.
Но работает некорректно. С трудом вникаю в код.
Позиция в Селл открывается - но реагирует только на свой собственный стоплосс. И больше ни на что!
Профит игнорирует!
Навскидку, - вот такое обьяснение:
Видимо, надо ставить уровень отсечки не на линии
(sl * 2 + spread)
а чуть ближе - на пару пипсов хотя-бы!
Тогда программа не будет путаться, - одновременно вычисляя и закрытие лота , и условия на подтяжку стлосса, или переворот!

Автор: leonid553 24.4.2007, 10:48

to NoName:
Прогнал исправленную версию с отсечкой.
Работает удовлетворительно, но прибыль показалась мне меньше расчетной, - предполагаемой!
Стал разбираться.
Так и есть! Число сделок не соответствует пропорции с контрольной версией! - без отсечки.
Вот, например, евроиена:
------дата----поз---№---лот--цена 0ткр--ст/лосс--прибыль
09.27 14:00 buy ---11-- 0.10-- 136.05-- 135.34
.09.27 14:00 buy ---12 --0.10-- 136.05-- 135.34
.10.06 02:00 close --11 -0.10--- 137.05 --135.34 +93.39
.10.06 03:00 modify-12- 0.10--- 136.05--- 136.22
.10.06 17:00 sell---- 13-- 0.20--- 137.71--- 138.42
.10.06 17:00 sell ----14-- 0.10--- 137.71--- 138.42
.10.06 17:00 close by-13--0.10---136.05--138.42--- +149.01

В 14-00 открыты два ордера в бай №12 и №11
Затем 10.06 в 2-00 ордер №11 закрылся +93.39
Но он должен был закрыться раньше!!!!!
Ведь стлосс здесь по этой паре = 67 пипсов
И значит примерно с таким же профитом ордер №11 и должен был закрыться - но никак не +93 !!!
Далее смотрим!
10.06 в 17-00 фиксация прибыли оставшегося ордера (+149) - переворотом поз 13-14-13
Вот где нестыковка!
По первому ордеру - стоплосс работает вроде бы как надо, - а по второму - отсечка запаздывает!

Символ EURJPY (Euro vs Japanese Yen)
Период 1 Час (H1) 2005.09.09 05:00 - 2007.04.20 22:59
Параметры Stochastic_period=8; slowing=3; x1=175; x2=89; x3=17; x4=68; sl=67; lots=0.1; MagicNumber=888;

Начальный депозит 1000.00
Чистая прибыль 4195.17
Матожидание выигрыша 9.78
Абсолютная просадка 806.04
Всего сделок 429
Короткие позиции (% выигравших) 222 (52.70%)
Длинные позиции (% выигравших) 207 (64.73%)
Прибыльные сделки (% от всех) 251 (58.51%)
Убыточные сделки (% от всех) 178 (41.4


Т.е. шаг трала в коде для отсечки заложен с ощибкой!
Пож. напиши в коде комментарии, - по всем строкам ,- где ты вносил дополнения и изменения. Иначе трудновато вникать...

Автор: NoName 24.4.2007, 14:44

Цитата
В 14-00 открыты два ордера в бай №12 и №11
Затем 10.06 в 2-00 ордер №11 закрылся +93.39
Но он должен был закрыться раньше!!!!!
Ведь стлосс здесь по этой паре = 67 пипсов
И значит примерно с таким же профитом ордер №11 и должен был закрыться - но никак не +93 !!!


Это объясняется просто. В советнике все действия проводятся при появления бара. На момент появления бара прибыль у нас может быть больше заданного значения стоп-лосса. Это логика заложенная Решетовым - я тут от себя ничего не добавлял.


Автор: leonid553 24.4.2007, 15:20

Понял!
но пока сделана часть работы! Значительное (по визуалу) число профитных сделок закрываются "по мизеру" - потому - что цена превышает уровень отсечки - но потом отступает и закрытие бара происходит ниже! и соотв. подтяжки не происходит.
Тогда мы теряем эту часть профитных сделок и более того - часть из них становятся убыточными!
В перспективе - также - установка трейлинга на этот второй ордер причем так чтобы не потерять уже имеющийся профит.

Автор: leonid553 25.4.2007, 12:21

Никак не пойму, почему не соблюдается число сделок в пропорции контрольной версии и версии с отсечкой при равных параметрах.
Видимо, тестер чуть иначе реагирует на изменения в коде.
По Фую, например, вообще прибыль не увеличивается с отсечкой!
Сделал так:
Прогнал контрольную версию -

-------------------------------------------------------------------------------
Символ GBPJPY (Great Britan vs Japanese Yen)
Период 1 Час (H1) 2005.09.26 08:00 - 2007.04.24 11:59

Начальный депозит 1000
Чистая прибыль 7446
Общая прибыль 16647
Общий убыток -9201
Относительная просадка 38.11% (1327.63)

Всего сделок 234
Прибыльные сделки (% от всех) 126 (53.85%)
Убыточные сделки (% от всех) 108 (46.15%)
Средняя прибыльная сделка 132.13 убыточная сделка -85.20
-----------------------------------------------------------------------------
Поскольку число прибыльных сделок здесь не сильно отличается от убыточных - то версию с отсечкой решил просто оптимизировать!
Вот результат:
------------------------------------------------------------------------------------------------------
Начальный депозит 1000
Чистая прибыль 12068
Общая прибыль 29177.
Общий убыток -17109

Абсолютная просадка 392.70
Максимальная просадка 2212.53
Относительная просадка 720.24

Всего сделок 536
Короткие позиции (% выигравших) 293 (56.31%)
Длинные позиции (% выигравших) 243 (71.19%)
Прибыльные сделки (% от всех) 338 (63.06%)
Убыточные сделки (% от всех) 198 (36.94%)
Средняя прибыльная сделка 86.32 убыточная сделка -86.41
-----------------------------------------------------------------------------------------
Пожалуй это лучший пока результат из всех в этой ветке!
Вот только просядка великовата пока!
Параметры по Фую - Stochastic_period=10; slowing=2; x1=115; x2=147; x3=101; x4=43; sl=96; lots=0.1;

Автор: NoName 25.4.2007, 15:52

Вчера ночью игрался с разными версиями и заметил вот что.
Я заменил перекрытие ордеров простым закрытием и открытием в другом направлении. Затем сравнил тесты на одном и том же периоде этой и предыдущей версии и вот что обнаружилось: в версии где использовалось перекрытие сделок было больше почти в двое больше чем в версии где использовалось закрытие и открытие. А прибыль при этом совпадала до цента! Видимо тестер по разному интерпритирует сделки, для которых используется CloseBy, а отсюда и не совпадение с расчётами (приб.-убыт.).


Автор: NoName 26.4.2007, 7:54

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

Прикрепленное изображение в новом окне

На периоде выделенном желтым цветом события развиваются абсолютно одинаково, позиции открываются и закрываются по стопу либо модифицируются (трейлинг). Но как только в действие вступает перекрытие позиций – появляются отличия. В этот момент в первой версии происходит открытие на одну позицию больше чем во второй версии, но самое интересное то, что конечный результат от этого не меняется. Прибыль в обоих версиях совпадает до цента. Но в первом случае было совершено 8 сделок, а во втором 6, от этого и совершенно разная статистика.

Отчёты первой и второй версии соответственно
Прикрепленное изображение в новом окне
Прикрепленное изображение в новом окне

Автор: leonid553 27.4.2007, 6:07

Посмотрел. Вник.
Ну и ладно! С "этим делом", стало быть, разобрались!
-------------------------------------------------------------------------------
Похоже с вводом "отсечки" мы уже "выжали" из алгоритма логики работы - всё что можно!
Впрочем не совсем так. Вернулся к версии с "разумным" тралом. Вставил в неё стохастик. Удалось оптимизировать на трехлетней истории по фунту до +7500.!
А просадка – «ты будешь смеяться» - всего -770 !
Посмотрю ещё...

Следующий наш шаг - "нещадная" борьба с просадкой!
Возможно, тут будет полезной именно та твоя версия, - где позиции не переворачиваются, а закрываются, и опять открываются.
Решения вижу пока такие:
Локирование убыточных позиций, например, начиная с заданного числа пунктов.
Например, цена после старта пошла против нас ,- и, начиная с некоторого убытка
(пусть=-25), должна включится локирующая - противоположная позиция со стоплоссом на уровне старта первой позиции и тейкпрофитом (а лучше тралом!) - на уровне стоплосса первой стартовой позиции.
Много прибыли здесь не прибавиться, - но зато навскидку, - возможно , существенно уменьшится просадка ,- да и торговать при этом намного спокойнее будет.
Можно даже и пару другую локирующую зарядить – против фунта открыть франк, но это – на любителя…
Кстати, - сделал пипсовочную версию на стохастике, - настроил на фунт.
Стоит сейчас на демо, - глянь(у Dimi – он там, правда , иногда вручную пошаливает!).
Оч. любопытно наблюдать, - как основная, контрольная версия почти все время локируется версией пипсовочной! Причем польза здесь получается обоюдной!
Смех разбирает ,- когда смотрю, - как пипсовочная версия ,- словно собачонка, крутится в противовес основной!

Автор: leonid553 27.4.2007, 16:30

Ещё вот соображения:
Прогнал первую версию со стохастиком по фунту по истории с июня 2004.
Прибыль +9325
всего сделок 498
прибыльных - 266
убыточных - 232
Распечатал, потом подсчитал с карандашиком в руке.
Сделки распределились следующим образом:
С убыточными всё ясно!
Прибыльных - 266 , из них -
43 сделки закрылись по "мизеру" (но с этим мы придумали уже как бороться! - в версии с отсечкой)
166 сделок закрылись на уровне отсечки (+80 в среднем)
57 сделок закрылись на следующих уровнях (от +150 до +554)
Т.е. что же получается?
В этих 166-и сделках цена превысила уровень отсечки на 80 пунктов?
Иначе стоплосс не подтянулся бы на этот уровень!
Оч. туго с этого момента мысль идет...
Вот в чем дело!
Часть из этих 166 сделок (в зависимости от перцептрона) закрылась переворотом (+80) на уровне отсечки if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point)), -
а часть пошла дальше, и достигла следующего уровня (ещё +80), - иначе стоплосс бы не подтянулся на уровень отсечки!
(Не путать эти 166 сделок с 43 по "мизеру" и 57 другими!)
После чего цена развернулась и спустилась опять на уровень отсечки, где и сработал стоплосс!
А вот как узнать - сколько сделок из этих 166 закрылись переворотом а сколько по стоплоссу?
От ответа на этот вопрос многое зависит.

Автор: NoName 27.4.2007, 18:36

Так сходу не врублюсь, нужно малость обдумать.

Цитата
А вот как узнать - сколько сделок из этих 166 закрылись переворотом а сколько по стоплоссу?
От ответа на этот вопрос многое зависит.


Это сделать возможно. Нужно в советник ввести счётчики на все интересующие варианты событий, а за тем выводить результат в журнал либо в отдельный лог-файл.
Прийдется повозится, конечно, но реализовать возможно.

Автор: leonid553 27.4.2007, 18:52

пожалуй, не стоит пока возиться!
По "закону подлости", - большинство сделок закроется именно по стлоссу!
Но это именно то, что надо в данном случ!

Автор: leonid553 28.4.2007, 12:21

По версии с разумным тралом.
Взял фунт - м30.
Привлекает малая просадка, - а значит возможность перспективной работы с ММ.
И число сделок на м30 - поболе будет, - а значит достоверность увеличивается!
Оптимизировал с июня 2004г. по 1 апреля сего года.
------------------------------------------------------------------------------
Начальный депозит 10000
Чистая прибыль +7040
Абсолютная просадка 124.72
Максимальная просадка 876(5.33%)
Относительная просадка 5.33% (876)

Всего сделок 857
Короткие позиции (% выигравших) 445 (63.15%)
Длинные позиции (% выигравших) 412 (63.11%)
Прибыльные сделки (% от всех) 541 (63.13%)
Убыточные сделки (% от всех) 316 (36.87%)
Самая большая прибыльная сделка 484.40
убыточная сделка -76.84
Средняя прибыльная сделка 57.32 убыточная сделка -75.86
---------------------------------------------------------------------------------------
С такой малой просадкой уже можно "делать дела" !
Ну а разница между прибыльными и убыточными сделками - сама просит поскорее ввести "отсечку"! (541-316=225 - прикинь, блин..!)
Далее проэкзаменовал оптимизированную версию за апрель-месяц :

Чистая прибыль +322
Абсолютная просадка 92
Относительная просадка 131
Всего сделок 14
Прибыльные сделки 10
Убыточные сделки 4

Автор: leonid553 28.4.2007, 17:03

Еще вот появились соображения.
По версии с лотами мы можем выстроить работу советника по типу пирамиды, - отсекая на каждом уровне часть прибыльных сделок в профитной зоне. Таким образом , у нас будет несколько уровней отсечки , - равное числу лотов! В идеале - 3-4.
Прибыль возрастет, но при этом и просадка будет увеличиваться (менее заметно чем прибыль - но всё-же)
И вот тут пригодится версия с ордерами!
Т.К. мы не можем отсекать убыточные сделки в минусовой зоне, - поскольку не знаем заранее прибыльной или убыточной будет сделка, - как мы это заранее знали в профитной зоне.
Остается вставить в код версии с лотами версию с ордерами, и залокировать убыточные (в текущий момент) сделки 0рдером с тем же числом лотов!
Мысль пока оч. сырая, и есть неясности, но уже понятно что ..." правильной дорогой идете товарищи!"

На форуме Игоря Кима esть любопытная веточка по реализации механизма локирования
http://forum.kimiv.ru/viewtopic.php?t=114&postdays=0&postorder=asc&start=0
Смотрю сейчас...

Автор: NoName 28.4.2007, 20:03

Я, наверное, временно откажусь от версии с двумя ордерами. Это сильно усложняет логику работы советника, а версия с двумя лотами работает ничуть не хуже. Но в дальнейшем, возможно прийдётся прибегнуть и ко второму ордеру.

P.S. Спасибо за ссылку, сейчас почитаю.
Только что отправил письмо Игорю Киму с вопросом о регистрации, а то за два месяца так и небыло подтверждения smile.gif)) Зато хороший способ для отсеивания халявщиков, зарегистрируется только тот, кому действительно необходимо!

Автор: leonid553 29.4.2007, 8:52

Версия с лотами работает - ну как часики!
Спасибо тебе за отличную, профессионально сделанную работу!
Не нарадуюсь!
Однако....
Мы, похоже сделали ошибку - ограничив число входящих изначально лотов! И вот почему:
Реализуя отсечку на "первой ступени пирамиды", мы забыли - что оставшиеся сделки у нас - все строго профитные!
Так зачем же ограничивать их число одним лотом (ордером)! ?
Напротив , нужно их увеличивать!
И вот тебе доказатильство!
ВВел в код небольшое изменение и .... -
Символ GBPUSD (Great Britan vs US Dollar)
Период 1 Час (H1) 2004.06.16 - 2007.04.27
------------------------------------------------------------------------
Начальный депозит 10000
Чистая прибыль +20778
Общая прибыль 80468
Общий убыток -59690

Абсолютная просадка 905.00
Максимальная просадка 3655.24 (23.72%)
Относительная просадка 23.72% (3655.24)

Всего сделок 639
Короткие позиции (% выигравших) 325 (61.23%)
Длинные позиции (% выигравших) 314 (59.87%)
Прибыльные сделки (% от всех) 387 (60.56%)
Убыточные сделки (% от всех) 252 (39.44%)
Самая большая прибыльная сделка 663.04
убыточная сделка -255.60
------------------------------------------------------------------------
Просадка, увы, тоже растет, но прибыль растет при этом гораздо быстрее, - соотношение роста, - примерно (1 : 4)
Но с просадкой еще разберемся....

Автор: NoName 29.4.2007, 10:08

Цитата
Мы, похоже сделали ошибку - ограничив число входящих изначально лотов! И вот почему:
Реализуя отсечку на "первой ступени пирамиды", мы забыли - что оставшиеся сделки у нас - все строго профитные!
Так зачем же ограничивать их число одним лотом (ордером)! ?
Напротив , нужно их увеличивать!
И вот тебе доказатильство!
ВВел в код небольшое изменение и ....


Тут нужно найти золотую середину! Увеличение числа лотов влечёт за собой дополнительные требования к размеру депозита. Думаю, что количество лотов нужно закладывать в логику ММ.

А вот на счёт небольших изменений, мог бы и намекнуть что ты там дописал wink.gifsmile.gif

Автор: leonid553 29.4.2007, 10:14

просто изменил число лотов - в начальном условии на открытие позиции с 2-х на 3 !


//---- Цикл открытия ордера --------------------------------------------------

Cnt=1;
while (Cnt <= 5)
{
if (OrderSend(Symbol(), OP_BUY, lots*3, Ask, 3, Bid - sl * Point, 0,
"AI", MagicNumber, 0, Blue) > 0) break;
else
{ Print ("Ошибка открытия Buy #", ErrorDescription( GetLastError() ), " попытка ", Cnt);

if (Cnt==5) return(0); //если за 5 попыток не закрыли - выходим
Cnt++;
Sleep(15000); // ждём 15 секунд
}
}
return (0);
}

else { // если перцептрон показывает вниз

Cnt=1;
while (Cnt <= 5)
{
if (OrderSend(Symbol(), OP_SELL, lots*3, Bid, 3, Ask + sl * Point, 0,
"AI", MagicNumber, 0, Red) > 0) break;
else
{ Print ("Ошибка открытия Sell #", ErrorDescription( GetLastError() ), " попытка ", Cnt);

if (Cnt==5) return(0); //если за 5 попыток не закрыли - выходим
Cnt++;
Sleep(15000); // ждём 15 секунд
}
}
return (0);
}

} //isNewBar


//----
return(0);
}

// ====================================================================================================
=
//| The PERCEPTRON - a perceiving and recognizing function |
//+-------------------------------------------------------

Далее думаю ввести lots*n

Автор: leonid553 29.4.2007, 11:17

Цитата(NoName @ 29.4.2007, 10:08) *

Цитата
Мы, похоже сделали ошибку - ограничив число входящих изначально лотов! И вот почему:
Реализуя отсечку на "первой ступени пирамиды", мы забыли - что оставшиеся сделки у нас - все строго профитные!
....


Тут нужно найти золотую середину! Увеличение числа лотов влечёт за собой дополнительные требования к размеру депозита. Думаю, что количество лотов нужно закладывать в логику ММ.



да- пожалуй !
Но я не зря писал:
"Реализуя отсечку на "первой ступени пирамиды", мы забыли - что оставшиеся сделки у нас - все строго профитные!"
Вот в чем дело!
Не надо пока увеличивать лоты.!
Помнишь, - чуть выше приводил пример по фунту со 166 "неиспользованными" сделками?
Здесь нам уже не надо бояться убытков и лишней просадки!!!!!!!!!!!
Они все уже профитные. Часть из них закрылась на уровне отсечки по подтянутому стоплосу (+80),
и значит ранее имели профит +160 (- иначе бы стлосс) не подтянулся бы).
Так что же нам мешает ещё раз организовать аналогичную отсечку на следующем уровне нашей пирамиды ? !!!!!
Мы абсолютно ничем не рискуем, - а приобретаем чистый профит!

Я не сразу это сообразил, - тут надо поломать голову, - а лучше взять карандашик и нарисовать эти уровни и отсечки , и движения цены.

Автор: leonid553 29.4.2007, 11:27

Но здесь строго mad.gif придется использовать ту твою версию, - где вместо переворота исрользуется закрытие и вновь открытие позиции!
rolleyes.gif

Автор: NoName 29.4.2007, 11:45

Цитата
ни все уже профитные. Часть из них закрылась на уровне отсечки по подтянутому стоплосу (+80),
и значит ранее имели профит +160 (- иначе бы стлосс) не подтянулся бы).


Вот тут или ты уже запутался или я чего-то не понимаю.
Отсечка срабатыват в момент подтяжки стопа. Первой подтяжки (около 80п) ! Почему ранее они имели профит 160 ??? А на счёт 166 сделок - тоже понять не могу. Каким образом можно это использовать?

И ещё раз обращаю внимание на существенный момент! Приведу пример для версии с двумя лотами: Когда осуществляется отсечка (это делает функция OrderClose, но количество лотов указывается в половину меньше чем имеет открытая позиция), в журнале это фиксируется как закрытие двух лотов и открытие одного. Тоесть когда происходит это открытие - у нас добавляется ещё одна сделка. И по этому расчёты (кол-во приб. - кол-во убыт. сделок ) в данном случае не верны! Для анализа скорее всего прийдётся сделать свои счётчики и скидывать их показания в файл.

Автор: leonid553 29.4.2007, 12:43

ДА действительно!
Поторопился я немного. Третий лот вводить придется.

"Отсечка срабатыват в момент подтяжки стопа. Первой подтяжки (около 80п) ! Почему ранее они имели профит 160 ??? А на счёт 166 сделок - тоже понять не могу. Каким образом можно это использовать?"

Я сам начинаю рассуждать и при этом часто теряю нить. Нужно сосредоточится!

166 СДЕЛОК В ПЕРВОЙ ВЕРСИИ закрылись с профитом +80.
Часть из них закрылась переворотом, дойдя до уровня
if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point)),
т.к. перцептрон изменил значение с "+"на "-".
Но все др. сделки из этих 166-ти уже имея профит +80. пошли дальше (перцептрон не изменил значения) .
При этом стоплосс у нас передвинулся "на мизер"!
Далее цена прошла ещё +80 (профит стал 80+80=160) - , но перцептрон не изменил значения !
(те сделки ,где перц. изменился я учел - их 57 и профит у них >=160).
Стоп лосс в этот момент полнялся уже на след. ступень - см. рис.
Значит, имея профит уже 80+80=160 эти сделки пошли дальше, но тут цена повернулась против нас и вернулась к уровню последнего стоплосса и закрылись +80! - см. син. стрелку на рис.
Вот эти-то сделки из 166-и и надо нам отсечь! - отсечь с профитом = +160 !!!!!!!!!!!
Сколько их?
Вопрос интересный! А ведь их немало! Пусть даже их всего лишь половина, или даже треть от 166-и. Но их профит= +160 !!!
А дополнительная просадка при этом останется = -1200
Можно сделать счетчик и их подсчитать, но проЩе вместо счетчика предусмотреть в коде советника третий лот (с отсечкой) и выяснить этот вопрос практически!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 29.4.2007, 14:40

Как это реализовать программно?.
И насколько это реализуемо?
Надо подумать.
Если мы введем в код - lots*m
Т.Е. сразу сделаем версию для "общего" случая.
Где отсечка будет реализовываться на всех уровнях, причем число уровней, видимо, будет равно (m-1) лотов в ордере.
Практически - не более 4-6.
Для пипсовочных версии - неплохое решение!
Для наших же размеров стопов реально будет достаточно 3-4-х.

-----------------------------------------------------------------
//------ ОТКРЫТЫХ ОРДЕРОВ НЕТ ---------
if (Signal > 0) { // если перцептрон показывает вверх

//---- Цикл открытия ордера --------------------------------------------------

Cnt=1;
while (Cnt <= 5)
{
if (OrderSend(Symbol(), OP_BUY, lots*m, Ask, 3, Bid - sl * Point, 0,
"ST", MagicNumber, 0, Blue) > 0) break;

---------------------------------------------------------------------------------

Автор: NoName 29.4.2007, 16:21

Ну теперь всё ясно и понятно.
Завтра-послезавтра посмотрю как это можно реализовать. Думаю проблем быть не должно. Но счётчики всёравно нужно прикрутить! smile.gif

Автор: leonid553 29.4.2007, 17:54

А я вот пока задумался о просадке. mad.gif
Пожалуй, борьба с просадкой будет важнее и потяжелее, чем наращивание прибыли!
В наращивании прибыли мы (скромно замечу) достигли некот. успеха.
Но вот просадка.... sad.gif
Особенно это касается Фуя и GBP/CHF.
Эти "финансовые инструменты" крайне тяжело оптимизируются на большой истории.
И спред здесь, явно, оставляет желать лучшего.
На короткой истории, - проблем нет, - но нет и смысла в такой работе...

Подкачал чуток истории по USD/CHF на м30.
Взял версию с "разумным" тралом по стохастику. Добавил контрольные точки и сделал у стохастика большой период. Контрольные точки подтянул поближе к текущему моменту.
Цель была - (не повышение прибыли а) - увеличить число профитных входов (сделок), и уменьшить просадку.
Вот результат :
Символ USDCHF (Swiss Franc vs US Dollar)
Период 30 Минут (M30) 2005.12.27- 2007.04.27
--------------------------------------------------------------------------------------------
Параметры Stochastic_period=19; slowing=4;
x0=114; x1=67; x2=107; x3=96; x4=106; x5=112;
ks=0; kb=0; sl=61; lots=0.1;
P_0=0; P_1=1; P_2=3; P_3=5; P_4=7; P_5=9;
UseTrailing=true; ProfitTrailing=true; TrailingStop=39; TrailingStep=10;

Начальный депозит 10000
Чистая прибыль +3530
Общая прибыль +7948.
Общий убыток -4418

Абсолютная просадка 10.12
Максимальная просадка 343.09 (2.70%)
Относительная просадка 2.70% (343.09)

Всего сделок 264
Короткие позиции (% выигравших) 119 (64.71%)
Длинные позиции (% выигравших) 145 (67.59%)
Прибыльные сделки (% от всех) 175 (66.29%)
Убыточные сделки (% от всех) 89 (33.71%)
Самая большая прибыльная сделка 275.78
убыточная сделка -57.46
Средняя прибыльная сделка 45.42 убыточная сделка -49.64
---------------------------------------------------------------------------------------------------
Прибыльных сделок здесь ровно в два раза больше чем убыточных - для отсечки!
Ну а просадка - порадовала! - всего -340 !
Вот кандидат для тестирования на демо!

График баланса :



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 30.4.2007, 13:17

Предположим, я хочу ввести дополнительное условие на изначальный вход.
Допустим, я желаю, чтобы вход был только тогда, - когда текущее значение индикатора совпадало по знаку с текущим значением перцептрона (от этого-же индюка)
Значение индюка уже есть внутри функции перцептрона:
double a0 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,P_0);

Видимо его надо оттуда взять. Или просто добавить ещё раз эту строку в условие входа? -
----------------------------------------------------------------------------------
// check for long or short position possibility

double a0 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,0);

// открываем длинную позицию
if((perceptron() > 0) && (a0 > 0) )
{
//long
ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0,
"FI", MagicNumber, 0, Blue);
if(ticket < 0)
{
Sleep(30000);
prevtime = Time[1];
}
}
else // иначе - короткую
{
// short
--------------------------------------------------------------------------------------------------
Правильно так будет?

Автор: NoName 30.4.2007, 14:46

Да, правильно. Но лучше для индикатора в основном коде использовать другую переменную, отличную от переменной в функции перцептрон. Например, вот так:

Код

// check for long or short position possibility

double fisher0 = iCustom(NULL, 0, "Fisher_m11",RangePeriods,PriceSmoothing, IndexSmoothing,0,0);

// открываем длинную позицию
if((perceptron() > 0) && (fisher0 > 0) )
{
...
}

Автор: leonid553 30.4.2007, 16:19

Понял! Благодарю!

Автор: leonid553 2.5.2007, 11:33

В свете последних событий на счете , т.е. поведения советника в последних сделках - обнаружилось следующее:
Цена дошла до уровня (sl*2 +spread) и ... развернулась! - против нас!
Профит не успел зафиксироваться, - т.к. он (профит) фиксируется только по цене открытия новой свечи!
И мы далее получаем закрытие "по мизеру", вместо ожидаемого "фрика"
Насколько часто так бывает?
Предполагаю, что - нередко!
И тем обиднее ситуация! Мы, - находясь в профитной зоне, упускаем то, - что обязаны брать!
Как с этим бороться?
В версии с лотами это будет излишне канительно.
А вот в версии с ордерами, - тут возможно будет проще!
Выделить второй ордер из цикла, - чтобы он "жил" своей жизнью и задать для него свои ТП и СЛ.
Причем работать второй ордер должен не по ценам открытия, - а по тикам.
Тогда мы можем оптимизировать параметры ТП и СЛ, - и Таким образом существенно увеличить общий профит, - без увеличения просадки!!!!!, - т.к. работа здесь идет только в профитной зоне!

Автор: NoName 2.5.2007, 17:02

Честно говоря, я сейчас сознательно пытаюсь уйти от всех тиков. Главная причина - это отсутствие возможности нормальной оптимизации по причине отсутствия минутных данных за большой период. Сейчас мне хочется попробовать реализовать срабатывание советника не по открытию бара на "рабочем" (в нашем случае Н1) таймфрейме, а по открытию бара меньшего периода. Например М15 или даже М5. Тогда останется возможность тестирования и оптимизации на "Контрольных точках", но правда глубина истории по вышеназванным ТФ так же не велика.

Автор: leonid553 4.5.2007, 20:13

Цитата(leonid553 @ 29.4.2007, 12:43) *


166 СДЕЛОК В ПЕРВОЙ ВЕРСИИ закрылись с профитом +80.
Но все др. сделки из этих 166-ти уже имея профит +80. пошли дальше (перцептрон не изменил значения) .
При этом стоплосс у нас передвинулся "на мизер"!
Далее цена прошла ещё +80 (профит стал 80+80=160) - , но перцептрон не изменил значения !
(те сделки ,где перц. изменился я учел - их 57 и профит у них >=160).
Стоп лосс в этот момент полнялся уже на след. ступень - см. рис.
Значит, имея профит уже 80+80=160 эти сделки пошли дальше, но тут цена повернулась против нас и вернулась к уровню последнего стоплосса и закрылись +80! - см. син. стрелку на рис.
Вот эти-то сделки из 166-и и надо нам отсечь! - отсечь с профитом = +160 !!!!!!!!!!!
Сколько их?
Вопрос интересный! А ведь их немало! Пусть даже их всего лишь половина, или даже треть от 166-и. Но их профит= +160 !!!
А дополнительная просадка при этом останется = -1200
Можно сделать счетчик и их подсчитать, но проЩе вместо счетчика предусмотреть в коде советника третий лот (с отсечкой) и выяснить этот вопрос практически!


Подсчитал!
Таких сделок на истории с июля 2004 оказалось 44
Мы теряем примерно 44*(+160)-просадка = 44(+160)-1200

Автор: leonid553 5.5.2007, 18:10

Перелопатил десятки (без приувеличения) индикаторов,- чтобы использавать их как дополнительный фильтр к перцептрону.
И убедился в бесперктивности такого подхода.
В лучшем случае, - профитность системы не уменьшается!
В силу (скажем так) случайности сигналов выдаваемых перцептроном на вход . Конечно, совсем уж случайными их назвать нельзя, - но тем не менее.
Сигналы выдаются по признакам, - которые я ну никак не могу отследить по индикатору-перцептрону. Видимо, при оптимизации подгонкой улавливается некая статистическая закономерность.
При добавке фильтров-индикаторов уменьшается (бывает в разы) и число сделок, а значит уменьшается достоверность.
Технические способы мы , пожалуй , уже все исчерпали!
Таким образом, остаются чисто логические приемы увеличения общей прибыли, - как мы уже проделали с Отсечкой!
Для уменьшения просадки и даже небольшого увеличения прибыли, мне представляется перспективным добавить локирование позиций в убыточной зоне.
особенно привлекательно выглядит локирование при трендовом рынке и активном флете, - т.к. советник частенько работает наоборот в таких ситуациях.
Начал вникать в технику локов....
------------------------------------------------------------------------
Интересно, - работают ли на графике баланса линии сопротивления и поддержки?


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: NoName 5.5.2007, 18:38

А мне пока что видится использование вместо перцептрона сигналов настоящей нейросети. Надежду возлагаю на то что сигналы будут не столь случайными. А вот какую сеть использовать - пока не решил. Или создать в нейрошеле, или использовать наработки klot'а.
Но в любом случае, сейчас на это пока нет времени.

Советник, который крутился на демо на этой неделе, видимо, удачно попал в "такт". Интересно как закроется последняя сделка, оставшаяся с пятницы в плюсе?


Цитата
Интересно, - работают ли на графике баланса линии сопротивления и поддержки?


А это ещё зачем? smile.gif

Автор: leonid553 6.5.2007, 19:25

Ну как зачем !
Видим, unsure.gif - пошел отскок вниз от линии сопроитвления, - отключаем советник!
А отскок вверх от поддержки, - опять включаем....!
smile.gif

Автор: NoName 6.5.2007, 21:20

smile.gif
Если мы отключим советник, то у нас линия баланса перестанет рисоваться.
Нечему будет отскакивать wink.gif

Автор: leonid553 7.5.2007, 7:18

На реале - отключим. На демо - оставим!
Кстати - сегодня с утра - приятный сюрприз -!
Наш советник приближается к удвоению начального депозита на демо!

Автор: leonid553 9.5.2007, 12:19

to NoName:
Вот ты писал недавно -
"Сейчас мне хочется попробовать реализовать срабатывание советника не по открытию бара на "рабочем" (в нашем случае Н1) таймфрейме, а по открытию бара меньшего периода. Например М15 или даже М5. Тогда останется возможность тестирования и оптимизации на "Контрольных точках", но правда глубина истории по вышеназванным ТФ так же не велика."
Я прикинул вот каким образом.
Как уйти от случайности сигналов перцептрона? Мы работаем на н1 и сигналы берем с индикатора на этом же тф.
Но наши стопы, - вовсе не соответствуют этому тф - н1 !
Для н1 более подошли бы стопы - = от 35 до 55, - но никак не 80/90 !
Переходить на тф н4 ? Но тогда в сделках по ценам открытия мы будем "упускать" профит, - как иногда вот сейчас на нашем счете....
Можно брать сигналы индикатора с н4, - а работать по ценам закрытия н1.
А что если взять индикатор с большим периодом?
Т.е. создать искусственно, - как бы имитацию большого периода? И оптимизировать все остальные параметры.
Сделал это .
Результат получился оч. удовлетворительным!
На прибыли это отразилось, - в сторону увеличения на 15 % !
А вот просадка уменьшилась почти в 1.5 раза !!!!!
Еще не вставил отсечку в версию с этим индикатором!
ПрибыльныХ сделок за три года было 864, а убыточных всего 537, - прикинь! (при стопе=70) !
Ну а график баланса - изрядно выпрямляется ...! -



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 31.7.2007, 10:42

to NoName:
По аналогии с обьединенной версией советника AI прикинул вот что. Система должна работать, если вместо реверсной версии мы просто вставим другую пару. Чтобы получился мультивалютный эксперт.
По системе ST+ENV, я думаю, есть целесообразность такого решения.
Попытался сделать это. Используя как образец обьединенную версию и Stoch_env_v3.
В сыром виде получается пока так:

Код
/+---------------------------------------------------------------------+
//|                                         mulutie.mq4                 |
//|                                     Copyright © 2007, Tradersforum. |
//|                                     http://www.tradersforum.net.ru/ |
//|                                            NoName(-and) & Leonid553 |
//+---------------------------------------------------------------------+

#property copyright "NoName(-and)& Leonid553"
#property link      "http://www.tradersforum.net.ru/"

//---- input parameters

extern string  GBPUSD= "Параметры GBPUSD";
extern int     MagicGBP=199;
extern bool    GBP=True;
extern int     GBPUSD_period=6;
extern int     GBP_Env_period=25;
extern int     GBP_Env_shift=1;
extern double  GBP_Env_deviation=20;
extern int     sl_GBPUSD = 70;
extern int     tp_GBPUSD = 70;


extern string  USDCHF= "Параметры USDCHF";
extern int     MagicCHF=991;
extern bool    CHF=false;
extern int     USDCHF_period=5;
extern int     CHF_Env_period=25;
extern int     CHF_Env_shift=1;
extern double  CHF_Env_deviation=20;
extern int     sl_USDCHF = 82;
extern int     tp_USDCHF = 82;



//-- Подключаемые модули ---------------
#include  <stdlib.mqh>
#include  <b-Lots.mqh>  //Переменный лот
//#include  <VisualTestingTools.mq4> //визуализация
//--------------------------------------
static int prevtime = 0;
static int spread   = 3;
//--
int ExpertBars;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//vTerminalInit();
//----------------
ExpertBars = Bars;
//----------------
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
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; //нет ордера
}*/
  {
//vTerminalRefresh();
//-------------------------------------------------------
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }
//-------------------------------------------------------

if (isNewBar) {  

int spread = MarketInfo(Symbol(), MODE_SPREAD);
//-----------------------------------
//double gbp_Signal =perceptron  ();
//double chf_Signal =perceptron_r();

//----- Вывод информации на экран -----------------------------------------------------
string info="";
string on_off="-------------------------------------------------------------"+ "\r\n";
if (GBP) on_off=StringConcatenate (on_off," версия GBPUSD    - включена. ", "\r\n");
else         on_off=StringConcatenate (on_off," версия GBPUSD    - отключена. ","\r\n");
if (CHF)  on_off=StringConcatenate (on_off," версия USDCHF    - включена. ",  "\r\n");
else         on_off=StringConcatenate (on_off," версия USDCHF    - отключена. ", "\r\n");
//---------
info=StringConcatenate(info,on_off,"\r\n");
info=StringConcatenate(info,"\r\n");
//info=StringConcatenate(info, "Перцептрон прям.:    ", GeneralSignal,"\r\n" );
//info=StringConcatenate(info, "Перцептрон реверс.:  ", ReversSignal);
//--
Comment(info);
//-------------------------------------------------------------------------------------
  // for (int i=0; i<OrdersTotal(); i++) {  
  
  double Stochastic_array[49];
//------заполняем массив значениями Stochastic-----------------
int    i=0;
while (i<50)
{
Stochastic_array[i]= iStochastic(NULL, 0, GBPUSD_period, 3,3,MODE_SMA,0,MODE_MAIN, i);
i++;
}
//------------------------------------------------------


ArraySetAsSeries(Stochastic_array,true);

double
En0_low=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0, GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0);

double
En0_up=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0, GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0);

double Stochastic_0=iStochastic(NULL, 0, GBPUSD_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
double Stochastic_1=iStochastic(NULL, 0, GBPUSD_period, 3,3,MODE_SMA,0,MODE_MAIN, 1);
          
    
//=======================Начальное открытие ордера ===============================

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

} //isNewBar
//----
   return(0);  
  }
//+------------------------------------------------------------------+
//|  The PERCEPTRON - a perceiving and recognizing function          |

  
//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// 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);
}
//---------------------------------------------------------------------------------+

Трал пока не ставил - не к спеху!
после компиллирования выдает одинаковую ошибку (20 раз)
'Cnt' - variable not defined
Понятно что я и не рассчитывал с налёта получить результат. Да и для второй пары ещё не прицепил конверт на Стохастик.
Возможно что упустил что-то - http://forum.mql4.com/ru/5661
Что по твоему на первый взгляд здесь не работает?
---------------------------------------------------------------------------------
Всё ОК!
Перечитал сейчас свой пост и сам увидел - где ошибка! Исправил. Скомпиллировалось!

Автор: NoName 31.7.2007, 15:12

Не заметил вовремя этот пост. Но, смотрю, ты и без меня справилсяwink.gif
На будущее: variable not defined - переменная не определена.

Автор: leonid553 31.7.2007, 15:13

Вставил трейлинг. Работает советник.
Но.... Не так, как надо. Похоже, он по ценам открытия работает. А не по всем тикам....

Автор: NoName 31.7.2007, 15:28

Совершенно верно.
Всё что помещено в этих скобках будет срабатывать только при появлении нового бара:

Код
if (isNewBar)
{

}


Автор: leonid553 31.7.2007, 15:42

Понятно. Спасибо.

Автор: leonid553 31.7.2007, 15:57

Убрал - if (isNewBar) { .... }
И заработал эксперт так как надо!
Сейчас вставляю второй трал и цепляю конверт на стох для второй пары!
Да! Насколько реально предусмотреть трейлинг отдельно для длинной и для короткой позиции?

Автор: NoName 31.7.2007, 16:41

Цитата
Да! Насколько реально предусмотреть трейлинг отдельно для длинной и для короткой позиции?


Для того что бы не править библиотеку с тралом можно поместить вот такой код в функцию Start().
Код
if (UseTrailing == True)
{
bool   fm;
int    err;
double ldOpen=0;
double ldTake=0;

for (i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
        if (OrderType()==OP_BUY) {
          if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingBuy*Point) {
            if (OrderStopLoss()<Bid-(TrailingBuy+TrailingStep-1)*Point) {
            
                ldOpen=OrderOpenPrice();
                ldTake=OrderTakeProfit();
        
              if (IsTradeAllowed()) {
              fm=OrderModify(OrderTicket(), ldOpen, Bid-TrailingBuy*Point, ldTake, 0, clModifyBuy);
              if (!fm) {
              err=GetLastError();
              Print("Error(",err,") modifying SL: ");
              }
             }
  
            }
          }
        }
        if (OrderType()==OP_SELL) {
          if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingSell*Point) {
            if (OrderStopLoss()>Ask+(TrailingSell+TrailingStep-1)*Point || OrderStopLoss()==0) {
              
              ldOpen=OrderOpenPrice();
              ldTake=OrderTakeProfit();
              
              if (IsTradeAllowed()) {
              fm=OrderModify(OrderTicket(), ldOpen, Ask+TrailingSell*Point, ldTake, 0, clModifySell);
              if (!fm) {
              err=GetLastError();
              Print("Error(",err,") modifying SL: ");
              }
             }

            }
          }
        }
      }
    }
  }
}



А также не забыть объявить внешние переменные отвечающие за работу трала:
Код

extern string _Parameters_Trailing = "----- Параметры Трейлинга -----";
extern bool UseTrailing    = false;   // Использовать трейлинг
extern bool ProfitTrailing = false;   // Включать трейлинг когда получен профит
extern TrailingBuy  =20;               // Размер трала для позиции Buy
extern TrailingSell =20;                // Размер трала для позиции Sell
extern int  TrailingStep   = 2;       // Шаг трейлинга

Автор: NoName 31.7.2007, 16:59

Только вот подумал что этот код сгодится только для одной пары. Для второй нужно либо добавить такой же кусок кода с другим Magic, что совсем не эстетично и громоздко, либо модифицировать этот код для работы со вторым Magic, что не совсем просто из-за большого ветвления if, if, if ...

Автор: leonid553 31.7.2007, 17:13

Это я у же все сделал"! (без библиотеки)

extern string GBPUSD= "Параметры GBPUSD";
extern int MagicGBP=199;
extern bool GBP=True;
extern int GBPUSD_period=17;
extern int GBP_Env_period=20;
extern int GBP_Env_shift=1;
extern double GBP_Env_deviation=17;
extern int sl_GBPUSD = 54;
extern int tp_GBPUSD = 250;

extern string _Parameters_Trailing_GBP = "----- Параметры Трейлинга GBPUSD -----";
extern bool UseTrailing = false; // Использовать трейлинг
extern bool ProfitTrailing = false; // Включать трейлинг когда получен профит
extern int TrailingStop = 60; // Фиксированный размер трала
extern int TrailingStep = 5; // Шаг трейлинга
-------------------------------------------------------------------------
Сейчас добавляю такой же второй трал - с магиком для второй пары!
Но вот как тут сделать отдельный размер для короткой и длинной поз?
Вроде где-то видел такой трал...

Вот нашел:

Код
extern bool UseTrailing = true;
extern int lMinProfit = 30;
extern int sMinProfit = 30;
extern int lTrailingStop = 15;
extern int sTrailingStop = 15;
extern int lTrailingStep = 5;
extern int sTrailingStep = 5;

if (UseTrailing) TrailPositions();  

void TrailPositions()
{
  int cnt = OrdersTotal();

  for (int i=0; i<cnt; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;        

    if (OrderType() == OP_BUY) {
      if (Bid-OrderOpenPrice() > lMinProfit*Point) {
        if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
      }
    }

    if (OrderType() == OP_SELL) {
      if (OrderOpenPrice()-Ask > sMinProfit*Point) {
        if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
      }
    }
  }
  
}__________________

Автор: NoName 31.7.2007, 17:13

Ну код который я выложил выше, он как раз с разным размером для позиций!
Смотри TrailingBuy, TrailingSell

Автор: leonid553 31.7.2007, 17:20

Понял! Прошу прощ. за невнимательность!

Автор: NoName 31.7.2007, 17:22

Немного подумал и решил что всё же грамотнее будет использовать библиотеку.
Подправил для этой цели трал Игоря Кима.
Прикрепленный файл  a_SimpleTrailingMod.rar ( 1.04 килобайт ) Кол-во скачиваний: 311

Подключить как обычно:
#include <a-SimpleTrailingMod.mqh>

Вызывать: TrailingPositions(Magic);
В функцию нужно передавать Magic той позиции, которую нужно тралить.

Автор: leonid553 31.7.2007, 17:38

Ок! Сейчас гляну!
Кстати! Что это за таинственная библиотека #include <stdlib.mqh> ?

Автор: NoName 31.7.2007, 18:13

Это стандартная библиотека метатрейдера, в которой есть полезная функция ErrorDescription(). Эта функция возвращает описание ошибки если передать в неё номер ошибки.

Автор: leonid553 31.7.2007, 18:15

Ок! Понял! ohmy.gif

smile.gif

Автор: leonid553 31.7.2007, 18:42

Только обьясни пож., почему грамотнее будет использовать библиотеку для трала? rolleyes.gif Я тут, "понимаешь", сидел вникал целых два часа, - а ты "немного подумал" и говоришь, - это не надо! - лучше библиотеку! tongue.gif
rolleyes.gif

Автор: NoName 31.7.2007, 20:29

Да потому что не нужно повторять код два раза!:) Ты пишешь трал для одной пары, а за тем такой же трал для другой. Отличия между ними только в переменной Magic.
Конечно ничего не изменится если сделать два трала, но с библиотекой код будет проще и меньше шансов наделать ошибок.

Автор: leonid553 1.8.2007, 14:46

Понял! И ещё. Обьясни пож. смысл вот этих строк кода (незакоммент):

int start()
{
//vTerminalRefresh();
//-------------------------------------------------------
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }
//-------------------------------------------------------

//if (isNewBar) {

int spread = MarketInfo(Symbol(), MODE_SPREAD);



//----- Вывод информации на экран ------------------------------
----------------------------------------------------------------------------------------

И нужно ли в посл. строке оставить как есть или вместо Symbol(), указать пары?

Все работает в тестере. Но вот пока по второй паре результат не соотв. тесту отдельной версии - чуть-чуть.

Автор: NoName 1.8.2007, 17:20

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


Эта конструкция отслеживает появление нового бара. Переменная isNewBar выступает в качестве ключа. true-появился бар, false-бар не появился. Для работы этой конструкции необходимо объявить на глобальном уровне переменную ExpertBars, а в функции Init() присвоить ей значение Bars.
Теперь давай проследим работу эксперта.
При запуске эксперта первой срабатывает функция Init(), в которой переменной ExpertBars присваивается значение Bars (Bars, возвращает количество баров в терминале). Далее в функции Start() объявляем переменную isNewBar и присваиваем ей false:
Код
bool isNewBar=false;

после чего проверяется условие:
Код
if (ExpertBars !=Bars)

В данный момент переменная ExpertBars хранит значение количества баров, которое было на момент запуска, и в данный момент ExpertBars ==Bars. А не равны они станут только тогда, когда появится новый бар и Bars вернёт значение отличное от ExpertBars. В этот момент выполняются действия
{ExpertBars=Bars; isNewBar=true; }
ExpertBars получает новое значение баров и замок открывается. На следующем тике замок снова закроется:
Код
bool isNewBar=false;


Далее, что бы то что ты хочешь, выполнялось только по приходу бара нужно поместить в эти скобки:
Код
if (isNewBar)
{

}


Код
int spread = MarketInfo(Symbol(), MODE_SPREAD);

Для мультивалютного эксперта символ нужно задать явно. Также нужно предусмотреть несколько таких переменных для каждой пары.

Автор: leonid553 1.8.2007, 17:52

Благодарю за разъяснение!

Автор: leonid553 2.8.2007, 19:18

Ещё вопрос

Код
/---- input parameters

extern string  GBPUSD= "Параметры GBPUSD";
extern int     MagicGBP=199;
extern bool    GBP=True;
extern int     GBPUSD_period=17;
extern int     GBP_Env_period=20;
extern int     GBP_Env_shift=1;
extern double  GBP_Env_deviation=17;
extern int     sl_GBPUSD = 54;
extern int     tp_GBPUSD = 50;

extern string _Parameters_Trailing_GBP = "- Параметры Трейлинга GBPUSD -";
extern bool UseTrailing    = false;// Использовать трейлинг
extern bool ProfitTrailing = false;//Включать трейлинг когда получен профит
extern int  TrailingStop   = 10;   // Фиксированный размер трала
extern int  TrailingStep   = 5;    // Шаг трейлинга

//********************************************************************
extern string  USDCHF= "Параметры USDCHF";
extern int     MagicCHF=991;
extern bool    CHF=false;
extern int     USDCHF_period=5;
extern int     CHF_Env_period=25;
extern int     CHF_Env_shift=1;
extern double  CHF_Env_deviation=20;
extern int     sl_USDCHF = 53;
extern int     tp_USDCHF = 30;

extern string _Parameters_Trailing_CHF = "-- Параметры Трейлинга USDCHF--";
extern bool UseTrailing_    = false;// Использовать трейлинг
extern bool ProfitTrailing_ = false;//Включать трейлинг когда получен профит
extern int  TrailingStop_   = 10;   // Фиксированный размер трала
extern int  TrailingStep_   = 5;    // Шаг трейлинга

color    clModifyBuy  = Green;
color    clModifySell = Blue;
color    clModifyBuy_  = Green;
color    clModifySell_ = Blue;

//-- Подключаемые модули ---------------
#include  <stdlib.mqh>
#include  <b-Lots.mqh>  //Переменный лот
//#include  <VisualTestingTools.mq4> //визуализация
//--------------------------------------
static int prevtime = 0;
static int spread   = 3;
//--
int ExpertBars;

Это был блок внешних параметров.

Далее непонятно - куда воткнуть строку для каждой пары
int spread = MarketInfo(Symbol(), MODE_SPREAD);

Код
nt start()
  {

int spread = MarketInfo(Symbol(), MODE_SPREAD);



  
  double Stochastic_array[49];
//------заполняем массив значениями Stochastic GBPUSD -----------
int    i=0;
while (i<50)
{
Stochastic_array[i]=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,i);
i++;
}
//------------------------------------------------------
ArraySetAsSeries(Stochastic_array,true);
//-------Цепляем конверт на Стохастик --------------
double
En0_low=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0);

double
En0_up=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0);

double Stochastic_0=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochastic_1=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,1);

//************* то же самое для  USDCHF ****************************
double Stochastic_array_[49];


Автор: NoName 2.8.2007, 19:50

А у тебя вообще переменная Spread где-то используется ?
Строка должна быть в функции Start(), а где именно принципиальной разницы нет, главное что бы она была до того места где ты будешь её использоватьsmile.gif
Выглядеть это будет примерно так:

Код
int GBPspread = MarketInfo("GBPUSD", MODE_SPREAD);
int CHFspread = MarketInfo("USDCHF", MODE_SPREAD);

Вот только никак не пойму где ты спрэд используешь в этом советнике ??

Автор: leonid553 2.8.2007, 19:58

Я тогда её вот в эти блоки вставлю - хуже не будет (кашу маслом не ...)

Код
//============================= GBPUSD ==================================
if (GBP) {     //если ордеров по паре GBPUSD нет и "выключатель" включен
if (!ExpertOrder(MagicGBP)) {
//-------Проверяем условие на покупку-------------
if  (     (Stochastic_1<En0_low) &&
          (Stochastic_0>En0_low)      )
    {  
  //---- Цикл открытия ордера  -------------------------------------------                      
int Cnt=1;
  while (Cnt <= 5)
  { //-----покупаем--------------
    Lots=GetSizeLot();
    if (OrderSend("GBPUSD", OP_BUY, Lots, Ask, 3, Bid - sl_GBPUSD * Point,
           Ask+tp_GBPUSD* Point,"General", MagicGBP, 0, Blue) > 0)  break;    
    else
{ Print ("Ошибка открытия Buy #", ErrorDescription( GetLastError() ),
                                                  " попытка ", Cnt);
                              
        if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
        Sleep(15000); // ждём 15 секунд

А по символу - в тралах там есть - ссылка на символ. И как тут? Оставить как есть? -

Код
////                          TRAILING  STOP  2                             //
//////////////////////////////////////////////////////////////////////////////
if (UseTrailing_ == True)
{
bool   fm_;
int    err_;
double ldOpen_=0;
double ldTake_=0;

for (int r=0; r<OrdersTotal(); r++)                                  {
    if (OrderSelect(r, SELECT_BY_POS, MODE_TRADES))                   {
     if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicCHF)      {
      if (OrderType()==OP_BUY)                                          {
       if (!ProfitTrailing_ || (Bid-OrderOpenPrice())>TrailingStop_*Point) {
        if (OrderStopLoss()<Bid-(TrailingStop_+TrailingStep_-1)*Point)      {
              //ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
              
                ldOpen_=OrderOpenPrice();
                ldTake_=OrderTakeProfit();
        
              if (IsTradeAllowed()) {
fm_=OrderModify(OrderTicket(),ldOpen_,Bid-TrailingStop_*Point,ldTake_,0,clModifyBuy_);
              if (!fm_) {
              err_=GetLastError();
              Print("Error(",err_,") modifying SL: ");
             }
            }  
           }
          }
         }
        if (OrderType()==OP_SELL) {
     if (!ProfitTrailing_ || OrderOpenPrice()-Ask>TrailingStop_*Point) {
if (OrderStopLoss()>Ask+(TrailingStop_+TrailingStep_-1)*Point || OrderStopLoss()==0) {
              //ModifyStopLoss(Ask+TrailingStop*Point, clModifySell);
              
                ldOpen_=OrderOpenPrice();
                ldTake_=OrderTakeProfit();
              
              if (IsTradeAllowed()) {
fm_=OrderModify(OrderTicket(),ldOpen_,Ask+TrailingStop_*Point,ldTake_,0,clModifySell_);
              if (!fm_) {
              err_=GetLastError();
              Print("Error(",err_,") modifying SL: ");
              }
             }  
            }
           }
          }
         }
        }
       }
      }
/////////////////////////////////////////////////////////////////////////////////
//////                  end of  TRAILING  STOP 2                              ////

Автор: NoName 3.8.2007, 6:30

Нет, как есть нельзя оставлять. Тралить не будет вторую пару. Вместо Period(), нужно прописать конкретную пару.

Автор: leonid553 3.8.2007, 9:34

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

потом станет -
(Stochastic_1=En0_low) &&
(Stochastic_0>En0_low) )

------------------------------------------------------------------
А условие кот. выше - может и так и не наступить!Как ты думаешь, - нет ли здесь у нас некоторой непродуманности условий на вход?

Автор: NoName 3.8.2007, 10:07

Цитата
Но при этом у нас получается - что СТохастик просто перепрыгивает через границу конверта! - НА ДВУХ ПОСЛ. ТИКАХ!

Не на ТИКАХ, а на барах.
Думаю что с условием всё впорядке, т.к. по стратегии нужно входить по пробою границы конверта. А пробой мы можем идентифицировать только так: на предыдущем баре стохастик ниже границы, на текущем он уже выше границы.
И почему это условие у нас может не наступить?
Как по мне, так выполнение условия (Stochastic_0 == En0_low) весьма сомнительно, так как эти индикаторы дают значение с точностью до 4-го знака после запятой. И вероятность того что в какой то момент времени они станут равны, думаю, очень-очень мала.

Автор: leonid553 3.8.2007, 11:53

Как это, - " не на тиках а на барах" ?
Советник работает по тикам! , - не по ценам открытия!
Условие
if (isNewBar)
{ }
я убрал!

Код
En0_low=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_LOWER,0);

double
En0_up=iEnvelopesOnArray(Stochastic_array,0,  GBP_Env_period,0,
GBP_Env_shift,GBP_Env_deviation,MODE_UPPER,0);

double Stochastic_0=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochastic_1=iStochastic(NULL,0,GBPUSD_period,3,3,MODE_SMA,0,MODE_MAIN,1);

"Как по мне, так выполнение условия (Stochastic_0 == En0_low) весьма сомнительно, так как эти индикаторы дают значение с точностью до 4-го знака после запятой. И вероятность того что в какой то момент времени они станут равны, думаю, очень-очень мала."
ну, впрочем, с этим понятно!
Гороздо больше беспокоит другое! Отслеживал в визуальном режиме одиночную версию и вроде обнаружил глюк, - разумеется,, не в нашу пользу!
Но сначала проясни вопрос " по барам или по тикам"?

Автор: NoName 3.8.2007, 14:58

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


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

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

Если убрал, то будет работать на каждом тике. Но условие от этого не меняется ведь...

Автор: leonid553 3.8.2007, 15:56

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



Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне
Прикрепленное изображение в новом окне

Автор: leonid553 3.8.2007, 16:19

В одной из статей на форуме 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

Вот ещё один момент . Мы как-то его уже выясняли. Но пришла пора вернуться опять.
Дело в том, что стохастик в силу своей структуры шкалы - не является симметричным инструментом!
Динамический диапазон расчета стохастика идет в однополярной шкале. Со всеми вытекающими. И даже если мы сделаем шкалу двухполярной, - делу это не поможет!
Не только шкала тут влияет на структуру. Но и методика расчета самого индикатора.
Это оч. хорошо заметно, когда мы вешаем на стохастик конверт.
Обрати внимание, что динамический диапазон (т.е. амплитуда) колебаний верхней границы конверта существенно больше, чем амплитуда колебаний нижней границы!
И это при общих внешних параметрах.
Что же получается? В ветке "Нест. тактика" на посл. странице я выложил графики балансов в различных режимах.
при покупке у нас задействована 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

При использовании "ускоренной" версии с МА - после оптимизации режима 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

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

Цитата(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

Ок! Благодарю!
Ещё вопрос. Вот сегодня на счету с советниками 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

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

Цитата
Как решить эту проблему?

Проблема уже решена в той версии, которую я тебе присылал. Используй либо её, либо переделай существующую по аналогии.

Автор: leonid553 6.8.2007, 16:48

Ок!
Вот ещё проблема с мультивалютной версией! В ОНЛАЙНЕ.
Первая пара работает нормально! а ВОТ ВТОРАЯ - НЕ ХОЧЕТ ВКЛЮЧАТЬСЯ!
Пока пробую сам разобраться!
Пож. скажи что делает этот блок?--
------------------------------------------------------------------
/---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// 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

Возможно причина в функции 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());

Автор: NoName 6.8.2007, 19:48

Цитата
Пож. скажи что делает этот блок?--


Этот блок проверяет есть ли открытая позиция с интересующим Magic. Может возвращать true или false.
Т.е. для того что бы узнать есть ли открытая позиция данного советника, нужно написать:
if(ExpertOrder(Magic))
{
...открытая позиция есть, делаем что-то
}
Цитата

Вот ещё проблема с мультивалютной версией! В ОНЛАЙНЕ.
Первая пара работает нормально! а ВОТ ВТОРАЯ - НЕ ХОЧЕТ ВКЛЮЧАТЬСЯ!
Возможно причина в функции OrderSend, кот. мы используем для открытия позиций.


Да! Так и есть. В журнале наверняка выводится ошибка об этом.
Значения Ask, Bid, Point для второй пары нужно получить через MarketInfo.

Цитата
Непонятно ещё, - где указан тф по второй паре.

Для функции OrderSend таймфрейм неважен.

Автор: leonid553 6.8.2007, 19:52

Всё понятно теперь!
За исключением ТФ! Откуда советник знает, - по какому ТФ открывать ордер по второй (и даже по третьей - в перспективе) паре? smile.gif

Автор: NoName 6.8.2007, 19:56

Какая разница по какому ТФ открывать позицию? На любом таймфрейме Bid и Ask будут одинаковымиwink.gif

Автор: leonid553 6.8.2007, 20:03

Но показания индюков-то должны сниматься с конкретного тф!

Автор: NoName 6.8.2007, 20:07

У индюков вторым параметром идёт таймфрейм:
( string symbol, int timeframe ... )
Не путай индюки и OrderSend smile.gif

Автор: leonid553 6.8.2007, 20:20

Благодарю! На сегодня вопросов больше нэт!

Автор: leonid553 7.8.2007, 4:02

По мультивалютному сделал так:
(Задействовал ф-ю MarketInfo для второй пары! )

Код
//========================= USDCHF ======================================

if (CHF) {                       //если "выключатель" включен
if (!ExpertOrder(MagicCHF))
{
double bid = MarketInfo("USDCHF", MODE_BID);
double ask = MarketInfo("USDCHF", MODE_ASK);
double point =MarketInfo("USDCHF",MODE_POINT);
//-------Проверяем условие на покупку----------
if (  .... ...  )
    {          
  
  //---- Цикл открытия ордера  -------------------------------------------                
  Cnt=1;
  while (Cnt <= 5)
  { //-----Покупаем----------
    Lots=GetSizeLot();
    if (OrderSend("USDCHF", OP_BUY, Lots, ask, 3, bid - sl_USDCHF * point,
             ask+tp_USDCHF* Point,"Revers", MagicCHF, 0, Red) > 0)  break;    

И ТЕПЕРЬ в блоке расчета индикаторов, - там не задан ТФ - второй пары!
Если для первой пары индюк расчитывается по тому тф, на кот. стоит советник,
то для второй пары здесь (и далее) видимо нужно задавать этот тф? -

Код
/************* то же самое для  USDCHF ****************************
double Stochastic_array_[49];
//------заполняем массив значениями Stochastic USDCHF  -----------
int    k=0;
while (k<50)
{
Stochastic_array_[k]=iStochastic(NULL,240,USDCHF_period,3,3,MODE_SMA,0,MODE_MAIN,k);
k++;
.... ....
}


И вот смотрю - мелькает строчка RefreshRates(); - в твоей версии GEN+REV по AI (по сопровожд. поз) - зачем она нужна , мож и мне добавить куда ниб;?

Добавлю что в онлайне - по отдельности обе пары на своих графиках работают!
А журнал - вторую пару - даже не замечает!
(по 1мин-графику смотрю)

Автор: NoName 7.8.2007, 7:54

Вот тут ошибка:
OrderSend("USDCHF", OP_BUY, Lots, ask, 3, bid - sl_USDCHF * point, ask+tp_USDCHF* Point,"Revers", MagicCHF, 0, Red)
В твоём случае нужно поставить point.

Для расчёта индикатора на второй паре, нужно написать так:

iStochastic("USDCHF", 240, USDCHF_period, ... // а дальше как обычно.

Первым параметром ты указываешь инструмент, с которого брать значения индикатора, а вторым указываешь ТФ.

Цитата(leonid553 @ 7.8.2007, 7:02) *

Добавлю что в онлайне - по отдельности обе пары на своих графиках работают!
А журнал - вторую пару - даже не замечает!
(по 1мин-графику смотрю)


Смотришь по минутному, а в коде жёстко привязал к H4.
Stochastic_array_[k]=iStochastic(NULL,240,USDCHF_period,3,3,MODE_SMA,0,MODE_MAIN,k);

Автор: leonid553 7.8.2007, 10:20

да нет! это я здесь так написал - "240"! (не совсем уж такой дурень...),
а ставлю конечно минутки...
сейчас попробую с учетом всего сказанного...
//*************************************************************

Сделал. Скрупулёзно проверил. Запустил.
И заработал эксперт! ПО обеим парам заработал!
На тф=1 мин.
-----------------------------------------------------
Ну и последний вопрос в эту тему (по мульти) -
double Stochastic_array_[49];
//------заполняем массив значениями Stochastic USDCHF -----------
int k=0;
while (k<50)
{
Stochastic_array_[k]=iStochastic("USDCHF",240,USDCHF_period,3,3,MODE_SMA,0,MODE_MAIN,k);
k++;
-------------------------------------------------------------
Если мы используем всего два значения (посл. и предпосл.) то зачем берем [49] ?

Автор: NoName 7.8.2007, 11:46

Число 49 взял от фонаря. Почему именно его - не помню (действительно, почему не 50 ?smile.gif ). Но! Это число должно быть больше или равно периоду Envelopes. Иначе, будет недостаточно данных для корректного расчёта индикатора.
Кстати, этот цикл сильно тормозит советник, т.к. пересчитывается на каждом тике. Лучше использовать внешний индикатор, который я тебе присылал, а его значения снимать в советнике через iCustom.

Автор: leonid553 7.8.2007, 13:17

Ок! В следующей, - трехвалютной версии я, пожалуй, так и сделаю!

Теперь пришла пора заняться отдельной версией!
ты говорил, что там всё в порядке с ордерами. Т.Е. в последней твоей версии советник не обращает внимание на чужие ордера.
Однако, это не так! Вот стоит эта версия на паре GBPCHF,H4 и ночью там был сигнал на вход в BUY.
но позиция не открылась! - см. рис.
Стал разбираться. И немного запутался!

Код
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; //нет ордера
}

Здесь всё ясно пока - для работы по ценам открытия.
Далее идет заблокированный кусочек. Ну раз - заблокированный, - значит не оч. и нужен!


Эскизы прикрепленных изображений
Прикрепленное изображение в новом окне

Автор: leonid553 7.8.2007, 13:29

А условие на открытие позиции вот такое -

Код
if (!ZeroBarOrd) {        
//----------------------------------------------------------------------------------------------

  //----проверяем условие на покупку-----
  if   (  (Stochastic[1]<Env_low[0])  &&
          (Stochastic[0]>Env_low[0])  ){
          
    if ( _Order==0) { //если нет открытых ордеров
      Buy ();             //покупаем
    }
    else {                //если открытые ордера есть
    

Далее пошли блоки открытия позиций, и блок закрытия позиций.

Автор: NoName 7.8.2007, 13:35

Скорее всего дело не с ордерами а с настройками.
Настройки индикатора и советника соответствуют?
Не работает ли на счету эксперт с таким же MagicNumber?
На закоментированный блок не обращай внимания, я просто забыл его удалить. Его функцию выполняют строки те что выше.

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

Автор: leonid553 7.8.2007, 13:54

Всё соответствует!
и магик задан
extern int ExpertID =1111;
А в др. советниках - другие магики. Да и структура там другая.
Непонятина начинается вот здесь :

Автор: leonid553 7.8.2007, 14:52

Код
/=======================================================================================
//| Функция проверки наличия ордеров эксперта |==========================================
//| 0 - ордеров нет                           |==========================================
//| 1 - есть ордер Buy                        |==========================================
//| 2 - есть ордер Sell                       |==========================================
//=======================================================================================
int isExpertOrder() {

int _OrdersTotal=OrdersTotal();

//---------- При тестировании проводим упрощённую проверку ордеров.
if (IsTesting()) {              
  if (_OrdersTotal==0) return (0);
  
  for (int i=0; i<_OrdersTotal; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY)  {return(1); break; }    
      if (OrderType()==OP_SELL) {return(2); break; }
    }        
  }
}

for (i=0; i<_OrdersTotal; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        if (OrderMagicNumber()==ExpertID) {
          if (OrderType()==OP_BUY) {
             return(1); break; }
          if (OrderType()==OP_SELL) {
             return(2); break; }
         }  
       }    
     }  
   }  
}

Автор: leonid553 7.8.2007, 16:24

Вроде бы разобрался! Установил. Скомпеллировалось.

Автор: leonid553 7.8.2007, 19:08

Вставляю третью и последнюю пару. В мультивалютный. Отлажу, приготовлю и пришлю тебе.
----------------------------------------------------------------------------------------
А вот с LotsWayChoice = 1; и =3 так и осталась проблема!
В мт4 MQ - CHEMP - там в терминале заложено ограничение до 5 лотов. После чего в журнале пишется ошибка!
Но в др. мт4 ограничений таких нет. А если задать ограничения вручную
LotsMax = 50 (т.е =5 лотов) ,
то все равно не работает!

Автор: leonid553 8.8.2007, 6:25

Цитата(NoName @ 7.8.2007, 11:46) *

Число 49 взял от фонаря. Почему именно его - не помню (действительно, почему не 50 ?smile.gif ). Но! Это число должно быть больше или равно периоду Envelopes. Иначе, будет недостаточно данных для корректного расчёта индикатора.
Кстати, этот цикл сильно тормозит советник, т.к. пересчитывается на каждом тике. Лучше использовать внешний индикатор, который я тебе присылал, а его значения снимать в советнике через iCustom.

вот в последней версии для ускоренных ресчетов в тестере - твоя последняя версия "нового поколения" с вызовом внешнего индюка iCustom(NULL,0,"i-StochEnv"
в коде стоит -
double Stochastic[2];
Нужно ли для онлайна задать побольше это число , если у меня период канала равен = 20-25 ?

Автор: NoName 8.8.2007, 9:26

Цитата(leonid553 @ 8.8.2007, 9:25) *


вот в последней версии для ускоренных ресчетов в тестере - твоя последняя версия "нового поколения" с вызовом внешнего индюка iCustom(NULL,0,"i-StochEnv"
в коде стоит -
double Stochastic[2];
Нужно ли для онлайна задать побольше это число , если у меня период канала равен = 20-25 ?


Нет. Этот массив с периодом канала никак не связан.
А вот на счёт библиотеки лучше поинтересоваться на форуме у Кима. Думаю, так будет проще, чем самим гадать в чём проблема.

Автор: leonid553 8.8.2007, 17:46

Обнаружился вроде глюк в версии с вызовом индюка!
в визуальном режиме я увидел что значения (в левом углу) границ канала остаются постоянными - в течение последней свечи!
И меняют значения лишь с началом следующей свечи!
А вот стохастик (как и положено) меняется на каждом тике!
Почему
Comment ("Stochastic[0] ", Stochastic[0] , "\r\n",
"Env_up [0] ", Env_up [0] , "\r\n",
"Env_low[0] ", Env_low[0] , "\r\n",
"Blocking= "+st );
значения Env_up [0] и "Env_low[0] не меняются на каждом тике?
Для тф н4 это оч. существенно!
В итоге мы сильно запаздываем со входом! Либо пропускаем вход!
Отследил в виз. режиме.
Т.к. вход всякий раз происходит после открытия новой свечи!
Это и в "классических" версиях - так же!
И скажи пож, что там на графике за -
Blocking=false?
Пожалуй, я совсем уже "притупил"!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: NoName 8.8.2007, 19:00

Цитата
Обнаружился вроде глюк в версии с вызовом индюка!
в визуальном режиме я увидел что значения (в левом углу) границ канала остаются постоянными - в течение последней свечи!
И меняют значения лишь с началом следующей свечи!
А вот стохастик (как и положено) меняется на каждом тике!
Почему
Comment ("Stochastic[0] ", Stochastic[0] , "\r\n",
"Env_up [0] ", Env_up [0] , "\r\n",
"Env_low[0] ", Env_low[0] , "\r\n",
"Blocking= "+st );
значения Env_up [0] и "Env_low[0] не меняются на каждом тике?
Для тф н4 это оч. существенно!

Почему значения Env_up [0] и Env_low[0] должны меняться на каждом тике?
В индикаторе разве они меняются? wink.gif

Цитата
Т.к. вход всякий раз происходит после открытия новой свечи!

Ничего подобного. Советник работает на всех тиках, и позиция может открываться внутри бара, как только появляется сигнал.

Цитата
И скажи пож, что там на графике за -
Blocking=false?


Если написано true - это значит что включена блокировка, и открытие позиции на текущем баре можно не ждать. Включается блокировка в том случае, если на текущем баре уже была проведена сделка.

Автор: leonid553 9.8.2007, 5:34

Понял. По мульти ещё вопрос. Как раз по блокировке.
Начинается блок открытия позиций.
Условие :
string st="";
if (ZeroBarOrd) st="_true";
else st="_false";
if (! ...... ) {.........}
нужно вставлять общее для всего этого блока, либо задавать для каждой пары конкретно?
А если можно и так и эдак, - то как будет лучше?

Автор: NoName 9.8.2007, 10:16

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

Этот блок отвечает только за вывод информации о текущем состоянии блокировки на экран - не более.

Цитата
нужно вставлять общее для всего этого блока, либо задавать для каждой пары конкретно?

Блокировку открытия нескольких позиций на одном баре, следует предусматривать для каждой пары отдельно.

Автор: leonid553 9.8.2007, 10:51

Думаю - что на счету Лайта-реал можно закрыть работу AI. И перейти на ручную ST+ENV, H4
Ты как думаешь?
Вот ещё одна проблема!
У Arn-а на демоЛайте сейчас стоят три советника.
Два - скомп. файлы.
Но они серые, а не синии.
Но позиции в онлайне открывают!
У себя проверил. тоже перенес на демоMQ эти советники. Файлы ex4.
Поставил на 1-мин тф. Работают !
НО ВРОДЕ НЕ ДОЛЖНЫ! Раз они серые!,

Автор: NoName 9.8.2007, 13:54

На счёт AI согласен, думаю нет надобности его больше мусолить в таком видеsmile.gif
А на счёт советников, увы, не знаю что означает их цвет. У меня такое бывало, когда случайно закинешь файл не в ту папку. Он появлялся в списке, но серый, и естественно не работал.
Может цвет означает что нет исходного файла? Или файл скомпилирован в другом билде?

Автор: leonid553 9.8.2007, 14:33

Закончил мульти-версию. Три пары задействОвал.
По всем парам - "классический" расчет индюков и входов.
Структура получилась такая :
///////////////////////////////////////////////////////////////////////
-Блок внешних параметров.
-Блок отображения информации на графике первой пары по всем инструментам.
-Блок обьявления переменных и расчета индикатров :
первой пары
второй пары
третьей пары
-Блок открытия и закрытия позиций
первой пары
второй
третьей
-Блок сопровождения позиций (три трала)
-Блок функции проверки наличия ордеров эксперта
///////////////////////////////////////////////////////////////////

Неслабая портянка получилась! smile.gif Я пока вставлял кусочки кода и двигал движок туда-сюда, -- уже и забывал, что я собственно хотел куда вставить!
Так что исходная схема у нас готова. Предполагаю, что версию по GBPUSD можно оставить в классическом варианте (плюс 2МА - добавить), а две другие пары можно заменить как версии нового поколения! - Ну это сам посмотришь. Решим.
Глянь на почту!
Проверил на мт4MQ на тф 1мин. Работает как часики! Только почему-то не отображается на графике инф-я. А в двухвалютной отображалась! Посмотри, - что там.
Что-то у меня почта глюкнула на Яндексе! Не могу войти! Не знаю почему.

Автор: leonid553 9.8.2007, 17:30

Никак у меня не получается вставить блокировку в классическую версию. Вроде сделал по аналогии с версией нового поколения. Но что-то не работает блокировка...

Код
//---- input parameters---------
extern int     MagicNum = 9649;
... ... ...
//-------------------
//-- Подключаемые модули --
#include  <b-Lots.mqh>
#include  <a-SimpleTrailing.mqh>
//---------------------------
int ExpertBars;
static bool ZeroBarOrd;

int init()   {   return(0);  }

int deinit()   {   return(0);  }

int start()
{
заявляем переменные
//--------------------------------------------
     string st="";
if (ZeroBarOrd) st="_true";
else st="_false";
Comment ("Stochastic_0 ",  Stochastic_0 , "\r\n",
         "En0_up    ",  En0_up     , "\r\n",
         "En0_low   ",  En0_low    , "\r\n",
         "Blocking= "+st );

if (!ExpertOrder(MagicNum)) //если  нет открытых позиций
if (!ZeroBarOrd)
{=== покупаем/продаем ===}
return(0);
  }
//------------------------------------------------------------
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// 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; }  
//---------------------  

Вот так получилось . Но открывает на одном баре всё равно....
Похоже вот с этим тут надо подсуетиться -
if (_Order!=0) ZeroBarOrd=true; //есть ордер
else ZeroBarOrd=false; //нет ордера

Автор: NoName 10.8.2007, 15:40

Привет, Леонид! Получил почту, спасибо. Правда небыло времени глянуть пока.
А на счёт блокировки, ты прав всё дело с этими строками.

Цитата
Вот так получилось . Но открывает на одном баре всё равно....
Похоже вот с этим тут надо подсуетиться -
if (_Order!=0) ZeroBarOrd=true; //есть ордер
else ZeroBarOrd=false; //нет ордера

Основная идея такая: если по приходу нового бара есть открытый ордер, то ZeroBarOrd присваивается true, если нету false. Также этой переменной нужно присвоить значение true после каждого успешного выполнения OrderSend.
Это я описал для одной пары. Для других пар этот блок нужно продублировать. Обрати внимание, что ZeroBarOrd должна быть объявлена как static на глобальном уровне (вне всяких функций).

Автор: leonid553 10.8.2007, 16:21

Ок! Там в трехвалютке не отображалась информация на графике.
Разобрался почему!
В блоке отображения инф-и нужно раскомент. две строки в самом конце:
//info=StringConcatenate(info,on_off,"\r\n");
//info=StringConcatenate(info,"\r\n");

Автор: NoName 11.8.2007, 12:48

Цитата
Вот ещё одна проблема!
У Arn-а на демоЛайте сейчас стоят три советника.
Два - скомп. файлы.
Но они серые, а не синии.


По поводу цвета значков. Попробовал у себя положить только исполняемый файл .ex4 В навигаторе он отобразился серым цветом. Если ложить исходник, отображается синим цветом.

Автор: leonid553 11.8.2007, 12:53

Поставил вопрос на MQ
http://forum.mql4.com/ru/7838
Но ответа пока нет....

Автор: leonid553 13.8.2007, 15:22

to NoName:
Вот ещё идея подошла!
Нет необходимости ограничивать число пар в советнике. Можно заложить в него 5-8 пар. Которые удовлетворительно работают по этой тактике. А число открытых ордеров при необходимости мы можем ограничить, если в условие открытия каждой пары добавим примерно вот такую конструкцию:

Код
if ExpertOrder (int VersionID)<=3 //если откр. позиций меньше 3-х
{
if (GBP) {     //если ордеров по паре GBPUSD нет и "выключатель" включен
{
if (!ExpertOrder(MagicGBP))
{
.... ... ...
//-----------------------------------------
bool ExpertOrder (int VersionID)

Глянь на почту.

Автор: leonid553 17.8.2007, 13:36

Решил проблему с библиотекой "b-lots".
Добавил пару строчек и ввел ограничение.

Заложил в мультивалютную версию кроме классических и ещё одну - с вызовом индикатора I-Stoch_Env/
Но почему-то она не дает работать советнику. Хотя сама работает.
Мешает вот этот блок:

double Env__low[2];
//double Env__up [2];
//double Env__low_[2];
double Env__up_ [2];

double St[2];
Env__low[0]= iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,1,2,0);
St[0] = iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,1,0,0);
St[1] = iCustom(NULL,0,"i-StochEnv",Stoch_period,3,3,Env_period, Env_deviation,1,0,1);

double St_[2];
Env__up_[0] = iCustom(NULL,0,"i-StochEnv",Stoch_period_SELL,3,3,Env_period_SELL , Env_deviation_SELL,1,1,0);
St_[0] = iCustom(NULL,0,"i-StochEnv",Stoch_period_SELL,3,3,Env_period_SELL, Env_deviation_SELL,1,0,0);
St_[1] = iCustom(NULL,0,"i-StochEnv",Stoch_period_SELL,3,3,Env_period_SELL, Env_deviation_SELL,1,0,1);

Автор: leonid553 20.8.2007, 17:53

Цитата(NoName @ 31.7.2007, 17:22) *

Немного подумал и решил что всё же грамотнее будет использовать библиотеку.
Подправил для этой цели трал Игоря Кима.
Прикрепленный файл  a_SimpleTrailingMod.rar ( 1.04 килобайт ) Кол-во скачиваний: 311

Подключить как обычно:
#include <a-SimpleTrailingMod.mqh>

Вызывать: TrailingPositions(Magic);
В функцию нужно передавать Magic той позиции, которую нужно тралить.

Запутался я в мультивалютке с тралами! В онлайне трал с грехом пополам работает по одной паре и печатает ошибку
2007.08.20 22:49:52 MULUTIE_v1 GBPUSD,M1: Error(130) modifying SL:
Это - у меня на каждую пару свой трал.
Но если я воспользуюсь твоей модиф. библиотекой, то что получается?
Получается, что сразу по всем парам будут задаваться одинаковые значения Трейлинга?
НО зачем нужна такая библиотека?
Ведь каждая пара оптимизирована со своим значением трейлинга!
Или я что-то не понял?

Автор: Dimi 29.8.2007, 13:52

Вот попробовал на скорую руку советника сделать по амкам, знающие люди Помогите, Hilfe, Help!!!! smile.gif



Код
double CrossUp[];
double CrossDown[];

extern string AMkA1 ="Параметры 1 AMkA";
extern int       periodAMA    = 14;    //период расчёта к-та эффективности
extern double    nfast        = 2;    //период EMA для эффективного рынка
extern double    nslow        = 30;   //период EMA для неэффективного рынка
//---- расчёт сглаживающей константы
extern double    Pow          = 2.0;  //степень эффективности
//---- фильтр сигналов
extern double    dK           = 1.0;  //коэффициент для фильтра
extern bool      use_stdev    = true; //использовать стандартное отклонение
//---- применять к цене
extern int       app_price    = 5;    //по умолчанию - к типической

extern string AMkA2 ="Параметры 2 AMkA";
extern int       periodAMA2    = 40;    //период расчёта к-та эффективности
extern double    nfast        = 2;    //период EMA для эффективного рынка
extern double    nslow        = 30;   //период EMA для неэффективного рынка
//---- расчёт сглаживающей константы
extern double    Pow          = 2.0;  //степень эффективности
//---- фильтр сигналов
extern double    dK           = 1.0;  //коэффициент для фильтра
extern bool      use_stdev    = true; //использовать стандартное отклонение
//---- применять к цене
extern int       app_price    = 5;    //по умолчанию - к типической

extern double Deviation1 = -0.01;
extern double Deviation2 = -0.02;
extern double Arrow_Delta1 = 1.5;
extern double Arrow_Delta2 = 1.5;
static int PrevBar = 0;
//-------------------
extern int     TP=30;
extern int     SL=30;
//extern double  Lot=0.1;
extern int     Slippage=3;
//-------------------
int    ticket;
int    MAGIC;

color    clModifyBuy  = Green;
color    clModifySell = Blue;
//-- Подключаемые модули --
#include  <b-Lots.mqh>
#include  <a-SimpleTrailing.mqh>
//---------------------------

//*********************************************************************

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

   SetIndexLabel(2, "Fast_AMkA ("+nfast+")");
   SetIndexLabel(3, "Slow_AMkA ("+nfast2+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

//----
int limit, i, counter;
   double fasterMAnow, slowerMAnow, fasterMAprevious, slowerMAprevious, fasterMAafter, slowerMAafter;
   double Range, AvgRange;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
  
   for(i = 0; i <= limit; i++) {
  
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i;counter<=i+9;counter++)
      {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range=AvgRange/10;

      [b]fasterMAnow = (1+Deviation1/100)*iCustom(NULL, 0, "AMkA",periodAMA,nfast,nslow,Pow,dK,use_stdev,app_price,0,i);
      fasterMAprevious = (1+Deviation1/100)*iCustom(NULL, 0, "AMkA",periodAMA,nfast,nslow,Pow,dK,use_stdev,app_price,0,i+1);
      fasterMAafter = (1+Deviation1/100)*iCustom(NULL, 0, "AMkA",periodAMA,nfast,nslow,Pow,dK,use_stdev,app_price,0,i-1);

      slowerMAnow = (1+Deviation2/100)*iCustom(NULL, 0, "AMkA",periodAMA2,nfast2,nslow2,Pow2,dK2,use_stdev2,app_price2,0,i);
      slowerMAprevious = (1+Deviation2/100)*iCustom(NULL, 0, "AMkA",periodAMA2,nfast2,nslow2,Pow2,dK2,use_stdev2,app_price2,0,i+1);
      slowerMAafter = (1+Deviation2/100)*iCustom(NULL, 0, "AMkA",periodAMA2,nfast2,nslow2,Pow2,dK2,use_stdev2,app_price2,0,i-1);
//===== Ищем возможность войти в рынок =========================================================

int Orders=OrdersTotal ();     //получаем кол-во открытых ордеров
if (Orders==0)                 //если нет открытых ордеров
  {  
//---------проверяем условие на покупку----------------------------
            if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious)
            && (fasterMAafter > slowerMAafter)
            && (Time[0] != PrevBar))
               {CrossUp[i] = MathMin(fasterMAnow,Low[i]) - Arrow_Delta1*Range*0.5;
   {
  Lots=GetSizeLot();
  ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,0,0,CLR_NONE);
  if    (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }  
  else
     {
     if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
    
        { MAGIC=OrderMagicNumber(); }
        
     else  { Print("Ошибка при выборе ордера BUY #", GetLastError() ); }
     }            
   }
//------------------------------------------------------------------

//--------проверяем условие на продажу------------------------------
          if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious)
            && (fasterMAafter < slowerMAafter)
            && (Time[0] != PrevBar))
               {CrossDown[i] = MathMax(fasterMAnow,High[i]) + Arrow_Delta2*Range*0.5;
   {
  Lots=GetSizeLot();      
  ticket=OrderSend(Symbol(),1,Lots,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,0,0,CLR_NONE);
  if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); }
  else
     {
     if (OrderSelect(ticket, SELECT_BY_TICKET) == true)
    
       { MAGIC=OrderMagicNumber(); }
      
     else  {Print("Ошибка при выборе ордера SELL #", GetLastError() ); }
     }                
   }
  
//------------------------------------------------------------------
  }
//===============================================================================================
if (UseTrailing == true)  TrailingPositions();

//----
   return(0);
  }
//+------------------------------------------------------------------+



Условие работы взял из индюка, который сигналит при пересечении Амок. Не знаю можно так или нельзя blink.gif При компилировании выдает аж 25 ошибок unsure.gif

'Pow' - variable already defined
'dK' - variable already defined
'use_stdev' - variable already defined

в общем вот эти все nfast,nslow,Pow,dK,use_stdev,app_price и nfast2,nslow2,Pow2,dK2,use_stdev2,app_price2, - variable already defined







Автор: NoName 29.8.2007, 15:07

Скажу сразу что в суть кода не вникал.

variable already defined - переменная уже определена

То есть эти ошибки указывают на то что одна и та же переменная объявляется несколько раз. Этого делать нельзя. Переменная должна быть объявлена один при первом её упоминании в коде.

P.S.
Обрати внимание на то место где ты перечисляешь внешние параметры.

extern string AMkA1 ="Параметры 1 AMkA";
extern int periodAMA = 14; //период расчёта к-та эффективности
extern double nfast = 2; //период EMA для эффективного рынка
extern double nslow = 30; //период EMA для неэффективного рынка
//---- расчёт сглаживающей константы
extern double Pow = 2.0; //степень эффективности
//---- фильтр сигналов
extern double dK = 1.0; //коэффициент для фильтра
extern bool use_stdev = true; //использовать стандартное отклонение
//---- применять к цене
extern int app_price = 5; //по умолчанию - к типической

extern string AMkA2 ="Параметры 2 AMkA";
extern int periodAMA2 = 40; //период расчёта к-та эффективности
extern double nfast = 2; //период EMA для эффективного рынка
extern double nslow = 30; //период EMA для неэффективного рынка
//---- расчёт сглаживающей константы
extern double Pow = 2.0; //степень эффективности
//---- фильтр сигналов
extern double dK = 1.0; //коэффициент для фильтра
extern bool use_stdev = true; //использовать стандартное отклонение
//---- применять к цене
extern int app_price = 5; //по умолчанию - к типической

Выделенные переменные должны иметь другое название. Например nfast2, nslow2 и т.д.

Автор: leonid553 29.8.2007, 17:39

Dimi, возьми для начала одно - самое простое условие и заявляй для начала одну- две своих переменных. Не два десятка!
Разберись, чем отличаются double, int, bool
а ТАКЖЕ - как правильно записать iCustom
Что бы тебе не лазить по лекциям и путаным комментариям сделай так, как по рекомендации Hеlen-ы делал я когда - то:
Например. Установи в метаэдиторе в меню русский язык.
Далее в коде советника выдели мышкой интересующий тебя термин.
Например iCustom. После чего смело нажимай клавишу F1 !
и ты получишь справку - что такое iCustom - в самом низу метаэдитора. И как им правильно пользоваться. ----------------------------------------------------------------------------------------------
NoName совершенно верно заметил.
Ты одно название (например extern double nfast ) ЗАЯВЛЯВЛЯЕШЬ два раза! Во второй раз надо присвоить другое название. Т.к. это уже другая ЕМА

Автор: leonid553 29.8.2007, 18:03

но сначала вот что. В мт4 два типа индикаторов. Встроенные и пользовательские. Для того чтобы вызвать их в советник нужно по различному их вызывать.
Встроенные вызваются ( в разделе int start() ):
double Stochastic_0=iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
Пользовательские вызываются:
double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)
Для начала поясни - что ты хочешь сделать. Как использовать индикатор . Например , назови хотя бы одно из условий на вход и мы попробуем его реализовать в коде.

Автор: Dimi 29.8.2007, 20:28

Дааа блин, как все запущенно..... scare.gif Разбираться и разбираться еще.... Бум читать, учиться...

Автор: leonid553 30.8.2007, 5:44

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift)

Расчет указанного пользовательского индикатора. Параметры:

symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
name - Имя пользовательского индикатора.
... - Список параметров (при необходимости).
Передаваемые параметры должны соответствовать порядку объявления и типу внешних (extern) переменных пользовательского индикатора.
mode - Индекс линии индикатора. Может быть от 0 до 7 и должен соответствовать индексу, используемому одной из функций SetIndexBuffer.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Пример:
double val=iCustom(NULL, 0, "SampleInd",13,1,0);
*******************************************************
'Это в справке так изложено. У тебя в коде значится:
iCustom(NULL, 0, "AMkA",periodAMA,nfast,nslow,Pow,dK,use_stdev,app_price,0,i);

Остановимся для начала на периоде. Пусть у нас будет покупка когда Амка с малым периодом (быстрая) пересекает Амку с большим периодом (медленную) снизу вверх.
Продажа - соответственно наоборот - сверху вниз.
Таким образом во внешних параметрах советника будут заданы для начала эти периоды.

Автор: leonid553 30.8.2007, 6:55

Код
//+------------------------------------------------------------------+
// |Амка
// | Dimi
//| http://www.tradersforum.net.ru/
//+------------------------------------------------------------------+
#property copyright "Dimi"
#property link "http://www.tradersforum.net.ru/"

//---- input parameters---------
extern int periodAMA_1=13;
extern int periodAMA_2=34;
//------------------------------
extern int TP=30;
extern int SL=30;
extern double Lot=0.1;
extern int Slippage=3;

int ticket;

//*********************************************************************

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

// вычисляем текущие значения Амок быстрой и медленной
double AMKA1_0 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,nfast,nslow,Pow,dK,use_stdev,app_price,0,0);
double AMKA2_0 = iCustom(NULL, 0, "AMkA", periodAMA_2 ,nfast,nslow,Pow,dK,use_stdev,app_price,0,0);

// вычисляем предыдущее значения Амки быстрой
double AMKA1_1 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,nfast,nslow,Pow,dK,use_stdev,app_price,0,1);

//===== Ищем возможность войти в рынок =========================================================

int Orders=OrdersTotal (); //получаем кол-во открытых ордеров
if (Orders==0) //если нет открытых ордеров
{
//---------проверяем условие на покупку----------------------------
if ( бла-бла-бла )
{
ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,0,0,CLR_NONE);
if (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }
}
//------------------------------------------------------------------

//--------проверяем условие на продажу------------------------------
if (бла- бла - бла)
{
ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,0,0,CLR_NONE);
if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); }
}

//------------------------------------------------------------------
}
//====================================================================

//----
return(0);
}
//+------------------------------------------------------------------+

Вместо параметров :
nfast,nslow,Pow,dK,use_stdev,app_price
Нужно задать пока конкретные числа. Кот . у тебя стоят по умолчанию.

Автор: Dimi 30.8.2007, 7:11

Привет!!! Давай наверное начнем с самого начала. Я так понял, что вот эти (nfast,nslow,Pow,dK,use_stdev,app_price) вообще не нужны или??? Тогда получиться, где вводим переменные

Код
double CrossUp[];
double CrossDown[];

extern string AMkA1 ="Параметры 1 AMkA";
extern int       periodAMA    = 14;    //период расчёта к-та эффективности
extern string AMkA2 ="Параметры 2 AMkA";
extern int       periodAMA2    = 40;    //период расчёта к-та эффективности
extern double Deviation1 = -0.01;
extern double Deviation2 = -0.02;
extern double Arrow_Delta1 = 1.5;
extern double Arrow_Delta2 = 1.5;
static int PrevBar = 0;
//-------------------
extern int     TP=30;
extern int     SL=30;
//extern double  Lot=0.1;
extern int     Slippage=3;
//-------------------
int    ticket;
int    MAGIC;

color    clModifyBuy  = Green;
color    clModifySell = Blue;
//-- Подключаемые модули --
#include  <b-Lots.mqh>
#include  <a-SimpleTrailing.mqh>
//---------------------------

//*********************************************************************


Тогда дальше получиться

Код
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

double val=iCustom(NULL, 0, "AMkA",periodAMA,0,i);



О, пока я тут все сочинял, ты уже написал!!! smile.gif

Автор: leonid553 30.8.2007, 10:27

Значения (nfast,nslow,Pow,dK,use_stdev,app_price) нам нужны. Но мы не будем их делать пока переменными. Оставим их постоянными. И в
iCustom(NULL, 0, "AMkA", periodAMA_1 ,nfast,nslow,Pow,dK,use_stdev,app_price,0,0);
мы вствим вместо них - их числовые значения кот. стоят по умолчанию в самом индюке.
nfast=2,
nslow=30,
Pow=2,
dK=1,
pp_price=5

А вот параметр use_stdev=true, - правильно ли он поставлен в iCustom ? Да и др. параметры тоже...

Автор: leonid553 30.8.2007, 10:52

условия на покупку - вместо
if (бла- бла-бла)

if ((AMKA1_1 < AMKA2_0) && (AMKA1_0 > AMKA2_0) )
// покупаем
//**************************************************
на продажу:
if ((AMKA1_1 > AMKA2_0) && (AMKA1_0 < AMKA2_0) )

Автор: Dimi 30.8.2007, 11:21

Если кто знает, отзовитесь пожалуйста!!!

Вот это условие правильно записано???

Код
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

// вычисляем текущие значения Амок быстрой и медленной
double AMKA1_0 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,0);
double AMKA2_0 = iCustom(NULL, 0, "AMkA", periodAMA_2 ,2,30,2,1,5,0,0);

// вычисляем предыдущее значения Амки быстрой
double AMKA1_1 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,0);


Вот этот вот iCustom непонятно

Автор: leonid553 30.8.2007, 13:17

вот только обратил внимание, что индюк работае скорее всего по открытиям баров. Не по тикам.
Это означает, что надо ввести в советник соотв. условие.
Тогда последний "0" в строке, - это значение Амок ( быстр. и медл.) на вновь только что открывшемся баре.
double AMKA1_0 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,0);
double AMKA2_0 = iCustom(NULL, 0, "AMkA", periodAMA_2 ,2,30,2,1,5,0,0);

А в след. строке - "1" - означает значение индюка на предыдущем баре.
double AMKA1_1 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,nfast,nslow,Pow,dK,use_stdev,app_price,0,1);

- у тебя неверно скопировано - глянь внимательнее! (посл. цифра=1 а не 0 как у тебя )

ВВел в код условие работы по ценам открытия.
И вроде заработал эксперт.

Код

//+------------------------------------------------------------------+
// |Амка
// | Dimi
//| http://www.tradersforum.net.ru/
//+------------------------------------------------------------------+
#property copyright "Dimi"
#property link "http://www.tradersforum.net.ru/"

//---- input parameters---------
extern int periodAMA_1=13;
extern int periodAMA_2=34;
//------------------------------
extern int TP=55;
extern int SL=55;
extern double Lot=0.1;
extern int Slippage=3;

int ticket;
static int    prevtime = 0;


//*********************************************************************

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(Time[0] == prevtime)
       return(0);  
   prevtime = Time[0];

  // вычисляем текущие значения Амок быстрой и медленной
double AMKA1_0 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,0);
double AMKA2_0 = iCustom(NULL, 0, "AMkA", periodAMA_2 ,2,30,2,1,5,0,0);

// вычисляем предыдущее значения Амки быстрой
double AMKA1_1 = iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,1);

//===== Ищем возможность войти в рынок =========================================================

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

{
ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,0,0,CLR_NONE);
if (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }
}
//------------------------------------------------------------------

//--------проверяем условие на продажу------------------------------
if ((AMKA1_1 > AMKA2_0) && (AMKA1_0 < AMKA2_0) )

{
ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,0,0,CLR_NONE);
if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); }
}

//------------------------------------------------------------------
}
//====================================================================

//----
return(0);
}
//+------------------------------------------------------------------+

Тестировать нужно по ценам открытия.
И даже с этими параметрами от фонаря - показал прибыль за 2007г. на н4 по фунту.!
Но что-то не совсем пока корректно он работает.

Автор: Dimi 31.8.2007, 6:38

Вот глянь, Леонид. Вставил твои библиотеки.

Прикрепленный файл  Sovetnik_Amka.rar ( 4.46 килобайт ) Кол-во скачиваний: 271

Автор: leonid553 31.8.2007, 9:30

Надо разобраться с
iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,0);
Похоже здесь ошибка у нас

Автор: leonid553 1.9.2007, 17:14

to NoName,
для блокировки никак не могу разобраться с таким вариантом открытия (в др. вариант вставил):

Код
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }  
int OrdersGBP=OrdersTotal();//ExpertOrder();
if (isNewBar) {
if (OrdersGBP!=0) ZeroBarOrd=true;  //есть ордер
else           ZeroBarOrd=false; //нет ордера
}
//***************************************************************
if (!ZeroBarOrd)      
  {  
//-------Проверяем условие на покупку-------------
if  (     (Stochastic_1<En0_low) &&
          (Stochastic_0>En0_low)      )
    {  
  //---- Цикл открытия ордера  -------------------------------------------                      
int Cnt=1;
  while (Cnt <= 5)
  { //-----покупаем--------------
    Lots=GetSizeLot();
ticketGBP=OrderSend("GBPUSD",OP_BUY,Lots,ask_GBP,3,bid_GBP - sl_GBPUSD_long*point_GBP,
                          ask_GBP+tp_GBPUSD_long*point_GBP,"M_1", MagicGBP, 0, Blue);
         if (ticketGBP > 0)  break;    
else
{ Print ("Ошибка открытия Buy GBP#", ErrorDescription( GetLastError() ),
                                                  " попытка ", Cnt);
                                                                                
        if (Cnt==5) return(0);  //если за 5 попыток не закрыли - выходим
        Cnt++;
        Sleep(15000); // ждём 15 секунд
      }    
    }
  }


Не соображу - куда вставить строку
" else ZeroBarOrd=true; "
Куда ни поставлю - всё невпопад!



Автор: NoName 2.9.2007, 11:09

По куску кода сложно понять куда именно его нужно вставить в данном случае. Но основная идея такая: ZeroBarOrd (переменная отвечающая за наличие ордеров на нулевом баре) получает значение true в случаях:
1. При появлении нового бара и наличии открытой позиции, иначе false;
2. При каждом успешном открытии позиции.

1 пункт выполняется строками:

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


А что бы выполнился второй пункт нужно вставить:
Код
ZeroBarOrd=true;
после каждого успешного открытия позиции.

Ещё раз напомню что ZeroBarOrd - статическая переменная объявленная на глобальном уровне.
Код
static bool ZeroBarOrd;

Автор: leonid553 2.9.2007, 12:16

Да - так и заявил. В глобальные.
В обычном коде вставил и заработало :

Код
if (!ZeroBarOrd)      
  {  
//---------проверяем условие на покупку----------------------------
  if   (  ((Stochastic_1b<MA_low)  &&
          (Stochastic_0b>MA_low)) || (ma_1<MA_0 && ma_0 > MA_0)  )
   {
   Lots=GetSizeLot();
ticket_=OrderSend("GBPJPY",0,Lot,ask_GBPJPY,Slippage,bid_GBPJPY-SL*point_GBPJPY,                     ask_GBPJPY+TP*point_GBPJPY,"M_3",MagicGBPJPY,0,CLR_NONE);
if (ticket_<0){Print("Ошибка открытия ордера BUY GBPJPY#",GetLastError()); return(0);
  }  
   else ZeroBarOrd=true;            
   }


Здесь же (выше в пред. посте) ситуация иная! Там после успешного открытия позиции уже есть
одно else

Автор: NoName 2.9.2007, 13:44

Если имеется ввиду этот момент, то нужно написать так:

Код
ticketGBP=OrderSend("GBPUSD",OP_BUY,Lots,ask_GBP,3,bid_GBP - sl_GBPUSD_long*point_GBP,
                          ask_GBP+tp_GBPUSD_long*point_GBP,"M_1", MagicGBP, 0, Blue);
         if (ticketGBP > 0) { ZeroBarOrd=true;  break; }  
else
{ Print ("Ошибка открытия Buy GBP#", ErrorDescription( GetLastError() ),
                                                  " попытка ", Cnt);

Автор: leonid553 2.9.2007, 15:50

Благодарю. Сейчас попробуем...

Автор: leonid553 4.9.2007, 6:57

Опять проблемы с блокировкой! В мультивалютном.
Пока поставил блокировку только на одну пару в мультивалютном. Но ..., эта пара вообще перестала включаться!
Как было велено, на глобальном уровне заявил:

Код

int ExpertBars;
static bool ZeroBarOrd;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
ExpertBars = Bars;

   return(0);
  }


Идем далее .

Код

if (GBP_JPY) {     //если  "выключатель" включен
if (!ExpertOrder(MagicGBPJPY)) { //если ордеров по паре GBPJPY нет

//**********************Блокировка******************************
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }  
int Orders=OrdersTotal();//ExpertOrder();
if (isNewBar) {
if (Orders!=0) ZeroBarOrd=true;  //есть ордер
else           ZeroBarOrd=false; //нет ордера
}
//***************************************************************
if (!ZeroBarOrd)      
  {  
//---------проверяем условие на покупку----------------------------
  if   (  бла-бла-бла  )
   {

ticket_=OrderSend("... ... ...);
if (ticket_<0){Print("Ошибка открытия ордера BUY GBPJPY#",GetLastError()); return(0);
  }  
  // else ZeroBarOrd=true;            
   }

Видимо дело здесь в строке
if (Orders!=0) ZeroBarOrd=true; //есть ордер

Как ты писал выше вместо if (Orders!=0)
нужно наверное задать - if (OrdersGBPJPY!=0)

Но у нас не заявлена эта переменная! Не соображу - где и как её заявить!
Видимо в строке выше
int Orders=OrdersTotal();//ExpertOrder();

И согласовать её с начальным условием
if (!ExpertOrder(MagicGBPJPY)) { //если ордеров по паре GBPJPY нет

Запутался я совсем...
Боюсь что,
bool isNewBar=false;
тож придется заявлять на глобальном уровне ...

Автор: Dimi 4.9.2007, 9:03

Привет всем!!! Леонид, ты использовал хоть раз a-ATR_Trailing.mqh в советниках??? Сразу вроде бы мне понравился ( в некоторых местах очень красиво передвигает стоп, даже можно поучиться у него этому smile.gif ) Но что-то меняю в нем период, а он никак не реагирует на это. Не знаешь почему???

Автор: leonid553 4.9.2007, 10:50

А что это такое? Не сталкивался с таким ни разу.
Кстати по определению тренда.
Rosh, на форуме метаквотов приводил пример в своем советнике - как программно задать ( опред-ть) - тренд/не тренд.
Там, правда, без стакана не разберешься.....
http://codebase.mql4.com/ru/1256

Автор: leonid553 4.9.2007, 12:48

Вроде выясняется с блокировкой вопрос. Вот как сделал -

Код

//**********************Блокировка******************************
//bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }  
if (isNewBar) {
if (ExpertOrder(MagicGBPJPY)) ZeroBarOrd=true;
else           ZeroBarOrd=false; //нет ордера
}
//***************************************************************
if (!ZeroBarOrd)      
  {  
//---------проверяем условие на покупку----------------------------


Так и пришлось заявить //bool isNewBar=false;
в глобальные переменные. Иначе - ошибка выдавалась!

Автор: Dimi 4.9.2007, 14:47

Цитата(leonid553 @ 4.9.2007, 10:50) *

А что это такое? Не сталкивался с таким ни разу.
Кстати по определению тренда.
Rosh, на форуме метаквотов приводил пример в своем советнике - как программно задать ( опред-ть) - тренд/не тренд.
Там, правда, без стакана не разберешься.....
http://codebase.mql4.com/ru/1256

Про это вот http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=30

Да действительно без стакана не разобраться... Прийдется стакан налить smile.gif

Автор: leonid553 23.9.2007, 12:02

Dimi, посмотрел и вник в систему входов. Прикидывал и так и эдак... Пришел к выводу, что использование индикатора В-Bonds вряд ли целесообразно. При таком алгоритме входов.
Вот почему . Индюк считается трендовым. Иначе говоря, при отсутствии тренда канал сужается и здесь оправдана торговля отскоком от границ канала внутрь. Поскольку предполагается, что 90% времени цена находится в границах канала - внутри. При наличии тренда границы канала расширяются, а цена практически постоянно болтается на самой границе, многократно её пересекая. И мы входим в рынок на этих пересечениях, - против тренда!. Таким образом прежде, чем поймать перелом этого тренда, мы получим сначала пару лосей!
Есть ещё один момент. В ОПИСАНИЯХ индикатора говориться, что если при тренде выброс цены уходит за границу более, чем на 30% от ширины канала, то неминуем быстрый возврат назад - внутрь границ. Вероятность взятия прибыли здесь = 80% . Но этот случай надо уже отдельно задавать программно, и это не так просто.
На графике - типичный пример работы эксперта, - трeнд вниз, а входы в основном вверх - со всеми вытекающими....


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 23.9.2007, 12:13

А если взять менее чуствительный канальный индикатор? В самом простейшем случае - добавить обычную МА(син) и провести по ней верхнюю и нижнюю границы(желт)?
И ещё там ты спред задаешь во внешних параметрах и привязываешь его к стоплоссу. А зачем? Зачем вручную задавть спред для тестируемой пары, - когда советник может вычислить его самостоятельно!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: leonid553 23.9.2007, 12:28

Это можно сделать вот так:
В глоб. переменных (во внеш. параметрах) добавь
static int spread = 3;
А потом

Код

int start()

// Если появляется новая свеча то в первую секунду проверяем возможность сделки
   if(Time[0] == prevtime)
       return(0);
   prevtime = Time[0];
//----ВСТАВЬ В КОД ЭТОТ КУСОЧЕК :
   if(IsTradeAllowed())
     { spread = MarketInfo(Symbol(), MODE_SPREAD); }
   else      {  prevtime = Time[1];  return(0);  }

После чего замени в покупке и продаже
Spread_long; Spread_short на spread

Автор: Dimi 24.9.2007, 12:31

Цитата(leonid553 @ 23.9.2007, 12:13) *

А если взять менее чуствительный канальный индикатор? В самом простейшем случае - добавить обычную МА(син) и провести по ней верхнюю и нижнюю границы(желт)?
И ещё там ты спред задаешь во внешних параметрах и привязываешь его к стоплоссу. А зачем? Зачем вручную задавть спред для тестируемой пары, - когда советник может вычислить его самостоятельно!

Идея не плохая с этой МА!!! Попробую сделать и расчет спрэда вставлю. Спасиб!

Автор: leonid553 24.9.2007, 14:25

ещё проще - взять уже готовый код - индюк Envelopes В его классической установке -
(отклонение задавать в долях, напр. =0.25)


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: Dimi 24.9.2007, 15:02

Леонид, объясни мне пожалуйста. Как две версии советника в один вставить??? И чтоб можно было их по отдельности включать выключать. Что то пытаюсь, а нифига не получается. blink.gif

Автор: leonid553 24.9.2007, 15:52

По одной паре или по разным?
Глянь в почту. Послал мультивалютную версию (три в одном)
Если надо по одной паре, - то там проще намного будет.

p.s. Сделай пож. на счету по фунту в эксперте LotsWayChoice = 0
Сыроват он ещё для реала - надо понаблюдать, как он с постоянным лотом будет работать....

Автор: Dimi 24.9.2007, 22:27

Усе гатова, Шеф!!! Ноль дак ноль smile.gif "Три в одном" получил, тружусь дальше wink.gif Спасиб!!!

Автор: leonid553 26.9.2007, 13:53

Исправил ошибки в эксперте. Теперь трал по второй версии заработал. Код можно упростить. Т.к. некоторые переменные - одинаковые для обеих версий. Их можно вынести в общие переменные.
Но вот сделки в селл, - никак не получаются. Не дают профита.
Посмотрел в визуальном режиме. И оч. удивился! Этот алгоритм "по определению" не должен давать прибыль! Ни в бай, ни в селл. Но, тем не менее, дает неплохой результат при длинных сделках, да ещё с мизерной просадкой! - 300 пипсов с янв. 2006г.
Но так не может быть, - это видно из графиков ниже, - почти по всей истории эксперт постоянно (без исключений) работает против тренда - когда тренд, вверх советник продает! Когда тренд вниз, - советник покупает! Откуда здесь может быть прибыль ПРИ ДЛИННЫХ СДЕЛКАХ - полная загадка!
А при коротких сделках прибыли нет и не будет - это очевидно - см. график.
Красн. треуг. - сделки в селл. Синии - в бай. Молотит против тренда....
Похоже, ты где-то что-то в условиях написал так, что алгоритмы входа длинных и коротких сделок отличаются. Надо найти это отличие. Я пока не нашел. Но тебе, - как автору, это легче сделать.
Чуть позже приведу эксперт в "читабельный" вид и пришлю....





Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне
Прикрепленное изображение в новом окне

Автор: leonid553 26.9.2007, 14:33

Dimi, похоже придется нам вникать в определитель тренда в эксперте у Rosh-а

Ну ладно.
Вот ты поставил условия на продажу:
//--------проверяем условие на продажу------------------------------
if (
(ZeroLagRed_sell > 70) && (ZeroLagGreen_sell>90) &&
//-----------------------------------------------------------------------------
Но если эти линии находятся в верней части графика, - то это однозначно означает, что имеет место тренд вверх!!!!
А ты хочешь продавать ....
И при покупке тож самое....
Конечно рано или поздно тренд закончится, цена развернется и мы поймаем одну, - последнюю, прибыльную сделку. Но при этом, предыдущие несколько сделок будут вступать против тренда и мы предварительно наловим лосей...

Автор: Dimi 26.9.2007, 15:01

Я уже понял, что на селл там профитом и не пахнет, как ни крути mad.gif А вот на бай работает и работает smile.gif Да надо разбираться дальше.... И по поводу трэнда тож и наверное даже в первую очередь...

Автор: leonid553 27.9.2007, 16:06

Dimi, убрал две строки из кода индикатора ZeroLag///
В последней (реверсной) версии эксперта нужно трейлинг тоже переделать немного. Иначе он будет общий на обе версии в бай.
В реверсном варианте по второй версии в бай получилось с янв 2006г после оптимизации на глазок:
суммарный результат по GBPCHF, M30
Чистая прибыль 4760.77
Общая прибыль 10504.61
Общий убыток -5743.85
Прибыльность 1.83 Матожидание выигрыша 19.92
Абсолютная просадка 42.64
Максимальная просадка 719.59 (4.77%) Относительная просадка 4.77% (719.59)

Всего сделок 239
Короткие позиции (% выигравших) 0 (0.00%)
Длинные позиции (% выигравших) 239 (67.36%)
Прибыльные сделки (% от всех) 161 (67.36%)
Убыточные сделки (% от всех) 78 (32.64%)
Самая большая прибыльная сделка 263.60
убыточная сделка -77.62
Средняя прибыльная сделка 65.25 убыточная сделка -73.64
Максимальное количество непрерывных выигрышей (прибыль) 12 (906.81) непрерывных проигрышей (убыток) 4 (-298.71)
Неплохой процент прибыльных сделок!

Не совсем понятно, - что именно надо куда подвесить на этот индюк - ZeroLag. Там уже так сделано. Красная линия уже подвешена на зеленый стохастик. И подвесить в свою очередь на неё дополнительную МА мне не представляется возможным. Потому что дополнительная МА опять же вешается на зеленую линию. См. рис. - дополн. МА - желтого цвета.




Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: Dimi 27.9.2007, 16:14

Можешь забыть про эту МА, бред это dry.gif Я уже визуально проверил по истории. Я вот тут подумал может лучевую тактику попробовать применить как фильтр. то есть позиции открываются только в направлении луча либо на перегибах???? Вот сижу читаю теперь, что вы там придумали по ней с Андреем... Да и трал думаю надо получше может тот 3 уровневый???

Автор: leonid553 27.9.2007, 17:27

Ну трал-то не проблема вставить другой. Тот трех-уровневый получше, конечно, отрабатывает. Но не всегда. По евроиене он идеально подходит. По другим парам, - только опытным путем нужно выяснять.
Чтобы вставить его в код нужно ввести в глобальные переменные

Код
//**************************************
int    MAGIC;
color clOpenBuy    = LightBlue;
color clOpenSell   = LightCoral;
color clCloseBuy   = Blue;
color clCloseSell  = Red;
color clModifyBuy  = Aqua;
color clModifySell = Tomato;
extern bool   UseSound      = False;        // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла

//-- Подключаемые модули --
#include  <b-Lots.mqh>
#include <stdlib.mqh>
#include <a-TLE_v.1.6.mqh>
//**********************************************

А там, где продаешь/покупаешь после
Код
ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point,NULL,MAGIC,0,CLR_NONE);
      if    (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }  

Нужно вставить
Код
else
     {
     if (OrderSelect(ticket, SELECT_BY_TICKET) == true)    
        { MAGIC=OrderMagicNumber(); }        
     else  { Print("Ошибка при выборе ордера BUY #", GetLastError() ); }
     }  

И ещё нужно вставить строчу в конце (или в начале) функции int start() перед return(0);
Код
if (UseTrailing) TrailingPositions();
  return(0);
  }

Попробуй для начала поставить его во вторую (реверсную) в бай версию. и сравни с первой. - какой трал лучше работает.
***********************************************************
По лучевой тактике - ничего не могу сказать. Я просто не представляю как ZUP программно хотя бы вызвать в коде. А ещё при этом и по ценам открытия ! Но зигзаг то по всем тикам работает. И конца оптимизиции такого алгоритма эксперта наши внуки не дождутся....

Есть ещё мыслишка.... cool.gif По определению тренда. Глянь картинку -


Эскизы прикрепленных изображений
Прикрепленное изображение в новом окне

Автор: Dimi 27.9.2007, 17:40

Честно говоря не очень понял как там можно трэнд определить.... А трал сейчас вставлю.

Автор: leonid553 27.9.2007, 18:23

Вот подметил я любопытную закономерность в работе этого цифрового индюка !
При хорошем трендовом рынке (например - тренд вниз) почти вся гистограмма уходит в минусовую зону. При этом, при даже оч. мелких коррекциях (против тренда) небольшие бугорки выходят ненадолго в плюсовую зону и потом опять возвращаются в глубоко в минус. Это очень хорошо видно на графиках! Если мы подвесим на гистoграмму МА (КРАСНАЯ ЛИНИЯ), то при трендовом рынке получаем отличные входы строго по тренду! При пересечении малыми бугорками гистограмы линии МА вблизи нулевой линии мы входим в рынок, - входы показал стрелками. И для UP-тренда и для DOWN-тренда.
Нужно лишь статистически (при оптимизации) подобрать допустимый макс. размер этих бугорков. Программно это нетрудно реализовать.
Но и это эщё не все. Есть и др. закономерности в работе этого индюка! На первый взгляд противоречущие здравому смыслу, но .... (см. галочку на одном из графиков)


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне
Прикрепленное изображение в новом окне

Автор: Dimi 27.9.2007, 18:35

Можно попробовать, но я уж точно это дело программно не смогу пока написать. Я вот тут заметил, мы с тобой такую хрень придумываем и самое интересно, что она почему-то работает smile.gif tongue.gif biggrin.gif Сейчас достал все индюки из заначки и пытаюсь что-нибудь подходящее подобрать....

Автор: leonid553 28.9.2007, 14:22

Я как то уже излагал свою мысль в другой ветке по автоматическим системам и в статье у MQ.
Основная идея - не сущ. алгоритма общего, - способного приносить прибыль при любой ситуации.
Какой то алгоритм работает лучше при тренде вверх, другой - при флете. Третий, - при тренде вниз и т.п. Отсюда - вывод...:
надо делать различные версии для каждого такого случая и ОДНОВРЕМЕННО запускать их в работу. В идеале - обьединиТь их в один советник!
Нечто похожее я попытался реализовать в своем конкурсном эксперте для чемпионата Роботов-2007.
Там у меня работают по одной паре три версии, каждая из которых оптимизирована по различным резонам.
Но реализация там ещё очень сырая из за недостатка времени и опыта. Я только в январе/феврале этого - 2007г. впервые заглянул внутрь эксперта в метаэдиторе. Не имея при этом ни малейшего представления о программировании. И еле-еле успел представить свой советник за пару дней до конца регистрации.
Вот тест с янв. 2006г:
LADA_TTT
Символ EURJPY (Euro vs Japanese Yen)
Период 30 Минут (M30) 2006.01.02 - 2007.09.28
Модель Все тики (на основе всех наименьших доступных периодов с фрактальной интерполяцией каждого тика)
Качество моделирования 90.00%

Начальный депозит 1000.00
Чистая прибыль 600230.82
Общая прибыль +1312461
Общий убыток -712230
Прибыльность 1.84 Матожидание выигрыша 593.70
Абсолютная просадка 226.13 Максимальная просадка 37372.03 (9.75%)
Относительная просадка 42.44% (570.47)

Всего сделок 1011
Короткие позиции (% выигравших) 360 (54.44%)
Длинные позиции (% выигравших) 651 (58.06%)
Прибыльные сделки (% от всех) 574 (56.78%) Убыточные сделки (% от всех) 437 (43.22%)
Самая большая прибыльная сделка 6975.09 убыточная сделка -2887.02
Средняя прибыльная сделка 2286.52 убыточная сделка -1629.82
Максимальное количество непрерывных выигрышей (прибыль) 11 (10699.01)
непрерывных проигрышей (убыток) 8 (-17499.04)
--------------------------------------------------------------------------------
При этом вне выборки за сентябрь прибыль составила несколько десятков тысяч! Вот бы и в реале он так же бы работал!


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: Dimi 28.9.2007, 18:44

Так то оно так вот только надо решить одну задачку, когда трэнд, когда флэт??? Вариантов разных много вот только для эксперта подходящего нет пока.... И практически все запаздывают, то есть пока разберёшься что к чему, то уже только верхушки остаются. Хорошо когда затяжные трэнды и флеты есть. Но они не так уж и часто бывают....

Автор: leonid553 28.9.2007, 19:13

Да задачка непростая...
Тогда можно подойти к решению иначе. Оставить в стороне тренд и флет. И посмотреть, - а какие другие критерии и резоны существуют?
Например критерий оптимального входа.
Возьмем индикатор Стохастик. Мы знаем, что по классичеcким правилам его использования вход в рынок, - это пересечение линией стохастика зоны перекупленности/перепроданности снаружи внутрь. А если поискать нестандартное решение? На гафике ниже видно, что если мы будем исполнять входы не так, как нам диктуют классические правила, а немного наоборот, - против здравого (на первый взгляд) смысла, то из каждых четырех сделок в трех мы строго берем профит!

Автор: leonid553 29.9.2007, 8:27

Известно, что при трендовом рынке или даже, просто, при достаточно хорошем движении Стохастик "любит" залипать в зонах перекупленности или перепроданности. Можно попробовать нестандартно использовать это свойство. Будем входить в рынок не так, как диктуют нам классические правила. А иначе! Наоборот будем покупать, когда стохастик изнутри наружу пробивает границу этих зон!
На графике я показал стрелками входы в бай и в селл.
ВЗЯЛ первый попавший график (честно - не подбирал специально!). Из пяти входов обозначенных стрелками в четырех мы строго берем профит! Да и в пятом (втором по графику - селл) входе при грамотном использовании трала мы, как минимум, будем в безубытке!
Конечно, для этой тактики нужно брать параметры не (5. 3. 3), а чуть увеличить К-период и замедление.
Например (20. 5. 3). Статистически подобрать уровни(границы) зон перекупленности/перепроданности.
Возможно, и ещё дополнить программно дополнительным индикатором в качестве фильтра.
В самом простейшем случае этот алгоритм можно использовать для доливки уже открытых позиций.
Но и в качестве отдельной тактики, я думаю, можно попробовать. Тем более, что советник здесь можно "слепить" за 20 мин.


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: Dimi 29.9.2007, 12:52

Идея довольно интересная, но без фильтра думаю здесь не обойтись. Да и границы не стоит опускать, не поднимать. Вообще не люблю я эту оптимизацию. Максимум можно трал,стоп да ТР оптимизировать. Эксперт должен чисто по системе работать без всякой там оптимизации. А система либо работает либо не работает. Это мое мнение wink.gif

Автор: leonid553 29.9.2007, 17:24

На скорую руку изготовил эксперт по описанной методике. Прибыль дал с полтыка с янв. 2006г - без оптимизации.
Потом отпимизировал период Стохастика и стопы. Вот результат:
Символ EURJPY (Euro vs Japanese Yen)
Период 1 Час (H1) (2006.01.01 - 2007.09.24)
Начальный депозит 10000
Чистая прибыль 4239.33
Общая прибыль 8971.69 Общий убыток -4732.36
Прибыльность 1.90 Матожидание выигрыша 18.84
Абсолютная просадка 140.28 Максимальная просадка 466.19 (4.15%)
Относительная просадка 4.15% (466.19)

Всего сделок 225
Короткие позиции (% выигравших) 100 (44.00%)
Длинные позиции (% выигравших) 125 (64.00%)
Прибыльные сделки (% от всех) 124 (55.11%) Убыточные сделки (% от всех) 101 (44.89%)
Самая большая прибыльная сделка 125.43 убыточная сделка -54.89
Средняя прибыльная сделка 72.35 убыточная сделка -46.86
Максимальное количество непрерывных выигрышей (прибыль) 7 (396.45)
непрерывных проигрышей (убыток) 5 (-247.80)


Эскизы прикрепленных изображений

Прикрепленное изображение в новом окне

Автор: meta-trader 3.10.2007, 22:50

Цитата(leonid553 @ 30.9.2007, 4:24) *

На скорую руку изготовил эксперт по описанной методике. Прибыль дал с полтыка с янв. 2006г - без оптимизации.
Потом отпимизировал период Стохастика и стопы. Вот результат:
Символ EURJPY (Euro vs Japanese Yen)
Период 1 Час (H1) (2006.01.01 - 2007.09.24)
Начальный депозит 10000
Чистая прибыль 4239.33
Общая прибыль 8971.69 Общий убыток -4732.36
Прибыльность 1.90 Матожидание выигрыша 18.84
Абсолютная просадка 140.28 Максимальная просадка 466.19 (4.15%)
Относительная просадка 4.15% (466.19)

Всего сделок 225
Короткие позиции (% выигравших) 100 (44.00%)
Длинные позиции (% выигравших) 125 (64.00%)
Прибыльные сделки (% от всех) 124 (55.11%) Убыточные сделки (% от всех) 101 (44.89%)
Самая большая прибыльная сделка 125.43 убыточная сделка -54.89
Средняя прибыльная сделка 72.35 убыточная сделка -46.86
Максимальное количество непрерывных выигрышей (прибыль) 7 (396.45)
непрерывных проигрышей (убыток) 5 (-247.80)



А где Ваш советник на Чемпе? Дайте ссылку

Автор: leonid553 4.10.2007, 8:09

http://championship.mql4.com/2007/ru/users?k=leonid553&x=25&y=7

Не всегда там ссылка почему-то работает.
Проще зайти на стр. http://championship.mql4.com/2007/ru/users Набрать там справа в строке УЧАСТНИКИ- leonid553 - в поиске и откроюся текущие сделки моего эксперта.

Автор: imsgfx 9.1.2008, 10:24

Леонид, Андрей спасибо за большую работу, ветка очень помогла при освоении НС. Подскажите, вы сейчас отказались от работы в данном направлении? Или я неправильно понял? Считаете ли вы его переспективным?


------------------------
С уважением, Игорь.

Автор: leonid553 16.1.2008, 11:49

Нет. Не отказались. Но при скромных знаниях по НС , видимо, более того, что тут уже сделано я ничего добавить не смогу. Разве что - http://articles.mql4.com/ru/403
Удачи !

Автор: Dark Trader 11.2.2008, 8:27

Здравствуйте, у меня такой вопрос. Я так понимаю при работе этого советника компьютер не должен выключаться даже в выходные?

Спасибо большое за проделанную работу, я немного модифицировал советника и выставил на конкурс. Правда опоздал на недельку.

Автор: leonid553 11.2.2008, 11:21

При работе любого эксперта компьютер должен быть включен и соед. с интернетом. На выходных рынок форекс не работает и комп. можно отключать. При включении эксперт опять "подхватывает" свои сделки и сопровождает их.
Однако. Описываемые в этой ветке эксперты раьотают по "ценам открытия" свечей. Т.е. в начале каждого часа (если эксперт работает на тф=н1) эксперт включается, анализирует ситуацию, закрывает , открывает или переворачивает позиции - после чего отключается до начала следующего часа. Таким образом , можно включать комп. каждый час в .n час 59 мин на несколько минут и потом выключать - до след. часа.
Или каждые 4 часа включать - если эксперт работает на тф=н4. И т.п....

Автор: Dark Trader 11.2.2008, 13:10

По поводу кода

double a1 = iAC(Symbol(), 0, 0);
double a2 = iAC(Symbol(), 0, 7);
double a3 = iAC(Symbol(), 0, 14);
double a4 = iAC(Symbol(), 0, 21);

Разве не целесообразней показания индикатора нормализовывать

double a1 = NormalizeDouble(iAC(Symbol(), 0, 0), 4);
double a2 = NormalizeDouble(iAC(Symbol(), 0, 7), 4);
double a3 = NormalizeDouble(iAC(Symbol(), 0, 14), 4);
double a4 = NormalizeDouble(iAC(Symbol(), 0, 21), 4);

или это не сказывается на результах вычислений перцептрона.
индикатор AC приведен для примера хотя так тоже интересно работает

double perceptron()
{
double w1 = x1;
double w2 = x2;

double a1 = NormalizeDouble(iAC(Symbol(), 0, 0), 4);
double a2 = NormalizeDouble(iAC(Symbol(), 0, 7), 4);

return (w1 * a1 + w2 * a2);
}

Автор: leonid553 12.2.2008, 20:44

Цитата(Dark Trader @ 11.2.2008, 8:27) *

я немного модифицировал советника и выставил на конкурс. Правда опоздал на недельку.

А что это за конкурс?, ГДЕ допускаются советники? Дайте пож., ссылку.
********************************************************************
Вот простая версия эксперта, адаптированного для тф м1 по Даксу. В качестве идеи по базовому элементу взят аналог советника Ю.Решетова - "AI- Исскуственный интеллект".
Эксперт включает в себя две версии - BULLS и BEARS, перцептроны которых выполнены на одноименных индикаторах. Версии можно отключать соответствующими опциями:
Bears = true/false;
Bulls = true/false;
Обе версии работают и в бай и в селл. Предполагается, что при совместном включении обоих (или обеих ? ) версий одна из них будет давать более точные сигналы для покупки. А другая - для продажи.
При тестировании на одномесячной истории с 1 дек. 2007г. лотом=0.1 на тф=м1 по индексу Дакс получились результаты:
Bulls = true
Начальный депозит 10000.00
Чистая прибыль 3402.87
Прибыльность 1.43
Относительная просадка 7.02% (778.05)
Всего сделок 381
Короткие позиции (% выигравших) 149 (61.74%)
Длинные позиции (% выигравших) 232 (54.74%)
//-------------------------------------------------------------------------
Bears = true
Начальный депозит 10000.00
Чистая прибыль 3529.09
Прибыльность 1.54
Относительная просадка 5.90% (626.48)
Всего сделок 302
Короткие позиции (% выигравших) 221 (52.49%)
Длинные позиции (% выигравших) 81 (50.62%)
//-----------------------------------------------------------------------------
Параметры :
PeriodBulls=8; x1=103; x2=100; x3=89; x4=161; sl=140;
PeriodBears=5; z1=110; z2=155; z3=105; z4=140; sl_=130;
Графики балансов по каждой версии - на рисунках. При совместной работе версий прибыль, понятно, суммируется.


Эскизы прикрепленных изображений
Прикрепленное изображение в новом окне


Прикрепленные файлы
Прикрепленный файл  N0_Bulls_Bears_v1.mq4 ( 12.32 килобайт ) Кол-во скачиваний: 544

Автор: Dark Trader 13.2.2008, 15:39

Конкурс проходит на сайте http://fx-invest.ru Начинающим -> Конкурс -> РАСПИСАНИЕ КОНКУРСОВ, проходит раз в месяц.

Тестирование советников провожу с депо = 200$ лот = 0.1 , считаю, что если эксперт может подняться с минимума он и с бОльшим депозитом справится :-)

Меня беспокоит только одно! Как было выше сказано, ему нужно попасть в такт, если тестить его с другой даты, отличающуюся на день-два, сливает сразу (не всегда конечно, к счастью).

Вот результаты тестов советника обсуждаемого в начале поста.


Прикрепленные файлы
Прикрепленный файл  StrategyTester.rar ( 8.15 килобайт ) Кол-во скачиваний: 152

Автор: leonid553 13.2.2008, 16:42

Dark Trader, тест нельзя назвать корректным. Что это за число сделок - чуть больше двадцати? При оптимизации тестер всяко сумеет выбрать из десятков миллиардов комбинациий х1-х8 несколько тысяч таких - где 99% сделок из этих 21 будут прибыльными. Т.е. получается обычная подгонка. А вот далее, - скорее всего будет слив! - Вот выложите результат теста (прогона) вне периода оптимизации - с 1янв. 2008г. по сей день, - посмотрим, что получилось!
И ещё, - я бы не рискнул ставить в реал эксперта, который за полгода на тф-н1 делает всего 21 сделку. Ну терпенья у меня не хватит ждать! А у вас ?
Все изложенное вовсе не означает, - что эксперт плохой или хороший. Просто тест надо провести так, чтобы сделок было не менее 100-150, и самое главное , - обязательно после оптимизации сделать контрольный прогон вне периода оптимизации. (вне выборки). Т.е. вы оптимизируете с 1.06.2007 по 31.12.2007.
А контрольный прогон нужно провести с 1 янв. 2008г. по сей день !

Автор: Tosik 20.3.2018, 10:51

Баров в истории 2348
Начальный депозит 1000.00
Чистая прибыль 3911.07
Общая прибыль 5859.70
Общий убыток -1948.63
Прибыльность 3.01
Матожидание выигрыша 35.23
Абсолютная просадка 50.84