期貨量化交易軟件:捕捉趨勢
警告
本文中包含的信息僅為我的個人見解。作為作者,我不想誘導你使用本文描述的算法進行交易。此外,我必須警告,使用該信息可能導致?lián)p失。

編輯
簡介
本文包含對交易方法的描述 - 即獲利交易的成交量積累。我認為只有獲利交易才能夠積累。文章解釋了實施的最佳方式,并包含了幫助正確進行交易的 EA 代碼。
算法的概念
獲利交易的成交量積累可以讓我們從市場變動中最大化獲利。但成交量積累必須避免導致風險的增加。本文描述了這種成交量積累的算法之一。
首先,赫茲期貨量化需要一個參考點 - 第一個主交易。主交易的交易量應大于每個輔交易的交易量。假設(shè)主交易的量為 0.2 手,輔交易的量則為 0.1 手。跟蹤止損用于所有的交易,例如,50 個點。當主交易的獲利達到 +100 點,止損為 +50。此時,在止損 -50 點的相同方向上打開 0.1 手的交易。如果價格回落,兩個交易將被止損訂單關(guān)閉。獲得的利潤等于 0.2 手的 50 點和 0.1 手的 - 50 點??偣搏@利等于 0.1 手的 50 點。這樣就在交易量增加時實現(xiàn)了止損保護。
如果交易繼續(xù)沿著必要的方向移動,當輔交易的獲利達到 +50 點時,跟蹤止損激活。當主交易的獲利達到 200 點,輔交易的獲利達到 100 點,將打開另一個輔交易。止損還是等于 -50。諸如此類。
這是一個非常簡單的從手數(shù)積累良好獲利的方法。同時使風險最小化。實際上,這里的風險不過是虧損了主交易的一部分,即第一個輔交易虧損的風險。但這并不是虧損風險,而是沒有獲得全部利潤的風險。
標準的跟蹤 止 損在只有獲利時才跟蹤交易。但如果在獲得必要的利潤之前對輔交易實施,則可以提高這種手數(shù)積累方法的獲利性。你可以利用赫茲期貨量化在優(yōu)化輔訂單的打開時如此操作。
實施
為此而編寫的 Expert Advisor 基于“方便的剝頭皮交易”一文中描述的 EA。本文中,EA 具有復合功能:即作為訓練游戲,又是打開交易的工具。在該交易中,刪除了游戲的功能。這樣 Expert Advisor 在圖表上繪制兩個箭頭 - 向上和向下。刪除其中之一是在必要的方向打開交易的信號。例如,刪除向下的箭頭,則向上的箭頭保留在圖表上。對于 EA,這是一個買入信號,下一定量的買入止損掛單。
這里,市場訂單是主訂單。掛單具有輔訂單的功能,輔訂單比主訂單的手數(shù)小。為了計算輔交易打開的“頻率”及其數(shù)量,使用了兩個概念。第一個是終極目標,即獲利。這對所有訂單都一樣(主訂單和輔訂單)。第二個概念是打開掛單的步長。根據(jù)終極目標,EA 計算按照從當前價格到獲利水平的間隔下單的數(shù)量。
例如,如果使獲利等于 400 點,打開訂單的步長為 100 點(默認),則買入時要打開 4 個訂單。第一個是以沽盤價買入的主訂單。第二個是以沽盤價+100 點買入的止損輔訂單。第三個是以沽盤價+200 點買入的止損輔訂單。第四個是以沽盤價+300 點買入的止損輔訂單。所有訂單的獲利等于沽盤價+400 點,即對第一個訂單為 400 點,第二個為 300 點,第三個為 200 點,第四個為 100 點。
跟蹤 止 損 只有在獲得必要的利潤時才作用于主交易(默認為 50 點)。對于輔交易,則從打開訂單的時刻開始(即可以跟蹤止損的虧損區(qū)域)。跟蹤止損水平對所有交易都相等。此外,跟蹤止損水平是對輔交易的止損水平。
如果主訂單關(guān)閉,會刪除剩余的掛單。之后,圖表上再次繪制兩個箭頭。這意味著 EA 準備好再次打開交易。
這一切看起來很冗長,但在實踐中很容易實施。赫茲期貨量化來分析 EA 代碼。
//+------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? take_trend.mq4 | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Copyright ? 2008, FXRaider | //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+------------------------------------------------------------------+ #property copyright "Copyright ? 2008, FXRaider" extern int gap=20; ? ? ? ? ? ?//level at which arrows are placed extern int TP=400; ? ? ? ? ? ?//Take Profit level extern int SL=0; ? ? ? ? ? ? ?//Stop Loss level extern double Lots1=0.2; ? ? ?//lot of a main trade extern double Lots2=0.1; ? ? ?//lot of auxiliary trades extern int slippage=2; ? ? ? ?//level of acceptable requote extern int MagicNumber1=5345; //magic number of the main trade extern int MagicNumber2=4365; //magic number of auxiliary trades extern int Open_Step=100; ? ? //step for opening auxiliary trades extern bool UseTrailing = true; //enabling/disabling T-SL extern int TrailingStop = 50; ? //Trailing Stop Loss level extern int TrailingStep = 1; ? ?//Trailing Stop Loss step int start() ?{ //------------------------------ ? ? ? //+----------------------------------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?searching open orders for a pair ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?int pos_sell=0; ?for (int i_op_sell=OrdersTotal()-1; i_op_sell>=0; i_op_sell--) ?{ ? if (!OrderSelect(i_op_sell,SELECT_BY_POS,MODE_TRADES)) break; ? if (Symbol()==OrderSymbol() ? &&OrderMagicNumber()==MagicNumber1 ? ? &&(OrderType()==OP_SELL)) ? { ? ?pos_sell=1; break; ? ? } ?} ? ? ? ?int pos_buy=0; ?for (int i_op_buy=OrdersTotal()-1; i_op_buy>=0; i_op_buy--) ?{ ? if (!OrderSelect(i_op_buy,SELECT_BY_POS,MODE_TRADES)) break; ? if (Symbol()==OrderSymbol() ? &&OrderMagicNumber()==MagicNumber1 ? &&(OrderType()==OP_BUY)) ? { ? ?pos_buy=1; break; ? ? } ?} ? ? //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?searching open orders for a pair ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| //+----------------------------------------------------------------------------------------------+ ? //+------------------------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? working with objects ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+----------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ?deleting objects ? ? ? ? ? ? ? ? ? ? ?| ?if(iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))>0 ? ? ||ObjectGet("down",OBJPROP_PRICE1)!=Open[0]-gap*Point) ? ?{ ? ? ObjectDelete("down"); ? ?} ? ?if(iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))>0 ? ?||ObjectGet("up",OBJPROP_PRICE1)!=Open[0]+gap*Point) ? ? ? ? ? ? ? ?{ ? ? ObjectDelete("up"); ? ?} //| ? ? ? ? ? ? ? ? ? ?deleting objects ? ? ? ? ? ? ? ? ? ? ?| ? //+----------------------------------------------------------+ //+----------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? drawing objects ? ? ? ? ? ? ? ? ? ? ? ?| ? ? if((ObjectFind("down") != 0&&ObjectFind("up") != 0) //if no objects ? &&!pos_sell&&!pos_buy) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//if no open orders ? { ? ? ObjectCreate("down", OBJ_ARROW, 0, Time[0], Open[0]-gap*Point); //draw a down arrow ? ? ObjectSet("down", OBJPROP_STYLE, STYLE_DOT); ? ? ObjectSet("down", OBJPROP_ARROWCODE, 234); ? ? ObjectSet("down", OBJPROP_COLOR, Red); ? ? ObjectCreate("up", OBJ_ARROW, 0, Time[0], Open[0]+gap*Point); //draw an up arrow ? ? ObjectSet("up", OBJPROP_STYLE, STYLE_DOT); ? ? ObjectSet("up", OBJPROP_ARROWCODE, 233); ? ? ObjectSet("up", OBJPROP_COLOR, Blue); ? } ? ? //| ? ? ? ? ? ? ? ? ? drawing objects ? ? ? ? ? ? ? ? ? ? ? ?| //+----------------------------------------------------------+ ? ? ? ? //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? working with objects ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? //+------------------------------------------------------------------------------------+ ? //+----------------------------------------------------------------------------------------------+ //| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?deleting unnecessary orders ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | int cnt_del; if(pos_buy==0) { ? ? ? ? ? ? ? ?for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) ?{ ? ?if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue; ? ? ? ?if(OrderSymbol()==Symbol()) ? ?{ ? ? if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); ? ?} ?} }