[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 259

 
paladin80:
必须以止损方式收盘。外汇交易在格林尼治标准时间00:00开启。

但不是以止损价收盘,而是以第一个价格收盘,这个价格可能比止损价低得多!而TakeProfit肯定会关闭。因此,最好不要用StopLoss离开,甚至最好不要在周末留出头寸!
 

我怎样才能找到我的用户功能的地址?也就是说,如果我的清单上写着

int start()
...
   int num=myFunc()//вызов функции
...
int myFunc()//описание моей функции
 {
    ...
 }

那么我怎样才能得到myFunc的地址?我需要它找出如何找出WndProc的地址(我用自定义函数描述),以便进一步传递给类参数。

 
paladin80:
必须以止损方式收盘。外汇交易在格林尼治标准时间00:00开启。

这还远远没有确定,它很可能在第一次报价时就关闭。你必须阅读文件,而经纪公司想写什么就写什么。
 
gyfto:

我怎样才能找到我的用户功能的地址?也就是说,如果我的清单上写着

那么我怎样才能得到myFunc的地址?我需要它找出如何找出WndProc的地址(我用自定义函数描述),以便进一步传递给类参数。


谁说它甚至有一个地址?它是一个MQL4-函数:它甚至没有在字面意义上被编译,而是在运行时 通过解释器运行。
 

为什么专家不修改订单?

这里有一个功能。

//+-------------------------------------------------------------------------------------+
//| Первоначальная установка TP и SL                                                    |
//+-------------------------------------------------------------------------------------+
void OrdersModifyer(int ticket)
{ 
   double SL, TP;
    
   if (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP)
   { 
       SL = ND(OrderOpenPrice() + i_sl * pt);
       TP = ND(OrderOpenPrice() - i_tp * pt); 
       
       if (SL - Ask <= g_stopLevel)
           SL = Ask + g_stopLevel;
       if (Ask - TP <= g_stopLevel)
           TP = Ask - g_stopLevel;
       
       if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red))
       {
          Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());
          return(false);
       }
   }
       
   if (OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
   { 
       SL = ND(OrderOpenPrice() - i_sl * pt);
       TP = ND(OrderOpenPrice() + i_tp * pt);
       
       if (Bid - SL <= g_stopLevel)
           SL = Bid - g_stopLevel;
       if (TP - Bid <= g_stopLevel)
           TP = Bid + g_stopLevel;
       
       if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red))
       {
          Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());
          return(false);
       }
   }
}

像这样在开始时调用。

 for (g = OrdersTotal() - 1; g >= 0; g--)
   {
       if (!OrderSelect(g,SELECT_BY_POS)) continue;
       if (i_magic != -1) if (OrderMagicNumber() != (i_magic)) continue;
       if (OrderSymbol() != Symbol()) continue;
       
       ticket = OrderTicket();
       type = OrderType();
       
       if (i_sl != 0 || i_tp != 0)
       {
          if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
          {
             OrdersModifyer(ticket);
          }
       }
   }
 
TarasBY:

谢谢你的帮助。
 
alsu:

谁说它甚至有一个地址? 这是一个MQL4函数:它甚至没有在字面上的意义上被编译,而是在运行时通过解释器运行。


这就是狗被埋葬的地方。我很抱歉浪费了2、3个星期的时间,因为我为我的机器人选择了一个独立的窗口界面,只在MQL4+WinAPI内,没有任何自写的dlls。我很抱歉我没有早点意识到这一点,为我的代码和发展感到抱歉。

总结一下。如果不把代码复制到你的dll中,你就不能创建一个重叠的(即不是一个子窗口),因为当描述WNDCLASS(或WNDCLASSEX)的时候

typedef struct tagWNDCLASSEX {//    это с MSDN
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;//<-
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
  HICON     hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

当把结构打包成一个int数组时,箭头所指示的线

lpwcx[0]=0x30;//cbSize//    это на MQL4
lpwcx[1]=0x0A23;//style
//lpwcx[2]=lpfnWndProc;<-
lpwcx[3]=0;//cbClsExtra
lpwcx[4]=0;//cbWndExtra
lpwcx[5]=GetModuleHandleA(lpModuleName);//hInstance
lpwcx[6]=LoadIconA(hInstance,IDI[0]);//hIcon
lpwcx[7]=LoadCursorA(hInstance,IDC[0]);//hCursor
lpwcx[8]=GetStockObject(WHITE_BRUSH);//hbrBackground
lpwcx[9]=StrStrA(lpszMenuName,lpszMenuName);
lpwcx[10]=StrStrA(lpszClassName,lpszClassName);
lpwcx[11]=0;//hIconSm
//передаём структуру в упакованном интовом массиве и регистрируем класс
atom=RegisterClassExA(lpwcx[12]);

数组,窗口程序的地址,即这个窗口的鼠标和键盘处理程序,被传递。MQL4中的窗口过程可以作为一个用户定义的函数来实现,但在解释器内不可能得到它的地址,所以没有什么可以传递的。在MQL4中,最大的可能是使用标准的窗口类,但它们将只作为子窗口使用。简单地说,由指示器创建的 窗口不能用鼠标抓取并显示在终端之外(因为它将是一个子窗口),而重叠的窗口可以显示在终端之外。标准窗口类上的子窗口已经在mt4gui.dll中实现,如果有人需要的话。但有自己的鼠标和键盘处理程序的重叠窗口是不可能的。

我请版主把这个对话和所有相关的信息发布到一个单独的主题,如 "如何在MQL4中创建一个窗口",这样其他人就不会犯同样的错误,并能在搜索引擎中找到它。

[Deleted]  
你好,我下载了metatreider4。交易标签 没有像演示版那样弹出(((。告诉我怎么了??????。
 

日安!

经纪人是否只在在线 模式下读取交易者电脑的IP地址,还是在技术上有可能从MT4的某个文件夹上传历史记录?

 

我决定实现 "热键"(不使用Ctrl、Alt、Shift等控制键)。但这段代码不起作用。

#property indicator_chart_window
#import "user32.dll"
bool RegisterHotKey(int hWnd, int id, int fsModifiers, int vk);
bool PeekMessage (int& lpMsg[7], int hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);
bool UnregisterHotKey (int hWnd, int id);
#import

extern string s0="идентификатор горячей клавиши";
extern int id;
extern string s1="код клавиши (список см. winuser.h)";
extern int vk;
extern string s2="номер окна (от нуля до WindowsTotal()-1)";
extern int aWindowNumber;
bool PM;

int init()
  {
   ObjectCreate("Smile",OBJ_LABEL,aWindowNumber,0,0);
   ObjectSet("Smile",OBJPROP_XDISTANCE,0);
   ObjectSet("Smile",OBJPROP_YDISTANCE,0);
   ObjectSetText("Smile", StringSetChar("", 0, 75), 50, "WingDings", Red);
   return(RegisterHotKey(WindowHandle(Symbol(), Period()), id, 0, vk));
  }

int deinit()
  {
   ObjectDelete("Smile");
   WindowRedraw();
   return(UnregisterHotKey(WindowHandle(Symbol(), Period()), id));
  }

int start()
  {
   int lpMsg[7];
   /*
   Структура lpMsg для WM_HOTKEY:
   0 - хэндл окна//HWND(MSDN)//int(MQL4)
   1 - WM_HOTKEY (0x0312)//UINT(MSDN)//int(MQL4)
   2 - заданный id//WPARAM(MSDN)//int(MQL4)
   3 - млардшее слово - ноль (модификатор, - не задаём), старшее - код виртуальной клавиши//LPARAM(MSDN)//int(MQL4)
   4 - время//DWORD(MSDN)//int(MQL4)
   5 - координата х мышки//структура POINT. LONG(MSDN)//int(MQL4)
   6- координата у мышки//LONG(MSDN)//int(MQL4)
   */
   PM=PeekMessage(lpMsg, WindowHandle(Symbol(), Period()), 0, 0, 1);//1 = PM_REMOVE
   if (lpMsg[1]==0x0312){
      if(lpMsg[2]==id){
         switch(StringGetChar(ObjectDescription("Smile"),0)){
            case 74 : ObjectSetText("Smile", StringSetChar("", 0, 75), 50, "WingDings", Red);
            case 75 : ObjectSetText("Smile", StringSetChar("", 0, 74), 50, "WingDings", Red);
            }
      }
   }
   return(0);
  }

为什么会不成功呢?理论上,笑脸应该是会变的。我设置了81(Q键代码),但你可以在那里设置任何东西。以下是关键代码。

1  2  3  4  5  6  7  8
49 50 51 52 53 54 55 56
Q  W  E  R  T  Y  U  I
81 87 69 82 84 89 85 73
A  S  D  F  G  H  J  K
65 83 68 70 71 72 74 75
Z  X  C  V  B  N  M  ,
90 88 67 86 66 78 77 188

新增: 无法调用PeekMessage - 系统错误127 "未找到指定程序"。注册热键返回1(真)。我试着在PeekMessage之后用NativeAPI调用RtlGetLastWin32Error(),它甚至没有来。并指出

PM=PeekMessage(lpMsg[],...

- 就会出现编译错误