47852 發表於 18-4-9 21:49

MT4程式編寫疑問

1.如何在目標價位到達時 停損自動調整至入場價
2.如何找尋即時K棒現價程式碼?
3.如何寫出當下K棒在跑的數值,如何寫出當下K棒在跑的價格
4.如何寫出讓一根K棒只能交易一次


問題有點多...
謝謝大家解答

esym 發表於 18-4-10 06:28

問題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

問題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 線的開的時間。


47852 發表於 18-4-10 21:02

esym 發表於 18-4-10 06:28
問題1 - 下面是個人之前寫的追蹤止損函數範例

strSym - 填入商品名,如果是當前圖表的商品,填 Symbol()


謝謝大大我來試看看

esym 發表於 18-4-10 21:40

本帖最後由 esym 於 18-4-10 21:42 編輯

47852 發表於 18-4-10 21:02
謝謝大大我來試看看
我這些年在對岸有維護一個MT4/MT5部落格,但在這個論壇權限不夠無法分享網址,如果你有興趣,可以谷歌 boolapi sina blog,就可以找到,雖然是用簡中和用對岸的軟體術語書寫,但應該很容易讀懂。我最近開始連載寫“從源碼看原理”這個系列文,是針對外部網上已流通的指標或EA源碼的原理解析,也順便分享源碼,不過部落格過去的文比較偏向個人設計過的模版介紹,而不是原理分享文。
頁: [1]
查看完整版本: MT4程式編寫疑問