Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 773

 

Teşekkür ederim.
Yeni kayıt oldum, forumun nasıl işlediğini henüz bilmiyorum.

 
0Aleksandr0 :

WinAPI'den hiçbir şey anlamıyorum, burada sorun ne?

denemelerini bir senaryo şeklinde görmeme izin ver

 
0Aleksandr0 :

Danışmanda bir işlev olarak var, işte kodun başlangıcı

bu fonksiyonun kendisi

danışmanın geri kalanı iyi çalışıyor, fonksiyondaki değişkenler kodun başka hiçbir yerinde kullanılmaz.
Terminal SetClipboardData(CF_UNICODETEXT, hMem) satırında kilitleniyor; // Dizeyle birlikte belleği arabelleğe aktarın

 
Artyom Trishkin :

Anladım düzeltin)

 
o_o :

denemelerini bir senaryo şeklinde görmeme izin ver


Danışmanda bir işlev olarak var, işte kodun başlangıcı

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

bu fonksiyonun kendisi

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

danışmanın geri kalanı iyi çalışıyor, fonksiyondaki değişkenler kodun başka hiçbir yerinde kullanılmaz.
Terminal SetClipboardData(CF_UNICODETEXT, hMem) satırında kilitleniyor; // Dizeyle birlikte belleği arabelleğe aktarın

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

Böyle bir komut dosyası buldum, teorik olarak arabelleği okuyor ve değeri terminal penceresinde gösteriyor - aynı zamanda çalışmıyor.

Terminali öldürmese de, pencerede de hiçbir şey göstermez.
Tamponla ilgili bir tür bilmece var, şimdilik kendimi uyarıya veri göndermekle sınırlayacağım, oradan "manuel" işlemlerden kaçınmak istesem de ctrl + c'yi kopyalayabilirsiniz.

 

Bu örnek MT4 içindi, bu nedenle bit derinliği hesaba katılmadı.

İşte tüm platformlar için:

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

Bu örnek MT4 içindi, bu nedenle bit derinliği hesaba katılmadı.

İşte tüm platformlar için:


Özellikle arabelleği okuyan ikinci komut dosyasına baktığımda, bit derinliği hakkında şüphelerim vardı.
Bunu nasıl düzeltebilirim, en azından bir ayda sadece doper yapardım))
Çok teşekkür ederim, bana çok zaman kazandırdın).

Hemen bir danışmana entegre edeceğim)

 

Lütfen MT5'teki kodu yeniden yazmama yardım edin - siparişleri hiç anlamıyorum :(

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

Derleme hatası:

'SELECT_BY_POS' - bildirilmemiş tanımlayıcı KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - bildirilmemiş tanımlayıcı KamikadzeStatistics.mqh 257 47

'OrderSelect' - yanlış parametre sayımı KamikadzeStatistics.mqh 257 on üç

'OrderType' - işlev tanımlanmadı KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - işlev tanımlanmadı KamikadzeStatistics.mqh 261 on dokuz

'OrderProfit' - işlev tanımlı değil KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin :

Lütfen MT5'teki kodu yeniden yazmama yardım edin - siparişleri hiç anlamıyorum :(

Derleme hatası:

'SELECT_BY_POS' - bildirilmemiş tanımlayıcı KamikadzeStatistics.mqh 257 33

'MODE_HISTORY' - bildirilmemiş tanımlayıcı KamikadzeStatistics.mqh 257 47

'OrderSelect' - yanlış parametre sayımı KamikadzeStatistics.mqh 257 on üç

'OrderType' - işlev tanımlanmadı KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - işlev tanımlanmadı KamikadzeStatistics.mqh 261 on dokuz

'OrderProfit' - işlev tanımlı değil KamikadzeStatistics.mqh 265 42



Bu ne? MQL4'te pek iyi düşünmüyorum ne alacağımı söylersen hemen her şeyi MQL5'e yazabilirsin.
Tarihte kar/zarar hesabıyla ilgili bir şey gibi mi?