COCO研究院

 找回密碼
 註冊
搜索
查看: 34131|回復: 3

MT4程式編寫疑問

[複製鏈接]
發表於 18-4-9 21:49 | 顯示全部樓層 |閱讀模式
1.如何在目標價位到達時 停損自動調整至入場價
2.如何找尋即時K棒現價程式碼?
3.如何寫出當下K棒在跑的數值,如何寫出當下K棒在跑的價格
4.如何寫出讓一根K棒只能交易一次


問題有點多...
謝謝大家解答
發表於 18-4-10 06:28 | 顯示全部樓層
問題1 - 下面是個人之前寫的追蹤止損函數範例

strSym - 填入商品名,如果是當前圖表的商品,填 Symbol()
iMagic - 這個 EA 使用的訂單魔術號
dTsTarget - 獲利多少點 pips 開始移動止損價格,單位 pips
dTsMoved - 獲利達到開始移動止損價格到開倉價格獲利多少點 pips, 如果一開始要移動到開倉價格,這裡填 0,因為是追蹤止損,所以接下來獲利再大於上面參數的獲利點數,止損價格會繼續移動,如果只是要移動到開倉價格後不再移動,請自行修改。
strCmt - 這個問題不需要填這個參數,跳過即可。

  1. void TrailingStop(string strSym,int iMagic,double dTsTarget,double dTsMoved,string strCmt="")
  2.   {
  3.    if(dTsTarget==0.0) return; bool bOrderModify=false;
  4.    for(int ii=OrdersTotal();ii>=0;ii--)
  5.      {
  6.       if(!OrderSelect(ii,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderType()>OP_SELL) continue;
  7.       if(OrderSymbol()==strSym && OrderMagicNumber()==iMagic && OrderType()==OP_BUY &&
  8.          NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_BID),SymbolInfoInteger(strSym,SYMBOL_DIGITS))-
  9.          NormalizeDouble(OrderOpenPrice(),SymbolInfoInteger(strSym,SYMBOL_DIGITS))>=dTsTarget*SymbolInfoDouble(strSym,SYMBOL_POINT) &&
  10.          NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_BID)-(dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS))>
  11.          NormalizeDouble(OrderStopLoss(),SymbolInfoInteger(strSym,SYMBOL_DIGITS)) &&
  12.          (strCmt=="" || StringFind(OrderComment(),strCmt,0)!=-1))
  13.         {
  14.          bOrderModify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_BID)-
  15.                                   (dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS)),
  16.                                   OrderTakeProfit(),0,clrNone);
  17.         }
  18.       if(OrderSymbol()==strSym && OrderMagicNumber()==iMagic && OrderType()==OP_SELL &&
  19.          NormalizeDouble(OrderOpenPrice(),SymbolInfoInteger(strSym,SYMBOL_DIGITS))-
  20.          NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_ASK),SymbolInfoInteger(strSym,SYMBOL_DIGITS))>=dTsTarget*SymbolInfoDouble(strSym,SYMBOL_POINT) &&
  21.          (NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_ASK)+(dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS))<
  22.          NormalizeDouble(OrderStopLoss(),SymbolInfoInteger(strSym,SYMBOL_DIGITS)) || OrderStopLoss()==0.0) &&
  23.          (strCmt=="" || StringFind(OrderComment(),strCmt,0)!=-1))
  24.         {
  25.          bOrderModify=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SymbolInfoDouble(strSym,SYMBOL_ASK)+
  26.                                   (dTsTarget-dTsMoved)*SymbolInfoDouble(strSym,SYMBOL_POINT),SymbolInfoInteger(strSym,SYMBOL_DIGITS)),
  27.                                   OrderTakeProfit(),0,clrNone);
  28.         }
  29.      }
  30.   }
複製代碼

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


 樓主| 發表於 18-4-10 21:02 | 顯示全部樓層
esym 發表於 18-4-10 06:28
問題1 - 下面是個人之前寫的追蹤止損函數範例

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

謝謝大大我來試看看
發表於 18-4-10 21:40 | 顯示全部樓層
本帖最後由 esym 於 18-4-10 21:42 編輯
47852 發表於 18-4-10 21:02
謝謝大大我來試看看

我這些年在對岸有維護一個MT4/MT5部落格,但在這個論壇權限不夠無法分享網址,如果你有興趣,可以谷歌 boolapi sina blog,就可以找到,雖然是用簡中和用對岸的軟體術語書寫,但應該很容易讀懂。我最近開始連載寫“從源碼看原理”這個系列文,是針對外部網上已流通的指標或EA源碼的原理解析,也順便分享源碼,不過部落格過去的文比較偏向個人設計過的模版介紹,而不是原理分享文。
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院

GMT+8, 24-11-22 10:12

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回復 返回頂部 返回列表
理財討論網站 |