MT4的命名管道
1 頁面的第 565 頁 123 ... 上一個上一個
Results 1 to 10 of 41

Thread: MT4的命名管道

  1. #1
    有人問過從MT4到另一個程序進行通信的命名管道,所以這裡是接口和一些示例代碼。這是一個無DLL的解決方案,僅使用MQL4。這假設您已熟悉命名管道。如果你不是,你可以在那裡閱讀
    http://msdn.microsoft.com/en-us/libr...80(VS.85).aspx

    我真的應該把它變成一個圖書館,但我現在沒有時間。如果有人想這樣做,請隨意。

    首先是界面:
    Inserted Code string PipeNamePrefix=\\\\.\\pipe\\; int BufferSize = 256; #define PIPE_ACCESS_INBOUND 1 #define PIPE_ACCESS_OUTBOUND 2 #define PIPE_ACCESS_DUPLEX 3 #define PIPE_TYPE_BYTE 0 #define PIPE_TYPE_MESSAGE 4 #define PIPE_READMODE_BYTE 0 #define PIPE_READMODE_MESSAGE 2 #define PIPE_WAIT 0 #define PIPE_NOWAIT 1 #define INVALID_HANDLE_VALUE 0xffffffff #define GenericRead 0x80000000 #define GenericWrite 0x40000000 #define OPEN_EXISTING 3 extern string PipeName=MetaTrader; int PipeHandle = INVALID_HANDLE_VALUE; int Buffer#91;64#93;; /4 bytes/int * 64 = 256 #import kernel32.dll int CreateNamedPipeA(string pipeName, int openMode, int pipeMode, int maxInstances, int outBufferSize, int inBufferSize, int defaultTimeOut, int security ); int WaitNamedPipeA( string lpNamedPipeName, int nTimeOut ); bool PeekNamedPipe( int pipeHandle, int buffer#91;#93;, int bufferSize, int bytesRead#91;#93;, int totalBytesAvail#91;#93;, int bytesLeftThisMessage#91;#93; ); int CreateFileA( string name, int desiredAccess, int SharedMode, int security, int creation, int flags, int templateFile ); int WriteFile( int fileHandle, int buffer#91;#93;, int bytes, int numOfBytes#91;#93;, int overlapped ); int ReadFile( int fileHandle, int buffer#91;#93;, int bytes, int numOfBytes#91;#93;, int overlapped ); int CloseHandle( int fileHandle ); int GetError(); #import To open the pipe as a client, do the following:

    插入的代碼FullPipeName = PipeNamePrefix PipeName; if(PipeHandle == INVALID_HANDLE_VALUE){if(WaitNamedPipeA(FullPipeName,1)== 0){//Print(No pipe available available);返回; PipeHandle = CreateFileA(FullPipeName,GenericRead | GenericWrite,0,0,OPEN_EXISTING,0,0);打印(Symbol(),:PipeHandle =,PipeHandle); if(PipeHandle == INVALID_HANDLE_VALUE){打印(管道打開失敗);返回;從管道讀取有點棘手。你不能直接讀入字符串,所以我讀入一個int數組,然後將數組轉換為字符串:
    Inserted Code ReadFile( PipeHandle, Buffer, BufferSize, bytesRead, 0 ); message = StringFromBuffer(bytesRead#91;0#93;); string StringFromBuffer(int length) { string message = ; for ( int i = 0; i lt; length; i ) { int c = Buffer#91;i4#93;; int off = i % 4; int shift = 0; if ( off == 1 ) shift = 8; else if ( off == 2 ) shift = 16; else if ( off == 3 ) shift = 24; c = (c gt;gt; shift) 0xff; message = message CharToStr( c ); } return( message ); } And to write to the pipe:
    插入代碼CopyToBuffer(orderMessage); result = WriteFile(PipeHandle,Buffer,BufferSize,numOfBytes,0); void CopyToBuffer(string message){for(int i = 0; i lt; 64; i )Buffer#91; i#93; = 0; for(i = 0; i lt; StringLen(message); i ){int off = i%4; int shift = 0; if(off == 1)shift = 8;否則if(off == 2)shift = 16;否則if(off == 3)shift = 24;緩衝器#91; I4#93; | = StringGetChar(message,i)lt; lt;轉移; }}

  2. #2
    4X:非常感謝 - 我知道這種事情需要一段時間才能開發和調試。我可以看到,由於受限制的DDE接口,它將在VB(和/或VBA)和MT4之間使用。我也在研究可以使用IPC的Ninja Trader應用程序。我發現在C#.NET中實現舊式C 可能是一個真正的挑戰!再次感謝,肯。問題:緩衝區[i4] | = StringGetChar(message,i)lt; lt;轉移;我不明白C語法足以知道這兩個運算符的作用:| = ???必須是ORing(不包括?)LT; LT; ???

  3. #3

    Quote Originally Posted by ;
    問題:緩衝區[i4] | = StringGetChar(message,i)lt; lt;轉移;我不明白C語法足以知道這兩個運算符的作用:| = ???必須是ORing(不包括?)LT; LT; ???
    是的,它需要相當多的工作。 x | = y與x = x | y相同,並且x和y的按位OR。 x lt; lt; y是y位左移x。所以1 lt; lt; 8是256.你可以在這裡閱讀更多關於它們的信息:
    http://book.mql4.com/basics/expressions

  4. #4
    嘿4X:我實際上有這個工作。將數據從Excel發送到MT4。我花了一些時間來弄清楚你在做什麼事情 - 現在我看到你正在使用整數的所有4個字節。我一開始認為這是一種以1字節存儲更多數據的聰明方法! =)

  5. #5
    對你有好處,希望它會讓你有所幫助。是的,代碼基本上將4個字符(8位)打包成一個int(32位),用於傳遞給Read和Write調用。原因是我無法讓字符串直接與調用一起工作,所以我不得不降低一個級別。

  6. #6

    Quote Originally Posted by ;
    嘿4X:我實際上有這個工作。將數據從Excel發送到MT4。我花了一些時間來弄清楚你在做什麼事情 - 現在我看到你正在使用整數的所有4個字節。我一開始認為這是一種以1字節存儲更多數據的聰明方法! =)
    您好Kenz,您能分享一下源代碼或部分內容嗎?我正在嘗試做同樣的事情,所有我得到的都是鎖定的應用程序和崩潰... ...提前謝謝..

  7. #7
    另一個優秀的參考代碼。感謝分享4xCoder。 =)Mods,我們可以把它作為粘性嗎?

  8. #8

    Quote Originally Posted by ;
    有人問過從MT4到另一個程序進行通信的命名管道,所以這裡是接口和一些示例代碼。這是一個無DLL的解決方案,僅使用MQL4。這假設您已熟悉命名管道。如果你不是,你可以在那裡閱讀
    http://msdn.microsoft.com/en-us/libr...80(VS.85).aspx我真的應該把它變成一個圖書館,但我現在沒有時間。如果有人想這樣做,請隨意。首先是界面:[code] string ...
    嗨4xCoder,非常感謝您分享代碼。我希望使用命名管道將一個整數值從excel導出到MT4 indior。實際上,我使用從MT4導入的(O,H,L,C)在Excel上進行了複雜的計算。這些複雜的callculation的結果將是一個整數變量,其中包含3個值之一( 1,-1,0)。我需要使用MT4 indior從excel讀取這個值,以便我可以確認lmy交易。你能不能分享如何做到這一點,一個excel例子將是非常有用的。我打算用這個1分鐘的TF。在此先感謝,乾杯,Way2Freedom

  9. #9
    大家好,美好的一天,為此代碼創建DLL文件的任何成功。我仍然不知道該怎麼做才能創造它。我有一個delphi Xe,仍然想知道如何編寫代碼。這裡的任何一位偉大的程序員都可以向我們展示至少步驟如何去做嗎?期待收到你們的回复,SF

  10. #10

    Quote Originally Posted by ;
    在為此代碼創建DLL文件方面取得了成功。我仍然不知道該怎麼做才能創造它。我有一個delphi Xe,仍然想知道如何編寫代碼。
    在Delphi(以及FPC)中,所有這些都被TPipeStream很好地包裝,並且它的行為與任何其他流完全相同,如果您正在使用Delphi(或FPCLazarus),則不必直接使用原始Windows API。

發布權限

  • 您不可發布新主題
  • 您不可回复
  • 您不可發布附件
  • 您不可編輯您的帖子
  •  
  • BB代碼是打開的
  • 表情符號是打開的
  • [IMG]代碼是打開的
  • [視頻]代碼是打開的
  • HTML代碼是關閉的
forex-pedia網站使用cookie 文字跟蹤
forex-pedia.com網站使用cookie 文字跟蹤,某些設定已經固定。您可以點擊此處閱讀我們的Cookie使用說明。 請點擊右鍵接受我們的cookies。如果您選擇繼續使用forex-pedia.com網站,我們將認為您接受我們的cookies。