Какой режим тестирования использовался? потиковый, по контрольным точкам или по открытию баров?
Если потиковый, то запросто можно получить время 23:59 - нужен полный код эксперта чтобы проверить.
Если потиковый, то запросто можно получить время 23:59 - нужен полный код эксперта чтобы проверить.
я могу предположить, что объёмы у Ваших дневных баров равны 1. поэтому сгенерированы только последние состояния баров на время 23:59
Какой режим тестирования использовался? потиковый, по контрольным точкам или по открытию баров?
Запустил на тестирование (билд 178, модель 2)
Если потиковый, то запросто можно получить время 23:59 - нужен полный код эксперта чтобы проверить.
да какая разница! я же пишу , что все торговые операции заключены внутри условия
extern int bTF=1440;
if(bTimeFlag!=iTime(NULL,bTF,0))
{
bTimeFlag=Time(NULL,bTF,0);
здесь прописаны все действия производимые экспертом
...
}
что означает = если время бара отличается от сохраненного в переменной bTimeFlag, то начинаем выполнять действия и сначала записываем новое время в переменную, пока не появится новый бар
ни о каких действия речи быть не может. Новый бар на дневках появляется в 00:00, эксперт может отловить это чуть позже, но не заранее. Экспертов я привел в "Моделирование?!?" (автор ветки-loewe).
Оба приведенных мною экспертов показывают наличие проблем с временной шкалой (уже недели две как) , кроме того в этой ветке я привел картинку, на которой видно и установленные уровни
стоп-лосс и что цена побывала ниже, а стоп не сработал
//---- input parameters
extern int bTF=1440;
extern int AMARange=10;
extern int AMAFast=2;
extern int AMASlow=20;
extern int AMAFilter=60;
extern int AMAn=6;
extern double AMAh=0.003;
extern double bePillow=0.004;
extern double biPillow=0.001;
extern int PCRange=6;
extern int ShRange=30;
extern double Sh_k=2.4;
//--------- объявление глобальных переменных
int bTrFlag=0;
datetime bTimeFlag=0;
double bBSLoss=0.0, bSSLoss=0.0, bSLim=0.0, bBLim=0.0;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int i,j;
double mlot=1;
//----
if(bTimeFlag!=iTime(NULL,bTF,0))
{
GetIbTFValue(0);
//----
//------------------- если флаг направления равен 11 ----------------------------------------------
if(bTrFlag==11)
{
//если есть открытые ордера закроем или удалим все кроме OP_BUY
if( OrdersTotal()>0 )
{
for(i=0;i<OrdersTotal();i++) //цикл по ордерам
{
//делаем попытки ордер селект
if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
{
Alert("Внимание!!! Необходимо удалить (закрыть) ордера отличные от OP_BUY");//выдаем сообщение
}
else
{
//если ордер отложенный
if( OrderType()>1 )
{
//делаем попытки удалить его
m_ODel(100);
}
else
{
if( OrderType()==1 ) //если ордер OP_SELL
{
//делаем попытки закрыть его
m_OClose(Ask,1,Black,100);
}
}
}
}
}
//конец блока удаляющего и закрывающего "лишние" ордера
//теперь если остались ордера то это OP_BUY для них нужно проверить необходимость передвижения стопа
//если нет - тогда нужно открыть нужные ордера
if( OrdersTotal()<1 )
{
m_OSend(Symbol(),OP_BUY,mlot,Ask,1,bBSLoss,0,""+bTrFlag,bTrFlag,0,DeepSkyBlue,100);
}
else
{
for(i=0;i<OrdersTotal();i++) //цикл по ордерам
{
//делаем попытки ордер селект
if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
{
Alert("Внимание!!! Необходимо скорректировать значения ордеров OP_BUY");//выдаем сообщение
}
else
{
if( OrderStopLoss()<bBSLoss )
{
m_OModify(0,bBSLoss,OrderTakeProfit(),0,DeepSkyBlue,100);
}
}
}
}
}
//-------------------------------------------------------------------------------------------------
//------------------- если флаг направления равен 12 ----------------------------------------------
if(bTrFlag==12)
{
//если есть открытые ордера закроем или удалим все кроме OP_SELL
if( OrdersTotal()>0 )
{
for(i=0;i<OrdersTotal();i++) //цикл по ордерам
{
//делаем попытки ордер селект
if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
{
Alert("Внимание!!! Необходимо удалить (закрыть) ордера отличные от OP_SELL");//выдаем сообщение
}
else
{
//если ордер отложенный
if( OrderType()>1 )
{
//делаем попытки удалить его
m_ODel(100);
}
else
{
if( OrderType()==0 ) //если ордер OP_BUY
{
//делаем попытки закрыть его
m_OClose(Bid,1,DeepSkyBlue,100);
}
}
}
}
}
//конец блока удаляющего и закрывающего "лишние" ордера
//теперь если остались ордера то это OP_SELL для них нужно проверить необходимость передвижения стопа
//если нет - тогда нужно открыть нужные ордера
if( OrdersTotal()<1 )
{
m_OSend(Symbol(),OP_SELL,mlot,Bid,1,bSSLoss,0,""+bTrFlag,bTrFlag,0,Black,100);
}
else
{
for(i=0;i<OrdersTotal();i++) //цикл по ордерам
{
//делаем попытки ордер селект
if( m_OSelect(i,SELECT_BY_POS,MODE_TRADES,100)!=1 ) //если ордер не выбран
{
Alert("Внимание!!! Необходимо скорректировать значения ордеров OP_SELL");//выдаем сообщение
}
else
{
if( OrderStopLoss()>bSSLoss )
{
m_OModify(0,bSSLoss,OrderTakeProfit(),0,Black,100);
}
}
}
}
}
//-------------------------------------------------------------------------------------------------
//------------------- если флаг направления равен 21 ----------------------------------------------
if(bTrFlag==21)
{
}
//-------------------------------------------------------------------------------------------------
//------------------- если флаг направления равен 22 ----------------------------------------------
if(bTrFlag==22)
{
}
//-------------------------------------------------------------------------------------------------
//во избежание недоразумений обнуляем глобальные переменные
bTrFlag=0;
bBSLoss=0.0;
bSSLoss=0.0;
bSLim=0.0;
bBLim=0.0;
}
return(0);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Функция получения данных индикатора на большом т-ф |
//+------------------------------------------------------------------+
int GetIbTFValue(int cb)
{
//----
bTimeFlag=iTime(NULL,bTF,cb); //изменяем значения флага времени последнего получения данных с индикатора
//устанавливаем значение флага направления торговли
bTrFlag=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,6,cb);
if( bTrFlag>10 )
{
if( bTrFlag==11 )//если восходящий тренд
{
//получим значение стоп-лосс для позиции Buy
bBSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,2,cb);
return(0);//выходим из функции
}
else
{
if( bTrFlag==12 )//если нисходящий тренд
{
//получим значение стоп-лосс для позиции Sell
bSSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,1,cb);
return(0);
}
}
}
if( bTrFlag>20 && bTrFlag<23 ) //если флет
{
//получим значения точек отбития и пробития
bBSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,4,cb);
bSSLoss=iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,3,cb);
bBLim= iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,2,cb);
bSLim= iCustom(NULL,bTF,"exp1_2",AMARange,AMAFast,AMASlow,AMAFilter,AMAn,AMAh,bePillow,biPillow,PCRange,ShRange,Sh_k,1,cb);
return(0);
}
else
{
//если значение флага направления не соответствует ни одному из перечисленных
//обнулим навсякий пожарный флаг направления торговли
bTrFlag=0;
//и сообщим о том что возникла не предвиденная ситуация
Alert("Внимание!!!Не предвиденная ситуация!!!");
}
//----
return(-1);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток ордер селект |
//+------------------------------------------------------------------+
int m_OSelect(int ct, int sel, int pool, int Attempt)
{
int i;
//----
//ордер селект за Attempt попыток
for(i=0;i<Attempt;i++)
{
if( OrderSelect(ct,sel,pool)==1 ) //если ордер выбран
{
Alert( "Попытка ордер селект удачна "+OrderTicket() );
return(1);//завершаем функцию
}
}
Alert( "Код ошибки - "+GetLastError() );
Alert("Невозможно ордер селект! Сделано "+Attempt+" попыток.");
//----
return(-1);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток удалить ордер |
//+------------------------------------------------------------------+
int m_ODel(int Attempt)
{
int i;
//----
//пытаемся удалить ордер за Attempt попыток
for(i=0;i<Attempt;i++)
{
if( OrderDelete(OrderTicket())==1 ) //если ордер удален
{
Alert("Ордер "+OrderTicket()+" удален!!!");
return(1);//завершаем функцию
}
}
Alert("Внимание!!! Не удалось удалить отложенный ордер. "+OrderTicket()+" Сделано "+Attempt+" попыток");
//----
return(1);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток закрыть ордер |
//+------------------------------------------------------------------+
int m_OClose(double Price, int slip, color ocolor, int Attempt)
{
int i;
//----
//пытаемся закрыть ордер за Attempt попыток
for(i=0;i<Attempt;i++)
{
if( OrderClose(OrderTicket(),OrderLots(),Price,slip,ocolor)==1 ) //если ордер закрыт
{
Alert("Ордер "+OrderTicket()+" закрыт!!!");
return(1);//завершаем функцию
}
}
Alert("Внимание!!! Не удалось закрыть ордер. "+OrderTicket()+" Сделано "+Attempt+" попыток");
//----
return(1);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток послать ордер |
//+------------------------------------------------------------------+
int m_OSend(string osymb, int otype, double ovol, double oprice, int oslipp, double osloss, double otprof, string ocomm, int omagic, datetime expir, color ocolor, int Attempt)
{
int i;
//----
//пытаемся удалить ордер за Attempt попыток
for(i=0;i<Attempt;i++)
{
if( OrderSend(osymb,otype,ovol,oprice,oslipp,osloss,otprof,ocomm,omagic,expir,ocolor)!=-1 ) //если ордер послан
{
Alert("Установка ордера прошла удачно!!!");
return(1);//завершаем функцию
}
}
Alert("Внимание!!! Не удалось поставить ордер. Сделано "+Attempt+" попыток");
//----
return(1);
}
//-------------------------------------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Функция делает Attempt количество попыток изменить ордер |
//+------------------------------------------------------------------+
int m_OModify(double nprice, double nsloss, double ntprof, datetime nexpir, color ncolor, int Attempt)
{
int i;
//----
//пытаемся удалить ордер за Attempt попыток
for(i=0;i<Attempt;i++)
{
if( OrderModify(OrderTicket(),nprice,nsloss,ntprof,nexpir,ncolor)!=-1 ) //если ордер послан
{
Alert("Ордер "+OrderTicket()+" изменен удачно!!!");
return(1);//завершаем функцию
}
}
Alert("Внимание!!! Не удалось изменить ордер. "+OrderTicket()+" Сделано "+Attempt+" попыток");
//----
return(1);
}
//-------------------------------------------------------------------------------------------------
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
extern int bTF=1440; if(bTimeFlag!=iTime(NULL,bTF,0)) { bTimeFlag=Time(NULL,bTF,0); ... }другие т-ф пока не использовались (на дневках будет определяться направление, а точки входа впоследствии будут уточняться на мелких т-ф для этого используется указанный вариант получения времени, а торговлю по дневкам написал для того, чтобы определить эффективность определения направления). Запустил на тестирование (билд 178, модель 2), получил результаты, памятуя о наличии ошибок в моделировании решил посмотреть что же там наторговал мой эксперт. Смотрю на график
Чудеса стопов и профитов начинаются с первой операции:
1. Советник торгует раз в сутки в начале появления нового бара открываются, закрываются, изменяются все позиции, а на вкладке результаты мы наблюдаем время всех операций = 23:59 (иногда все-таки и встречается правильные 00:00 ну или чуть позже, время на просчет + посылки ордера), скорее всего 23:59 предыдущий даты на самом деле является 00:00 следующей за ней датой (см. ветку "Моделирование?!?")
2. по первой операции (OP_BUY) последнее изменение стопа 11/01/1990 23:59 = 1.6572, после этого до момента срабатывания стопа 17/01/1990 23:59 (????) почему-то стоп сработал тоже в 23:59 цена побывала ниже уровня стопа, как минимум два раза (спрэд учтен)
3. если судить по времени срабатывания стопа то уровень должен быть гораздо ниже (жирная красная линия на графике), а так цена закрытия равна уровню стопа который указан в ордере (хоть что-то правильно, уже радует)