Тикет позиции. Уникальное число, которое присваивается каждой вновь открытой позиции. Как правило, соответствует тикету ордера, в результате которого она была открыта, за исключением случаев изменения тикета в результате служебных операций на сервере. Например, начисления свопов переоткрытием позиции. Для нахождения ордера, которым была открыта...
//+------------------------------------------------------------------+ //| 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も同じように変化しているはずです。
今も変わりません。これがバグなら最高なんだけどなー。
だから質問です。 DEAL_ENTRY_INOUTトランザクションは、PositionIDをDEAL_ORDERに変更する必要がありますか?
そうすべきだと思います。この挙動は非常に便利/正しいでしょう。ロジックを評価せずに情報を書き込んだ。ただし、影響を受ける場合は、PositionIDも同じように変化しているはずです。
今も変わりません。これがバグなら最高なんだけどなー。
だから質問です。 DEAL_ENTRY_INOUTトランザクションは、PositionIDをDEAL_ORDERに変更する必要がありますか?
ないと書いてある。https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer
それ以前はそう書かれていて、ポジションIDが変更されていましたが。
ないと書いてある。https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties#enum_position_property_integer
おそらく、それには何か正当な理由があるのでしょう。私の目から見ると、まったく違和感がありません。
以前はそう書かれていて、Position IDが変更されたのですが。
開発者の方々に、状況を明らかにしていただくようお願いします。PositionIDが変更されると、その後5回フリップした後、ポジションビューの取引履歴タブに5つのポジションが表示されます。
現在では(フリップ中にPositionIDは変化しない)常に1つのポジションのみが表示されます。これは、大げさに言えば、おかしな解決方法です。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MetaTrader 5 build 1930の新バージョン:MQL5におけるフローティング・チャート・ウィンドウと.Netライブラリ
fxsaber さん 2018.11.09 16:19
by real ticks "モードでは、テスターはティックの到着時に独立してバーを生成します。このため、ターミナルとテスターでカスタムシンボルのバー履歴が全く異なる場合があります。
このExpert Advisorが以前に選択されていた場合、コンパイル後にテスターの設定が リセットされることが多いことに気づきました。これははっきり言って迷惑です。コンパイルのたびに、Expert Advisorsのツリーに移動して、EAを検索する必要があります。知らない人がいたら、テスターがリセットされないようにするレシピがあるんだ。Expert Advisor をデバッグモードで一度実行する必要があります - ヒストリー上で CTRL+F5.その後、再コンパイルしても、テスターの設定には影響しません。
同じです!昨日気づきました。
新しいバージョン(新しいファイル名)をコンパイルした後、ターミナルを再起動する必要があることを修正しました。-mqlcacheを更新して いないのかもしれません。
その後、テスターはコンパイル中に前のファイルにリセットされることはありません。
この問題は以前にも何度か発生し、その後消滅しています。そして、再び現れたのは...。
Z.I.さんの言葉の意味を読み取れず、質問というよりアドバイスになってしまいましたが......。
履歴のダウンロードスクリプトを確認...
凍死してしまうのは私だけでしょうか?スクリプトは、ヘルプから引用しています...
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
保留中の注文がトリガーされる状況が不明確です。
fxsaber さん 2018.11.26 13:37
また、こんな状況もあります。
例えば、ポジションや注文がない場合、PositionsTotal = 0、OrdersTotal = 0となります。
成行注文を設定します。PositionTotal = 0, OrdersTotal = 1.
成行注文が執行される - OrdersTotal = 0.しかし、PositionsTotal = 0!
PositionsTotalが(再現が難しくない程度に)変化するような。
例えば、PositionSelectBytTicketがtrueを返す直前に、PositionTotalが0を返す。