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
Таким образом, если нам известно уравнение некой плоскости и координаты любых точек, то мы можем разделить множество всех точек пространства на два множества точек, разделяемых этой самой плоскостью.
ПОСТАНОВКА ЗАДАЧИ
Если мы разделим объекты на два класса: открываемые длинные позиции и короткие позиции, а в качестве признаков возьмем значения индикаторов или осцилляторов технического анализа, то остается лишь выяснить уравнение плоскости и попытаться с ее помощью произвести идентификацию. Постановка задачи ясна.
Множества точек пересекаются в пространстве и провести четкую разделительную черту между ними невозможно. Единственным и приемлемым решением здесь является линия, которая будет отделять оба множества точек таким образом, чтобы с ее помощью большинство красных объектов оказалось по одну сторону, а синих по другую. На сей раз, мы имеем дело с задачей оптимизации, то есть поиском уравнения разделяющей плоскости или линии, способной максимально разделить два класса объектов друг от друга, но с вероятностью того, что часть точек, принадлежащих одному классу, будет ошибочно идентифицировано, как принадлежащих к классу другому.
Попробуем теперь определиться с постановкой задачи, которую мы собираемся решить. Элементарно, что нужно знать трейдеру для прибыльной торговли - это направление движения котировок. То есть если котировки пойдут вверх, то следует открыть длинную позицию. Если вниз, то необходимо открывать позицию короткую. Следовательно, два класса объектов у нас уже есть, а именно, направление движения котировок. Для того, чтобы принять решение, следуя техническому анализу, трейдеры прибегают к исследованию так называемых технических индикаторов или осцилляторов. Мы также будем исследовать осциллятор.
Поскольку технические осцилляторы - это гистограммы, значения которых отклоняются от горизонтальной линии, то соответственно и нейронная сеть нам понадобится с линейным фильтром. В качестве признаков объекта, будем брать паттерны, то есть значения осциллятора в четырех точках, взятые с шагом в семь периодов вглубь истории, начиная от текущего момента.
Эскизы прикрепленных изображений
На вышеприведенном рисунке значения осциллятора обведены кружочками. Присвоим их идентификаторам 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 слоев воедино и обучить последний слой.
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
Эскизы прикрепленных изображений
to NoName:
Твоя последняя версия "ST+ENV" - с переворотом, работает оч. прилично! Сам не ожидал!
Выгребает тренд - почти до дна!
Появилась мысль вставить в советник перцептрон с вызовом другого индикатора! Чтобы уменьшить число убыточных, нетрендовых входов.
"А я так и не смог от неё ничего путнего получить. Как не крутил - на бэктесте всё сливает, зараза. Так что подгонка, как говорится, на лицо "
---------------------------------------------------------------------------
Я тоже изначально не мог получить удовлетворительных результатов. Но потом дошло, в чем тут дело!!
Посмотрел в визуале работу нейро советника и обнаружил - как грамотно он работает при трендовом рынке.
По аналогии предусмотрел аналогичную комбинацию внешних параметров в ST+ENV, отказался от тейкпрофита (ну почти, сделал его = 250/300). Заменил его тралом, оптимизировал шаг трала - Tr/Step .
При этом обнаружилось, что теперь и наш советник "выгребает тренд" оч. неплохо!
Имеются, конечно "отдельные недостатки" - о них я писал в НЕСТАНДАРТНОЙ ТАКТИКЕ.
-----------------------------------------------------------------------------------
"На счёт перцептрона, а почему бы в сеть не подать сигналы самих "ST+ENV", без вызовов всяких индикаторов? Я примерно представляю как это программно описать, нужно будет индикатор состряпать. Но этим если и заниматься, то нужно создавать нормальную нейросеть, а то этот советник уж больно примитивный "
-----------------------------------------------------------------------------------
Поскольку индикатор ты уже "состряпал", то я вижу примерно такой сценарий:
Решетов писал:
"Я тоже попробовал 5-ти слойку. Первые 4 имеют по 5 входов, на каждый из которого поступают нормированные значения с отдельно взятого индикатора (на каждый слой свой индикатор). 5-й слой 4-х входовый и также обобщающий. Результаты весьма неплохие получаются. Самое главное, что вне репрезентативной выборки ведет себя очень стабильно по сравнению с однослойкой."
Поэтому наш ST+ENV будет давать только сигналы на вход и сопровождать позицию, как "базовый" узел.
А достоверность его сигналов будет проверяться (для начала) однослойной нейро структурой с др. индикатором.
Причем работу однослойки желательно постоить на меньшем тф, чем тот на кот. работает ST+ENV!. Чтобы "не задерживаться со входом.
А на счет того - как программно подать в сеть сигналы самого ST+ENV, - увы...
Не могу пока сообразить.
Вот такая ещё идея .
ПО вышеприведенному советнику.
Там перцептрон обрабатывает значения индикатора 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(......
и т.д.
А в код самого советника вставить именно - полученное значение последнего, суммирующего перцептрона!
Я ведь тебе предлагал уже это по аське! Можно вообще все индикаторы туда засунуть. Можно, также, брать не просто значения с определенных баров, а например, изменение на последнем и предпоследнем баре (например, Close[1]-Close[0]) - тоже может получиться интересный результат.
В любом случае при использовании нескольких перцептронов нужно учитывать "размерность" индикаторов. Т.к. у одних область определения от 0 до 100, у других от 0 до 1, у третих -100 - +100 и т.д. Нужно все показания приводить к одному виду, иначе, последний результирующий перецептрон будет считать показания индикатора с маленькими числами "незначительными".
А реализовываться это будет примерно так:
Либо подбирать индикаторы , средняя линия которых равна нулю!
Понятно теперь стало - почему в реале советник с индикатором WPR постоянно сливает!
Я там не предусмотрел, что его шкала находится только в +зоне.
И оптимизация , конечно, получилась случайной!
Особенно это заметно при оптимизации параметра SL.
Сейчас вот исправил в коде условие на вход - и результаты меняются на глазах!
Прибыль увеличивается не быстро, зато становится гораздо надежней!
Графики идут плавно, без провалов.
Кроме того, вспомнилась твоя идея - задавать "запрещенный" диапазоп выходного значения перцептрона. Чтобы советник - в этом диапазоне отдохнул, подумал немного "как дальше с этим жить...".
Вот график оптимизации , GBPUSD, стохастик, M30, с янв. 2007г.
Эскизы прикрепленных изображений
А вот результат оптимизации от пред. поста
Качество моделирования 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)
Эскизы прикрепленных изображений
Не всё, однако, так хорошо!
Результат был получен при оптимизации от 1 янв. до 16 марта. При прогоне до сег. дня - 26 марта - обнаружилось подряд 5 лосей!
Стал разбираться - прогнал с 2004 года, результат(фунт, м30):
668 сделок =+375-313, общий профит=+45 пипсов !
Причем короткие 412 сделок, длинные - 276.
Обнаружилось вот что:
Поскольку в советнике использован вызов стохастика, я взял точку отсчета - среднюю линию стохастика = 50.
Но - вот тут и присутствует ошибка!
Значения перцептрона у нас в коде заданы либо <50, либо >50, - но при положительной, однополярной шкале стохастика на выходе перцептрона почти всё время будут получаться значения - больше 50-ти (независимо от положения) - это очевидно! И в результате невпопад открываются короткие сделки! Да и значения перцептрона при этом надо задавать либр выше, либо ниже уровней перепроданности/перекупл-ти.
Выход - изменить шкалу стохастика на двухполярную. Или брать другой индикатор!
вот так сделал для текущей 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);
}
Похоже, я тут вообще не в кон задал
if(perceptron() < 50)
- надо подумать здесь!
Вот, модернизировал для наглядности
Благодарю, Андрей.
Вставил этот кусочек кода.
чтобы избежать подгонки при оптимизации решил оптимизировать по всей доступной истории.
С мая 2004г. закачаны минутки с Альпари по всем тф. А с янв. 2007г - текущие котировки Лайта.
Результат получился - от +6000 до +8500 (м30 и н1)
Даже "побаловался" с контрольными точками.
Не думаю, что на этот раз имеет место подгонка! Три года - это не месяц-два, и подгонка здесь мало вероятна!
Причем прибыль идет оч. последовательно вверх, но в неком диапазоне - почти идеальном канале - обозначил на графике баланса зел. линиями. (без ММ)
Оч . жаль, однако, что пока внутри этого канала ситуация ещё не определена.
Это напоминает мне муравьев - которые тащат соломинку в муравейник. Всякий из нас часто такое наблюдал в детстве. Каждый муравей тянет соломинку в с свою сторону , но в сумме соломинка непостижимом образом всё-таки движется в сторону муравейника!
Если взять и разбить этот общий полученный профитный результат по месяцам - то картина не очень впечатляет.
Однако в сумме мы имеем достаточно надежный общий профит!
Осталось теперь перейти к деталям. И внутри нашего канала свести к минимуму просадку, либо (менее желательно) увеличивать профит.
Вот еще проблема, впрочем, небольшая осталась.
Эскизы прикрепленных изображений
А Проблема вот в чем:
---------------------------------------------------------------------------------
// 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);
--------------------------------------------------------------------------------
Здесь я забыл поменять.
И ещё - мне непонятен механизм входа при самой первой сделке, т.е. при включении советника. А это, между тем, тоже существенно!
бдагодарю.
Сейчас разберусь!
Только что пришла ещё вот какая мысль.
В авторскои версии использован индикатор АО.
но там граничные значения шкалы - от +0.005 до -0.005
Более того - сейчас на графике фунта крайние значения от +0.003515 до -0.003200 !
И конечно , вес контрольных точек до 200 единиц оправдан!
Но у нас то - граничные значения шкалы от +50 до -50 !
И придавая вес = от единиц до 200 мы в итоге получаем все что можно, но только не то что нужно!
Какие уж тут +25 и -25 в итоге , если разброс значений Х1-Х4 составляет у нас от десятков единиц до 10 тысяч!
Похоже опять не в кон!
Надо задавать весовые коэффициенты, видимо от 0.05 до 1 ? Либо опять по новой менять шкалу стохастика.
Как считаешь?
Вставил вот этот кусочек!
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
Эскизы прикрепленных изображений
Всё правильно. Шкала и не изменится, т.к вызывается стандартный индикатор. А дальше мы уже крутим его значениями как хотим, это никак не может изображаться на графике.
В соотв. с вышеизложенными резонами подготовил пока два варианта советника - со стохастиком (ниж. график баланса) и с инд. 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)
---------------------------------------------------------------------------------------------------
Далее, видимо, нужно отследить участки графиков, где линии балонсов идут в разные стороны и выяснить - почему так случилось!
Эскизы прикрепленных изображений
Да, пожалуй...
Но хотелось бы уж сразу многослойку заряжать на демотест!
(Хочется ведь - чтобы было "много и сразу !"...)
Вот ещё одна идея попутно пришла.
До сих пор мы использовали индикаторы, в кот. вершины(впадины) соответствуют вершинам(впадинам) на графике цены .
Т.е. экстремальные значения индикаторов - появляются на переломах трендовых движений цены!
Однако, если взять индикатор, где переломы тренда будут отображаться не как макс и мин. значений, а как пересечение линии индикатора своей же средней (в нашем случае - нулевой) линии?
Недостаток таких индикаторов - они перерисовываются сразу по неск. барам в соотв. с движением цены.
Но в нашем случае - в советнике - этот момент может напротив, обернуться достоинством! В силу специфики работы перцептрона!
У нас получаются , как бы, качели - при правильно подобранных весовых коэффициентах мы будем получать сигналы на вход - в сторону наклона качелей! При этом - в самом начале трендового движения!
Вспомнилось, что в "НЕСТАНДАРТНОЙ" тактике TURAMI предлагал использовать такой индикатор - из группы индикаторов Алекса.
Вставил этот индикатор в советник.
Индикатор - в закачке...
Эскизы прикрепленных изображений
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 идет небольшой слив, в то время как на Фишере (нижний) в этот период напротив - активно растет профит!
При многослойке это , возможно даст нам любопытный результат!
Эскизы прикрепленных изображений
Благодарю.
При реализации очередной идеи обнаружилось очередная "непонятность"!
Бывает, что при трендовом рынке советник иногда с "ослиным" упрямством выдает сигналы на вход против тренда - и соответственно получаются лоси.
Стал разбираться с "этим делом".
Зарядил трендовый индикатор (с двухполярной шкалой). Вставил в код:
----------------------------------------------------------------------------
int start()
{
Comment(perceptron());
-------------------------------------------------------------------------
И увидел в лев. верх. углу - что при UP-тренде, когда значения индикатора (даже от 0 до 21 бара) находятся в положительной зоне шкалы - то перцептрон выдает оч. часто отрицательные значения!
Вот график визуального режима - живой пример! (см. ниже)
Но ведь весовые все коэф-ты больше 0 - от 10 до 100!
Так не может быть по определению!
Значение индикатора в текуший момент и предшествующие 7-14-21 были и есть положительные , а перцепртрон вот сейчас отображает "-0.2186" !
Надо покупать, а у нас сигнал в SELL !
Эскизы прикрепленных изображений
Причина этого несоответствия , возможно, заложена в строчках кода:
---------------------------------------------------------------------------
double perceptron()
{
double w1 = x1 - 100;
double w2 = x2 - 100;
double w3 = x3 - 100;
double w4 = x4 - 100;
----------------------------------------------------------------------------
А почему, собственно (х-100) ?
Возможно для авторской версии с индикатором АС для этого есть резоны?
А для других индикаторов необходимо подбирать иное число - в зависимости от размерности шкалы? И от исходного принципа работы применяемого индикатора?
На графике - индикаторы АС и инд. BullsPower (в советнике- сейчас)
Эскизы прикрепленных изображений
Да, действительно, - для каждого индикатора нужно осмысленно подбирать (х-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);
}
--------------------------------------------------------------------------------------
Разберемся, надеюсь!
Главная всё-же, проблема - это работа трейлинга "лошадиными дозами" !
Ну ни в какие ворота не лезет!
На КАЖДОЙ профитной сделке мы теряем от 60 до 120 пипсов профита! - в среднем 70-80 пипсов!
Шаг трала завязан на величину стоплосса.
Можно чуть улучшить ситуацию, если перейти на меньший тф - м30 , тогда по ценам закрытия стоплосс будет иногда подтягиваться почаще.
Но при этом начинают "мельчать" показания индикаторов - и значит возрастает фактор случайности. Не выход!
Нужно срочно что-то с этим делать!
Ну эту проблему можно решить с помощью трейлинга от Кима. Стандартный выкинуть из кода, а новый что-бы выполнялся на каждом тике. Но вообще мне не нравится вся торговая логика данного советника
А я пытался экспериментировать с (sl * Point) в трале, но успеха не добился!
С тралом Кима нужно и библиотеку прилагать.
А если вот такой вариант? -
Прикрепленные файлы
_______________________.________.rar ( 4.47 килобайт )
Кол-во скачиваний: 342
Сделал.
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];
-------------------------------------------------------------------------------------------
Это наверное как-то влияет?
Конечно влияет!
Пришли советник, попробую поправить.
вот он:
Прикрепленные файлы
N0_NO_N0_MULTY.rar ( 2.47 килобайт )
Кол-во скачиваний: 335
Поработал пока с версией советника с инд. Фишера .(закачка в пост 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
-------------------------------------------------------
Андрей! Обрати внимание на просадки - оч. приличный результат!
А когда будет сделан "разумный" трал, то результаты будут ещё лучше!
Эскизы прикрепленных изображений
Да, действительно, просадка около 2% - отличный результат
Вот вариант советника с "разумным" тралом:
N0_NO_N0_MULTY.rar ( 2.17 килобайт )
Кол-во скачиваний: 724
Благодарю! Оч. кстати!
Решил выяснить - почему в строчках кода
double w1 = x1 - 100.0;
заявлено именно (х-100)
Вспомнил, что Решетов рекомендовал применять весовые коэффициэнты не более 200.
Вопрос сразу прояснился!
Получается, что при такой записи - весовые коэф-ты у нас получаются двухполярными!
Также как и шкала индикатора!
В результате имеем своего рода расширение "динамичечкого диапазона" значений индикатора.
Положительные значения при этом увеличиваются при х>100, а отрицательные также по абсолютной величине увеличиваются при х.>100. Т.е. уменьшаются.
При х<100 - динамический диапазон, напротив, сужается!
Тут надо ещё посоображать...
Руки до всего не доходят! - времени не хватает!
Ну ладно...
Оптимизировал по всей доступной истории (с 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()
....
Вроде так(значения х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 ----------------------------
Проблема в последнем результирующем слое.
p_1, p_2 ... - это функции, значит после них нужно поставить скобки.
Вот так будет правильно:
ДА, ДЕЙСТВИТЕЛЬНО!
С р_1() всё получилось
Эскизы прикрепленных изображений
Вставил оптимизированные параметры для каждого индикатора.
Теперь следует разобраться с
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 - стоплосс)
Так вот!
Так не получается!
Не могу понять, в чем дело!
сделал так с индикатором WPR.
А вот здесь результат сошелся с тестом версии WPR !
С индикаторм фишера - опять всё не так!
А с индикаторм АС - РЕЗУЛЬТАТ СОШЕЛСЯ ТОЖЕ!
нИЧЕГО НЕ ПОНИМАЮ!
Поскольку тесты с 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 соответственно !
Сейчас ещё и ММ вставлю ... для моральной поддержки ..!
Эскизы прикрепленных изображений
Попробовал тоже так сделать. Стохастик у меня сошелся, правда не с первого раза
Смотри внимательно настройки индикаторов в конкретном советнике, и выставляй такие же в общем советнике. В стохастике, я, например, не обратил внимания на период. Когда поправил - всё сошлось. Весовые коэффициенты, естественно так же должны быть одинаковыми!
ОК! Понял.
Исправил все недоработки. Система заработала так, как и положено!
В часности, обнаружилось, что в коде у стохастика надо добавить - двухполярную шкалу:
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 !
Вроде бы нахожу этому обьяснение.
Но пока - посмотри на график.
это кусочек работы со стохастиком , у=101(у остальных у=100)
Стох - самая прибыльная версия (+8786$ с мая 2004г) и поэтому предлагаю "плясать" именно от неё!
Здесь видно , что идут подряд две убыточных, лосевых сделки - против тренда, при этом перцептрон меньше нуля.
В то-же время значения инд. Фишера больше нуля и при правильно подобранных весовых коэф-тах, мы , как минимум, запретили бы вход в SELL в такой ситуации.
А в идеале - вошли бы в BUY !
Эскизы прикрепленных изображений
Если нам удасться правильно организовать взаимодействие iStochastic и "Fisher_m11", - именно этих двух , то результаты сильно улучшаться! - это ещё мягко сказано!
Причем заметь - со стохастиком частенько так бывает - прёт , как баран, против тренда - и при этом остается самой выгодной версией!
Вот идея появилась навскидку. Тоже может дать интересный результат.
но даже и в этом случае необходим фильтр - для предотвращения сделок против тренда!
Вот можно попробовать , например , осциллятор Эллиотта или индикатор OsMA.
Причем даже не нужно слишком оптимизировать весовые. Просто взять значения этих индикаторов - плюс и минус и применить к условиям входа.
Эскизы прикрепленных изображений
Меня вот крайне удручают частые ситуации показанные на графике ниже.
Текущая прибыль (зелёная линия) постоянно преобладает над текущим балансом. И каждый раз при этом все прибыльные сделки, тем не менее, закрываются по подтянувшемуся стоплоссу!
Как с эти бороться?
График - ниже - это версия советника с "разумным тралом". Но и она не оказалась панацеей.
С большим трудом оптимизировал по фунту н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
Эскизы прикрепленных изображений
Kola:
"А чего тут всего четыре входа у перцептрона? Больше не пробовали?
Я делал помощнее перцептрон для анализа цен на много входов трехслойный обучающийся по алгоритму стохастическо-градиентного спуска, только результаты мне не очень надежными показались. Зато тут для анализа используется значение акселератора, может быть так и надо? "
Reshetov:
"Пробовали. Могу даже сообщить, что чем больше входов, тем точнее описание паттерна (впрочем, слишком детальное тоже не к чему), а следовательно результат будет более приближенным к реальности. А вот при попытках увеличения слоев, все наоборот, вроде бы прибыли по тестам растут, но вне выборки оказываются значительно ниже. Сначала было не совсем понятно, почему так происходит, а потом удалось выяснить. Ведь чем больше слоев, тем меньше паттернов приходится на каждый из них, а следовательно почти тоже самое, что и подгонка под оптимизацию с малым количеством сделок."
http://forum.mql4.com/ru/4973/page2
Kola:
А Вы в многослойном какую активационную функцию использовали?
Reshetov:
Для переключения между слоями лучше всего подходит проверка значений основной линии ADX
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)
В реале не больно-то поторгуешь с такой просадкой! - см. ниже график баланса от фр/фр метода!
Скрупулезно просмотрел историю сделок. Обнаружилось оч. любопытная закономерность.
По этой паре. ВОТ какая:
Оч. часто убыточные сделки группируюются по две подряд!
И лишь дважды случилось так, что сразу три подряд сделки оказались убыточными!
Что это нам дает?
Здесь, в алгоритме работы эксперта, можно предусмотреть (как вариант) включение режима ММ только после двух подряд убыточных сделок!
При этом общий итог у нас получается зачастую ничуть не меньше, чем с постоянно включенным ММ!
Где-то видел кусочек кода - с похожим условием - вроде на Ониксе - пойду гляну...
Эскизы прикрепленных изображений
Ну какой же это мизер?? Советник будет курить пока размер профита не превысит размер стоплоса.
Вот мне недавно попалась одна дипломная работа по теме нейросетей. Не помню откуда скачал. Всем кто интересуется данной темой очень рекомендую ознакомиться!
diplom_.rar ( 303.39 килобайт )
Кол-во скачиваний: 8171
Да, действительно.
И сразу обнаружл то, что не сделано в результирующем перцептроне в нашем случае
Эскизы прикрепленных изображений
Сделал индикатор, который отображает значения выдаваемые перцептроном, в виде гистограммы. Сделал для перцептрона использующего стохастик, но можно приспособить для любого.
Благодарю!
Поставил. Оч. полезная штуковина!
Теперь наглядно видно работу перцептрона на истории!
И Веса теперь изначально можно подбирать не от фонаря - а осмысленно.
iPeriod - в коде - также нужно подставлять в др. индикаторы...
Только он у меня почему-то не работает - так как нужно!
Показывает только отрицательные значения!
А вместо положительных - сплошная штриховка!
Эскизы прикрепленных изображений
Дело оказалось в билде MT! На 203-м работает нормально, а на 202 такая же картинка. Если 202 на Windows2000 - вообще падает терминал. Почему так - не пойму, вроде бы простенький индикатор, да и в последнем билде особых изменений нет.
Благодарю! Так и случилось! Сейчас поставил билд 203 и всё стало ОК!
Поставил.
Сходу удалось получить +2550 за три года.
в лонге.
Зарядил на оптимизацию.
Жду ...
Провёл оптимизацию советника LongOnly по фунту на H1 по данным Лайтфорекса. Оптимизация провоилась за 2006. Период с января 2007 по сегодня оставил как экзаменационный.
Отчёты тестов приведены ниже.
Слушай!
Что-то мне "тревожно" стало за эти версии!
Сделок должно быть поболе - чем мы "имеем" !
По шорту - зарядил фунтик - так он мне за полтора года выдал всего три сделки ! (ладно - хоть профитных)
В коде мне пока трудновато разобраться!
Дай пож. сюда кусочек - где прописаны условия на вход и прокомментируй, пож. детально!
На счёт шорта и меня стали сомнения терзать. Сейчас ещё раз проверю не допустил ли ошибки, если не найду то выложу с комментариями
В любом случ. надо код - для ясности
Приведу, пожалуй, основной код: ShortOnly
Тоже исправил шкалу.
Но у меня ещё до исправления - и после исправления
при компиляции есть:
0 error(s), 1 warning(s)
Function "Sell" is not referenced and will be removed from exp-file
в обеих версиях - одно и тож
это не ошибка а предупреждение о том что функция Sell не используется и она не будет включена в exp-файл. На работе это не сказывается. В тех советниках, что выложил выше, лишние функции убрал.
никак не могу добиться в шорте профитных результатов!
Тестирую с 2004г.
Или стохастик здесь принципиально не годится для этого режима?
Или против тренда молотит.
Или в конце треда - в лучшем случае вход!
С двухполярным стохастиком результат однозначно хуже. Так Long так и Short.
Андрей!
По вопросу защиты текущей прибыли в момент подтягивания стоплосса.
Назовем идею - ОТСЕЧКОЙ
Я всё-таки думаю, - что проще будет сделать так:
Самая Первая сделка советника - пусть идет так, как заложено в алгоритме советника.
А уже далее пусть советник начинает реализовывать ОТСЕЧКУ - причем не двумя сделками - как мы вчера планировали, - а лотами !
Вот смотри :
----------------------------------------------------------------------------------------------------------------
/* 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) !
Далее вводим дополнительное условие - ЕСЛИ НА МОМЕНТ ОТКРЫТИЯ НОВОГО БАРА ПОЛУЧЕННЫЙ ПРОФИТ БОЛЬШЕ РАЗМЕРА подтянувшегося СТОПЛОССА - закрываем один лот из текущих двух!
Но лучше конечно закрыть его ,по тейку. Причем предусмотреть ТП во внешних параметрах! - Для экспериментов по оптимизации.
Так возможно будет проще...
Ещё есть мысль использовать трехступеньчатую систему выходов Виктора, - описанную и реализованную в советнике Игоря Кима, - но это в перспективе....
Ещё вот сейчас посмотрел. Кроме стохастика для реализации Отсечки оч. хор. подходит версия с индикаторм Фишера. Версия в открытом доступе есть на стр. 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
Поставил версию с Отсечкой.
Но работает некорректно. С трудом вникаю в код.
Позиция в Селл открывается - но реагирует только на свой собственный стоплосс. И больше ни на что!
Профит игнорирует!
Навскидку, - вот такое обьяснение:
Видимо, надо ставить уровень отсечки не на линии
(sl * 2 + spread)
а чуть ближе - на пару пипсов хотя-бы!
Тогда программа не будет путаться, - одновременно вычисляя и закрытие лота , и условия на подтяжку стлосса, или переворот!
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
Т.е. шаг трала в коде для отсечки заложен с ощибкой!
Пож. напиши в коде комментарии, - по всем строкам ,- где ты вносил дополнения и изменения. Иначе трудновато вникать...
Понял!
но пока сделана часть работы! Значительное (по визуалу) число профитных сделок закрываются "по мизеру" - потому - что цена превышает уровень отсечки - но потом отступает и закрытие бара происходит ниже! и соотв. подтяжки не происходит.
Тогда мы теряем эту часть профитных сделок и более того - часть из них становятся убыточными!
В перспективе - также - установка трейлинга на этот второй ордер причем так чтобы не потерять уже имеющийся профит.
Никак не пойму, почему не соблюдается число сделок в пропорции контрольной версии и версии с отсечкой при равных параметрах.
Видимо, тестер чуть иначе реагирует на изменения в коде.
По Фую, например, вообще прибыль не увеличивается с отсечкой!
Сделал так:
Прогнал контрольную версию -
-------------------------------------------------------------------------------
Символ 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;
Вчера ночью игрался с разными версиями и заметил вот что.
Я заменил перекрытие ордеров простым закрытием и открытием в другом направлении. Затем сравнил тесты на одном и том же периоде этой и предыдущей версии и вот что обнаружилось: в версии где использовалось перекрытие сделок было больше почти в двое больше чем в версии где использовалось закрытие и открытие. А прибыль при этом совпадала до цента! Видимо тестер по разному интерпритирует сделки, для которых используется CloseBy, а отсюда и не совпадение с расчётами (приб.-убыт.).
Вот на этих отчётах наглядно видно почему происходит различие в количестве сделок. Я взял два эксперта, в первом остался первоначальный механизм закрытия ордеров (открытие двойным лотом и последующее перекрытие старой позицией), а во втором я заменил перекрытие обычным закрытием старой позиции и открытием новой. Тест проводился на одном и том же периоде.
В отчётах я выделил одни и те же действия одинаковым цветом, они происходят в одно и то же время.
Посмотрел. Вник.
Ну и ладно! С "этим делом", стало быть, разобрались!
-------------------------------------------------------------------------------
Похоже с вводом "отсечки" мы уже "выжали" из алгоритма логики работы - всё что можно!
Впрочем не совсем так. Вернулся к версии с "разумным" тралом. Вставил в неё стохастик. Удалось оптимизировать на трехлетней истории по фунту до +7500.!
А просадка – «ты будешь смеяться» - всего -770 !
Посмотрю ещё...
Следующий наш шаг - "нещадная" борьба с просадкой!
Возможно, тут будет полезной именно та твоя версия, - где позиции не переворачиваются, а закрываются, и опять открываются.
Решения вижу пока такие:
Локирование убыточных позиций, например, начиная с заданного числа пунктов.
Например, цена после старта пошла против нас ,- и, начиная с некоторого убытка
(пусть=-25), должна включится локирующая - противоположная позиция со стоплоссом на уровне старта первой позиции и тейкпрофитом (а лучше тралом!) - на уровне стоплосса первой стартовой позиции.
Много прибыли здесь не прибавиться, - но зато навскидку, - возможно , существенно уменьшится просадка ,- да и торговать при этом намного спокойнее будет.
Можно даже и пару другую локирующую зарядить – против фунта открыть франк, но это – на любителя…
Кстати, - сделал пипсовочную версию на стохастике, - настроил на фунт.
Стоит сейчас на демо, - глянь(у Dimi – он там, правда , иногда вручную пошаливает!).
Оч. любопытно наблюдать, - как основная, контрольная версия почти все время локируется версией пипсовочной! Причем польза здесь получается обоюдной!
Смех разбирает ,- когда смотрю, - как пипсовочная версия ,- словно собачонка, крутится в противовес основной!
Ещё вот соображения:
Прогнал первую версию со стохастиком по фунту по истории с июня 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 закрылись переворотом а сколько по стоплоссу?
От ответа на этот вопрос многое зависит.
Так сходу не врублюсь, нужно малость обдумать.
пожалуй, не стоит пока возиться!
По "закону подлости", - большинство сделок закроется именно по стлоссу!
Но это именно то, что надо в данном случ!
По версии с разумным тралом.
Взял фунт - м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
Еще вот появились соображения.
По версии с лотами мы можем выстроить работу советника по типу пирамиды, - отсекая на каждом уровне часть прибыльных сделок в профитной зоне. Таким образом , у нас будет несколько уровней отсечки , - равное числу лотов! В идеале - 3-4.
Прибыль возрастет, но при этом и просадка будет увеличиваться (менее заметно чем прибыль - но всё-же)
И вот тут пригодится версия с ордерами!
Т.К. мы не можем отсекать убыточные сделки в минусовой зоне, - поскольку не знаем заранее прибыльной или убыточной будет сделка, - как мы это заранее знали в профитной зоне.
Остается вставить в код версии с лотами версию с ордерами, и залокировать убыточные (в текущий момент) сделки 0рдером с тем же числом лотов!
Мысль пока оч. сырая, и есть неясности, но уже понятно что ..." правильной дорогой идете товарищи!"
На форуме Игоря Кима esть любопытная веточка по реализации механизма локирования
http://forum.kimiv.ru/viewtopic.php?t=114&postdays=0&postorder=asc&start=0
Смотрю сейчас...
Я, наверное, временно откажусь от версии с двумя ордерами. Это сильно усложняет логику работы советника, а версия с двумя лотами работает ничуть не хуже. Но в дальнейшем, возможно прийдётся прибегнуть и ко второму ордеру.
P.S. Спасибо за ссылку, сейчас почитаю.
Только что отправил письмо Игорю Киму с вопросом о регистрации, а то за два месяца так и небыло подтверждения )) Зато хороший способ для отсеивания халявщиков, зарегистрируется только тот, кому действительно необходимо!
Версия с лотами работает - ну как часики!
Спасибо тебе за отличную, профессионально сделанную работу!
Не нарадуюсь!
Однако....
Мы, похоже сделали ошибку - ограничив число входящих изначально лотов! И вот почему:
Реализуя отсечку на "первой ступени пирамиды", мы забыли - что оставшиеся сделки у нас - все строго профитные!
Так зачем же ограничивать их число одним лотом (ордером)! ?
Напротив , нужно их увеличивать!
И вот тебе доказатильство!
ВВел в код небольшое изменение и .... -
Символ 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)
Но с просадкой еще разберемся....
просто изменил число лотов - в начальном условии на открытие позиции с 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
Но здесь строго придется использовать ту твою версию, - где вместо переворота исрользуется закрытие и вновь открытие позиции!
ДА действительно!
Поторопился я немного. Третий лот вводить придется.
"Отсечка срабатыват в момент подтяжки стопа. Первой подтяжки (около 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
Можно сделать счетчик и их подсчитать, но проЩе вместо счетчика предусмотреть в коде советника третий лот (с отсечкой) и выяснить этот вопрос практически!
Эскизы прикрепленных изображений
Как это реализовать программно?.
И насколько это реализуемо?
Надо подумать.
Если мы введем в код - 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;
---------------------------------------------------------------------------------
Ну теперь всё ясно и понятно.
Завтра-послезавтра посмотрю как это можно реализовать. Думаю проблем быть не должно. Но счётчики всёравно нужно прикрутить!
А я вот пока задумался о просадке.
Пожалуй, борьба с просадкой будет важнее и потяжелее, чем наращивание прибыли!
В наращивании прибыли мы (скромно замечу) достигли некот. успеха.
Но вот просадка....
Особенно это касается Фуя и 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 !
Вот кандидат для тестирования на демо!
График баланса :
Эскизы прикрепленных изображений
Предположим, я хочу ввести дополнительное условие на изначальный вход.
Допустим, я желаю, чтобы вход был только тогда, - когда текущее значение индикатора совпадало по знаку с текущим значением перцептрона (от этого-же индюка)
Значение индюка уже есть внутри функции перцептрона:
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
--------------------------------------------------------------------------------------------------
Правильно так будет?
Да, правильно. Но лучше для индикатора в основном коде использовать другую переменную, отличную от переменной в функции перцептрон. Например, вот так:
Понял! Благодарю!
В свете последних событий на счете , т.е. поведения советника в последних сделках - обнаружилось следующее:
Цена дошла до уровня (sl*2 +spread) и ... развернулась! - против нас!
Профит не успел зафиксироваться, - т.к. он (профит) фиксируется только по цене открытия новой свечи!
И мы далее получаем закрытие "по мизеру", вместо ожидаемого "фрика"
Насколько часто так бывает?
Предполагаю, что - нередко!
И тем обиднее ситуация! Мы, - находясь в профитной зоне, упускаем то, - что обязаны брать!
Как с этим бороться?
В версии с лотами это будет излишне канительно.
А вот в версии с ордерами, - тут возможно будет проще!
Выделить второй ордер из цикла, - чтобы он "жил" своей жизнью и задать для него свои ТП и СЛ.
Причем работать второй ордер должен не по ценам открытия, - а по тикам.
Тогда мы можем оптимизировать параметры ТП и СЛ, - и Таким образом существенно увеличить общий профит, - без увеличения просадки!!!!!, - т.к. работа здесь идет только в профитной зоне!
Честно говоря, я сейчас сознательно пытаюсь уйти от всех тиков. Главная причина - это отсутствие возможности нормальной оптимизации по причине отсутствия минутных данных за большой период. Сейчас мне хочется попробовать реализовать срабатывание советника не по открытию бара на "рабочем" (в нашем случае Н1) таймфрейме, а по открытию бара меньшего периода. Например М15 или даже М5. Тогда останется возможность тестирования и оптимизации на "Контрольных точках", но правда глубина истории по вышеназванным ТФ так же не велика.
Перелопатил десятки (без приувеличения) индикаторов,- чтобы использавать их как дополнительный фильтр к перцептрону.
И убедился в бесперктивности такого подхода.
В лучшем случае, - профитность системы не уменьшается!
В силу (скажем так) случайности сигналов выдаваемых перцептроном на вход . Конечно, совсем уж случайными их назвать нельзя, - но тем не менее.
Сигналы выдаются по признакам, - которые я ну никак не могу отследить по индикатору-перцептрону. Видимо, при оптимизации подгонкой улавливается некая статистическая закономерность.
При добавке фильтров-индикаторов уменьшается (бывает в разы) и число сделок, а значит уменьшается достоверность.
Технические способы мы , пожалуй , уже все исчерпали!
Таким образом, остаются чисто логические приемы увеличения общей прибыли, - как мы уже проделали с Отсечкой!
Для уменьшения просадки и даже небольшого увеличения прибыли, мне представляется перспективным добавить локирование позиций в убыточной зоне.
особенно привлекательно выглядит локирование при трендовом рынке и активном флете, - т.к. советник частенько работает наоборот в таких ситуациях.
Начал вникать в технику локов....
------------------------------------------------------------------------
Интересно, - работают ли на графике баланса линии сопротивления и поддержки?
Эскизы прикрепленных изображений
А мне пока что видится использование вместо перцептрона сигналов настоящей нейросети. Надежду возлагаю на то что сигналы будут не столь случайными. А вот какую сеть использовать - пока не решил. Или создать в нейрошеле, или использовать наработки klot'а.
Но в любом случае, сейчас на это пока нет времени.
Советник, который крутился на демо на этой неделе, видимо, удачно попал в "такт". Интересно как закроется последняя сделка, оставшаяся с пятницы в плюсе?
Ну как зачем !
Видим, - пошел отскок вниз от линии сопроитвления, - отключаем советник!
А отскок вверх от поддержки, - опять включаем....!
Если мы отключим советник, то у нас линия баланса перестанет рисоваться.
Нечему будет отскакивать
На реале - отключим. На демо - оставим!
Кстати - сегодня с утра - приятный сюрприз -!
Наш советник приближается к удвоению начального депозита на демо!
to NoName:
Вот ты писал недавно -
"Сейчас мне хочется попробовать реализовать срабатывание советника не по открытию бара на "рабочем" (в нашем случае Н1) таймфрейме, а по открытию бара меньшего периода. Например М15 или даже М5. Тогда останется возможность тестирования и оптимизации на "Контрольных точках", но правда глубина истории по вышеназванным ТФ так же не велика."
Я прикинул вот каким образом.
Как уйти от случайности сигналов перцептрона? Мы работаем на н1 и сигналы берем с индикатора на этом же тф.
Но наши стопы, - вовсе не соответствуют этому тф - н1 !
Для н1 более подошли бы стопы - = от 35 до 55, - но никак не 80/90 !
Переходить на тф н4 ? Но тогда в сделках по ценам открытия мы будем "упускать" профит, - как иногда вот сейчас на нашем счете....
Можно брать сигналы индикатора с н4, - а работать по ценам закрытия н1.
А что если взять индикатор с большим периодом?
Т.е. создать искусственно, - как бы имитацию большого периода? И оптимизировать все остальные параметры.
Сделал это .
Результат получился оч. удовлетворительным!
На прибыли это отразилось, - в сторону увеличения на 15 % !
А вот просадка уменьшилась почти в 1.5 раза !!!!!
Еще не вставил отсечку в версию с этим индикатором!
ПрибыльныХ сделок за три года было 864, а убыточных всего 537, - прикинь! (при стопе=70) !
Ну а график баланса - изрядно выпрямляется ...! -
Эскизы прикрепленных изображений
to NoName:
По аналогии с обьединенной версией советника AI прикинул вот что. Система должна работать, если вместо реверсной версии мы просто вставим другую пару. Чтобы получился мультивалютный эксперт.
По системе ST+ENV, я думаю, есть целесообразность такого решения.
Попытался сделать это. Используя как образец обьединенную версию и Stoch_env_v3.
В сыром виде получается пока так:
Не заметил вовремя этот пост. Но, смотрю, ты и без меня справился
На будущее: variable not defined - переменная не определена.
Вставил трейлинг. Работает советник.
Но.... Не так, как надо. Похоже, он по ценам открытия работает. А не по всем тикам....
Совершенно верно.
Всё что помещено в этих скобках будет срабатывать только при появлении нового бара:
Понятно. Спасибо.
Убрал - if (isNewBar) { .... }
И заработал эксперт так как надо!
Сейчас вставляю второй трал и цепляю конверт на стох для второй пары!
Да! Насколько реально предусмотреть трейлинг отдельно для длинной и для короткой позиции?
Только вот подумал что этот код сгодится только для одной пары. Для второй нужно либо добавить такой же кусок кода с другим Magic, что совсем не эстетично и громоздко, либо модифицировать этот код для работы со вторым Magic, что не совсем просто из-за большого ветвления if, if, if ...
Это я у же все сделал"! (без библиотеки)
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; // Шаг трейлинга
-------------------------------------------------------------------------
Сейчас добавляю такой же второй трал - с магиком для второй пары!
Но вот как тут сделать отдельный размер для короткой и длинной поз?
Вроде где-то видел такой трал...
Вот нашел:
Ну код который я выложил выше, он как раз с разным размером для позиций!
Смотри TrailingBuy, TrailingSell
Понял! Прошу прощ. за невнимательность!
Немного подумал и решил что всё же грамотнее будет использовать библиотеку.
Подправил для этой цели трал Игоря Кима.
a_SimpleTrailingMod.rar ( 1.04 килобайт )
Кол-во скачиваний: 396
Подключить как обычно:
#include <a-SimpleTrailingMod.mqh>
Вызывать: TrailingPositions(Magic);
В функцию нужно передавать Magic той позиции, которую нужно тралить.
Ок! Сейчас гляну!
Кстати! Что это за таинственная библиотека #include <stdlib.mqh> ?
Это стандартная библиотека метатрейдера, в которой есть полезная функция ErrorDescription(). Эта функция возвращает описание ошибки если передать в неё номер ошибки.
Ок! Понял!
Только обьясни пож., почему грамотнее будет использовать библиотеку для трала? Я тут, "понимаешь", сидел вникал целых два часа, - а ты "немного подумал" и говоришь, - это не надо! - лучше библиотеку!
Да потому что не нужно повторять код два раза!:) Ты пишешь трал для одной пары, а за тем такой же трал для другой. Отличия между ними только в переменной Magic.
Конечно ничего не изменится если сделать два трала, но с библиотекой код будет проще и меньше шансов наделать ошибок.
Понял! И ещё. Обьясни пож. смысл вот этих строк кода (незакоммент):
int start()
{
//vTerminalRefresh();
//-------------------------------------------------------
bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; }
//-------------------------------------------------------
//if (isNewBar) {
int spread = MarketInfo(Symbol(), MODE_SPREAD);
//----- Вывод информации на экран ------------------------------
----------------------------------------------------------------------------------------
И нужно ли в посл. строке оставить как есть или вместо Symbol(), указать пары?
Все работает в тестере. Но вот пока по второй паре результат не соотв. тесту отдельной версии - чуть-чуть.
Благодарю за разъяснение!
Ещё вопрос
А у тебя вообще переменная Spread где-то используется ?
Строка должна быть в функции Start(), а где именно принципиальной разницы нет, главное что бы она была до того места где ты будешь её использовать
Выглядеть это будет примерно так:
Я тогда её вот в эти блоки вставлю - хуже не будет (кашу маслом не ...)
Нет, как есть нельзя оставлять. Тралить не будет вторую пару. Вместо Period(), нужно прописать конкретную пару.
Ок! Вставил вместо 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) )
------------------------------------------------------------------
А условие кот. выше - может и так и не наступить!Как ты думаешь, - нет ли здесь у нас некоторой непродуманности условий на вход?
Как это, - " не на тиках а на барах" ?
Советник работает по тикам! , - не по ценам открытия!
Условие
if (isNewBar)
{ }
я убрал!
Ок! Тогда вот что!
Пусть у нас нет открытых сделок и стохастик пересекает изнутри нижнюю границу канала.
Рис. 1
По сути тактики ST+ENV у нас в этот момент не должна открываться позиция. Поскольку позиция у нас должна открываться - только тогда, когда стох пересекает границу снаружи внутрь!
А теперь рассмотрим "под микроскопом" участок - обведенный синим
эллипсом. Рис. 2
Потиковый график. Стох пересекает нижнюю границу канала и на этой границе ходит "туда-сюда" и мы получаем абсолютно ненужный нам вход!
Т.к. обязательно будет выполнено условие
if ( (Stochastic_1<En0_low) &&
(Stochastic_0>En0_low) )
Как с этим бороться? Нечасто такое бывает - но бывает в 5-8 %-х сделок!
Есть вот соображение....
Эскизы прикрепленных изображений
В одной из статей на форуме 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=
Вот ещё один момент . Мы как-то его уже выясняли. Но пришла пора вернуться опять.
Дело в том, что стохастик в силу своей структуры шкалы - не является симметричным инструментом!
Динамический диапазон расчета стохастика идет в однополярной шкале. Со всеми вытекающими. И даже если мы сделаем шкалу двухполярной, - делу это не поможет!
Не только шкала тут влияет на структуру. Но и методика расчета самого индикатора.
Это оч. хорошо заметно, когда мы вешаем на стохастик конверт.
Обрати внимание, что динамический диапазон (т.е. амплитуда) колебаний верхней границы конверта существенно больше, чем амплитуда колебаний нижней границы!
И это при общих внешних параметрах.
Что же получается? В ветке "Нест. тактика" на посл. странице я выложил графики балансов в различных режимах.
при покупке у нас задействована ENV_Low и практически весь профит системы определяется именно этим режимом! - до 70% профитных сделок.
При продаже у нас задействована ENV_Up и практически все убытки системы приходятся именно на этот режим! - до 75% убыточных сделок! И отдельная оптимизация мало помогает.
Понятно, что здесь всему виной - амплитуда верхней границы канала Envelopes, которая при сделках в SELL дает зачастую убыточные сигналы.
Можно, конечно, вместо конверта применить МА c симметричным отклонением up и low.
Есть у нас и такая версия советника. Та, что ты прислал - последняя, для ускоренной оптимизации с вызовом отдельного твоего индикатора "i-StochEnv" . Посмотрел - погонял.
Но статистически обнаружилось, что для сделок BUY лучше всего подходит, всё-таки, нижняя граница конверта - Env_low.
А вот для коротких позиций похоже придется вместо Env_up вставлять в советник верхнее отклонение Env_up=iMaOnArray()
В связи "с вышеизложенным" встает вопрос.
(продолж. следует)
Эскизы прикрепленных изображений
При использовании "ускоренной" версии с МА - после оптимизации режима ONLY short и последующем прогоне в режиме LONG & SHORT число прибыльных сделок SELL получилось 62%.
Но вот при этом число прибыльных сделок BUY стало = 45% !
Т.е. нужно по отдельности вводить внешние параметры для длинных и коротких сделок.
Пож. обьясни непонятные моменты.
вроде бы в этой твоей версии границы канала работают по ценам открытия! А вот стохастик работает по всем тикам! Это так?
Почему в double Stochastic[2]; - в скобках стоит двойка?
Почему везде скобки квадратные а не круглые?
Что такое вот это ?--
Привет! Попробую по порядку.
Ок! Благодарю!
Ещё вопрос. Вот сегодня на счету с советниками 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++) ? - вставить?
Именно!
Я же говорил тебе не использовать эту версию на демо.
Ок!
Вот ещё проблема с мультивалютной версией! В ОНЛАЙНЕ.
Первая пара работает нормально! а ВОТ ВТОРАЯ - НЕ ХОЧЕТ ВКЛЮЧАТЬСЯ!
Пока пробую сам разобраться!
Пож. скажи что делает этот блок?--
------------------------------------------------------------------
/---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// 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);
}
----------------------------------------------------
Желательно подробнее!
Возможно причина в функции 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.
--------------------------------------------------------------------------------
А мы, получается , - не берем в наст. момент котировки по второй паре!
Непонятно ещё, - где указан тф по второй паре.
Надо сделать примерно так:
Всё понятно теперь!
За исключением ТФ! Откуда советник знает, - по какому ТФ открывать ордер по второй (и даже по третьей - в перспективе) паре?
Какая разница по какому ТФ открывать позицию? На любом таймфрейме Bid и Ask будут одинаковыми
Но показания индюков-то должны сниматься с конкретного тф!
У индюков вторым параметром идёт таймфрейм:
( string symbol, int timeframe ... )
Не путай индюки и OrderSend
Благодарю! На сегодня вопросов больше нэт!
По мультивалютному сделал так:
(Задействовал ф-ю MarketInfo для второй пары! )
Вот тут ошибка:
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, ... // а дальше как обычно.
Первым параметром ты указываешь инструмент, с которого брать значения индикатора, а вторым указываешь ТФ.
да нет! это я здесь так написал - "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] ?
Число 49 взял от фонаря. Почему именно его - не помню (действительно, почему не 50 ? ). Но! Это число должно быть больше или равно периоду Envelopes. Иначе, будет недостаточно данных для корректного расчёта индикатора.
Кстати, этот цикл сильно тормозит советник, т.к. пересчитывается на каждом тике. Лучше использовать внешний индикатор, который я тебе присылал, а его значения снимать в советнике через iCustom.
Ок! В следующей, - трехвалютной версии я, пожалуй, так и сделаю!
Теперь пришла пора заняться отдельной версией!
ты говорил, что там всё в порядке с ордерами. Т.Е. в последней твоей версии советник не обращает внимание на чужие ордера.
Однако, это не так! Вот стоит эта версия на паре GBPCHF,H4 и ночью там был сигнал на вход в BUY.
но позиция не открылась! - см. рис.
Стал разбираться. И немного запутался!
А условие на открытие позиции вот такое -
Скорее всего дело не с ордерами а с настройками.
Настройки индикатора и советника соответствуют?
Не работает ли на счету эксперт с таким же MagicNumber?
На закоментированный блок не обращай внимания, я просто забыл его удалить. Его функцию выполняют строки те что выше.
Всё соответствует!
и магик задан
extern int ExpertID =1111;
А в др. советниках - другие магики. Да и структура там другая.
Непонятина начинается вот здесь :
Вроде бы разобрался! Установил. Скомпеллировалось.
Вставляю третью и последнюю пару. В мультивалютный. Отлажу, приготовлю и пришлю тебе.
----------------------------------------------------------------------------------------
А вот с LotsWayChoice = 1; и =3 так и осталась проблема!
В мт4 MQ - CHEMP - там в терминале заложено ограничение до 5 лотов. После чего в журнале пишется ошибка!
Но в др. мт4 ограничений таких нет. А если задать ограничения вручную
LotsMax = 50 (т.е =5 лотов) ,
то все равно не работает!
Обнаружился вроде глюк в версии с вызовом индюка!
в визуальном режиме я увидел что значения (в левом углу) границ канала остаются постоянными - в течение последней свечи!
И меняют значения лишь с началом следующей свечи!
А вот стохастик (как и положено) меняется на каждом тике!
Почему
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?
Пожалуй, я совсем уже "притупил"!
Эскизы прикрепленных изображений
Понял. По мульти ещё вопрос. Как раз по блокировке.
Начинается блок открытия позиций.
Условие :
string st="";
if (ZeroBarOrd) st="_true";
else st="_false";
if (! ...... ) {.........}
нужно вставлять общее для всего этого блока, либо задавать для каждой пары конкретно?
А если можно и так и эдак, - то как будет лучше?
Думаю - что на счету Лайта-реал можно закрыть работу AI. И перейти на ручную ST+ENV, H4
Ты как думаешь?
Вот ещё одна проблема!
У Arn-а на демоЛайте сейчас стоят три советника.
Два - скомп. файлы.
Но они серые, а не синии.
Но позиции в онлайне открывают!
У себя проверил. тоже перенес на демоMQ эти советники. Файлы ex4.
Поставил на 1-мин тф. Работают !
НО ВРОДЕ НЕ ДОЛЖНЫ! Раз они серые!,
На счёт AI согласен, думаю нет надобности его больше мусолить в таком виде
А на счёт советников, увы, не знаю что означает их цвет. У меня такое бывало, когда случайно закинешь файл не в ту папку. Он появлялся в списке, но серый, и естественно не работал.
Может цвет означает что нет исходного файла? Или файл скомпилирован в другом билде?
Закончил мульти-версию. Три пары задействОвал.
По всем парам - "классический" расчет индюков и входов.
Структура получилась такая :
///////////////////////////////////////////////////////////////////////
-Блок внешних параметров.
-Блок отображения информации на графике первой пары по всем инструментам.
-Блок обьявления переменных и расчета индикатров :
первой пары
второй пары
третьей пары
-Блок открытия и закрытия позиций
первой пары
второй
третьей
-Блок сопровождения позиций (три трала)
-Блок функции проверки наличия ордеров эксперта
///////////////////////////////////////////////////////////////////
Неслабая портянка получилась! Я пока вставлял кусочки кода и двигал движок туда-сюда, -- уже и забывал, что я собственно хотел куда вставить!
Так что исходная схема у нас готова. Предполагаю, что версию по GBPUSD можно оставить в классическом варианте (плюс 2МА - добавить), а две другие пары можно заменить как версии нового поколения! - Ну это сам посмотришь. Решим.
Глянь на почту!
Проверил на мт4MQ на тф 1мин. Работает как часики! Только почему-то не отображается на графике инф-я. А в двухвалютной отображалась! Посмотри, - что там.
Что-то у меня почта глюкнула на Яндексе! Не могу войти! Не знаю почему.
Никак у меня не получается вставить блокировку в классическую версию. Вроде сделал по аналогии с версией нового поколения. Но что-то не работает блокировка...
Привет, Леонид! Получил почту, спасибо. Правда небыло времени глянуть пока.
А на счёт блокировки, ты прав всё дело с этими строками.
Ок! Там в трехвалютке не отображалась информация на графике.
Разобрался почему!
В блоке отображения инф-и нужно раскомент. две строки в самом конце:
//info=StringConcatenate(info,on_off,"\r\n");
//info=StringConcatenate(info,"\r\n");
Поставил вопрос на MQ
http://forum.mql4.com/ru/7838
Но ответа пока нет....
to NoName:
Вот ещё идея подошла!
Нет необходимости ограничивать число пар в советнике. Можно заложить в него 5-8 пар. Которые удовлетворительно работают по этой тактике. А число открытых ордеров при необходимости мы можем ограничить, если в условие открытия каждой пары добавим примерно вот такую конструкцию:
Решил проблему с библиотекой "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);
Вот попробовал на скорую руку советника сделать по амкам, знающие люди Помогите, Hilfe, Help!!!!
Скажу сразу что в суть кода не вникал.
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 и т.д.
Dimi, возьми для начала одно - самое простое условие и заявляй для начала одну- две своих переменных. Не два десятка!
Разберись, чем отличаются double, int, bool
а ТАКЖЕ - как правильно записать iCustom
Что бы тебе не лазить по лекциям и путаным комментариям сделай так, как по рекомендации Hеlen-ы делал я когда - то:
Например. Установи в метаэдиторе в меню русский язык.
Далее в коде советника выдели мышкой интересующий тебя термин.
Например iCustom. После чего смело нажимай клавишу F1 !
и ты получишь справку - что такое iCustom - в самом низу метаэдитора. И как им правильно пользоваться. ----------------------------------------------------------------------------------------------
NoName совершенно верно заметил.
Ты одно название (например extern double nfast ) ЗАЯВЛЯВЛЯЕШЬ два раза! Во второй раз надо присвоить другое название. Т.к. это уже другая ЕМА
но сначала вот что. В мт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)
Для начала поясни - что ты хочешь сделать. Как использовать индикатор . Например , назови хотя бы одно из условий на вход и мы попробуем его реализовать в коде.
Дааа блин, как все запущенно..... Разбираться и разбираться еще.... Бум читать, учиться...
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);
Остановимся для начала на периоде. Пусть у нас будет покупка когда Амка с малым периодом (быстрая) пересекает Амку с большим периодом (медленную) снизу вверх.
Продажа - соответственно наоборот - сверху вниз.
Таким образом во внешних параметрах советника будут заданы для начала эти периоды.
Привет!!! Давай наверное начнем с самого начала. Я так понял, что вот эти (nfast,nslow,Pow,dK,use_stdev,app_price) вообще не нужны или??? Тогда получиться, где вводим переменные
Значения (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 ? Да и др. параметры тоже...
условия на покупку - вместо
if (бла- бла-бла)
if ((AMKA1_1 < AMKA2_0) && (AMKA1_0 > AMKA2_0) )
// покупаем
//**************************************************
на продажу:
if ((AMKA1_1 > AMKA2_0) && (AMKA1_0 < AMKA2_0) )
Если кто знает, отзовитесь пожалуйста!!!
Вот это условие правильно записано???
вот только обратил внимание, что индюк работае скорее всего по открытиям баров. Не по тикам.
Это означает, что надо ввести в советник соотв. условие.
Тогда последний "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 как у тебя )
ВВел в код условие работы по ценам открытия.
И вроде заработал эксперт.
Вот глянь, Леонид. Вставил твои библиотеки.
Sovetnik_Amka.rar ( 4.46 килобайт )
Кол-во скачиваний: 349
Надо разобраться с
iCustom(NULL, 0, "AMkA", periodAMA_1 ,2,30,2,1,5,0,0);
Похоже здесь ошибка у нас
to NoName,
для блокировки никак не могу разобраться с таким вариантом открытия (в др. вариант вставил):
По куску кода сложно понять куда именно его нужно вставить в данном случае. Но основная идея такая: ZeroBarOrd (переменная отвечающая за наличие ордеров на нулевом баре) получает значение true в случаях:
1. При появлении нового бара и наличии открытой позиции, иначе false;
2. При каждом успешном открытии позиции.
1 пункт выполняется строками:
Да - так и заявил. В глобальные.
В обычном коде вставил и заработало :
Если имеется ввиду этот момент, то нужно написать так:
Благодарю. Сейчас попробуем...
Опять проблемы с блокировкой! В мультивалютном.
Пока поставил блокировку только на одну пару в мультивалютном. Но ..., эта пара вообще перестала включаться!
Как было велено, на глобальном уровне заявил:
Привет всем!!! Леонид, ты использовал хоть раз a-ATR_Trailing.mqh в советниках??? Сразу вроде бы мне понравился ( в некоторых местах очень красиво передвигает стоп, даже можно поучиться у него этому ) Но что-то меняю в нем период, а он никак не реагирует на это. Не знаешь почему???
А что это такое? Не сталкивался с таким ни разу.
Кстати по определению тренда.
Rosh, на форуме метаквотов приводил пример в своем советнике - как программно задать ( опред-ть) - тренд/не тренд.
Там, правда, без стакана не разберешься.....
http://codebase.mql4.com/ru/1256
Вроде выясняется с блокировкой вопрос. Вот как сделал -
Dimi, посмотрел и вник в систему входов. Прикидывал и так и эдак... Пришел к выводу, что использование индикатора В-Bonds вряд ли целесообразно. При таком алгоритме входов.
Вот почему . Индюк считается трендовым. Иначе говоря, при отсутствии тренда канал сужается и здесь оправдана торговля отскоком от границ канала внутрь. Поскольку предполагается, что 90% времени цена находится в границах канала - внутри. При наличии тренда границы канала расширяются, а цена практически постоянно болтается на самой границе, многократно её пересекая. И мы входим в рынок на этих пересечениях, - против тренда!. Таким образом прежде, чем поймать перелом этого тренда, мы получим сначала пару лосей!
Есть ещё один момент. В ОПИСАНИЯХ индикатора говориться, что если при тренде выброс цены уходит за границу более, чем на 30% от ширины канала, то неминуем быстрый возврат назад - внутрь границ. Вероятность взятия прибыли здесь = 80% . Но этот случай надо уже отдельно задавать программно, и это не так просто.
На графике - типичный пример работы эксперта, - трeнд вниз, а входы в основном вверх - со всеми вытекающими....
Эскизы прикрепленных изображений
А если взять менее чуствительный канальный индикатор? В самом простейшем случае - добавить обычную МА(син) и провести по ней верхнюю и нижнюю границы(желт)?
И ещё там ты спред задаешь во внешних параметрах и привязываешь его к стоплоссу. А зачем? Зачем вручную задавть спред для тестируемой пары, - когда советник может вычислить его самостоятельно!
Эскизы прикрепленных изображений
Это можно сделать вот так:
В глоб. переменных (во внеш. параметрах) добавь
static int spread = 3;
А потом
ещё проще - взять уже готовый код - индюк Envelopes В его классической установке -
(отклонение задавать в долях, напр. =0.25)
Эскизы прикрепленных изображений
Леонид, объясни мне пожалуйста. Как две версии советника в один вставить??? И чтоб можно было их по отдельности включать выключать. Что то пытаюсь, а нифига не получается.
По одной паре или по разным?
Глянь в почту. Послал мультивалютную версию (три в одном)
Если надо по одной паре, - то там проще намного будет.
p.s. Сделай пож. на счету по фунту в эксперте LotsWayChoice = 0
Сыроват он ещё для реала - надо понаблюдать, как он с постоянным лотом будет работать....
Усе гатова, Шеф!!! Ноль дак ноль "Три в одном" получил, тружусь дальше Спасиб!!!
Исправил ошибки в эксперте. Теперь трал по второй версии заработал. Код можно упростить. Т.к. некоторые переменные - одинаковые для обеих версий. Их можно вынести в общие переменные.
Но вот сделки в селл, - никак не получаются. Не дают профита.
Посмотрел в визуальном режиме. И оч. удивился! Этот алгоритм "по определению" не должен давать прибыль! Ни в бай, ни в селл. Но, тем не менее, дает неплохой результат при длинных сделках, да ещё с мизерной просадкой! - 300 пипсов с янв. 2006г.
Но так не может быть, - это видно из графиков ниже, - почти по всей истории эксперт постоянно (без исключений) работает против тренда - когда тренд, вверх советник продает! Когда тренд вниз, - советник покупает! Откуда здесь может быть прибыль ПРИ ДЛИННЫХ СДЕЛКАХ - полная загадка!
А при коротких сделках прибыли нет и не будет - это очевидно - см. график.
Красн. треуг. - сделки в селл. Синии - в бай. Молотит против тренда....
Похоже, ты где-то что-то в условиях написал так, что алгоритмы входа длинных и коротких сделок отличаются. Надо найти это отличие. Я пока не нашел. Но тебе, - как автору, это легче сделать.
Чуть позже приведу эксперт в "читабельный" вид и пришлю....
Эскизы прикрепленных изображений
Dimi, похоже придется нам вникать в определитель тренда в эксперте у Rosh-а
Ну ладно.
Вот ты поставил условия на продажу:
//--------проверяем условие на продажу------------------------------
if (
(ZeroLagRed_sell > 70) && (ZeroLagGreen_sell>90) &&
//-----------------------------------------------------------------------------
Но если эти линии находятся в верней части графика, - то это однозначно означает, что имеет место тренд вверх!!!!
А ты хочешь продавать ....
И при покупке тож самое....
Конечно рано или поздно тренд закончится, цена развернется и мы поймаем одну, - последнюю, прибыльную сделку. Но при этом, предыдущие несколько сделок будут вступать против тренда и мы предварительно наловим лосей...
Я уже понял, что на селл там профитом и не пахнет, как ни крути А вот на бай работает и работает Да надо разбираться дальше.... И по поводу трэнда тож и наверное даже в первую очередь...
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. Там уже так сделано. Красная линия уже подвешена на зеленый стохастик. И подвесить в свою очередь на неё дополнительную МА мне не представляется возможным. Потому что дополнительная МА опять же вешается на зеленую линию. См. рис. - дополн. МА - желтого цвета.
Эскизы прикрепленных изображений
Можешь забыть про эту МА, бред это Я уже визуально проверил по истории. Я вот тут подумал может лучевую тактику попробовать применить как фильтр. то есть позиции открываются только в направлении луча либо на перегибах???? Вот сижу читаю теперь, что вы там придумали по ней с Андреем... Да и трал думаю надо получше может тот 3 уровневый???
Ну трал-то не проблема вставить другой. Тот трех-уровневый получше, конечно, отрабатывает. Но не всегда. По евроиене он идеально подходит. По другим парам, - только опытным путем нужно выяснять.
Чтобы вставить его в код нужно ввести в глобальные переменные
Честно говоря не очень понял как там можно трэнд определить.... А трал сейчас вставлю.
Вот подметил я любопытную закономерность в работе этого цифрового индюка !
При хорошем трендовом рынке (например - тренд вниз) почти вся гистограмма уходит в минусовую зону. При этом, при даже оч. мелких коррекциях (против тренда) небольшие бугорки выходят ненадолго в плюсовую зону и потом опять возвращаются в глубоко в минус. Это очень хорошо видно на графиках! Если мы подвесим на гистoграмму МА (КРАСНАЯ ЛИНИЯ), то при трендовом рынке получаем отличные входы строго по тренду! При пересечении малыми бугорками гистограмы линии МА вблизи нулевой линии мы входим в рынок, - входы показал стрелками. И для UP-тренда и для DOWN-тренда.
Нужно лишь статистически (при оптимизации) подобрать допустимый макс. размер этих бугорков. Программно это нетрудно реализовать.
Но и это эщё не все. Есть и др. закономерности в работе этого индюка! На первый взгляд противоречущие здравому смыслу, но .... (см. галочку на одном из графиков)
Эскизы прикрепленных изображений
Можно попробовать, но я уж точно это дело программно не смогу пока написать. Я вот тут заметил, мы с тобой такую хрень придумываем и самое интересно, что она почему-то работает Сейчас достал все индюки из заначки и пытаюсь что-нибудь подходящее подобрать....
Я как то уже излагал свою мысль в другой ветке по автоматическим системам и в статье у 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)
--------------------------------------------------------------------------------
При этом вне выборки за сентябрь прибыль составила несколько десятков тысяч! Вот бы и в реале он так же бы работал!
Эскизы прикрепленных изображений
Так то оно так вот только надо решить одну задачку, когда трэнд, когда флэт??? Вариантов разных много вот только для эксперта подходящего нет пока.... И практически все запаздывают, то есть пока разберёшься что к чему, то уже только верхушки остаются. Хорошо когда затяжные трэнды и флеты есть. Но они не так уж и часто бывают....
Да задачка непростая...
Тогда можно подойти к решению иначе. Оставить в стороне тренд и флет. И посмотреть, - а какие другие критерии и резоны существуют?
Например критерий оптимального входа.
Возьмем индикатор Стохастик. Мы знаем, что по классичеcким правилам его использования вход в рынок, - это пересечение линией стохастика зоны перекупленности/перепроданности снаружи внутрь. А если поискать нестандартное решение? На гафике ниже видно, что если мы будем исполнять входы не так, как нам диктуют классические правила, а немного наоборот, - против здравого (на первый взгляд) смысла, то из каждых четырех сделок в трех мы строго берем профит!
Известно, что при трендовом рынке или даже, просто, при достаточно хорошем движении Стохастик "любит" залипать в зонах перекупленности или перепроданности. Можно попробовать нестандартно использовать это свойство. Будем входить в рынок не так, как диктуют нам классические правила. А иначе! Наоборот будем покупать, когда стохастик изнутри наружу пробивает границу этих зон!
На графике я показал стрелками входы в бай и в селл.
ВЗЯЛ первый попавший график (честно - не подбирал специально!). Из пяти входов обозначенных стрелками в четырех мы строго берем профит! Да и в пятом (втором по графику - селл) входе при грамотном использовании трала мы, как минимум, будем в безубытке!
Конечно, для этой тактики нужно брать параметры не (5. 3. 3), а чуть увеличить К-период и замедление.
Например (20. 5. 3). Статистически подобрать уровни(границы) зон перекупленности/перепроданности.
Возможно, и ещё дополнить программно дополнительным индикатором в качестве фильтра.
В самом простейшем случае этот алгоритм можно использовать для доливки уже открытых позиций.
Но и в качестве отдельной тактики, я думаю, можно попробовать. Тем более, что советник здесь можно "слепить" за 20 мин.
Эскизы прикрепленных изображений
Идея довольно интересная, но без фильтра думаю здесь не обойтись. Да и границы не стоит опускать, не поднимать. Вообще не люблю я эту оптимизацию. Максимум можно трал,стоп да ТР оптимизировать. Эксперт должен чисто по системе работать без всякой там оптимизации. А система либо работает либо не работает. Это мое мнение
На скорую руку изготовил эксперт по описанной методике. Прибыль дал с полтыка с янв. 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)
Эскизы прикрепленных изображений
http://championship.mql4.com/2007/ru/users?k=leonid553&x=25&y=7
Не всегда там ссылка почему-то работает.
Проще зайти на стр. http://championship.mql4.com/2007/ru/users Набрать там справа в строке УЧАСТНИКИ- leonid553 - в поиске и откроюся текущие сделки моего эксперта.
Леонид, Андрей спасибо за большую работу, ветка очень помогла при освоении НС. Подскажите, вы сейчас отказались от работы в данном направлении? Или я неправильно понял? Считаете ли вы его переспективным?
------------------------
С уважением, Игорь.
Нет. Не отказались. Но при скромных знаниях по НС , видимо, более того, что тут уже сделано я ничего добавить не смогу. Разве что - http://articles.mql4.com/ru/403
Удачи !
Здравствуйте, у меня такой вопрос. Я так понимаю при работе этого советника компьютер не должен выключаться даже в выходные?
Спасибо большое за проделанную работу, я немного модифицировал советника и выставил на конкурс. Правда опоздал на недельку.
При работе любого эксперта компьютер должен быть включен и соед. с интернетом. На выходных рынок форекс не работает и комп. можно отключать. При включении эксперт опять "подхватывает" свои сделки и сопровождает их.
Однако. Описываемые в этой ветке эксперты раьотают по "ценам открытия" свечей. Т.е. в начале каждого часа (если эксперт работает на тф=н1) эксперт включается, анализирует ситуацию, закрывает , открывает или переворачивает позиции - после чего отключается до начала следующего часа. Таким образом , можно включать комп. каждый час в .n час 59 мин на несколько минут и потом выключать - до след. часа.
Или каждые 4 часа включать - если эксперт работает на тф=н4. И т.п....
По поводу кода
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);
}
Конкурс проходит на сайте http://fx-invest.ru Начинающим -> Конкурс -> РАСПИСАНИЕ КОНКУРСОВ, проходит раз в месяц.
Тестирование советников провожу с депо = 200$ лот = 0.1 , считаю, что если эксперт может подняться с минимума он и с бОльшим депозитом справится :-)
Меня беспокоит только одно! Как было выше сказано, ему нужно попасть в такт, если тестить его с другой даты, отличающуюся на день-два, сливает сразу (не всегда конечно, к счастью).
Вот результаты тестов советника обсуждаемого в начале поста.
Прикрепленные файлы
StrategyTester.rar ( 8.15 килобайт )
Кол-во скачиваний: 251
Dark Trader, тест нельзя назвать корректным. Что это за число сделок - чуть больше двадцати? При оптимизации тестер всяко сумеет выбрать из десятков миллиардов комбинациий х1-х8 несколько тысяч таких - где 99% сделок из этих 21 будут прибыльными. Т.е. получается обычная подгонка. А вот далее, - скорее всего будет слив! - Вот выложите результат теста (прогона) вне периода оптимизации - с 1янв. 2008г. по сей день, - посмотрим, что получилось!
И ещё, - я бы не рискнул ставить в реал эксперта, который за полгода на тф-н1 делает всего 21 сделку. Ну терпенья у меня не хватит ждать! А у вас ?
Все изложенное вовсе не означает, - что эксперт плохой или хороший. Просто тест надо провести так, чтобы сделок было не менее 100-150, и самое главное , - обязательно после оптимизации сделать контрольный прогон вне периода оптимизации. (вне выборки). Т.е. вы оптимизируете с 1.06.2007 по 31.12.2007.
А контрольный прогон нужно провести с 1 янв. 2008г. по сей день !
Баров в истории 2348
Начальный депозит 1000.00
Чистая прибыль 3911.07
Общая прибыль 5859.70
Общий убыток -1948.63
Прибыльность 3.01
Матожидание выигрыша 35.23
Абсолютная просадка 50.84