Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 773

 

Gracias.
Acabo de registrarme, aún no sé cómo funciona el foro.

 
0Aleksandr0:

No entiendo la WinAPI, ¿qué pasa aquí?

déjame ver tus esfuerzos en forma de guión

 
0Aleksandr0:

Lo tengo como una función en mi EA, aquí está el comienzo del código

esta es la función en sí

El resto del EA funciona bien, las variables que están en la función no se utilizan en ninguna otra parte del código.
El terminal se bloquea en la líneaSetClipboardData( CF_UNICODETEXT, hMem );// Pasando la memoria con la cadena al buffer

 
Artyom Trishkin:

Lo entiendo, me corrijo).

 
o_o:

déjame ver tus esfuerzos como un guión


Lo tengo como una función en mi EA, aquí está el comienzo del código

#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";

esta es la función en sí

 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();  // Закрываем буфер
   }
}

El resto del EA funciona bien, las variables que están en la función no se utilizan en ninguna otra parte del código.
El terminal se bloquea en la líneaSetClipboardData( CF_UNICODETEXT, hMem );// Pasando la memoria con la cadena al buffer

 
//+------------------------------------------------------------------+
//|                                                    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);
  }
//+------------------------------------------------------------------+

Encontré este script, que supuestamente lee el buffer y emite el valor en la ventana de la terminal - tampoco funciona.

Aunque no mata a la terminal, tampoco sale nada en la ventana.
Es un misterio con el buffer, limitaré la salida de datos a Alert por ahora, puedo copiar datos de él con ctrl+c, aunque quería evitar acciones "manuales".

 

Ese ejemplo era para MT4, por lo que no tenía en cuenta la capacidad de los dígitos.

Aquí hay uno para todas las plataformas:

#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();  // Закрываем буфер
   }
}
//+------------------------------------------------------------------+
Archivos adjuntos:
WinDef.mqh  1 kb
 
Koldun Zloy:

Ese ejemplo era para MT4, por lo que no tenía en cuenta la capacidad de los dígitos.

Aquí hay uno para todas las plataformas:


Sospeché de la capacidad, especialmente cuando miré el segundo script leyendo el buffer.
Esa es la única manera de arreglarlo, me habría dado cuenta sólo después de al menos un mes)).
Muchas gracias, me has ahorrado mucho tiempo).

Integrarlo inmediatamente en la EA)

 

Por favor, ayúdame a reescribir el código en MT5 - No soy bueno en las órdenes :(

//+------------------------------------------------------------------+
//| Расчёт статистик                                                 |
//+------------------------------------------------------------------+
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;
                    }
                 }
           }
     }

Al compilar los errores de código:

'SELECT_BY_POS' - identificador no declarado KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - identificador no declarado KamikadzeStatistics.mqh 257 47

'OrderSelect' - recuento de parámetros erróneos KamikadzeStatistics.mqh 257 13

'OrderType' - función no definida KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - función no definida KamikadzeStatistics.mqh 261 19

'OrderProfit' - función no definida KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin:

Por favor, ayúdame a reescribir el código en MT5 - No soy bueno en las órdenes :(

Al compilar los errores de código:

'SELECT_BY_POS' - identificador no declarado KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - identificador no declarado KamikadzeStatistics.mqh 257 47

'OrderSelect' - recuento de parámetros erróneos KamikadzeStatistics.mqh 257 13

'OrderType' - función no definida KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - función no definida KamikadzeStatistics.mqh 261 19

'OrderProfit' - función no definida KamikadzeStatistics.mqh 265 42



¿Qué es esto? No soy un buen juez de MQL4. Si me dices lo que necesito, podré escribir todo en MQL5.
¿Tiene algo que ver con el cálculo de pérdidas y ganancias del historial?