Errores, fallos, preguntas - página 3140
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
¡Buenas tardes, señores!
¿Puede alguien decirme cuál es el error?
Estoy trabajando con el historial de operaciones en MT5.
Necesito obtener información sobre cada trato(DEAL_ENTRY_OUT) y ponerla en la estructura.
La estructura se rellena, pero cuando imprimo los datos de la estructura, Print me da valores irreales.
Esto sólo afecta a la salida de cada símbolo por separado. Totalmente para todas las transacciones ("TOTAL") la información se imprime correctamente.
ver script adjunto
El mismo código funciona perfectamente en MT4 (pero en lugar de realizar operaciones, analizo las órdenes en el historial)
No sé qué @#$ diseñador decidió que al hacer clic en *.mq5 se descargara el archivo, y no se abriera en una ventana aparte ?
¿Quiere dar algunos enlaces sobre cómo adjuntar ACE o CodeMirror a su sitio y ver/editar MQL?
ya que eres un sinvergüenza.
distraídamente :
Publicando todo el código del script para que no tengas que descargarlo:
//+------------------------------------------------------------------+
//| 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);
//---
}
//+------------------------------------------------------------------+
Símbolos¿Error total, o algo malo?
Si pongo false, mostrará todos los disponibles, si true, sólo mostrará los seleccionados
El problema es que si pongofalse, muestra todos los disponibles, y al cambiar el valor a true no cambia nada - tengo que reiniciar el terminal, sino muestra todos los disponibles en cualquier caso.
Símbolos¿Error total, o algo malo?
Si pongo false, mostrará todos los disponibles, si true, sólo mostrará los seleccionados
El problema es que si ponesfalse, muestra todo lo disponible, y cuando lo cambias a true, no cambia nada - tienes que reiniciar el terminal, si no, muestra todo lo disponible igualmente.
Condición de uso.
cuando se emiten datos de la estructura, Print emite valores irreales.
Utiliza la condición.
¿No sé dónde ponerlo?
El código supone que todos los caracteres se escriben en una matriz para su posterior manipulación
No sé dónde poner esto.
Después de.
Después de.
Gracias, eso es útil.
Gracias.
ZeroMemory(tradeenv[symbolnumber]);
Ayudó.
No entiendo una cosa, ¿por qué funciona correctamente en MQL4 sin puesta a cero, pero no en MQL5?