Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
//+------------------------------------------------------------------+ //| TestLoadHistory.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright"2009, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.02"#property script_show_inputs//--- input parameters //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart()
{
int all_symbols=SymbolsTotal(false); string sym_name="";
Print("Load symbols ",all_symbols);
for(int k=0;k<all_symbols;k++)
if((sym_name=SymbolName(k,false))!="")
{
SymbolSelect(sym_name,true);
Print(k," Symbol name ",sym_name);
int res=CheckLoadHistory(sym_name,PERIOD_M1,(TimeCurrent()-60*60*24*5));
switch(res)
{
case -1 : Print("Unknown symbol ",sym_name); break;
case -2 : Print("Requested bars more than max bars in chart ",sym_name); break;
case -3 : Print("Program was stopped ",sym_name); break;
case -4 : Print("Indicator shouldn't load its own data ",sym_name); break;
case -5 : Print("Load failed ",sym_name); break;
case0 : Print("Loaded OK ",sym_name); break;
case1 : Print("Loaded previously ",sym_name); break;
case2 : Print("Loaded previously and built ",sym_name); break;
default : Print("Unknown result ",sym_name);
}
datetime first_date;
SeriesInfoInteger(sym_name,PERIOD_M1,SERIES_FIRSTDATE,first_date);
int bars=Bars(sym_name,PERIOD_M1);
Print("First date ",first_date," - ",bars," bars");
}
//--- //---
}
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
{
datetime first_date=0;
datetime times[100];
//--- check symbol & period if(symbol==NULL || symbol=="") symbol=Symbol();
if(period==PERIOD_CURRENT) period=Period();
//--- check if symbol is selected in the MarketWatch if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
//--- check if data is present SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);
//--- don't ask for load of its own data if it is an indicator if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
return(-4);
//--- second attempt if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- there is loaded data to build timeseries if(first_date>0)
{
//--- force timeseries build CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- check date if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
//--- max bars in chart from terminal options int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
Sleep(5);
//--- fix start date for loading if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Warning: first server date ",first_server_date," for ",symbol,
" does not match to first series date ",first_date);
//--- load data step by step int fail_cnt=0;
while(!IsStopped())
{
//--- wait for timeseries build while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- ask for built bars int bars=Bars(symbol,period);
if(bars>0)
{
if(bars>=max_bars) return(-2);
//--- ask for first date if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(0);
}
//--- copying of next part forces data loading int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- check for data if(times[0]<=start_date) return(0);
if(bars+copied>=max_bars) return(-2);
fail_cnt=0;
}
else
{
//--- no more than 100 failed attempts
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
}
//--- stopped return(-3);
}
//+------------------------------------------------------------------+ //| Возвращает строкое значение периода | //+------------------------------------------------------------------+ string GetPeriodName(ENUM_TIMEFRAMES period)
{
if(period==PERIOD_CURRENT) period=Period();
//--- switch(period)
{
casePERIOD_M1: return("M1");
casePERIOD_M2: return("M2");
casePERIOD_M3: return("M3");
casePERIOD_M4: return("M4");
casePERIOD_M5: return("M5");
casePERIOD_M6: return("M6");
casePERIOD_M10: return("M10");
casePERIOD_M12: return("M12");
casePERIOD_M15: return("M15");
casePERIOD_M20: return("M20");
casePERIOD_M30: return("M30");
casePERIOD_H1: return("H1");
casePERIOD_H2: return("H2");
casePERIOD_H3: return("H3");
casePERIOD_H4: return("H4");
casePERIOD_H6: return("H6");
casePERIOD_H8: return("H8");
casePERIOD_H12: return("H12");
casePERIOD_D1: return("Daily");
casePERIOD_W1: return("Weekly");
casePERIOD_MN1: return("Monthly");
}
//--- return("unknown period");
}
//+------------------------------------------------------------------+
符合逻辑--这是一场政变。
在没有评估逻辑性的情况下写了资料。如果它受到影响,PositionID应该以同样的方式改变。
现在还没有改变。如果这是一个bug,那就太好了!
因此,有一个问题。 DEAL_ENTRY_INOUT交易 是否应将PositionID改为DEAL_ORDER?
我认为应该这样。这种行为将是非常方便/正确的。在没有评估逻辑的情况下写了资料。然而,如果它受到影响,PositionID应该以同样的方式改变。
现在还没有改变。如果这是一个bug,那就太好了!
因此,有一个问题。 DEAL_ENTRY_INOUT交易 是否应将PositionID改为DEAL_ORDER?
它说,没有。https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer
虽然之前写的是,是的,而且职位标识也改了。
它说,没有。https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer
也许这其中有一些很好的理由。从我的观点来看,这似乎一点都不对。
虽然之前是这样写的,是的,而且职位标识也改了。
我请开发商澄清一下情况。当PositionID发生变化时,那么在五次翻转之后,头寸视图中的交易历史标签将显示五个头寸。
现在(PositionID在翻转过程中不发生变化)总是只显示一个位置。不客气地说,这是个奇怪的解决方案。
关于交易、自动交易系统和交易策略测试的论坛
新版MetaTrader 5 build 1930:MQL5中的浮动图表窗口和.Net库
fxsaber, 2018.11.09 16:19
在 "通过真实刻度 "模式下,测试器在刻度到来时独立生成条形。由于这个原因,一个自定义符号在终端和测试器中的条形历史可能会有很大的不同。
我们注意到,如果之前在测试器中选择了这个专家顾问,那么测试器的设置 往往在编译后被重置。至少可以说,这很令人讨厌。每次编译后,我们都要到专家顾问的树上搜索我们的EA。如果有人不知道,有一个配方可以让测试器不重置。你应该在历史的调试模式下运行一次专家顾问 - CTRL+F5。此后,任何重新编译都不会影响测试器的设置。
同样的事情,昨天就注意到了!
这样修正:编译新版本(新文件名)后,你必须重新启动终端。-也许它没有更新mqlcache
此后,在编译过程中,测试人员不会重置到以前的文件。
这个问题以前出现过几次,后来就消失了。然后它又重新出现在....
Z.I.没有读懂你的话的意思,你是在建议而不是询问......
有人在这里吗? 检查历史下载脚本...
我是唯一一个被冻死的人吗?该脚本取自帮助...
关于交易、自动交易系统和交易策略测试的论坛
待定订单触发时的不明确情况。
fxsaber, 2018.11.26 13:37
还有一种情况是这样的。
例如,没有头寸或订单 - 头寸总数=0,订单总数=0。
你设置了一个市场订单。职位总数=0,订单总数=1。
市场订单被执行 - OrdersTotal = 0。但职位总数=0!
这样,PositionsTotal 可以(不难再现)变化。
例如,PositionsTotal在PositionsSelectBytTicket之前返回0,而PositionsSelectBytTicket则返回true。