問題1 - 下面是個人之前寫的追蹤止損函數範例
strSym - 填入商品名,如果是當前圖表的商品,填 Symbol()
iMagic - 這個 EA 使用的訂單魔術號
dTsTarget - 獲利多少點 pips 開始移動止損價格,單位 pips
dTsMoved - 獲利達到開始移動止損價格到開倉價格獲利多少點 pips, 如果一開始要移動到開倉價格,這裡填 0,因為是追蹤止損,所以接下來獲利再大於上面參數的獲利點數,止損價格會繼續移動,如果只是要移動到開倉價格後不再移動,請自行修改。
strCmt - 這個問題不需要填這個參數,跳過即可。
- void TrailingStop(string strSym,int iMagic,double dTsTarget,double dTsMoved,string strCmt="")
- {
- if(dTsTarget==0.0) return; bool bOrderModify=false;
- for(int ii=OrdersTotal();ii>=0;ii--)
- {
- if(!OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderType()>OP_SELL) continue;
- if(OrderSymbol()==strSym && OrderMagicNumber()==iMagic && OrderType()==OP_BUY &&
- NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_BID),SymbolInfoInteger(strSym,SYMBOL_DIGITS))-
- NormalizeDouble(OrderOpenPrice(),SymbolInfoInteger(strSym,SYMBOL_DIGITS))>=dTsTarget*SymbolInfoDouble(strSym,SYMBOL_POINT) &&
- NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_BID)-(dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS))>
- NormalizeDouble(OrderStopLoss(),SymbolInfoInteger(strSym,SYMBOL_DIGITS)) &&
- (strCmt=="" || StringFind(OrderComment(),strCmt,0)!=-1))
- {
- bOrderModify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_BID)-
- (dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS)),
- OrderTakeProfit(),0,clrNone);
- }
- if(OrderSymbol()==strSym && OrderMagicNumber()==iMagic && OrderType()==OP_SELL &&
- NormalizeDouble(OrderOpenPrice(),SymbolInfoInteger(strSym,SYMBOL_DIGITS))-
- NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_ASK),SymbolInfoInteger(strSym,SYMBOL_DIGITS))>=dTsTarget*SymbolInfoDouble(strSym,SYMBOL_POINT) &&
- (NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_ASK)+(dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS))<
- NormalizeDouble(OrderStopLoss(),SymbolInfoInteger(strSym,SYMBOL_DIGITS)) || OrderStopLoss()==0.0) &&
- (strCmt=="" || StringFind(OrderComment(),strCmt,0)!=-1))
- {
- bOrderModify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_ASK)+
- (dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS)),
- OrderTakeProfit(),0,clrNone);
- }
- }
- }
複製代碼
問題2 - Close[0]
問題3 - 如果是要把當前價格顯示在圖表上,需要使用 label object 來画
問題4 - 如果是用指標信號來判斷開單,用 dtTime!=iTime(Symbol(),Period(),0) 和指標信號判斷放在一起判斷,如果信號符合,然後再把 dtTime=iTime(Symbol(),Period(),0); 接下來就是作開單,這樣下次 OnTick 函數觸發,這個圖表的 k 線沒有換線前就不會再判斷進來。如果是非圖表週期,把 Period() 替換成你要的 K 線週期。
另外一個方式就是在 OnTick 函數裏調用一個你自己寫的訂單檢查函數,掃描訂單的最後這個 EA 下的單,並得到 EA 最後下的單的開單時間,然後每次下單檢查 iTime(Symbol(),Period(),0) 是否大於那個最後的下單時間。如果前面都沒有開過單,得到 EA 最後下單的時間自然是0,自然會大於,所以就可以跳過這個條件限制,如果有開過單就是用這個比較來判斷是否是當前 K 線開的單。
iTime(Symbole(),Period(),0) 就是圖表 K 線最新那個 K 線的開的時間。
|