繁簡切換您正在訪問的是FX168財經網,本網站所提供的內容及信息均遵守中華人民共和國香港特別行政區當地法律法規。

FX168財經網>人物頻道>帖子

價格行為. 自動化內含柱交易策略

作者/金融法師 2019-05-07 09:20 0 來源: FX168財經網人物頻道

簡介

所有的外匯交易者或多或少都接觸過價格行為. 它不僅僅是一項圖表分析技術, 而是包含了定義未來價格可能走向的整個系統. 在本文中, 我們將詳細研究內含柱模式, 並且會基於該模式開發一個EA交易以跟蹤內含柱信息及進行交易.



關於價格行為

價格行為是一種非指標的價格移動偵測方法, 它可以使用簡單或者複雜的模式, 也可以使用輔助的圖表元件(例如水平線, 垂直線, 趨勢線, 斐波那契水平, 支撐/阻力水平等等).

乍一看來, 此方法貌似複雜, 但事實上並非如此. 這種方法現已日益流行, 因為和使用技術指標的方法相比較, 它的優勢顯而易見.



內含柱

內含柱也就是某個柱的柱體以及引線都包含在其前一個柱(母柱)的範圍之內. 內含柱的最高價比其母柱的最高價要低, 而最低價比其母柱最低價要高. 母柱和內柱構成了潛在的進入市場的模式.

這是一個兩面性的模式, 因為它可能指出趨勢的反轉或者持續.

圖 1. 內含柱

圖 1. 內含柱



圖 2. 內含柱模式布局

圖 2. 內含柱模式布局




內含柱規則:


  • 內含柱模式在更高時間框架內更有意義, 例如 H4 或 D1.

  • 此模式可能暗示趨勢的反轉, 也可能暗示趨勢的持續.

  • 使用額外的圖形分析工具, 包括趨勢線, 支撐/阻力水平, 斐波那契水平以及其他的價格行為模式等等, 可以獲得更加清晰的進場信號.

  • 使用掛單來避免過早或者錯誤地進入市場.

  • 不要在平緩的市場中重複使用內含柱作為進場信號.


圖 3. 在 GBPUSD D1 圖表上定義真正的內含柱

圖 3. 在 GBPUSD D1 圖表上定義真正的內含柱

把這些都記住後, 讓我們嘗試定義一個真正的內含柱. 在上圖中, 我們可以看到在價格陡然下降之後出現一個牛勢柱形. 但是, 這個柱整個位於前一個柱範圍之內. 另外, 此柱也位於支撐水平之上, 進一步確認了該模式. 第三點確認是這並非平緩的市場環境. 因為此模式滿足了這些規則, 它可以被確認為真實.



定義入場點並設置止損單

就這樣, 我們已經在圖表上發現了一個真正的內含柱 (圖 3). 我們應該怎樣進入市場?還有我們在哪里設置訂單的止損位呢?讓我們看圖4.

圖 4. 設置止損買入訂單並設置止損

圖 4. 設置止損買入 訂單並設置止損

首先, 我們應該使用上面的例子來考慮止損水平的設置:


  1. 設置一個比母柱最高價略高的止損買入掛單(只需要高幾個點, 用於確認).

  2. 設置一個比支撐位, 也就是母柱的最低價略低的一個止損水平. 這是一個額外的保護, 以防掛單被觸發以後, 價格又回到支撐水平而反彈後再向正確方向移動.

  3. 再在略低於阻力位的地方設置獲利水平.

別忘了, 內含柱可能跟隨着趨勢的反轉或者持續, 所以我們還要設置一個止損賣出訂單.


圖 5. 設置止損賣出訂單及止損

圖 5. 設置止損賣出訂單及止損

首先, 我們應該使用上面的例子來考慮止損水平的設置:


  1. 設置一個比母柱最低價略低的止損賣出訂單(只要低幾個點, 以作確認).

  2. 在母柱最高價上方設置止損水平.

  3. 在最近的支撐水平略高處設置獲利水平.


基於內含柱交易開發一個EA交易

現在我們已經了解了定義內含柱的所有規則, 進入市場及設置止損單, 我們最終可以使用內含柱模式來實現對應的EA交易了.

從MetaTrader 4終端開啟 MetaEditor 並創建一個新的 EA 交易 (相信我不必在此方面涉及過多, 網站上已經有了很多如何創建EA交易的信息了). 在這個階段把所有的參數設置成空. 您可以按照您的喜好對它們進行命名. 結果代碼看起來如下:


//++ //|                                                    InsideBar.mq4 | //|                                  Copyright 2015, Iglakov Dmitry. | //|                                               cjdmitri@gmail.com | //++ #property copyright "Copyright 2015, Iglakov Dmitry." #property link      "cjdmitri@gmail.com" #property version   "1.00" #property strict //++ //| EA 初始化函數                                                     | //++ int OnInit()   { //- //-    return(INIT_SUCCEEDED);   } //++ //| EA 終止化函數                                                     | //++ void OnDeinit(const int reason)   { //-   } //++ //| EA 訂單處理函數                                                    | //++ void OnTick()   { //-   } //++


把模式轉換為MQL4算法

當我們創建了EA之後, 我們需要在柱關閉後定義一個內含柱. 為此, 我們會引入新的變量並為它們賦值. 參照以下代碼:

//++ //|                                                    InsideBar.mq4 | //|                                  Copyright 2015, Iglakov Dmitry. | //|                                               cjdmitri@gmail.com | //++ #property copyright "Copyright 2015, Iglakov Dmitry." #property link      "cjdmitri@gmail.com" #property version   "1.00" #property strict double   open1,//第一個柱的開盤價 open2,    //第二個柱的開盤價 close1,   //第一個柱的收盤價 close2,   //第二個柱的收盤價 low1,     //第一個柱的最低價 low2,     //第二個柱的最低價 high1,    //第一個柱的最高價 high2;    //第二個柱的最高價 //++ //| EA 初始化函數                                                     | //++ int OnInit()   {    return(INIT_SUCCEEDED);   } //++ //| EA 終止化函數                                                     | //++ void OnDeinit(const int reason)   {   } //++ //| EA 訂單處理函數                                                   | //++ void OnTick()   { //- 定義所需的柱的價格    open1        = NormalizeDouble(iOpen(Symbol(), Period(), 1), Digits);    open2        = NormalizeDouble(iOpen(Symbol(), Period(), 2), Digits);    close1       = NormalizeDouble(iClose(Symbol(), Period(), 1), Digits);    close2       = NormalizeDouble(iClose(Symbol(), Period(), 2), Digits);    low1         = NormalizeDouble(iLow(Symbol(), Period(), 1), Digits);    low2         = NormalizeDouble(iLow(Symbol(), Period(), 2), Digits);    high1        = NormalizeDouble(iHigh(Symbol(), Period(), 1), Digits);    high2        = NormalizeDouble(iHigh(Symbol(), Period(), 2), Digits);   } //++

作為例子, 讓我們考慮母柱是熊勢柱 (柱 2), 而內含柱為牛勢柱 (柱 1)的狀況. 讓我們在 OnTick()函數體中增加一系列條件:

void OnTick()   { //- 定義所需的柱的價格    open1        = NormalizeDouble(iOpen(Symbol(), Period(), 1), Digits);    open2        = NormalizeDouble(iOpen(Symbol(), Period(), 2), Digits);    close1       = NormalizeDouble(iClose(Symbol(), Period(), 1), Digits);    close2       = NormalizeDouble(iClose(Symbol(), Period(), 2), Digits);    low1         = NormalizeDouble(iLow(Symbol(), Period(), 1), Digits);    low2         = NormalizeDouble(iLow(Symbol(), Period(), 2), Digits);    high1        = NormalizeDouble(iHigh(Symbol(), Period(), 1), Digits);    high2        = NormalizeDouble(iHigh(Symbol(), Period(), 2), Digits); //- 如果第二個柱為熊勢而第一個柱為牛勢    if(open2>close2 && //第二個柱為牛勢       close1>open1 && //第一個柱是熊勢       high2>high1 &&  //第二柱的最高價高於第一個柱的最高價       open2>close1 && //第二柱的開盤價高於第一柱的收盤價       low2<low1)      //第二柱的最低價低於第一柱的收盤價      {       //- 我們已經列出了第一柱內含於第二柱的所有條件      }   }
  • 創建可定制的變量: 止損單, 點差, 訂單過期時間, EA 幻數, 交易手數. 止損值可以不用, 因為它決定於內含柱的原則.

  • 為這些變量增加代碼中的局部變量.

  • 止損訂單由距離柱價位的某個距離設置. 為了實現這一點, 增加Interval變量, 作為止損訂單和最高/最低價的距離以及掛單的水平.

  • 增加timeBarInside變量以避免在此模式上重複開啟訂單.

  • 增加bar2size變量以確認母柱足夠大, 是當前市場並不平緩的很好的標記.

結果我們可以獲得如下代碼:

//++ //|                                                    InsideBar.mq4 | //|                                  Copyright 2015, Iglakov Dmitry. | //|                                               cjdmitri@gmail.com | //++ #property copyright "Copyright 2015, Iglakov Dmitry." #property link      "cjdmitri@gmail.com" #property version   "1.00" #property strict extern int     interval          = 20;                               //距離 extern double  lot               = 0.1;                              //手數 extern int     TP                = 300;                              //獲利 extern int     magic             = 555124;                           //幻數 extern int     slippage          = 2;                                //點差 extern int     ExpDate           = 48;                               //訂單過期小時數 extern int     bar2size          = 800;                              //柱 2 的大小 double   buyPrice,//定義止損買入價位 buyTP,      //止損買入單的獲利價位 buySL,      //止損買入單的止損價位 sellPrice,  //定義止損賣出價位 sellTP,     //止損賣出單的獲利價位 sellSL;     //止損賣出單的止損價位 double   open1,//第一個柱的開盤價 open2,    //第二個柱的開盤價 close1,   //第一個柱的收盤價 close2,   //第二個柱的收盤價 low1,     //第一個柱的最低價 low2,     //第二個柱的最低價 high1,    //第一個柱的最高價 high2;    //第二個柱的最高價 datetime _ExpDate=0;          //定義訂單過期時間的局部變量 double     _bar2size; datetime timeBarInside;         //內含柱開啟的時間, 用於防止重複開單 //++ //| EA 初始化函數                                                     | //++ int OnInit()   {    return(INIT_SUCCEEDED);   } //++ //| EA 終止化函數                                                     | //++ void OnDeinit(const int reason)   {   } //++ //| EA 訂單處理函數                                                    | //++ void OnTick()   {    double   _bid     = NormalizeDouble(MarketInfo(Symbol(), MODE_BID), Digits); //定義低價     double   _ask     = NormalizeDouble(MarketInfo(Symbol(), MODE_ASK), Digits); //定義高價    double   _point   = MarketInfo(Symbol(), MODE_POINT); //- 定義所需的柱的價格    open1        = NormalizeDouble(iOpen(Symbol(), Period(), 1), Digits);    open2        = NormalizeDouble(iOpen(Symbol(), Period(), 2), Digits);    close1       = NormalizeDouble(iClose(Symbol(), Period(), 1), Digits);    close2       = NormalizeDouble(iClose(Symbol(), Period(), 2), Digits);    low1         = NormalizeDouble(iLow(Symbol(), Period(), 1), Digits);    low2         = NormalizeDouble(iLow(Symbol(), Period(), 2), Digits);    high1        = NormalizeDouble(iHigh(Symbol(), Period(), 1), Digits);    high2        = NormalizeDouble(iHigh(Symbol(), Period(), 2), Digits); //-    _bar2size=NormalizeDouble(((high2-low2)/_point),0); //- 如果第二個柱為熊勢而第一個柱為牛勢    if(timeBarInside!=iTime(Symbol(),Period(),1) && //此模式尚未開啟訂單       _bar2size>bar2size && //第二個柱足夠大, 說明市場並不平緩       open2>close2 && //第二個柱為牛勢       close1>open1 && //第一個柱是熊勢       high2>high1 &&  //第二柱的最高價高於第一個柱的最高價       open2>close1 && //第二個柱的開盤價高於第一個柱的收盤價       low2<low1)      //第二個柱的最低價低於第一個柱的最低價      {       //- 我們已經列出了第一柱內含於第二柱的所有條件       timeBarInside=iTime(Symbol(),Period(),1); //表明已經為此模式開啟訂單      }   } //++


定義止損訂單水平

現在所有的準備工作都已完成, 我們只需要定義止損訂單水平和訂單價格了. 並且, 別忘了訂單過期時間的計算.

讓我們把以下代碼加入OnTick()函數體:

buyPrice=NormalizeDouble(high2+interval*_point,Digits);       //根據距離定義訂單價格       buySL=NormalizeDouble(low2-interval*_point,Digits);     //根據距離定義止損       buyTP=NormalizeDouble(buyPrice+TP*_point,Digits);       //定義獲利價位       _ExpDate=TimeCurrent()+ExpDate*60*60;                   //計算掛單過期時間       sellPrice=NormalizeDouble(low2-interval*_point,Digits);       sellSL=NormalizeDouble(high2+interval*_point,Digits);       sellTP=NormalizeDouble(sellPrice-TP*_point,Digits);


執行錯誤的修正

如果您開發過EA交易, 您也許知道當關閉訂單, 設置訂單, 包括等待時間, 不正確的止損值等等經常可能引發錯誤. 為了消除此類錯誤, 我們應該使用簡單的內部基本錯誤處理寫一個獨立的函數.

//++ //| 開啟和設置訂單的函數                                                                                                    | //| symbol      - 訂單的交易品種                                                                                           | //| cmd         - 交易類型 (可能等於任何交易類型值).                                                                         | //| volume      - 手數.                                                                                                   | //| price       - 開單價格.                                                                                               | //| slippage    - 市場買入或者賣出訂單的最大點差.                                                                            | //| stoploss    - 當虧損達到某種水平關閉倉位的價位 (如果不設止損則為0).                                                         | //| takeprofit  - 當獲利達到某種水平關閉倉位的價位 (如果不設獲利則為0).                                                         | //| comment     - 訂單注釋. 注釋的最後部分可能被交易服務器修改.                                                                | //| magic       - 訂單幻數. 可以使用用戶自定義的ID.                                                                          | //| expiration  - 掛單的過期時間.                                                                                          | //| arrow_color - 圖表上開啟訂單的箭頭顏色. 如果此參數空缺或者等於CLR_NONE,                                                     | //|               開單的箭頭在圖表上則不做顯示.                                                                              | //++ int OrderOpenF(string     OO_symbol,                int        OO_cmd,                double     OO_volume,                double     OO_price,                int        OO_slippage,                double     OO_stoploss,                double     OO_takeprofit,                string     OO_comment,                int        OO_magic,                datetime   OO_expiration,                color      OO_arrow_color)   {    int      result      = -1;    //開啟訂單的結果    int      Error       = 0;     //開啟訂單出錯編號    int      attempt     = 0;     //已經進行的嘗試次數    int      attemptMax  = 3;     //最大嘗試次數    bool     exit_loop   = false; //退出循環    string   lang=TerminalInfoString(TERMINAL_LANGUAGE);  //交易終端語言, 為了定義消息的語言    和double   stopllvl=NormalizeDouble(MarketInfo(OO_symbol,MODE_STOPLEVEL)*MarketInfo(OO_symbol,MODE_POINT),Digits);  //最小止損/獲利水平點數                                                                                                                      //本模塊提供了安全的訂單開啟功能.  //- 檢查買入訂單    if(OO_cmd==OP_BUY || OO_cmd==OP_BUYLIMIT || OO_cmd==OP_BUYSTOP)      {       double tp = (OO_takeprofit - OO_price)/MarketInfo(OO_symbol, MODE_POINT);       double sl = (OO_price - OO_stoploss)/MarketInfo(OO_symbol, MODE_POINT);       if(tp>0 && tp<=stopllvl)         {          OO_takeprofit=OO_price+stopllvl+2*MarketInfo(OO_symbol,MODE_POINT);         }       if(sl>0 && sl<=stopllvl)         {          OO_stoploss=OO_price -(stopllvl+2*MarketInfo(OO_symbol,MODE_POINT));         }      } //- 檢查賣出訂單    if(OO_cmd==OP_SELL || OO_cmd==OP_SELLLIMIT || OO_cmd==OP_SELLSTOP)      {       double tp = (OO_price - OO_takeprofit)/MarketInfo(OO_symbol, MODE_POINT);       double sl = (OO_stoploss - OO_price)/MarketInfo(OO_symbol, MODE_POINT);       if(tp>0 && tp<=stopllvl)         {          OO_takeprofit=OO_price -(stopllvl+2*MarketInfo(OO_symbol,MODE_POINT));         }       if(sl>0 && sl<=stopllvl)         {          OO_stoploss=OO_price+stopllvl+2*MarketInfo(OO_symbol,MODE_POINT);         }      } //- while 循環    while(!exit_loop)      {       result=OrderSend(OO_symbol,OO_cmd,OO_volume,OO_price,OO_slippage,OO_stoploss,OO_takeprofit,OO_comment,OO_magic,OO_expiration,OO_arrow_color); //嘗試使用指定的參數下單       //- 如果開啟訂單出錯       if(result<0)         {          Error = GetLastError();                                     //給錯誤碼賦值          switch(Error)                                               //枚舉錯誤            {                                                         //關閉訂單出錯的枚舉, 並嘗試修複錯誤             case  2:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   Sleep(3000);                                       //延遲3秒                   RefreshRates();                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt=0;                                         //把嘗試次數重設為0                    exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case  3:                RefreshRates();                exit_loop = true;                                     //退出 while                break;                                                //退出 switch                case  4:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   Sleep(3000);                                       //延遲3秒                   RefreshRates();                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt = 0;                                       //把嘗試次數重設為0                   exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case  5:                exit_loop = true;                                     //退出 while                break;                                                //退出 switch                case  6:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   Sleep(5000);                                       //延遲5秒                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt = 0;                                       //把嘗試次數重設為0                   exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case  8:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   Sleep(7000);                                       //延遲7秒                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt = 0;                                       //把嘗試次數重設為0                   exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case 64:                exit_loop = true;                                     //退出 while                break;                                                //退出 switch             case 65:                exit_loop = true;                                     //退出 while                break;                                                //退出 switch             case 128:                Sleep(3000);                RefreshRates();                continue;                                             //退出 switch             case 129:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   Sleep(3000);                                       //延遲3秒                   RefreshRates();                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt = 0;                                       //把嘗試次數重設為0                   exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case 130:                exit_loop=true;                                       //退出 while                break;             case 131:                exit_loop = true;                                     //退出 while                break;                                                //退出 switch             case 132:                Sleep(10000);                                         //延遲10秒                RefreshRates();                                       //更新數據                //exit_loop = true;                                   //退出 while                break;                                                //退出 switch             case 133:                exit_loop=true;                                       //退出 while                break;                                                //退出 switch             case 134:                exit_loop=true;                                       //退出 while                break;                                                //退出 switch             case 135:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   RefreshRates();                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt = 0;                                       //把嘗試次數設為0                    exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case 136:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                                 //再多嘗試一次                   RefreshRates();                   break;                                             //退出 switch                  }                if(attempt==attemptMax)                  {                   attempt = 0;                                       //把嘗試次數設為0                    exit_loop = true;                                  //退出 while                   break;                                             //退出 switch                  }             case 137:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                   Sleep(2000);                   RefreshRates();                   break;                  }                if(attempt==attemptMax)                  {                   attempt=0;                   exit_loop=true;                   break;                  }             case 138:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                   Sleep(1000);                   RefreshRates();                   break;                  }                if(attempt==attemptMax)                  {                   attempt=0;                   exit_loop=true;                   break;                  }             case 139:                exit_loop=true;                break;             case 141:                Sleep(5000);                exit_loop=true;                break;             case 145:                exit_loop=true;                break;             case 146:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                   Sleep(2000);                   RefreshRates();                   break;                  }                if(attempt==attemptMax)                  {                   attempt=0;                   exit_loop=true;                   break;                  }             case 147:                if(attempt<attemptMax)                  {                   attempt=attempt+1;                   OO_expiration=0;                   break;                  }                if(attempt==attemptMax)                  {                   attempt=0;                   exit_loop=true;                   break;                  }             case 148:                exit_loop=true;                break;             default:                Print("錯誤: ",Error);                exit_loop=true; //退出 while                 break;          //其他選項             }         }       //- 如果沒有發現出錯       else         {          if(lang == "Russian") {Print("Ордер успешно открыт. ", result);}          if(lang == "English") {Print("The order is successfully opened.", result);}          Error = 0;                                //把錯誤碼重設為0          break;                                    //退出 while          //errorCount =0;                          //把嘗試次數設為0         }      }    return(result);   } //++

結果我們可以獲得如下代碼:

//++ //|                                                    InsideBar.mq4 | //|                                  Copyright 2015, Iglakov Dmitry. | //|                                               cjdmitri@gmail.com | //++ #property copyright "Copyright 2015, Iglakov Dmitry." #property link      "cjdmitri@gmail.com" #property version   "1.00" #property strict extern int     interval          = 20;                               //距離 extern double  lot               = 0.1;                              //手數 extern int     TP                = 300;                              //獲利 extern int     magic             = 555124;                           //幻數 extern int     slippage          = 2;                                //點差 extern int     ExpDate           = 48;                               //訂單過期小時數 extern int     bar2size          = 800;                              //柱 2 的大小 double   buyPrice,//定義止損買入價位 buyTP,      //止損買入單的獲利價位 buySL,      //止損買入單的止損價位 sellPrice,  //定義止損賣出價位 sellTP,     //止損賣出單的獲利價位 sellSL;     //止損賣出單的止損價位 double   open1,//第一個柱的開盤價 open2,    //第二個柱的開盤價 close1,   //第一個柱的收盤價 close2,   //第二個柱的收盤價 low1,     //第一個柱的最低價 low2,     //第二個柱的最低價 high1,    //第一個柱的最高價 high2;    //第二個柱的最高價 datetime _ExpDate=0;          //定義訂單過期時間的局部變量 double     _bar2size; datetime timeBarInside;       //內含柱訂單開啟的柱的時間, 防止重複下單 //++ //| EA 初始化函數                                                     | //++ int OnInit()   {    return(INIT_SUCCEEDED);   } //++ //| EA 終止化函數                                                     | //++ void OnDeinit(const int reason)   {   } //++ //| EA 訂單處理函數                                                    | //++ void OnTick()   {    double   _bid     = NormalizeDouble(MarketInfo(Symbol(), MODE_BID), Digits); //定義低價     double   _ask     = NormalizeDouble(MarketInfo(Symbol(), MODE_ASK), Digits); //定義高價    double   _point   = MarketInfo(Symbol(), MODE_POINT); //- 定義所需的柱的價格    open1        = NormalizeDouble(iOpen(Symbol(), Period(), 1), Digits);    open2        = NormalizeDouble(iOpen(Symbol(), Period(), 2), Digits);    close1       = NormalizeDouble(iClose(Symbol(), Period(), 1), Digits);    close2       = NormalizeDouble(iClose(Symbol(), Period(), 2), Digits);    low1         = NormalizeDouble(iLow(Symbol(), Period(), 1), Digits);    low2         = NormalizeDouble(iLow(Symbol(), Period(), 2), Digits);    high1        = NormalizeDouble(iHigh(Symbol(), Period(), 1), Digits);    high2        = NormalizeDouble(iHigh(Symbol(), Period(), 2), Digits); //-    _bar2size=NormalizeDouble(((high2-low2)/_point),0); //- 如果第二個柱為熊勢而第一個柱為牛勢    if(timeBarInside!=iTime(Symbol(),Period(),1) && //此模式尚未開啟訂單       _bar2size>bar2size && //第二個柱足夠大, 說明市場並不平緩       open2>close2 && //第二個柱為牛勢       close1>open1 && //第一個柱是熊勢       high2>high1 &&  //第二柱的最高價高於第一個柱的最高價       open2>close1 && //第二個柱的開盤價高於第一個柱的收盤價       low2<low1)      //第二個柱的最低價低於第一個柱的最低價      {       buyPrice=NormalizeDouble(high2+interval*_point,Digits); //根據間隔定義的訂單價格       buySL=NormalizeDouble(low2-interval*_point,Digits);     //根據間隔定義的止損價格       buyTP=NormalizeDouble(buyPrice+TP*_point,Digits);       //定義獲利價位       _ExpDate=TimeCurrent()+ExpDate*60*60;                   //掛單過期時間的計算       sellPrice=NormalizeDouble(low2-interval*_point,Digits);       sellSL=NormalizeDouble(high2+interval*_point,Digits);       sellTP=NormalizeDouble(sellPrice-TP*_point,Digits);       OrderOpenF(Symbol(),OP_BUYSTOP,lot,buyPrice,slippage,buySL,buyTP,NULL,magic,_ExpDate,Blue);       OrderOpenF(Symbol(),OP_SELLSTOP,lot,sellPrice,slippage,sellSL,sellTP,NULL,magic,_ExpDate,Blue);       //- we h*e listed all the conditions defining that the first bar is completely within the second one       timeBarInside=iTime(Symbol(),Period(),1); //指出此模式已經下單      }   } //++

現在讓我們進行編譯並在記錄中檢查錯誤信息.


測試EA交易

現在是時候測試我們的EA交易了. 讓我們運行策略測試期並設置輸入參數. 我設置了如下的參數:

圖 6. 測試的輸入參數

圖 6. 測試的輸入參數

  1. 選擇一個交易品種 (在我的例子中是 CADJPY ).

  2. 請確認使用"每一訂單(Every tick)"模式, 並且定義測試將在曆史數據上進行. 我已經選擇了2014年整年的數據.

  3. 設置的時間框架是D1.

  4. 運行測試.

  5. 測試結束後檢查記錄. 我們可以看到, 過程中沒有錯誤.

以下是EA交易測試的日誌:

圖 7. EA 交易測試日誌

圖 7. EA 交易測試日誌

確認沒有出錯後優化EA交易.


優化

我選擇了如下的參數進行優化:

圖 8. 優化參數

圖 8. 優化參數



圖 9. 優化設置

圖 9. 優化設置

就這樣, 我們就擁有了可以使用的EA交易.


優化和測試結果

圖 10. 測試結果

圖 10. 測試結果



圖 11. 測試結果圖

圖 11. 測試結果圖



結論

  1. 我們已經開發了可用的基於內含柱交易的 EA 交易.

  2. 我們已經確認, 即使不使用額外的進場過濾器價格行為模式也是可行的.

  3. 沒有使用特殊的技巧(例如馬丁格爾或者平均).

  4. 通過止損單的正確設置, 回撤已經被減到最小.

  5. 沒有使用技術指標. 此交易機器人僅僅依賴於讀取基本圖表.


感謝您的閱讀!我希望本文會有所幫助.


分享到:
舉報財經168客戶端下載

全部回複

0/140

投稿 您想發表你的觀點和看法?

更多人氣分析師

  • 張亦巧

    人氣2208文章4145粉絲45

    暫無個人簡介信息

  • 張迎妤

    人氣1904文章3305粉絲34

    個人專注於行情技術分析,消息面解讀剖析,給予您第一時間方向...

  • 指導老師

    人氣1864文章4423粉絲52

    暫無個人簡介信息

  • 李冉晴

    人氣2320文章3821粉絲34

    李冉晴,專業現貸實盤分析師。

  • 梁孟梵

    人氣2184文章3177粉絲39

    qq:2294906466 了解群指導添加微信mfmacd

  • 王啟蒙現貨黃金

    人氣312文章3427粉絲8

    本人做分析師以來,並專注於貴金屬投資市場,尤其是在現貨黃金...

  • 金泰鉻J

    人氣2328文章3925粉絲51

    投資問答解咨詢金泰鉻V/信tgtg67即可獲取每日的實時資訊、行情...

  • 金算盤

    人氣2696文章7761粉絲125

    高級分析師,混過名校,廝殺於股市和期貨、證券市場多年,專注...

  • 金帝財神

    人氣4760文章8329粉絲119

    本文由資深分析師金帝財神微信:934295330,指導黃金,白銀,...

FX168財經

FX168財經學院

FX168財經

FX168北美