pairs_trading/tool.mqh

482 lines
29 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:15:29 +02:00
<EFBFBD><EFBFBD>#define TOSTR(A) #A+" = "+(string)A+" "
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD><EFBFBD>L0<EFBFBD>x<EFBFBD>[W0_0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0j0<EFBFBD>0true
//+------------------------------------------------------------------+
bool IsNewBar(ENUM_TIMEFRAMES tf = PERIOD_CURRENT)
{
static datetime time = 0;
static long msc = 0;
//--- <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>`1Xn0<EFBFBD>S<EFBFBD>_
MqlTick tick;
SymbolInfoTick(_Symbol, tick);
if(iTime(_Symbol, tf, 0) == time && msc != tick.time_msc)
return false;
time = iTime(_Symbol, tf, 0);
msc = tick.time_msc;
return true;
}
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0L0n<EFBFBD>V<EFBFBD>vj0<EFBFBD>0true
//+------------------------------------------------------------------+
bool IsSpecifiedTick(const int n = 100)
{
static int tick_count = 0;
if(tick_count < n){
tick_count++;
return false;
}
tick_count = 0;
return true;
}
//+------------------------------------------------------------------+
//| <EFBFBD>[pe<EFBFBD>]<EFBFBD>S<EFBFBD>v<EFBFBD>s
//+------------------------------------------------------------------+
double iR(string sym, ENUM_TIMEFRAMES tf, int i)
{
double c0 = iClose(sym,tf,i);
double c1 = iClose(sym,tf,i+1);
return(log(c0) - log(c1));
}
//+------------------------------------------------------------------+
//|
NfW0_0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0g0B0<EFBFBD>0p0true
//+------------------------------------------------------------------+
bool IsRisedTick()
{
static double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
bool ret = false;
if(SymbolInfoDouble(_Symbol, SYMBOL_BID) > bid)
ret = true;
bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
return ret;
}
//+------------------------------------------------------------------+
//| NM<EFBFBD>W0_0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0g0B0<EFBFBD>0p0true
//+------------------------------------------------------------------+
bool IsDescntTick()
{
static double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
bool ret = false;
if(SymbolInfoDouble(_Symbol, SYMBOL_BID) < bid)
ret = true;
bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
return ret;
}
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD><EFBFBD>{Y0<EFBFBD>0(_pe1:<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0~0g0n0ݍ<EFBFBD><EFBFBD>(%) _pe2:<EFBFBD><EFBFBD>D0(1)K0<EFBFBD>X<EFBFBD>0(-1) )
//+------------------------------------------------------------------+
double CalculateStopRate(double range, int buysell)
{
if(range <= 0)
return (double)"nan";
if(buysell != 1 && buysell != -1){
Print("<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<6E>0<EFBFBD>0<EFBFBD>0<08><>{g0 Nckj0$P<EFBFBD>0<EFBFBD>SQ0<EFBFBD>S<EFBFBD>0~0W0_00");
return (double)"nan";
}
double nowprice = iClose(_Symbol, PERIOD_CURRENT, 0);
return nowprice - (nowprice * range * buysell);
}
//+------------------------------------------------------------------+
//| g<EFBFBD>_n0}<EFBFBD>[<EFBFBD>O<h<EFBFBD>0ԏY0
//+------------------------------------------------------------------+
double GetLastDealPrice(long magic,ulong second = 600)
{
ulong ticket_history_deal = 0; // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
double deal_price = (double)"nan";
if(!HistorySelect(TimeCurrent() - second, TimeCurrent()))
return deal_price;
uint total_deals = HistoryDealsTotal();
if(total_deals == 0)
return deal_price;
//--- hQf0n0<EFBFBD>S_<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>S<EFBFBD>_
for(uint i = 0; i < total_deals; i++) {
if((ticket_history_deal = HistoryDealGetTicket(i)) > 0) {
if(HistoryDealGetInteger(ticket_history_deal, DEAL_MAGIC) != magic)
continue;
deal_price = HistoryDealGetDouble(ticket_history_deal, DEAL_PRICE);
}
}
return deal_price;
}
//+------------------------------------------------------------------+
//| g<EFBFBD>_n0}<EFBFBD>[Bf;R<EFBFBD>0ԏY0
//+------------------------------------------------------------------+
datetime GetLastDealTime(long magic,ulong second = 3600)
{
ulong ticket_history_deal = 0; // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
datetime deal_time = 0;
if(!HistorySelect(TimeCurrent() - second, TimeCurrent()))
return deal_time;
uint total_deals = HistoryDealsTotal();
if(total_deals == 0)
return deal_time;
//--- hQf0n0<EFBFBD>S_<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>S<EFBFBD>_
for(uint i = 0; i < total_deals; i++) {
if((ticket_history_deal = HistoryDealGetTicket(i)) > 0) {
if(HistoryDealGetInteger(ticket_history_deal, DEAL_MAGIC) != magic)
continue;
deal_time = (datetime)HistoryDealGetInteger(ticket_history_deal, DEAL_TIME);
}
}
return deal_time;
}
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0P}<EFBFBD>g<EFBFBD>0CSV<EFBFBD>Q<EFBFBD>RY0<EFBFBD>0<EFBFBD><EFBFBD>pe
//|
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD> \MetaQuotes\Tester\(MT5<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0)\Agent-127.0.0.1-3000\MQL5\Files
//| OnDeinit<EFBFBD><EFBFBD>peg0CsvOutputBTResults(__FILE__)h0<EFBFBD>fO0
//+------------------------------------------------------------------+
bool OutputResultsToCSV(string ea_name = "BackTestEA")
{
//--- XSN<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n00
if(!MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION))
return false;
//--- <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0 T
string fn = FileName(ea_name, TimeCurrent());
//--- <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<EFBFBD>S<EFBFBD>_
int handle = FileOpen(fn + ".csv", FILE_CSV | FILE_WRITE);
if( handle == INVALID_HANDLE ) {
Print("CSV<00>Q<EFBFBD>RY0<59>0<EFBFBD><30>pe<70>Qg0<67>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>S<EFBFBD>_k01YWe<1A>", GetLastError());
return false;
}
long DealTimeIn[], DealTimeOut[], DealType[];
double DealPriceIn[], DealPriceOut[], DealVolume[], DealProfit[], DealSwap[];
string DealSymbol[];
int total_deals = 0;
//--- <EFBFBD>S_ d<EFBFBD>v<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD>0
if(!GetTradeResults(DealTimeIn, DEAL_TIME, DEAL_ENTRY_IN)
|| !GetTradeResults(DealTimeOut, DEAL_TIME, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealType, DEAL_TYPE, DEAL_ENTRY_IN)
|| !GetTradeResults(DealPriceIn, DEAL_PRICE, DEAL_ENTRY_IN)
|| !GetTradeResults(DealPriceOut, DEAL_PRICE, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealVolume, DEAL_VOLUME, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealProfit, DEAL_PROFIT, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealSwap, DEAL_SWAP, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealSymbol, DEAL_SYMBOL, DEAL_ENTRY_OUT) ){
FileClose(handle);
return false;
}
total_deals = ArraySize(DealProfit);
FileWrite(handle, "in_date", "in_time", "out_date", "out_time", "symbol", "buy_sell", "in_price", "out_price", "volume", "profit", "swap");
//--- CVSk0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD><EFBFBD><EFBFBD>RY0<EFBFBD>0
for(int i = 0; i < total_deals; i++) {
//--- ENUM_DEAL_TYPE<EFBFBD>0string<EFBFBD>Wn0"Buy/Sell"g0h<EFBFBD><EFBFBD>sY0<EFBFBD>0
string deal_type = "Buy";
if(DEAL_TYPE_SELL == (ENUM_DEAL_TYPE)DealType[i])
deal_type = "Sell";
//--- <EFBFBD>fM0<EFBFBD><EFBFBD>0
FileWrite(handle,
TimeToString((datetime)DealTimeIn[i], TIME_DATE),
TimeToString((datetime)DealTimeIn[i], TIME_MINUTES),
TimeToString((datetime)DealTimeOut[i], TIME_DATE),
TimeToString((datetime)DealTimeOut[i], TIME_MINUTES),
DealSymbol[i],
deal_type,
DealPriceIn[i],
DealPriceOut[i],
DealVolume[i],
DealProfit[i],
DealSwap[i]);
}
FileClose(handle);
Print("CSV<00>Q<EFBFBD>RL0<4C>[<5B>NW0~0W0_0");
return true;
}
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0P}<EFBFBD>g<EFBFBD>0CSV<EFBFBD>Q<EFBFBD>RY0<EFBFBD>0<EFBFBD><EFBFBD>pe(<EFBFBD>e<EFBFBD>N0}K0O0)
//|
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD> \MetaQuotes\Tester\(MT5<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0)\Agent-127.0.0.1-3000\MQL5\Files
//| OnDeinit<EFBFBD><EFBFBD>peg0OutputResultsToCSV(__FILE__)h0<EFBFBD>fO0
//+------------------------------------------------------------------+
bool OutputResultsToCSV2(string ea_name = "BackTestEA")
{
//--- XSN<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n00
if(!MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION))
return false;
//--- <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0 T
string fn = FileName(ea_name, TimeCurrent());
//--- <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0n0<EFBFBD>S<EFBFBD>_
int handle = FileOpen(fn + ".csv", FILE_CSV | FILE_WRITE);
if( handle == INVALID_HANDLE ) {
Print("CSV<00>Q<EFBFBD>RY0<59>0<EFBFBD><30>pe<70>Qg0<67>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>S<EFBFBD>_k01YWe<1A>", GetLastError());
return false;
}
long DealTimeIn[], DealTimeOut[], DealType[];
double DealPriceIn[], DealPriceOut[], DealVolume[], DealProfit[], DealSwap[];
string DealSymbol[], DealComment[];
int total_deals = 0;
MqlDateTime dtin,dtout;
//--- <EFBFBD>S_ d<EFBFBD>v<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD>0
if(!GetTradeResults(DealTimeIn, DEAL_TIME, DEAL_ENTRY_IN)
|| !GetTradeResults(DealTimeOut, DEAL_TIME, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealType, DEAL_TYPE, DEAL_ENTRY_IN)
|| !GetTradeResults(DealPriceIn, DEAL_PRICE, DEAL_ENTRY_IN)
|| !GetTradeResults(DealPriceOut, DEAL_PRICE, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealVolume, DEAL_VOLUME, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealProfit, DEAL_PROFIT, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealSwap, DEAL_SWAP, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealSymbol, DEAL_SYMBOL, DEAL_ENTRY_OUT)
|| !GetTradeResults(DealComment, DEAL_COMMENT, DEAL_ENTRY_IN) ){
FileClose(handle);
return false;
}
total_deals = ArraySize(DealProfit);
FileWrite(handle,
"int^",
"ing",
"in<00>e",
"in<00>f<EFBFBD>e",
"inBf",
"inR",
"outt^",
"outg",
"out<00>e",
"out<00>f<EFBFBD>e",
"outBf",
"outR",
"<1A><><EFBFBD><EFBFBD>0<EFBFBD>0",
"Buy/Sell",
"in}<7D>[<5B>O<h",
"out}<7D>[<5B>O<h",
"<00>0<EFBFBD>0<EFBFBD>0pe",
" d<EFBFBD>v",
"<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0",
"in<00>0<EFBFBD>0<EFBFBD>0<EFBFBD>0");
//--- CVSk0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD><EFBFBD><EFBFBD>RY0<EFBFBD>0
for(int i = 0; i < total_deals; i++) {
//--- ENUM_DEAL_TYPE<EFBFBD>0string<EFBFBD>Wn0"Buy/Sell"g0h<EFBFBD><EFBFBD>sY0<EFBFBD>0
string deal_type = "Buy";
if(DEAL_TYPE_SELL == (ENUM_DEAL_TYPE)DealType[i])
deal_type = "Sell";
//---
TimeToStruct(DealTimeIn[i], dtin);
TimeToStruct(DealTimeOut[i], dtout);
//--- <EFBFBD>fM0<EFBFBD><EFBFBD>0
FileWrite(handle,
dtin.year,
dtin.mon,
dtin.day,
dtin.day_of_week,
dtin.hour,
dtin.min,
dtout.year,
dtout.mon,
dtout.day,
dtout.day_of_week,
dtout.hour,
dtout.min,
DealSymbol[i],
deal_type,
DealPriceIn[i],
DealPriceOut[i],
DealVolume[i],
DealProfit[i],
DealSwap[i],
DealComment[i]);
}
FileClose(handle);
Print("CSV<00>Q<EFBFBD>RL0<4C>[<5B>NW0~0W0_0");
return true;
}
//+------------------------------------------------------------------+
//| <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0 T( TMRh0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0B}<EFBFBD>N<EFBFBD>e<EFBFBD>N)
//+------------------------------------------------------------------+
string FileName(string ea_name, datetime time)
{
string name = ea_name;
if(".mq5" == StringSubstr(name, StringFind(name, "."), 4)
|| ".ex5" == StringSubstr(name, StringFind(name, "."), 4)
|| ".mqh" == StringSubstr(name, StringFind(name, "."), 4)) {
StringSetLength(name, name.Length() - 4);
}
name += "_" + TimeToString(time, TIME_DATE);
StringReplace(name, ".", "");
StringReplace(name, " ", "_");
StringReplace(name, ":", "");
return name;
}
//+------------------------------------------------------------------+
//| long<EFBFBD>Wn0}<EFBFBD>[<EFBFBD>`1X<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD><EFBFBD>0
//+------------------------------------------------------------------+
bool GetTradeResults(long &results[], const ENUM_DEAL_PROPERTY_INTEGER EDPI, const ENUM_DEAL_ENTRY EDE)
{
//--- hQg<EFBFBD><EFBFBD>n0<EFBFBD>S_e\tk<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0Y0<EFBFBD>0
if(!HistorySelect(0, TimeCurrent()))
return (false);
uint total_deals = HistoryDealsTotal();
//--- M<EFBFBD>R<EFBFBD>00e\tkn0<EFBFBD>S_pek0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
ArrayResize(results, total_deals);
int counter = 0; // <EFBFBD>S_<EFBFBD>Vpe<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
ulong ticket_history_deal = 0; // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
//--- hQf0n0<EFBFBD>S_<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>S<EFBFBD>_
for(uint i = 0; i < total_deals; i++) {
//--- <EFBFBD>S_<EFBFBD>0x<EFBFBD><EFBFBD>bY0<EFBFBD>0
if((ticket_history_deal = HistoryDealGetTicket(i)) > 0) {
ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY);
long deal_type = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE);
long deal_info = HistoryDealGetInteger(ticket_history_deal, EDPI);
//--- <EFBFBD>S_<EFBFBD>d\O<EFBFBD>NYo0<EFBFBD>0<EFBFBD>0<EFBFBD>0
if((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
continue;
//--- ENUM_DEAL_ENTRYg0c<EFBFBD>[W0_0<EFBFBD>`1Xn00
if(deal_entry == EDE) {
//--- <EFBFBD>S_P}<EFBFBD>g<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD>00<EFBFBD>S_n0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
results[counter] = deal_info;
counter++;
}
}
}
//--- M<EFBFBD>Rn0gB}<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0-<EFBFBD><EFBFBD>[Y0<EFBFBD>0
ArrayResize(results, counter);
return (true);
}
//+------------------------------------------------------------------+
//| Double<EFBFBD>Wn0}<EFBFBD>[<EFBFBD>`1X<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD><EFBFBD>0
//+------------------------------------------------------------------+
bool GetTradeResults(double &results[], const ENUM_DEAL_PROPERTY_DOUBLE EDPD, const ENUM_DEAL_ENTRY EDE)
{
//--- hQg<EFBFBD><EFBFBD>n0<EFBFBD>S_e\tk<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0Y0<EFBFBD>0
if(!HistorySelect(0, TimeCurrent()))
return (false);
uint total_deals = HistoryDealsTotal();
//--- M<EFBFBD>R<EFBFBD>00e\tkn0<EFBFBD>S_pek0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
ArrayResize(results, total_deals);
int counter = 0; // <EFBFBD>S_<EFBFBD>Vpe<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
ulong ticket_history_deal = 0; // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
//--- hQf0n0<EFBFBD>S_<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>S<EFBFBD>_
for(uint i = 0; i < total_deals; i++) {
//--- <EFBFBD>S_<EFBFBD>0x<EFBFBD><EFBFBD>bY0<EFBFBD>0
if((ticket_history_deal = HistoryDealGetTicket(i)) > 0) {
ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY);
long deal_type = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE);
double deal_info = HistoryDealGetDouble(ticket_history_deal, EDPD);
//--- <EFBFBD>S_<EFBFBD>d\O<EFBFBD>NYo0<EFBFBD>0<EFBFBD>0<EFBFBD>0
if((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
continue;
//--- ENUM_DEAL_ENTRYg0c<EFBFBD>[W0_0<EFBFBD>`1Xn00
if(deal_entry == EDE) {
//--- <EFBFBD>S_P}<EFBFBD>g<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD>00<EFBFBD>S_n0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
results[counter] = deal_info;
counter++;
}
}
}
//--- M<EFBFBD>Rn0gB}<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0-<EFBFBD><EFBFBD>[Y0<EFBFBD>0
ArrayResize(results, counter);
return (true);
}
//+------------------------------------------------------------------+
//| string<EFBFBD>Wn0}<EFBFBD>[<EFBFBD>`1X<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD><EFBFBD>0
//+------------------------------------------------------------------+
bool GetTradeResults(string &results[], const ENUM_DEAL_PROPERTY_STRING EDPS, const ENUM_DEAL_ENTRY EDE)
{
//--- hQg<EFBFBD><EFBFBD>n0<EFBFBD>S_e\tk<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0Y0<EFBFBD>0
if(!HistorySelect(0, TimeCurrent()))
return (false);
uint total_deals = HistoryDealsTotal();
//--- M<EFBFBD>R<EFBFBD>00e\tkn0<EFBFBD>S_pek0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
ArrayResize(results, total_deals);
int counter = 0; // <EFBFBD>S_<EFBFBD>Vpe<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
ulong ticket_history_deal = 0; // <EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
//--- hQf0n0<EFBFBD>S_<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>S<EFBFBD>_
for(uint i = 0; i < total_deals; i++) {
//--- <EFBFBD>S_<EFBFBD>0x<EFBFBD><EFBFBD>bY0<EFBFBD>0
if((ticket_history_deal = HistoryDealGetTicket(i)) > 0) {
ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket_history_deal, DEAL_ENTRY);
long deal_type = HistoryDealGetInteger(ticket_history_deal, DEAL_TYPE);
string deal_info = HistoryDealGetString(ticket_history_deal, EDPS);
//--- <EFBFBD>S_<EFBFBD>d\O<EFBFBD>NYo0<EFBFBD>0<EFBFBD>0<EFBFBD>0
if((deal_type != DEAL_TYPE_BUY) && (deal_type != DEAL_TYPE_SELL))
continue;
//--- ENUM_DEAL_ENTRYg0c<EFBFBD>[W0_0<EFBFBD>`1Xn00
if(deal_entry == EDE) {
//--- <EFBFBD>S_P}<EFBFBD>g<EFBFBD>0M<EFBFBD>Rk0<EFBFBD>fM0<EFBFBD><EFBFBD>00<EFBFBD>S_n0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0
results[counter] = deal_info;
counter++;
}
}
}
//--- M<EFBFBD>Rn0gB}<EFBFBD>0<EFBFBD>0<EFBFBD>0<EFBFBD>0-<EFBFBD><EFBFBD>[Y0<EFBFBD>0
ArrayResize(results, counter);
return (true);
}
//+------------------------------------------------------------------+