Советники: AG

 

AG:

Ja ne programist, potomu izvenjajus za oshibki. Eto moj pervij sovetnik,pozalujsta ocenite. I na skolko etot sovetnik nadjozen.

Author: Gatis

 
Вас интересовала оценка советника. Проведите простой тест. Оптимизируйте его на интервале
май-август 2007 г., затем прогоните тест с полученными установками с января по декабрь 2007 г. и выложите стейт.
Так можно косвенно оценить наличие переоптимизации и стабильность советника.
 
нормальная такая просадочка - 58%. Хотя лот можно и поменьше задать
 
Хорошо бы его протестировать с 1995 - 2001 и с 2001 - 2008. В этих интервалах времени отчетливо видны низходящий тренд и восходящий. В данном случае советник несет прибыль т.к "верно" открывает buy - всеравно с 2001 года восходящий тренд. Вот интересно как он поведет при низходящем тренде. Я думаю надо  тестить именно с 1995.
 
Bez:
Хорошо бы его протестировать с 1995 - 2001 и с 2001 - 2008. В этих интервалах времени отчетливо видны низходящий тренд и восходящий. В данном случае советник несет прибыль т.к "верно" открывает buy - всеравно с 2001 года восходящий тренд. Вот интересно как он поведет при низходящем тренде. Я думаю надо  тестить именно с 1995.

На мой взгляд грааль это то что делает бабосы из неоткуда - продает при восходящем тренде и покупает при низходящем тренде. Если так и есть значит и по тренду торговать будет без проблем.
 

Символ EURUSD (Euro vs US Dollar)
Период 1 Час (H1) 1999.01.08 18:00 - 2008.01.04 20:59
Модель По ценам открытия (только для советников с явным контролем открытия баров)
Параметры Lots=1; FastEmaPeriod=15; SlowEmaPeriod=18; SignalPeriod=30; ORDER=1;

P.S. Перед тестом в советник был добавлен контроль открытия баров. В любом случае в советнике значения MACD берутся с первого, тоесть с уже сформировавшегося бара.

Вывод - для новичка советник хорош, автор молодец.

 
Topor:

Символ EURUSD (Euro vs US Dollar)
Период 1 Час (H1) 1999.01.08 18:00 - 2008.01.04 20:59
Модель По ценам открытия (только для советников с явным контролем открытия баров)
Параметры Lots=1; FastEmaPeriod=15; SlowEmaPeriod=18; SignalPeriod=30; ORDER=1;

P.S. Перед тестом в советник был добавлен контроль открытия баров. В любом случае в советнике значения MACD берутся с первого, тоесть с уже сформировавшегося бара.

Вывод - для новичка советник хорош, автор молодец.

Spasibo za pohvalu.
Nu wto vi dobavili v moi sovetnik, kakoj kod? Mozet podskazite.
 
gatgen писал(а):
Spasibo za pohvalu.
Nu wto vi dobavili v moi sovetnik, kakoj kod? Mozet podskazite.

extern double     Lots=     1;
extern double     FastEmaPeriod=   15;
extern double     SlowEmaPeriod=   18;
extern double     SignalPeriod=     30;
extern double     ORDER=   10;
static int prevtime = 0;
//+------------------------------------------------------------------+
//|          expert start making money - sometimes                   |
//+------------------------------------------------------------------+
int start()
  {
   
    if(Time[0] == prevtime) return(0);
   prevtime = Time[0];
   
   int  ticket, total;
Вот что я добавил.
 
в общем первый опыт кодирования советника достаточно на хорошем уровне,  но позволю сделать себе следующие замечания:
по логике советника -
1. советник при поступлении сигнала на смену направленности позиции и наличие лимитированного количества позизий будет пропускать тики и не будет открывать позиции до тех пор, пока не будут закрыты ранее открытые позы, т.е. логичнее было бы сначало закрыть позиции открытые в предыдущем направлении, а затем открывать позиции в новом направлении.
2. и при открытии позиций и при их закрытие идет проверка на условия отношения позиций индикаторов, при этом обе проверки происходят в любом случае, а ведь правильнее было бы если первое условие удовлетворительное (т.е. например выполняются условия на открытие селл), то остальные условия не проверялись, т.к. это бесполезно (не могут же одновременно выполняться условия и на бай)? поэтому чтобы исключить подобную бесполезную работу эксперта здесь нужно использовать конструкцию if - else

по коду -
1. смотрим условия на открытие селл позиции
if( (SAR<SA) && (SA>0) && (SAR1<SA1) && (SA1>0) )
теперь на закрытие бай позиции
if( (SAR1<SA1) && (SA>0) )
что мы видим? а видим мы что одни и теже условия (3 и 2 часть кода проверки на вход в селл) проверяются дважды, это не есть эффективно, поэтому стоило бы объединить эти участки и делать проверку один раз
if( (SAR1<SA1) && (SA>0) )
{
   //здесь проверим возможность открытия селл позиций
   if( (SAR<SA) && (SA1>0) )
   {
     ...
   }
   //здесь доп. проверка условий на закрытие бай позиций
}
аналогичным образом на открытие бай и закрытие селл позиций (однако не забываем про ранее сказанное о логике, лучше сначало проверять на необходимость закрытия противоречащих поз)
2. одна из самых распространенных ошибок в кодировании, это сравнение чисел с плавающей точкой подобным образом в MQL, разработчике не зря включили в стандартную библиотеку функцию bool CompareDoubles() (см. файлик stdlib.mq4) и на форуме соответственно это проблема обсуждалась не раз, в т.ч. и мной, поэтому еще раз привожу пример видоизменненной функции сравнения двух чисел с плавающей точкой, использование которой приведет к ожидаемым результатам, в ней идет проверка на условие что первое число (number1) больше второго (number2) с точностью до количества знаков указанным в третьем параметре функции (dig)
//+--------------------------------------------------------------------------------------------------------------------------------------------------+
//| right comparison of 2 doubles                                                                                                                    |
//+--------------------------------------------------------------------------------------------------------------------------------------------------+
bool GreaterDoubles(double number1,double number2,int dig)
{
   if(NormalizeDouble(number1-number2,dig)>0) return(true);
   else return(false);
}
3. засорять логи пользователей - тоже не очень хорошо, поэтому отладочная информация должна отключаться после теста работы эксперта. Вывод сообщений об ошибках остается, а вот сообщения об открытых позициях нужно удалять, зачем дублировать то, что терминал и так проделает сам?
//Print("OPEN SELL ORDER :  ",OrderOpenPrice());
4. совершенно непонятно какую полезную нагрузку несет переменная "chk", вне зависимости от того что введет пользователь внутри кода ей все равно будет присвоено значение 1, причем делаться это будет чуть ли не на каждый тик, а для чего ? мало того что чуть ли не при каждой отработке функции старт мы будем выполнять операцию присвоения значения, так еще и бесполезная проверка условий будет в дополнение выполняться
5. для чего проверять AccountFreeMargin ? логично если необходимо открыть позицию, поэтому правильнее было бы проверять состояние перед операцией открытия новой позы, а у тебя не эффективно, надо не надо - условие проверяется.
6. для чего осуществлять выбор ордера после его открытия? почему сравнение идет с 1, а не с "-1", даже в приведенных в справочниках примерах везде сравнивается на удачность постановки, а не номер тикета. Если ticket<1 , в т.ч. и "-1" , то ничего выбрать есстественно невозможно и вторая проверка всегда будет истинной, т.е. будет печататься сообщениея, да и сообщение об ошибке установки ордера будет выдаваться в случае его удачного исполнения
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"SAR position:",16385,0,Red);
//возвратит номер тикета или -1 если неудачная попытка
if(ticket<1)
{
   //здесь будет выполняться если ticket<1, т.е. в том числе и "-1"
   if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==False)
   {
       //Print("OPEN SELL ORDER :  ",OrderOpenPrice());
   }
}
else
{
   //здесь будет выполняться если ticket>=1
   Print("-----ERROR-----  opening SEEL order : ",GetLastError());
   return(0);
}
7. ордера при таком коде будут открываться пачками, т.е. сколько тиков и при этом соблюдение условий,  столько и ордеров, ограничение лишь их лимит :( , т.е. здесь тоже недоработка

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

Че та не разберусь, обьясни логику открытия и закрытия позиций, т.е. при каких условиях?

Причина обращения: