Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 773

 

Grazie.
Appena registrato, non so ancora come funziona il forum.

 
0Aleksandr0:

Non capisco WinAPI, cosa c'è di sbagliato qui?

fatemi vedere i vostri sforzi sotto forma di script

 
0Aleksandr0:

L'ho come una funzione nel mio EA, ecco l'inizio del codice

questa è la funzione stessa

Il resto dell'EA funziona bene, le variabili che sono nella funzione non sono usate da nessun'altra parte nel codice.
Il terminale va in crash sulla lineaSetClipboardData( CF_UNICODETEXT, hMem );// Passare la memoria con la stringa al buffer

 
Artyom Trishkin:

Ho capito, mi correggo).

 
o_o:

fatemi vedere i vostri sforzi come uno script


L'ho come una funzione nel mio EA, ecco l'inizio del codice

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

questa è la funzione stessa

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

Il resto dell'EA funziona bene, le variabili che sono nella funzione non sono usate da nessun'altra parte nel codice.
Il terminale va in crash sulla lineaSetClipboardData( CF_UNICODETEXT, hMem );// Passare la memoria con la stringa 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);
  }
//+------------------------------------------------------------------+

Ho trovato questo script, che presumibilmente legge il buffer ed emette il valore nella finestra del terminale - non funziona nemmeno questo.

Anche se non uccide il terminale, non emette nulla nella finestra.
È un mistero con il buffer, limiterò l'emissione di dati su Alert per ora, posso copiare i dati da esso con ctrl+c, anche se volevo evitare azioni "manuali".

 

Quell'esempio era per MT4, quindi non teneva conto della capacità delle cifre.

Eccone uno per tutte le piattaforme:

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

Quell'esempio era per MT4, quindi non teneva conto del bit rate.

Eccone uno per tutte le piattaforme:


Mi sono insospettito sulla capacità, soprattutto quando ho guardato il secondo script che leggeva il buffer.
Questo è l'unico modo per risolvere il problema, l'avrei capito almeno un mese dopo)).
Grazie mille, mi hai risparmiato un sacco di tempo).

Integrarlo immediatamente in EA)

 

Per favore aiutatemi a riscrivere il codice su MT5 - non sono bravo con gli ordini :(

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

Durante la compilazione degli errori di codice:

'SELECT_BY_POS' - identificatore non dichiarato KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - identificatore non dichiarato KamikadzeStatistics.mqh 257 47

'OrderSelect' - conteggio parametri errato KamikadzeStatistics.mqh 257 13

'OrderType' - funzione non definita KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - funzione non definita KamikadzeStatistics.mqh 261 19

'OrderProfit' - funzione non definita KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin:

Per favore aiutatemi a riscrivere il codice su MT5 - non sono bravo con gli ordini :(

Durante la compilazione degli errori di codice:

'SELECT_BY_POS' - identificatore non dichiarato KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - identificatore non dichiarato KamikadzeStatistics.mqh 257 47

'OrderSelect' - conteggio parametri errato KamikadzeStatistics.mqh 257 13

'OrderType' - funzione non definita KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - funzione non definita KamikadzeStatistics.mqh 261 19

'OrderProfit' - funzione non definita KamikadzeStatistics.mqh 265 42



Che cos'è questo? Non sono un buon giudice di MQL4. Se mi dici di cosa ho bisogno, sarò in grado di scrivere tutto in MQL5.
Ha qualcosa a che fare con il calcolo dei profitti e delle perdite della storia?