2014年1月4日 星期六

20140104 部位縮放法,移動停利法

http://wenschair.blogspot.tw/2013/09/18_18.html
★18種常用移動停利法--測試篇
http://wenschair.blogspot.tw/2013/09/18.html

http://wenschair.blogspot.tw/2013/09/18_17.html


http://wenschair.blogspot.tw/2013/10/blog-post.html
 四種必學的部位縮放法之開放程式碼。
     →固定收益部位縮放法(Fixed Profit position sizing)
     →固定總資金風險部位縮放法(Fixed risk% position sizing)
     →保證金目標部位縮放法(Fixed Margin position sizing)
     →最大連續虧損資金部位縮放法(MaxDD position sizing)


2014年1月3日 星期五

20140104 MT4 讓離線圖自動更新.

http://forum.mql4.com/12970
Execute EA without waiting for a tick?
有人這樣寫的
EA starts on tick.
Script starts without a tick.
直接使用script是不用透過tick來處發產生資料

http://forum.mql4.com/25152

http://www.metatrader4.com/forum/2227
官方回答

//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <WinUser32.mqh>

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   int hWnd = WindowHandle(Symbol(),Period());
   PostMessageA(hWnd,MT4InternalMsg,2,1);
//----
   return(0);
  }

2014年1月1日 星期三

20140101 MT4雜項紀錄

http://www.520fx.com/forum.php?mod=viewthread&tid=40972&page=1&authorid=39167

MT4裡邊會有一些比較底層,不被寫入help的用法,這些用法在某些方面是至關重要的。MT4窗口之間使用消息通訊機制,所以可以在EA,或者外部程序通過消息,來控制MT4的一些行為,下邊就列出已經知道的一些用法。

#include <WinUser32.mqh>
#define MT4_WMCMD_PERIOD_D1       33134
#define MT4_WMCMD_PERIOD_H4       33136
#define MT4_WMCMD_PERIOD_M1       33137
#define MT4_WMCMD_PERIOD_M5       33138
#define MT4_WMCMD_PERIOD_M15      33139
#define MT4_WMCMD_PERIOD_M30      33140
#define MT4_WMCMD_PERIOD_W1       33141
#define MT4_WMCMD_MOVE_RIGHT      33197
#define MT4_WMCMD_MOVE_LEFT       33198

PostMessageA(hwnd, WM_COMMAND,MT4_WMCMD_MOVE_RIGH, 2); //可以向左移動一個bar
PostMessageA(hwnd,MW_COMMAND,MT4_WMCMD_PERIOD_M5,0);//轉換為週期

>>>>>>>>>>>>>>>>>>>>
另外一些消息是通過 註冊一種MT4特有的消息類型,通訊

1 觸發EA的start函數運行一次
int hwnd=WindowHandle(Symbol(), Period());
int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd,MT4InternalMsg,2,1);

2 讓圖表跳到某一個時間點
int hwnd=WindowHandle(Symbol(), Period());
int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd,MT4InternalMsg,55,time1);

3 調用指標,腳本到圖表
#import "user32.dll"
  int RegisterWindowMessageA(string lpstring);
  int PostMessageA(int hWnd,int Msg,int wParam,int lParam); //注意這個必須是在這裡,而且頭文件不能添加 #include <WinUser32.mqh>
#import
int hwnd=WindowHandle(Symbol(), Period());
int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd,MT4InternalMsg,15,"ATR");
//調用指標"ATR"

PostMessageA(hwnd,MT4InternalMsg,16,"test");
//調用腳本"test"

當然還有以供參考,如下:

PostMessageA(hwnd, MT4InternalMsg, 13, StandartIndicatorName);
PostMessageA(hwnd, MT4InternalMsg, 14, EAName);
PostMessageA(hwnd, MT4InternalMsg, 15, CustomIndicatorName);
PostMessageA(hwnd, MT4InternalMsg, 16, ScriptName);


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

因為使用消息機制,所以這些代碼是可以移植到外部程序實現,可以實現mt4和外部程序良好交互。
這些在mt4的官方論壇有介紹
MT4也可以執行外部程序。 比如在腳本裡執行 cmd.exe
程序如下
#import "Kernel32.dll"
   int WinExec(string,int);
#import
int start()
  {
    WinExec("CMD",0);
     return(0);
  }

就可以利用腳本打開 cmd命令行了。



>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void SendTickToChart() {
int hwnd = WindowHandle(Symbol(), Period());
if (IsDllsAllowed()) {
int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
PostMessageA(hwnd, msg, 2, 0);
PostMessageA(hwnd, msg, 2, 1);
}

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//+------------------------------------------------------------------+
//|                                                 IncomingTick.mq4 |
//|                      Copyright c 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright c 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   int hWnd = WindowHandle(Symbol(),Period());
   PostMessageA(hWnd,MT4InternalMsg,2,1);
//----
   return(0);
  }
//+------------------------------------------------------------------+


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
終於搞定了,是用腳本的,代碼如下:
refresh.mq4 |
//|                                                               fw |
//|                                                              clc |
//+------------------------------------------------------------------+
#property copyright "fw"
#property link      "clc"
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   while(IsStopped()==false)
     {
      static int hwnd = 0;
      hwnd = WindowHandle(Symbol(), Period());
      PostMessageA(hwnd,WM_COMMAND,33324,0);
      Sleep(500);
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.
http://blog.csdn.net/yangmingxtx/article/details/8503060

MetaTrader軟件的功能擴展(關於程序補丁製作的一個例子)

  

>>>>>>>>>>>>> 20140107  update
1. 讓offline 可以畫面tick跳動是用 
      hwnd = WindowHandle(Symbol(), Period());
      PostMessageA(hwnd,WM_COMMAND,33324,0);

2. 讓offline 可以使用EA正常工作是使用  (正常可以在start() 當中列印訊息,會印出來,不正常就印不出來,會只跑init() )
   int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   int hWnd = WindowHandle(Symbol(),Period());
   PostMessageA(hWnd,MT4InternalMsg,2,1);