エラー、バグ、質問 - ページ 3140

 

こんにちは、皆さん

どなたかエラーの内容を教えてください。

MT5で 取引履歴を操作しています。

各取引の情報(DEAL_ENTRY_OUT)を取得し、構造体に入れる必要があります。

構造体は埋まっているのですが、構造体からデータを印刷すると、Printは 非現実的な値を出します。

これは、各シンボルの出力にのみ個別に関係します。すべての取引(「TOTAL」)の情報が正しく印刷されます。

See attached script

同じコードが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ではゼロインなしで正常に動作するのに、MQL5では動作しないのでしょうか?