初学者的问题 MQL5 MT5 MetaTrader 5 - 页 773 1...766767768769770771772773774775776777778779780...1503 新评论 0Aleksandr0 2017.08.22 11:46 #7721 谢谢你。 刚注册,还不知道论坛的功能。 --- 2017.08.22 12:38 #7722 0Aleksandr0:我不明白WinAPI,这里有什么问题吗?让我看到你的努力在脚本中的形式 Artyom Trishkin 2017.08.22 12:52 #7723 0Aleksandr0:我在我的EA中把它作为一个函数,这里是代码的开头这是该函数本身EA的其他部分工作正常,函数中的变量在代码的其他地方没有使用。 终端在第1行崩溃SetClipboardData( CF_UNICODETEXT, hMem );// 将带有字符串的内存传递给缓冲区。 0Aleksandr0 2017.08.22 12:55 #7724 Artyom Trishkin: 我明白了,我接受纠正)。 0Aleksandr0 2017.08.22 12:55 #7725 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 );// 将带有字符串的内存传递给缓冲区。 0Aleksandr0 2017.08.22 14:57 #7726 //+------------------------------------------------------------------+ //| 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从里面复制数据,虽然我想避免 "手动 "操作。 Koldun Zloy 2017.08.22 15:33 #7727 那个例子是针对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 0Aleksandr0 2017.08.22 15:51 #7728 Koldun Zloy:那个例子是针对MT4的,所以没有考虑到数字容量。这里有一个适用于所有平台的。我对容量产生了怀疑,特别是当我看了第二个读取缓冲区的脚本时。 这是解决它的唯一方法,我至少会在一个月后想明白))。 非常感谢你,你为我节省了大量的时间)。 立即将其纳入EA) Aleksey Vyazmikin 2017.08.22 22:55 #7729 请帮助我在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 0Aleksandr0 2017.08.23 00:25 #7730 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写出一切。 是否与历史盈亏计算有关? 1...766767768769770771772773774775776777778779780...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
谢谢你。
刚注册,还不知道论坛的功能。
我不明白WinAPI,这里有什么问题吗?
让我看到你的努力在脚本中的形式
我在我的EA中把它作为一个函数,这里是代码的开头
这是该函数本身
EA的其他部分工作正常,函数中的变量在代码的其他地方没有使用。
终端在第1行崩溃SetClipboardData( CF_UNICODETEXT, hMem );// 将带有字符串的内存传递给缓冲区。
我明白了,我接受纠正)。
让我看看你的努力,作为一个脚本
我在我的EA中把它作为一个函数,这里是代码的开头
这是该函数本身
EA的其他部分工作正常,函数中的变量在代码的其他地方没有使用。
终端在第1行崩溃SetClipboardData( CF_UNICODETEXT, hMem );// 将带有字符串的内存传递给缓冲区。
我找到了这个脚本,据说它可以读取缓冲区并在终端窗口中输出数值--它也不起作用。
虽然它没有杀死终端,但它也没有在窗口中输出任何东西。
缓冲区是个谜,我暂时限制输出数据到Alert,我可以用ctrl+c从里面复制数据,虽然我想避免 "手动 "操作。
那个例子是针对MT4的,所以没有考虑到数字容量。
这里有一个适用于所有平台的。
那个例子是针对MT4的,所以没有考虑到数字容量。
这里有一个适用于所有平台的。
我对容量产生了怀疑,特别是当我看了第二个读取缓冲区的脚本时。
这是解决它的唯一方法,我至少会在一个月后想明白))。
非常感谢你,你为我节省了大量的时间)。
立即将其纳入EA)
请帮助我在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
请帮助我在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写出一切。
是否与历史盈亏计算有关?