можно протестить - только выбираете дату начала тестирования ,и выставляете время старта эксперта и время закрытия - правда как
сработает время закрытия , тестирование прекратится
а в реале каждый день будет открываться и закрываться в заданное время
только - создайте шаблоны, на шаблоне эксперт заданным временем и как он сработает откроет другой шаблон, с другими настройками и так
далее
Хорошо, что эти моменты времени фиксированы и их не нужно оптимизировать. Глянуть бы что-то изящнее чем у меня.
Увы, начало вечёрки - не фиксировано. 19:00 или 19:05, а через год-другой, глядишь, и ещё на пару минут клиринг(дневной или вечерний) продлят, как уже было.
Время сервера и Ваше локальное время могут существенно отличаться.
Да и торговля ведется по времени сервера.
Добавлено
Самое правильное, это проверять время последнего тика
можно заменить TimeLocal() на TimeCurrent()
TimeCurrent
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчикеOnTick()данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов вобработчикахOnInit(), OnDeinit(), OnTimer() и так далее) это –время прихода последней котировкипо любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.
//+------------------------------------------------------------------+//| Moving Averages.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"//---#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
CPositionInfo m_position; // trade position object//---inputdouble MaximumRisk = 0.02; // Maximum Risk in percentageinputdouble DecreaseFactor = 3; // Descrease factorinputint MovingPeriod = 12; // Moving Average periodinputint MovingShift = 6; // Moving Average shift//---sinput group "1"sinputdatetime HoursFrom0 = D'1970.01.01 10:01'; // START//---sinputdatetime HoursTo0 = D'1970.01.01 13:59'; // STOP Closesinput group "2"sinputdatetime HoursFrom1 = D'1970.01.01 14:05'; // START//---sinputdatetime HoursTo1 = D'1970.01.01 18:44'; // STOP Closesinput group "3"sinputdatetime HoursFrom2 = D'1970.01.01 19:00'; // START//---sinputdatetime HoursTo2 = D'1970.01.01 23:49'; // STOP Close//---datetime Today0=D'1970.01.01';
datetime Today1=D'1970.01.01';
datetime Today2=D'1970.01.01';
datetime Todayx=D'1970.01.01';
//---int ExtHandle=0;
bool ExtHedging=false;
//---#define MA_MAGIC 1234501//+------------------------------------------------------------------+//| Calculate optimal lot size |//+------------------------------------------------------------------+double TradeSizeOptimized(void)
{
double price=0.0;
double margin=0.0;
//--- select lot sizeif(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
return(0.0);
if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
return(0.0);
if(margin<=0.0)
return(0.0);
double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a breakif(DecreaseFactor>0)
{
//--- select history for accessHistorySelect(0,TimeCurrent());
//---int orders=HistoryDealsTotal(); // total history dealsint losses=0; // number of losses orders without a breakfor(int i=orders-1; i>=0; i--)
{
ulong ticket=HistoryDealGetTicket(i);
if(ticket==0)
{
Print("HistoryDealGetTicket failed, no trade history");
break;
}
//--- check symbolif(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
continue;
//--- check Expert Magic numberif(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC)
continue;
//--- check profitdouble profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
if(profit>0.0)
break;
if(profit<0.0)
losses++;
}
//---if(losses>1)
lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
}
//--- normalize and check limitsdouble stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
lot=stepvol*NormalizeDouble(lot/stepvol,0);
double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(lot<minvol)
lot=minvol;
double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
if(lot>maxvol)
lot=maxvol;
//--- return trading volumereturn(lot);
}
//+------------------------------------------------------------------+//| Check for open position conditions |//+------------------------------------------------------------------+void CheckForOpen(void)
{
MqlRates rt[2];
//--- go trading only for first ticks of new barif(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
if(rt[1].tick_volume>1)
return;
//--- get current Moving Averagedouble ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
return;
}
//--- check signalsENUM_ORDER_TYPE signal=WRONG_VALUE;
if(rt[0].open>ma[0] && rt[0].close<ma[0])
signal=ORDER_TYPE_SELL; // sell conditionselse
{
if(rt[0].open<ma[0] && rt[0].close>ma[0])
signal=ORDER_TYPE_BUY; // buy conditions
}
//--- additional checkingif(signal!=WRONG_VALUE)
{
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
m_trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK),
0,0);
}
//---
}
//+------------------------------------------------------------------+//| Check for close position conditions |//+------------------------------------------------------------------+void CheckForClose(void)
{
MqlRates rt[2];
//--- go trading only for first ticks of new barif(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history");
return;
}
if(rt[1].tick_volume>1)
return;
//--- get current Moving Averagedouble ma[1];
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data");
return;
}
//--- positions already selected beforebool signal=false;
long type=PositionGetInteger(POSITION_TYPE);
if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])
signal=true;
if(type==(long)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])
signal=true;
//--- additional checkingif(signal)
{
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
m_trade.PositionClose(_Symbol,3);
}
//---
}
//+------------------------------------------------------------------+//| Position select depending on netting or hedging |//+------------------------------------------------------------------+bool SelectPosition()
{
bool res=false;
//--- check position in Hedging modeif(ExtHedging)
{
uint total=PositionsTotal();
for(uint i=0; i<total; i++)
{
string position_symbol=PositionGetSymbol(i);
if(_Symbol==position_symbol && MA_MAGIC==PositionGetInteger(POSITION_MAGIC))
{
res=true;
break;
}
}
}
//--- check position in Netting modeelse
{
if(!PositionSelect(_Symbol))
return(false);
elsereturn(PositionGetInteger(POSITION_MAGIC)==MA_MAGIC); //---check Magic number
}
//--- result for Hedging modereturn(res);
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit(void)
{
//--- prepare trade class to control positions if hedging mode is active
ExtHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
m_trade.SetExpertMagicNumber(MA_MAGIC);
m_trade.SetMarginMode();
m_trade.SetTypeFillingBySymbol(Symbol());
//--- Moving Average indicator
ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
if(ExtHandle==INVALID_HANDLE)
{
printf("Error creating MA indicator");
return(INIT_FAILED);
}
//--- okreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick(void)
{
//---MqlDateTime currTime;
TimeToStruct(TimeCurrent(),currTime);
Todayx=currTime.hour*60*60+currTime.min*60;
if((HoursFrom0 < HoursTo0 && Todayx >= HoursFrom0 && Todayx< HoursTo0) ||
(HoursFrom0 > HoursTo0 && (Todayx< HoursTo0 || Todayx >= HoursFrom0))
||(HoursFrom1 < HoursTo1 && Todayx >= HoursFrom1 && Todayx < HoursTo1) ||
(HoursFrom1 > HoursTo1 && (Todayx< HoursTo1 || Todayx >= HoursFrom1))
||(HoursFrom2 < HoursTo2 && Todayx >= HoursFrom2 && Todayx < HoursTo2) ||
(HoursFrom2 > HoursTo2 && (Todayx< HoursTo2 || Todayx >= HoursFrom2)))
{
//--- Сюдаif(SelectPosition())
CheckForClose();
else
CheckForOpen();
}
//---if((Todayx != Today0 && Todayx == HoursTo0)||
(Todayx != Today1 && Todayx == HoursTo1)||
(Todayx != Today2 && Todayx == HoursTo2))
{
Today0 = Todayx;
Today1 = Todayx;
Today2 = Todayx;
//--- Сюда
CloseAll();
Print("STOP Close = ",Todayx);
}
//---
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| start function |//+------------------------------------------------------------------+void CloseAll(void)
{
for(int i=PositionsTotal()-1; i>=0; i--)
if(m_position.SelectByIndex(i))
{
ClosePosition(m_position.Symbol());
}
}
//+------------------------------------------------------------------+//| Close selected position |//+------------------------------------------------------------------+void ClosePosition(conststring symbol)
{
if(InitTrade(symbol))
m_trade.PositionClose(m_position.Ticket());
PlaySound("ok.wav");
}
//+------------------------------------------------------------------+//| Init trade object |//+------------------------------------------------------------------+bool InitTrade(conststring symbol)
{
if(!m_symbol.Name(symbol))
return(false);
//---if(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_FOK))
m_trade.SetTypeFilling(ORDER_FILLING_FOK);
elseif(IsFillingTypeAllowed(symbol,SYMBOL_FILLING_IOC))
m_trade.SetTypeFilling(ORDER_FILLING_IOC);
else
m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---return(true);
//---
}
//+------------------------------------------------------------------+//| Checks if the specified filling mode is allowed |//+------------------------------------------------------------------+bool IsFillingTypeAllowed(string symbol,int fill_type)
{
//--- Obtain the value of the property that describes allowed filling modesint filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE);
//--- Return true, if mode fill_type is allowedreturn((filling & fill_type)==fill_type);
}
//+------------------------------------------------------------------+
жаль что никак не протестить
можно протестить - только выбираете дату начала тестирования ,и выставляете время старта эксперта и время закрытия - правда как сработает время закрытия , тестирование прекратится
а в реале каждый день будет открываться и закрываться в заданное время
только - создайте шаблоны, на шаблоне эксперт заданным временем и как он сработает откроет другой шаблон, с другими настройками и так далее
time_st_mon - time_st_day - time_st_evn --- это переменные. Что они означают попытайтесь понять самостоятельно.
int - double - datetime --- это типы переменных. Не знать этого вам должно быть стыдно.
Не сто́ит благодарности.
человек просто спросил чему равны переменные и к какому отнести их типу. не на то ответили, причём грубо
если кому-либо понадобится, то освежил расписание и добавил пару комментариев с учётом утренней сессии на FORTS
человек просто спросил чему равны переменные и к какому отнести их типу. не на то ответили, причём грубо
если кому-либо понадобится, то освежил расписание и добавил пару комментариев с учётом утренней сессии на FORTS
Ты спустя полтора года решил поумничать?
Ты спустя полтора года решил поумничать?
Наверное, хотя я не разрешал публиковать мой код (часть кода).
Весь опубликованный мною код, предназначен только для личного пользования.
Вот еще вариант намудрил - главное работает!
Хорошо, что эти моменты времени фиксированы и их не нужно оптимизировать. Глянуть бы что-то изящнее чем у меня.
Хорошо, что эти моменты времени фиксированы и их не нужно оптимизировать. Глянуть бы что-то изящнее чем у меня.
Увы, начало вечёрки - не фиксировано. 19:00 или 19:05, а через год-другой, глядишь, и ещё на пару минут клиринг(дневной или вечерний) продлят, как уже было.
Вот еще вариант намудрил - главное работает!
Вот еще вариант намудрил - главное работает!
Вот именно, намудрили!
Нельзя брать
TimeLocal()Время сервера и Ваше локальное время могут существенно отличаться.
Да и торговля ведется по времени сервера.
Добавлено
Самое правильное, это проверять время последнего тика
Вот именно, намудрили!
Нельзя брать
Время сервера и Ваше локальное время могут существенно отличаться.
Да и торговля ведется по времени сервера.
Добавлено
Самое правильное, это проверять время последнего тика
можно заменить TimeLocal() на TimeCurrent()
TimeCurrent
Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна. Значение времени формируется на торговом сервере и не зависит от настроек времени на компьютере пользователя. Существует 2 варианта функции.