Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 773

 

Ich danke Ihnen.
Habe mich gerade registriert, weiß noch nicht, wie das Forum funktioniert.

 
0Aleksandr0:

Ich verstehe die WinAPI nicht, was ist hier los?

Lassen Sie mich Ihre Bemühungen in Form eines Drehbuchs sehen

 
0Aleksandr0:

Ich habe es als eine Funktion in meinem EA, hier ist der Anfang des Codes

Dies ist die eigentliche Funktion

Der Rest des EA funktioniert gut, die Variablen in der Funktion werden nirgendwo anders im Code verwendet.
Terminal stürzt in ZeileSetClipboardData( CF_UNICODETEXT, hMem );// Übergabe von Speicher mit String an den Puffer

 
Artyom Trishkin:

Verstehe, ich korrigiere mich.)

 
o_o:

Lassen Sie mich Ihre Bemühungen als Skript sehen


Ich habe es als eine Funktion in meinem EA, hier ist der Anfang des Codes

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

Dies ist die eigentliche Funktion

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

Der Rest des EA funktioniert gut, die Variablen in der Funktion werden nirgendwo anders im Code verwendet.
Terminal stürzt in ZeileSetClipboardData( CF_UNICODETEXT, hMem );// Übergabe von Speicher mit String an den Puffer

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

Ich habe dieses Skript gefunden, das angeblich den Puffer liest und den Wert im Terminalfenster ausgibt - es funktioniert auch nicht.

Es beendet zwar nicht das Terminal, aber es gibt auch nichts in dem Fenster aus.
Das mit dem Puffer ist ein Rätsel, ich werde die Ausgabe von Daten an Alert vorerst beschränken, ich kann Daten mit ctrl+c daraus kopieren, obwohl ich "manuelle" Aktionen vermeiden wollte.

 

Dieses Beispiel war für MT4, also ohne Berücksichtigung der Ziffernkapazität.

Hier ist eine für alle Plattformen:

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

Dieses Beispiel war für MT4, also ohne Berücksichtigung der Ziffernkapazität.

Hier ist eine für alle Plattformen:


Ich wurde misstrauisch, was die Kapazität angeht, vor allem, als ich mir das zweite Skript ansah, das den Puffer liest.
Das ist die einzige Möglichkeit, das Problem zu beheben, das hätte ich mindestens einen Monat später herausgefunden).
Vielen Dank, Sie haben mir eine Menge Zeit erspart).

Unmittelbar in EA integrieren)

 

Bitte helfen Sie mir, den Code auf MT5 umzuschreiben - ich bin nicht gut in Bestellungen :(

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

Beim Kompilieren des Codes treten Fehler auf:

'SELECT_BY_POS' - nicht deklarierter Bezeichner KamikadzeStatistics.mqh 257 33

MODE_HISTORY' - nicht deklarierter Bezeichner KamikadzeStatistics.mqh 257 47

'OrderSelect' - falsche Parameteranzahl KamikadzeStatistics.mqh 257 13

'OrderType' - Funktion nicht definiert KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - Funktion nicht definiert KamikadzeStatistics.mqh 261 19

'OrderProfit' - Funktion nicht definiert KamikadzeStatistics.mqh 265 42


 
Aleksey Vyazmikin:

Bitte helfen Sie mir, den Code auf MT5 umzuschreiben - ich bin nicht gut in Bestellungen :(

Beim Kompilieren des Codes treten Fehler auf:

'SELECT_BY_POS' - nicht deklarierter Bezeichner KamikadzeStatistics.mqh 257 33

MODE_HISTORY' - nicht deklarierter Bezeichner KamikadzeStatistics.mqh 257 47

'OrderSelect' - falsche Parameteranzahl KamikadzeStatistics.mqh 257 13

'OrderType' - Funktion nicht definiert KamikadzeStatistics.mqh 259 60

'OrderCloseTime' - Funktion nicht definiert KamikadzeStatistics.mqh 261 19

'OrderProfit' - Funktion nicht definiert KamikadzeStatistics.mqh 265 42



Was ist das? Ich bin kein guter Kenner von MQL4. Wenn Sie mir sagen, was ich brauche, kann ich alles in MQL5 schreiben.
Hat es etwas mit der Gewinn-/Verlustberechnung in der Vergangenheit zu tun?

Grund der Beschwerde: