初学者的问题 MQL5 MT5 MetaTrader 5 - 页 773

 

谢谢你。
刚注册,还不知道论坛的功能。

 
0Aleksandr0:

我不明白WinAPI,这里有什么问题吗?

让我看到你的努力在脚本中的形式

 
0Aleksandr0:

我在我的EA中把它作为一个函数,这里是代码的开头

这是该函数本身

EA的其他部分工作正常,函数中的变量在代码的其他地方没有使用。
终端在第1行崩溃SetClipboardData( CF_UNICODETEXT, hMem );// 将带有字符串的内存传递给缓冲区

 
Artyom Trishkin:

我明白了,我接受纠正)。

 
o_o:

让我看看你的努力,作为一个脚本


我在我的EA中把它作为一个函数,这里是代码的开头

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

这是该函数本身

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

EA的其他部分工作正常,函数中的变量在代码的其他地方没有使用。
终端在第1行崩溃SetClipboardData( CF_UNICODETEXT, hMem );// 将带有字符串的内存传递给缓冲区

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

我找到了这个脚本,据说它可以读取缓冲区并在终端窗口中输出数值--它也不起作用。

虽然它没有杀死终端,但它也没有在窗口中输出任何东西。
缓冲区是个谜,我暂时限制输出数据到Alert,我可以用ctrl+c从里面复制数据,虽然我想避免 "手动 "操作。

 

那个例子是针对MT4的,所以没有考虑到数字容量。

这里有一个适用于所有平台的。

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

那个例子是针对MT4的,所以没有考虑到数字容量。

这里有一个适用于所有平台的。


我对容量产生了怀疑,特别是当我看了第二个读取缓冲区的脚本时。
这是解决它的唯一方法,我至少会在一个月后想明白))。
非常感谢你,你为我节省了大量的时间)。

立即将其纳入EA)

 

请帮助我在MT5上重写代码--我不擅长订单:(

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

编译代码时出错。

'SELECT_BY_POS' - 未声明的标识符 KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - 未声明的标识 KamikadzeStatistics.mqh 257 47

'OrderSelect' - 错误的参数计数 KamikadzeStatistics.mqh 257 13

'OrderType' -函数 未定义 KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - 函数未定义 KamikadzeStatistics.mqh 261 19

'OrderProfit' - 函数未定义 KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin:

请帮助我在MT5上重写代码--我不擅长订单:(

编译代码时出错。

'SELECT_BY_POS' - 未声明的标识符 KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - 未声明的标识 KamikadzeStatistics.mqh 257 47

'OrderSelect' - 错误的参数计数 KamikadzeStatistics.mqh 257 13

'OrderType' -函数 未定义 KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - 函数未定义 KamikadzeStatistics.mqh 261 19

'OrderProfit' - 函数未定义 KamikadzeStatistics.mqh 265 42



这是什么?我对MQL4不是很了解。 如果你告诉我需要什么,我就能用MQL5写出一切。
是否与历史盈亏计算有关?