오류, 버그, 질문 - 페이지 3140

 

좋은 오후입니다, 신사 숙녀 여러분!

누가 무엇이 잘못되었는지 말할 수 있습니까?

저는 MT5 의 거래 이력을 가지고 일합니다.

각 거래( DEAL_ENTRY_OUT )에 대한 정보를 가져와 구조에 넣어야 합니다.

구조는 채워져 있지만 데이터가 구조에서 출력될 때 Print 는 비현실적인 값을 생성합니다.

이것은 개별적으로 각 문자에 대한 출력에만 적용됩니다. 모든 거래에 대한 총계("TOTAL") 정보가 올바르게 표시됩니다.

첨부 스크립트 참조

MT4 의 구조 측면에서 동일한 코드는 완벽하게 작동합니다(트랜잭션 대신에 내역에서 주문을 분석합니다)

파일:
 

추상적으로 : 글쎄, 어떤 종류의 @#$ 디자이너가 *.mq5를 클릭하면 파일을 다운로드하고 별도의 창에서 열지 않아야 한다고 결정했습니까?

ACE 또는 CodeMirror를 사이트에 연결하고 MQL을 보거나 편집하는 방법에 대한 링크를 보내시겠습니까?

당신은 그런 바보니까

 
Maxim Kuznetsov # :

추상적으로:

나는 그것을 다운로드하지 않도록 스크립트의 전체 코드를 게시합니다.

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

//|                                         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 에 오류가 발생했습니까? 아니면 제가 잘못하고 있습니까?

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

false 로 설정하면 사용 가능한 모든 항목 표시, true이면 선택한 항목만 표시

문제는 false 로 설정하면 사용 가능한 모든 항목이 표시되고 값을 true 로 변경해도 아무 것도 변경되지 않는다는 것입니다. 터미널을 다시 시작해야 합니다. 그렇지 않으면 사용 가능한 모든 항목이 표시됩니다.

 
Vitaly Muzichenko # :

SymbolsTotal 에 오류가 발생했습니까? 아니면 제가 잘못하고 있습니까?

false 로 설정하면 사용 가능한 모든 항목 표시, true이면 선택한 항목만 표시

문제는 false 로 설정하면 사용 가능한 모든 항목이 표시되고 값을 true 로 변경해도 아무 것도 변경되지 않는다는 것입니다. 터미널을 다시 시작해야 합니다. 그렇지 않으면 사용 가능한 모든 항목이 표시됩니다.

조건을 사용합니다.

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

구조에서 데이터를 출력할 때 Print 는 비현실적인 값을 생성합니다.

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

조건을 사용합니다.

어디에 넣어야 할지 감이 안 잡히시나요?

코드는 추가 작업을 위해 모든 문자의 배열에 쓰는 것으로 가정합니다.

 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 # :

어디에 넣어야 할지 감이 안 잡히시나요?

후.

 
fxsaber # :

후.

도와 줘서 고맙다

   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 # :

고맙습니다!

 ZeroMemory (tradeenv[symbolnumber]);

도움이 되었습니다.

나는 한 가지를 이해하지 못합니다. 왜 MQL4에서는 0으로 설정하지 않고 올바르게 작동하지만 MQL5에서는 작동하지 않습니까 ???

사유: