Erros, bugs, perguntas - página 3140

 

Boa tarde, cavalheiros!

Alguém me pode dizer qual é o erro?

Estou a trabalhar com a história do negócio em MT5.

Preciso de obter informações sobre cada negócio(DEAL_ENTRY_OUT) e colocá-las na estrutura.

A estrutura é preenchida, mas quando imprimo dados da estrutura, Imprimir dá-me valores irrealistas.

Isto só diz respeito à saída para cada símbolo separadamente. Totalmente para todas as transacções ("TOTAL"), a informação é impressa correctamente.

ver guião em anexo

O mesmo código funciona sem falhas no MT4 (mas em vez de realizar negócios, analiso as encomendas na história)

Arquivos anexados:
 

Não sei o que @#$ designer decidiu que clicar em *.mq5 resultará em descarregar o ficheiro, e não o abrir numa janela separada ?

Quer dar-lhe alguns links sobre como anexar ACE ou CodeMirror ao seu site e visualizar/editar MQL?

uma vez que é um vigarista.

 
Maxim Kuznetsov #:

distraidamente :

Afixar todo o código do guião para que não tenha de o descarregar:

//+------------------------------------------------------------------+

//|                                         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ímbolosErro total, ou algo errado?

  int c=SymbolsTotal(MarketWatch);
  for(int i=0; i<c; i++) {
    string symb=SymbolName(i,MarketWatch);

Se eu definir falso, mostrará todos os disponíveis, se verdadeiro, mostrará apenas os seleccionados

O problema é que se eu definirfalso, mostra tudo o que está disponível, e se eu mudar o valor para verdadeiro, não muda nada - eu preciso de reiniciar o terminal, caso contrário mostra tudo o que está disponível de qualquer maneira.

 
Vitaly Muzichenko #:

SímbolosErro total, ou algo errado?

Se eu definir falso, mostrará todos os disponíveis, se verdadeiro, mostrará apenas os seleccionados

O problema é que, se definirfalso, mostra tudo o que está disponível, e mudar o valor para verdadeiro não altera nada - é necessário reiniciar o terminal, caso contrário, mostra tudo o que está disponível em qualquer caso.

Condição de utilização.

if (SymbolInfoInteger(SymbolName(i, true), SYMBOL_VISIBLE))
 
Oleg Pavlenko #:

ao produzir dados a partir da estrutura, Imprimir produz valores irrealistas.

         if(!found)  //если текущий символ не найден в сохраненном массива
           {
            symbolnumber = ArraySize(tradeenv); //назначаем последний номер массива номером этого элемента
            ArrayResize(tradeenv,symbolnumber+1); //увеличиваем размер массива на единицу
            ZeroMemory(tradeenv[symbolnumber]);
            tradeenv[symbolnumber].symbol = symbol; //сохраняем в массив текущий символ
           }
 
fxsaber #:

Utilizar a condição.

Não consigo descobrir onde o colocar?

O código assume que todos os caracteres são escritos numa matriz para posterior manipulação

input  bool   MarketWatch = true; // С обзора рынка, или со всех доступных
int GetIDList()
{
  int n=0;
  int c=SymbolsTotal(MarketWatch); // Здесь проблемы независимо от true/false
  for(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);
}
 
Vitaly Muzichenko #:

Não consigo descobrir onde colocar isto?

Depois por.

 
fxsaber #:

Depois por.

Obrigado, isso é útil.

  int c=SymbolsTotal(MarketWatch);
  for(int i=0; i<c; i++) {
    if(!MarketWatch || SymbolInfoInteger(SymbolName(i, true), SYMBOL_VISIBLE)) {
      string symb=SymbolName(i,MarketWatch);
      double bid=SymbolInfoDouble(symb,SYMBOL_BID);
      if(bid>0) {
        n++;
        ArrayResize(symbols,n);
        symbols[n-1] = symb;
      }
    }
  }
 
fxsaber #:

Obrigado!

ZeroMemory(tradeenv[symbolnumber]);

Ajudou.

Não percebo uma coisa, porque funciona correctamente na MQL4 sem zeragem, mas não na MQL5?