Hatalar, hatalar, sorular - sayfa 3140

 

Tünaydın bayanlar ve baylar!

Neyin yanlış olduğunu kim söyleyebilir?

MT5'teki işlemlerin geçmişi ile çalışıyorum.

Her anlaşma ( DEAL_ENTRY_OUT ) için bilgi almanız ve yapıya yerleştirmeniz gerekmektedir.

Yapı doldurulur, ancak veriler yapıdan çıkarıldığında Print gerçekçi olmayan değerler üretir.

Bu, yalnızca her karakterin çıktısı için ayrı ayrı geçerlidir. Tüm işlemler için toplam ("TOPLAM") bilgileri doğru bir şekilde görüntülenir.

ek komut dosyasına bakın

MT4'te yapı olarak aynı kod kusursuz çalışıyor (sadece işlemler yerine geçmişteki siparişleri analiz ediyorum)

Dosyalar:
 

soyut olarak: peki, ne tür bir @#$ tasarımcısı *.mq5 üzerine tıklamanın dosyayı indirmeye ve ayrı bir pencerede açmamaya yol açması gerektiğine karar verdi?

ACE veya CodeMirror'u siteye nasıl ekleyeceğinizi ve MQL'yi nasıl görüntüleyeceğinizi / düzenleyeceğinizi size bağlantılar göndermek ister misiniz?

bu kadar salak olduğun için

 
Maxim Kuznetsov # :

soyut:

İndirmemek için betiğin tüm kodunu gönderiyorum:

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

//|                                         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'da hata mı var yoksa yanlış bir şey mi yapıyorum ?

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

false olarak ayarlandıysa, mevcut tüm öğeleri göster, true ise yalnızca seçili olanları göster

Sorun şu ki, false olarak ayarlanırsa, mevcut olanların tümünü gösterir ve değeri true olarak değiştirmek hiçbir şeyi değiştirmez - terminali yeniden başlatmanız gerekir, aksi takdirde mevcut olan tüm olanları gösterecektir.

 
Vitaly Muzichenko # :

SymbolsTotal'da hata mı var yoksa yanlış bir şey mi yapıyorum ?

false olarak ayarlandıysa, mevcut tüm öğeleri göster, true ise yalnızca seçili olanları göster

Sorun şu ki, false olarak ayarlanırsa, mevcut olanların tümünü gösterir ve değeri true olarak değiştirmek hiçbir şeyi değiştirmez - terminali yeniden başlatmanız gerekir, aksi halde mevcut olan tüm olanları gösterir.

Bir koşul kullanın.

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

bir yapıdan veri çıktısı alırken, Print gerçekçi olmayan değerler üretir.

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

Bir koşul kullanın.

Nereye koyacağınızı bulamıyor musunuz?

Kod, onlarla daha fazla çalışmak için tüm karakterlerin dizisine yazmayı varsayar.

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

Nereye koyacağınızı bulamıyor musunuz?

için sonra.

 
fxsaber # :

için sonra.

Yardım için teşekkürler

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

Teşekkür ederim!

 ZeroMemory (tradeenv[symbolnumber]);

Yardım etti.

Bir şeyi anlamıyorum, neden MQL4'te sıfırlamadan doğru çalışıyor da MQL5'te çalışmıyor ???