初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 773

 

ありがとうございます。
登録したばかりで、まだフォーラムの機能を知りません。

 
0Aleksandr0:

WinAPIがわからないのですが、何がいけないのでしょうか?

頑張っている姿をスクリプトという形で見せてください

 
0Aleksandr0:

私はこれをEAの関数として持っており、以下はそのコードの始まりです。

これは関数そのものです。

EAの残りの部分は問題なく動作し、関数内にある変数はコードの他のどこにも使用されていません。
行目でターミナルがクラッシュする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の残りの部分は問題なく動作し、関数内にある変数はコードの他のどこにも使用されていません。
行目でターミナルがクラッシュする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のものなので、ビットレートは考慮されていません。

ここでは、すべてのプラットフォームに対応したものを紹介します。


特にバッファを読み込んでいる2番目のスクリプトを見て、容量に不審を抱いたんです。
それだけで直るなら、少なくとも1ヶ月後にはわかっていたはずです))。
ありがとうございました、時間の節約になりました)。

すぐに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' -function not defined KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - function not defined KamikadzeStatistics.mqh 261 19

'OrderProfit' - function not defined 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' -function not defined KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - function not defined KamikadzeStatistics.mqh 261 19

'OrderProfit' - function not defined KamikadzeStatistics.mqh 265 42



これは何でしょう?MQL4が苦手なのですが、必要なものを教えていただければ、すべてMQL5で書けるようになります。
履歴の損益計算と関係があるのでしょうか?

理由: