Questions des débutants MQL5 MT5 MetaTrader 5 - page 773

 

Merci.
Je viens de m'inscrire, je ne connais pas encore le fonctionnement du forum.

 
0Aleksandr0:

Je ne comprends pas WinAPI, qu'est-ce qui ne va pas ici ?

laissez-moi voir vos efforts sous la forme d'un script

 
0Aleksandr0:

Je l'ai placé comme une fonction dans mon EA, voici le début du code

Voici la fonction elle-même

Le reste de l'EA fonctionne bien, les variables qui sont dans la fonction ne sont pas utilisées ailleurs dans le code.
Le terminal se bloque à la ligneSetClipboardData( CF_UNICODETEXT, hMem ) ;// Passage de la mémoire avec la chaîne au tampon

 
Artyom Trishkin:

J'ai compris, je suis corrigé.)

 
o_o:

laissez-moi voir vos efforts en tant que script


Je l'ai placé comme une fonction dans mon EA, voici le début du code

#define  CF_UNICODETEXT 13
#define  GHND 0x0042

#import "User32.dll"
   int OpenClipboard( uint );
   int EmptyClipboard();
   int CloseClipboard();
   uint SetClipboardData( uint uFormat, uint hMem );
#import "Kernel32.dll"
   uint GlobalAlloc( uint uFlags, uint dwBytes );
   uint GlobalLock( uint hMem );
   int GlobalUnlock( uint hMem );
#import "msvcrt.dll"
   uint memcpy( uint &dest, string src, uint count );
#import

string text = "AAA";

Voici la fonction elle-même

 void OutClipboard()
{
   uint hwnd = (uint)ChartGetInteger( 0, CHART_WINDOW_HANDLE );
   
   int strSize = StringLen( text ) * 2 + 2;  // Получаем размер строки в байтах
   
   if( OpenClipboard( hwnd ) )    // Открываем буфер
   {
      EmptyClipboard();           // Очищаем буфер
      
      uint hMem = GlobalAlloc( GHND, strSize ); // Выделяем память
      uint pMem = GlobalLock( hMem );    // Получаем адрес выделенной памяти
      memcpy( pMem, text, strSize );     // Копируем строку в память
      GlobalUnlock( hMem );
   
      SetClipboardData( CF_UNICODETEXT, hMem );  // Передаём память со строкой в буфер
      
      CloseClipboard();  // Закрываем буфер
   }
}

Le reste de l'EA fonctionne bien, les variables qui sont dans la fonction ne sont pas utilisées ailleurs dans le code.
Le terminal se bloque à la ligneSetClipboardData( CF_UNICODETEXT, hMem ) ;// Passage de la mémoire avec la chaîne au tampon

 
//+------------------------------------------------------------------+
//|                                                    Clipboard.mq4 |
//|                                               ПавелИванович(api) |
//|                                              p231970@hotmail.com |
//|  Перенос на MQL5 и доработка unicode - Сергеев Алексей (sergeev) |
//|                                              profy.mql@gmail.com |
//+------------------------------------------------------------------+
#property version "1.00"
#property description "Getting contents of the clipboard"

#import "user32.dll"
bool  OpenClipboard(int hwnd);
int   GetClipboardData(int uFormat);
bool  CloseClipboard();
int   GetAncestor(long hWnd,int gaFlags);
int   GetAncestor(int  hWnd,int gaFlags);
#import "kernel32.dll"
int   GlobalLock(int hMem);
bool  GlobalUnlock(int hMem);
string lstrcatW(int dst,string src);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart()
  {
   int    hMain;
   string clip="";
//---
   if(_IsX64)
      hMain=GetAncestor(ChartGetInteger(ChartID(),CHART_WINDOW_HANDLE),2);
   else
      hMain=GetAncestor((int)ChartGetInteger(ChartID(),CHART_WINDOW_HANDLE),2);
//---
   if(OpenClipboard(hMain))
     {
      int hglb=GetClipboardData(1/*CF_TEXT*/);
      if(hglb!=0)
        {
         int lptstr=GlobalLock(hglb);

         if(lptstr!=0) { clip=lstrcatW(lptstr,""); GlobalUnlock(hglb); }
        }
      CloseClipboard();
     }

// translate ANSI to UNICODE
   ushort chW; uchar chA; string rez;
   for(int i=0; i<StringLen(clip); i++)
     {
      chW=StringGetCharacter(clip, i);
      chA=uchar(chW&255); rez=rez+CharToString(chA);
      chA=uchar(chW>>8&255); rez=rez+CharToString(chA);
     }

   MessageBox("Clipboard: \n"+rez,"Clipboard");
   return(0);
  }
//+------------------------------------------------------------------+

J'ai trouvé ce script, qui est censé lire le tampon et sortir la valeur dans la fenêtre du terminal - il ne fonctionne pas non plus.

Bien qu'il ne tue pas le terminal, il n'affiche rien dans la fenêtre non plus.
C'est un mystère avec le tampon, je vais limiter la sortie de données vers Alert pour le moment, je peux copier des données à partir de celui-ci avec ctrl+c, mais je voulais éviter les actions "manuelles".

 

Cet exemple était pour MT4, il ne tenait donc pas compte de la capacité des chiffres.

En voici un pour toutes les plateformes :

#ifdef __MQL5__
#define _WIN64  // Только для 64-разрядного терминала!
#endif

#include <WinDef.mqh>

#define  CF_UNICODETEXT 13
#define  GHND 0x0042

#import "User32.dll"
   BOOL OpenClipboard( HWND );
   BOOL EmptyClipboard();
   BOOL CloseClipboard();
   HANDLE SetClipboardData( uint uFormat, HANDLE hMem );
#import "Kernel32.dll"
   HANDLE GlobalAlloc( uint uFlags, size_t dwBytes );
   LPVOID GlobalLock( HANDLE hMem );
   BOOL GlobalUnlock( HANDLE hMem );
#import "msvcrt.dll"
   PVOID memcpy( PVOID dest, string src, size_t count );
#import

string str = "АБВГД";

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   HWND hwnd = (HWND)ChartGetInteger( 0, CHART_WINDOW_HANDLE );
   
   size_t strSize = StringLen( str ) * 2 + 2;  // Получаем размер строки в байтах
   
   if( OpenClipboard( hwnd ) )    // Открываем буфер
   {
      EmptyClipboard();           // Очищаем буфер
      
      HANDLE hMem = GlobalAlloc( GHND, strSize ); // Выделяем память
      PVOID pMem = GlobalLock( hMem );    // Получаем адрес выделенной памяти
      memcpy( pMem, str, strSize );     // Копируем строку в память
      GlobalUnlock( hMem );
   
      SetClipboardData( CF_UNICODETEXT, hMem );  // Передаём память со строкой в буфер
      
      CloseClipboard();  // Закрываем буфер
   }
}
//+------------------------------------------------------------------+
Dossiers :
WinDef.mqh  1 kb
 
Koldun Zloy:

Cet exemple était pour MT4, donc il ne prenait pas en compte le débit binaire.

En voici un pour toutes les plateformes :


J'ai eu des doutes sur la capacité, surtout quand j'ai regardé le deuxième script qui lit le tampon.
C'est la seule façon de le réparer, je l'aurais compris au moins un mois plus tard)).
Merci beaucoup, vous m'avez fait gagner beaucoup de temps).

L'intégrer immédiatement dans l'EA)

 

Aidez-moi à réécrire le code sur MT5 - je ne suis pas doué pour les ordres :(

//+------------------------------------------------------------------+
//| Расчёт статистик                                                 |
//+------------------------------------------------------------------+
bool CTradeStatistics::Calculate(const bool _to_log=false,const double _init_balance=0.0)
  {
//---
   if(_init_balance>0.)
      m_init_deposit=_init_balance;
   else
     {
      m_init_deposit=TesterStatistics(STAT_INITIAL_DEPOSIT);
      double curr_balance=m_init_deposit;
      if(!m_balance_arr.Add(curr_balance))
        {
         if(_to_log)
            Print("Ошибка добавления значения депозита.");
         return false;
        }
      //---
      int  orders_num=OrdersHistoryTotal();
      if(orders_num<1)
        {
         if(_to_log)
            Print("Нет ордеров в истории.");
         return false;
        }

      //--- собрать данные
      for(int ord_idx=0;ord_idx<orders_num;ord_idx++)
         if(OrderSelect(ord_idx,SELECT_BY_POS,MODE_HISTORY))
           {
            ENUM_ORDER_TYPE curr_ord_type=(ENUM_ORDER_TYPE)OrderType();
            if((curr_ord_type==ORDER_TYPE_BUY) || (curr_ord_type==ORDER_TYPE_SELL))
               if(OrderCloseTime()>0)
                 {
                  //int ord_ticket=OrderTicket();// del
                  //--- добавить профит ордера
                  double curr_ord_profit=OrderProfit()-OrderCommission()+OrderSwap();
                  if(!m_orders_arr.Add(curr_ord_profit))
                    {
                     if(_to_log)
                        Print("Ошибка добавления значения профита.");
                     return false;
                    }
                  //--- добавить текущее значение баланса
                  curr_balance+=curr_ord_profit;
                  if(!m_balance_arr.Add(curr_balance))
                    {
                     if(_to_log)
                        Print("Ошибка добавления значения депозита.");
                     return false;
                    }
                 }
           }
     }

Lors de la compilation des erreurs de code :

SELECT_BY_POS' - identifiant non déclaré KamikadzeStatistics.mqh 257 33

MODE_HISTORY' - identificateur non déclaré KamikadzeStatistics.mqh 257 47

OrderSelect' - nombre de paramètres erronés KamikadzeStatistics.mqh 257 13

OrderType' - fonction non définie KamikadzeStatistics.mqh 259 60

OrderCloseTime' - fonction non définie KamikadzeStatistics.mqh 261 19

OrderProfit' - fonction non définie KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin:

Aidez-moi à réécrire le code sur MT5 - je ne suis pas doué pour les ordres :(

Lors de la compilation des erreurs de code :

SELECT_BY_POS' - identifiant non déclaré KamikadzeStatistics.mqh 257 33

MODE_HISTORY' - identificateur non déclaré KamikadzeStatistics.mqh 257 47

OrderSelect' - nombre de paramètres erronés KamikadzeStatistics.mqh 257 13

OrderType' - fonction non définie KamikadzeStatistics.mqh 259 60

OrderCloseTime' - fonction non définie KamikadzeStatistics.mqh 261 19

OrderProfit' - fonction non définie KamikadzeStatistics.mqh 265 42



Qu'est-ce que c'est ? Je ne suis pas un bon juge de MQL4. Si vous me dites ce dont j'ai besoin, je pourrai tout écrire en MQL5.
Cela a-t-il quelque chose à voir avec le calcul des pertes et profits de l'historique ?