Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 773

 

Obrigado.
Apenas registado, ainda não sabe como funciona o fórum.

 
0Aleksandr0:

Não percebo WinAPI, o que é que se passa aqui?

deixem-me ver os vossos esforços sob a forma de um guião

 
0Aleksandr0:

Tenho-o como função na minha EA, aqui está o início do código

esta é a própria função

O resto da EA funciona bem, as variáveis que estão na função não são utilizadas em qualquer outro lugar do código.
Terminal crashes on lineSetClipboardData( CF_UNICODETEXT, hMem );// Passar a memória com string para o buffer

 
Artyom Trishkin:

Já percebi, estou corrigido).

 
o_o:

deixem-me ver os vossos esforços como um guião


Tenho-o como função na minha EA, aqui está o início do 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 é a própria função

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

O resto da EA funciona bem, as variáveis que estão na função não são utilizadas em qualquer outro lugar do código.
Terminal crashes on lineSetClipboardData( CF_UNICODETEXT, hMem );// Passar a memória com string para o 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);
  }
//+------------------------------------------------------------------+

Encontrei este guião, que supostamente lê o buffer e produz o valor na janela terminal - também não funciona.

Embora não mate o terminal, também não produz nada na janela.
É um mistério com buffer, vou limitar a saída de dados a Alerta por agora, posso copiar dados a partir dele com ctrl+c, embora quisesse evitar acções "manuais".

 

Esse exemplo foi para o MT4, pelo que não teve em conta a capacidade de dígitos.

Aqui está uma para todas as 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();  // Закрываем буфер
   }
}
//+------------------------------------------------------------------+
Arquivos anexados:
WinDef.mqh  1 kb
 
Koldun Zloy:

Esse exemplo foi para o MT4, pelo que não teve em conta a taxa de bits.

Aqui está uma para todas as plataformas:


Suspeitei da capacidade, especialmente quando olhei para o segundo guião a ler o buffer.
Essa é a única forma de o resolver, teria descoberto pelo menos um mês mais tarde))).
Muito obrigado, poupou-me muito tempo).

Integrá-lo imediatamente na EA)

 

Por favor, ajude-me a reescrever o código no MT5 - Não sou bom em encomendas :(

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

Ao compilar os erros de código:

'SELECT_BY_POS' - identificador não declarado KamikadzeStatistics.mqh 257 33

'MODE_HISTÓRIA' - identificador não declarado KamikadzeStatistics.mqh 257 47

OrderSelect' - contagem de parâmetros errados KamikadzeStatistics.mqh 257 13

'OrderType' - função não definida KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - função não definida KamikadzeStatistics.mqh 261 19

OrderProfit' - função não definida KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin:

Por favor, ajude-me a reescrever o código no MT5 - Não sou bom em encomendas :(

Ao compilar os erros de código:

'SELECT_BY_POS' - identificador não declarado KamikadzeStatistics.mqh 257 33

'MODE_HISTÓRIA' - identificador não declarado KamikadzeStatistics.mqh 257 47

OrderSelect' - contagem de parâmetros errados KamikadzeStatistics.mqh 257 13

'OrderType' - função não definida KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - função não definida KamikadzeStatistics.mqh 261 19

OrderProfit' - função não definida KamikadzeStatistics.mqh 265 42



O que é isto? Não sou um bom juiz da MQL4. Se me disserem o que preciso, poderei escrever tudo na MQL5.
Tem algo a ver com o cálculo do lucro/perda histórica?