我的目標是將數據從一個terminal.exe進程傳輸到另一個進程....
我不想使用文本文件,因為可能發生衝突....
我的第一個想法是創建一個具有共享內存空間的DLL,並將其導入每個MT4終端....然後從一個EX4讀取並用另一個寫入...
對於任何使用過Terranin的MT4複印機的人來說,他已經找到了解決問題的方法......但他對PM的反應對我來說太複雜了。
救命
我的目標是將數據從一個terminal.exe進程傳輸到另一個進程....
我不想使用文本文件,因為可能發生衝突....
我的第一個想法是創建一個具有共享內存空間的DLL,並將其導入每個MT4終端....然後從一個EX4讀取並用另一個寫入...
對於任何使用過Terranin的MT4複印機的人來說,他已經找到了解決問題的方法......但他對PM的反應對我來說太複雜了。
救命
您無法直接在DLL中創建共享內存空間。有幾種方法可以讓DLL相互通信。這取決於你是否想要雙向com,以及他們需要交談的頻率。最簡單的方法包括:1)在DLL中打開套接字,通過TCP或其他協議進行通信。 (可能最簡單,如果MT4應用程序位於局域網上的不同計算機上或超過inet)2)有一個MT4使用創建“輔助”窗口(可見或不可見)的DLL,然後直接從MT4使用SendMessage實現WM_COPYDATA消息或來自另一個DLL。如果這超出了你的範圍,那麼你可以使用磁盤文件來傳遞數據,如果你沒有過於頻繁地傳輸,你只需要使用輔助文件作為信號量機制。再次,它真的取決於你如何嘗試傳播,但這應該在EA(不是一個indior)內部工作。 (但是你必須使用windows API文件函數,因為據我所知MT4不會在自己的目錄結構之外寫或讀)'Datafile.txt'包含你的數據'app1lock.txt'...虛擬鎖文件' app2lock.txt'...在啟動任何一個MT4應用程序之前的虛擬鎖文件確保沒有文件存在App1 ...如果app2lock.txt不存在{create file app1lock.txt//此時可能兩個應用程序都鎖定了同時等待並再次檢查睡眠(1000);/如果app2lock.txt不存在則等待一秒{createmodifyread'datafile.txt'} else標記我們需要通過刪除文件'app1lock.txt'重做下一次}} App2 ...如果app1lock.txt確實如此不存在{create file app2lock.txt Sleep(1500)如果app1lock.txt不存在{createmodifyread'datafile.txt'} else標誌,用於下次運行刪除文件'app2lock.txt'}
謝謝。我會看看你做了什麼。我自己發現了這個:
http://forums.devx.com/showthread.php?t=157293不幸的是,C 不是我強大的套件。
根據該線程創建共享資源只能在進程/應用程序的同一實例的框架工作中工作因此,例如,如果您有一個indior(使用DLL)並附加到同一MT4應用程序中的多個圖表,那麼他們將使用MT4應用程序的Hinstance句柄打開DLL的實例。他們將能夠共享內存,因為DLL的每個實例都使用相同MT4應用程序的相同Hinstance句柄打開。你想在兩個MT4應用程序之間進行交談。每個MT4應用程序都有自己的Hinstance句柄,因此如果您在兩個不同的Mt4應用程序上打開相同的DLL,則每個應用程序都有自己獨立的共享內存塊,因此無法進行通信。
謝謝你的回复。我需要創建一個類似於這裡完成的地形的應用程序:
https://www.forex-pedia.com/crypto-t...de-copier.html
我還沒有這樣做,但認為它會起作用:import user32 - 參見示例
http://www.metatrader.info/node/160並使用dde函數(抱歉,我找不到這個例子)或send_message函數。 (這是因為兩個MT都在同一台計算機上)。這裡有一些關於dde的想法:
http://www.answers.com/topic/dde-con...on?=technologyDDE發送已經內置,只需要在第二個實例上進行接收。我會看到我能找到的其他東西。
1附件我在交易之間把它扔在一起所以它不是最令人驚奇的一段代碼但是它的作用我能說什麼...我同時感到無聊和感覺慷慨!!!它是什麼:DLL和示例EA(帶有源)允許使用FIFO文本字符串消息隊列在同一台機器上的兩個MT4應用程序之間進行串擾。僅在單個MT4 APP上運行EA的一個副本,並將其應用於同一台計算機上不超過2個單獨的MT4應用程序。我不建議嘗試在egy測試儀中使用它,但它可能在視覺模式下工作。用法將EX4 MQ4複製到2 MT4應用程序的expert文件夾中復制basicmsgdll.dll到2 MT4應用程序的experts \ libraries文件夾EA有1個外部參數'runasserver'default = true將EA放到APP 1的圖表上並設置runasserver = True將EA放到APP 2中的圖表上並設置runasserver = False享受!無償的謝謝!將付款後付給您選擇的慈善機構。 BTW。在下一個刻度線到達之前,您不會知道您有新消息,並強制EA再次運行。 (I.E. EA發送消息時不會醒來)我不知道Hack Terranin正在使用什麼來強制EA運行。如果你發布他的EA然後我可以看看,但我懷疑它在EA代碼不知何故。
https://www.forex-pedia.com/attachme...1167661009.zipOriginally Posted by ;
感謝您的努力,範圍。
強迫EA定期運行沒有任何破解行為。你只是不在第一個勾號的start()調用返回。 (你必須等待第一個滴答)。訣竅是你需要至少每2.5秒檢查一次IsStopped()標誌。如果用戶要求MT4停止/卸載EA,則MT4將使IsStopped()開始返回true並等待最多2.5秒以使EA從該原始啟動呼叫返回。如果你不這樣做,MT4將只是以不體面的方式打斷你的代碼。一個相關的技巧是你不希望有一個'wild'循環,它可以像代碼執行一樣快速地反複查看某些內容。您將消耗所有CPU時間並使一切看起來都很遲鈍。如果不出意外,只需在主循環中的某處調用Sleep。大多數窗口阻塞函數都有一個超時參數(例如WaitForSingleObject(等待外部進程退出等))返回值通常允許您區分由於發生所需事件而返回的返回值超時發生。如果你正在等待一些長期運行的進程,你可以使用WaitForSingleObject等待進程長達500ms的循環,檢查返回值以查看WaitForSingleObject是否只是超時。如果它確實超時,你可以檢查IsStopped()以查看是否應該退出EA,如果它仍然是假,則繼續循環。/未經測試和不完整的代碼只是為了給出概念的要點而(1){ret = WaitForSingleObject(someProcessHandle,500); if(ret == WAIT_OBJECT_0 || IsStopped())break; }