if (!found) //если текущий символ не найден в сохраненном массива
{
symbolnumber = ArraySize (tradeenv); //назначаем последний номер массива номером этого элементаArrayResize (tradeenv,symbolnumber+ 1 ); //увеличиваем размер массива на единицуZeroMemory (tradeenv[symbolnumber]);
tradeenv[symbolnumber].symbol = symbol; //сохраняем в массив текущий символ
}
좋은 오후입니다, 신사 숙녀 여러분!
누가 무엇이 잘못되었는지 말할 수 있습니까?
저는 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);
//---
}
//+------------------------------------------------------------------+
SymbolsTotal 에 오류가 발생했습니까? 아니면 제가 잘못하고 있습니까?
false 로 설정하면 사용 가능한 모든 항목 표시, true이면 선택한 항목만 표시
문제는 false 로 설정하면 사용 가능한 모든 항목이 표시되고 값을 true 로 변경해도 아무 것도 변경되지 않는다는 것입니다. 터미널을 다시 시작해야 합니다. 그렇지 않으면 사용 가능한 모든 항목이 표시됩니다.
SymbolsTotal 에 오류가 발생했습니까? 아니면 제가 잘못하고 있습니까?
false 로 설정하면 사용 가능한 모든 항목 표시, true이면 선택한 항목만 표시
문제는 false 로 설정하면 사용 가능한 모든 항목이 표시되고 값을 true 로 변경해도 아무 것도 변경되지 않는다는 것입니다. 터미널을 다시 시작해야 합니다. 그렇지 않으면 사용 가능한 모든 항목이 표시됩니다.
조건을 사용합니다.
구조에서 데이터를 출력할 때 Print 는 비현실적인 값을 생성합니다.
조건을 사용합니다.
어디에 넣어야 할지 감이 안 잡히시나요?
코드는 추가 작업을 위해 모든 문자의 배열에 쓰는 것으로 가정합니다.
어디에 넣어야 할지 감이 안 잡히시나요?
후.
후.
도와 줘서 고맙다
고맙습니다!
ZeroMemory (tradeenv[symbolnumber]);
도움이 되었습니다.
나는 한 가지를 이해하지 못합니다. 왜 MQL4에서는 0으로 설정하지 않고 올바르게 작동하지만 MQL5에서는 작동하지 않습니까 ???