if(!found) //если текущий символ не найден в сохраненном массива
{
symbolnumber = ArraySize(tradeenv); //назначаем последний номер массива номером этого элементаArrayResize(tradeenv,symbolnumber+1); //увеличиваем размер массива на единицуZeroMemory(tradeenv[symbolnumber]);
tradeenv[symbolnumber].symbol = symbol; //сохраняем в массив текущий символ
}
inputbool MarketWatch = true; // С обзора рынка, или со всех доступныхint GetIDList()
{
int n=0;
int c=SymbolsTotal(MarketWatch); // Здесь проблемы независимо от true/falsefor(int i=0; i<c; i++) {
string symb=SymbolName(i,MarketWatch);
double bid=SymbolInfoDouble(symb,SYMBOL_BID); // Встречаются символы с нулевой ценойif(bid>0) {
n++;
ArrayResize(symbols,n);
symbols[n-1] = symb;
}
}
return(n);
}
下午好,先生们!
谁能告诉我这个错误是什么?
我在 MT5 中处理交易历史。
我需要获得每笔交易的信息(DEAL_ENTRY_OUT)并将其放入结构中。
结构已经填好了,但当我从结构中打印数据时,Print 给我的是不现实的值。
这只涉及到每个符号的单独输出。所有交易("TOTAL")的信息都能正确打印。
见所附脚本
同样的代码在MT4 上运行无误(但我不执行交易,而是在历史上分析订单)。
我不知道是哪个@#$设计师决定,点击*.mq5会导致下载文件,而不是在一个单独的窗口中打开它?
想给你一些链接,如何将ACE或CodeMirror附加到你的网站,并查看/编辑MQL?
既然你是这样一个骗子。
心不在焉地。
发布所有的脚本代码,所以你不必下载它。
//+------------------------------------------------------------------+
//| HistoryDealGetTicket.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.000"
#property script_show_inputs
//---
input datetime from_date = D'2021.01.01 00:00:00'; //С какой даты смотрим историю
input datetime to_date = D'2022.01.14 13:00:00'; //До какой даты смотрим историю
struct TradeEnv //Структура для хранения данных
{
string symbol; //Символ сделки
int countB; //Количество BUY
int countS; //Количество SELL
double profitB; //Профит BUY
double profitS; //Профит SELL
double LotB; //Объем BUY
double LotS; //Объем SELL
int win; //Количество выигрышей
int loss; //Количество проигрышей
};
TradeEnv tradeenv[]; //Массив с данными структуры
int TotalHistoryOrders = 0; //Переменная для проверки состояния изменения истории
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
ulong deal_ticket; // тикет сделки
ulong order_ticket; // тикет ордера,по которому была совершена сделка
datetime transaction_time; // время совершения сделки
ENUM_DEAL_TYPE deal_type; // тип торговой операции
ENUM_DEAL_ENTRY deal_entry; // направление сделки
long position_ID; // идентификатор позиции
string deal_description; // описание операции
double volume; // объем операции
double profit; // профитоперации
string symbol; // по какому символу была сделка
int symbolnumber = 1; //Переменная для хранения индекса массива
double win_percent = 0; //Процент выигрышных сделок
double loss_percent = 0; //Процент проигрышных сделок
//--- запросим историрю сделок в указанном интервале
HistorySelect(from_date,to_date);
//--- общее количество в списке сделок
int deals=HistoryDealsTotal();
//--- если сделок меньше или равно 1 выходим
if(deals <= 1)
{
Print("No closed orders");
return;
}
if(deals != TotalHistoryOrders) //если изменилось количество ордеров
{
TotalHistoryOrders = deals;
ArrayResize(tradeenv,1); //изменяем размер массива на единицу
ZeroMemory(tradeenv); //очистка памяти структуры.
tradeenv[0].symbol = "TOTAL"; //Присвоим нулевому индексу массива, для поля symbol значение TOTAL для суммирования всех сделок
//--- теперь обработаем каждую сделку
for(int i=0; i<deals; i++)
{
deal_ticket=HistoryDealGetTicket(i);
deal_type=(ENUM_DEAL_TYPE)HistoryDealGetInteger(deal_ticket,DEAL_TYPE);
if(deal_type==DEAL_TYPE_BALANCE) // если это пополнение баланса пропускаем интерацию
continue;
deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
if(deal_entry!=DEAL_ENTRY_OUT) // если это не выход из рынка, то пропускаем интерацию
continue;
volume=HistoryDealGetDouble(deal_ticket,DEAL_VOLUME);
transaction_time=(datetime)HistoryDealGetInteger(deal_ticket,DEAL_TIME);
order_ticket=HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
symbol=HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
position_ID=HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
profit=HistoryDealGetDouble(deal_ticket,DEAL_PROFIT)+HistoryDealGetDouble(deal_ticket,DEAL_SWAP)+HistoryDealGetDouble(deal_ticket,DEAL_COMMISSION);
deal_description=GetDealDescription(deal_entry,deal_type,volume,symbol,order_ticket,position_ID);
//--- сделаем форматирование для номера сделки
string print_index=StringFormat("% 3d",i);
//--- и выведем информацию по каждой сделке
Print(print_index+": deal #",deal_ticket," at ",transaction_time,", ",deal_description,", Profit=",DoubleToString(profit,2));
//Блок поиска текущего символа в уже сохраненных элементах массива tradeenv
bool found=false;
for(int j=ArraySize(tradeenv)-1; j>=0; j--) //цикл по элементам массива
{
if(tradeenv[j].symbol==symbol)
{
symbolnumber = j;
found=true;
break;
}
}
if(!found) //если текущий символ не найден в сохраненном массива
{
symbolnumber = ArraySize(tradeenv); //назначаем последний номер массива номером этого элемента
ArrayResize(tradeenv,symbolnumber+1); //увеличиваем размер массива на единицу
tradeenv[symbolnumber].symbol = symbol; //сохраняем в массив текущий символ
}
if(deal_type==DEAL_TYPE_BUY)
{
tradeenv[0].countS++;
tradeenv[0].LotS += volume;
tradeenv[0].profitS += profit;
tradeenv[symbolnumber].countS++;
tradeenv[symbolnumber].LotS += volume;
tradeenv[symbolnumber].profitS += profit;
}
if(deal_type==DEAL_TYPE_SELL)
{
tradeenv[0].countB++; //счетчик ордеров Buy
tradeenv[0].LotB += volume; //складываем торговые лоты ордеров
tradeenv[0].profitB += profit; //склыдваем прибыль всех ордеров
tradeenv[symbolnumber].countB++;
tradeenv[symbolnumber].LotB += volume;
tradeenv[symbolnumber].profitB += profit;
}
}
}
for(int i=0; i<ArraySize(tradeenv); i++)
{
Print("Symbol=",tradeenv[i].symbol,", countB=",tradeenv[i].countB,", lotB=",DoubleToString(tradeenv[i].LotB,2),", profitB=",DoubleToString(tradeenv[i].profitB,2),", countS=",tradeenv[i].countS,", lotS=",DoubleToString(tradeenv[i].LotS,2),", profitS=",DoubleToString(tradeenv[i].profitS,2));
}
Print("Array Size=",ArraySize(tradeenv));
}
//+------------------------------------------------------------------+
//| Возвращает строковое описание операции |
//+------------------------------------------------------------------+
string GetDealDescription(ENUM_DEAL_ENTRY deal_entry,ENUM_DEAL_TYPE deal_type,double volume,string symbol,long ticket,long pos_ID)
{
string descr;
//---
switch(deal_entry)
{
case DEAL_ENTRY_IN:
descr="Вход в рынок, ";
break;
case DEAL_ENTRY_OUT:
descr="Выход из рынка, ";
break;
case DEAL_ENTRY_INOUT:
descr="Разворот, ";
break;
case DEAL_ENTRY_OUT_BY:
descr="Закрытие встречной позицией, ";
break;
}
//---
switch(deal_type)
{
case DEAL_TYPE_BALANCE:
return ("balance");
case DEAL_TYPE_CREDIT:
return ("credit");
case DEAL_TYPE_CHARGE:
return ("charge");
case DEAL_TYPE_CORRECTION:
return ("correction");
case DEAL_TYPE_BUY:
descr+="buy";
break;
case DEAL_TYPE_SELL:
descr+="sell";
break;
case DEAL_TYPE_BONUS:
return ("bonus");
case DEAL_TYPE_COMMISSION:
return ("additional commission");
case DEAL_TYPE_COMMISSION_DAILY:
return ("daily commission");
case DEAL_TYPE_COMMISSION_MONTHLY:
return ("monthly commission");
case DEAL_TYPE_COMMISSION_AGENT_DAILY:
return ("daily agent commission");
case DEAL_TYPE_COMMISSION_AGENT_MONTHLY:
return ("monthly agent commission");
case DEAL_TYPE_INTEREST:
return ("interest rate");
case DEAL_TYPE_BUY_CANCELED:
descr+="cancelled buy deal";
break;
case DEAL_TYPE_SELL_CANCELED:
descr+="cancelled sell deal";
break;
}
descr=StringFormat("%s %G %s (order #%d, position ID %d)",
descr, // текущее описание
volume, // объем сделки
symbol, // инструмент сделки
ticket, // тикет ордера,вызвавшего сделку
pos_ID // ID позиции, в которой участвовала сделка
);
return(descr);
//---
}
//+------------------------------------------------------------------+
符号总数 错误,还是有什么问题?
如果我设置为false,它将显示所有可用的,如果为true, 它将只显示选定的。
问题是,如果我设置为false,就会显示所有可用的,如果我把数值改为true,就不会有任何改变--我需要重新启动终端,否则无论如何都会显示所有可用的。
符号总数 错误,还是有什么问题?
如果我设置为false,它将显示所有可用的,如果为true, 它将只显示选定的。
问题是,如果你设置为false,它就会显示所有可用的,而将值改为true 并不会改变任何东西--你需要重新启动终端,否则在任何情况下都会显示所有可用。
使用条件。
当从结构中输出数据时,Print 会输出不真实的值。
使用条件。
我不知道该把它放在哪里?
该代码假设所有的字符都被写入一个数组中,以便进一步操作
我不知道该把这个放在哪里?
后为。
后为。
谢谢你,这很有帮助。
谢谢你!
ZeroMemory(tradeenv[symbolnumber]);
这很有帮助。
我有一点不明白,为什么在MQL4中不用归零就能正常工作,而在MQL5中却不能?