@編寫時頭部:
例:
property copyright "牛在匯上飛"
其中:
// 表示后面是預處理語句卡啰。
property // 定義mt4內部變量的性質
@if(AccountMargin()>0)
Print("保證金比例=",DoubleToStr(AccountEquity()/AccountMargin()*100,2),"% ");
@ 減肥:
測試數(shù)據(jù)次數(shù)過多静稻,目錄文件胖到走不到時,就把
目錄:\ \tester\history和tester\logs里的文件全部刪除
@下載的文件在哪兒:
如果你下載的是ex4文件匈辱,就將它拷貝到experts\indicators目錄下振湾,然后重新運行MT4,就可以在導航欄的自定義指標項目下看到新的指標名稱亡脸,后面的使用和其他指標一樣押搪。
如果你下載的是mq4文件,同樣你也需要先拷貝的experts\indicators目錄下浅碾,然后使用MetaEditor打開源文件大州,點擊編寫按鈕。這時會在目錄下自動生成ex4文件垂谢,同時MT4導航欄自定義指標項目下會出現(xiàn)新指標厦画,直接使用即可。
如果還有DLL文件埂陆,或者有.set苛白,或者有.tpl等娃豹,
DLL為庫文件焚虱,復制到experts\libraries,
.set為設置文件復制到experts\presets懂版,
.tpl為模板文件鹃栽,復制到templates
@ OrdersTotal()不僅僅是指當前已成交的訂單數(shù)
它可以計算當前賬戶中 未平倉的單子 和 掛單 的總個數(shù)
@從歷史訂單選出最后一單
int i =0;
while (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) )
i++;
OrderSelect(i-1,SELECT_BY_POS,MODE_HISTORY)
所選即為最后一個平倉單
但前提條件是沒有使用掛單,沒有取消過掛單. 因為歷史中包含了平倉單和取消的掛單躯畴;
所以當歷史單中有取消的掛單民鼓,就得需要判斷 類型/時間/贏利來,來剔除取消的掛單,才能找到最后的平倉單.
@既然已經有OBJ_TEXT函數(shù)了蓬抄,為何MT4中還要再多一個OBJ_LABEL函數(shù)呢丰嘉?
兩者的坐標性質不同。OBJ_TEXT的坐標是時間和價格,位置會隨著圖表的移動而變化; 而OBJ_LABEL的坐標是以當前可視區(qū)域的相對位置作為坐標嚷缭,文字則始終不變饮亏,除非你更改了屏幕分辨率耍贾。
@如何檢測交易單是被打止損(或被打止盈)?
OrderCloseTime()函數(shù)返回的是訂單的收盤時間。如果訂單正在交易中而未平倉路幸,此函數(shù)返回的是0荐开,如果平倉,此值就會變成平倉當時的服務器時間简肴,是一個很大的正整數(shù)晃听。
//-----------------檢測是否平倉-----------------+
string IsClosed(int tik){
OrderSelect(tik, SELECT_BY_TICKET);
//--若為未平倉
if(OrderCloseTime()<1)
return("未平");
//--若為買單 被止盈
if(OrderType()==OP_BUY){
if(OrderClosePrice()>=OrderTakeProfit())
return("已被止盈");
}
//--若為賣單 被止盈
if(OrderType()==OP_SELL){
if(OrderClosePrice()<=OrderTakeProfit())
return("已被止盈");
}
//--其它的則為被止損
return("已被止損");
}
//------------------------------------------------+
其它找到打止損或打止盈的訂單的方法,OrderComment()包含sl或tp字樣,也可以適用.
@基準貨幣每一點的價值都是10美元砰识,這是因為基準貨幣最小的變動點就是0.0001能扒。即:只要乘以合約單位可以得知:0.0001100000手數(shù)=10美元。
@Lots = 0.1
if(AccountFreeMargin()<(1000*Lots)){
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
代碼的意思是仍翰,假設我們的可用保證金小于100的話赫粥,我們就停止開倉。其目的主要是保護我們的資金予借,否則我們的資金無限制的開倉
@OrderType() 是針對OrderSelect()選中的訂單有效越平。因此次序應在OrderSelect()之后
@OrderProfit() 不是OrderTakeProfit()!
@掛單成交后,訂單類型就會自動變成 OP_BUY和OP_SELL了
@EA下單時有效期expiration參數(shù),是以秒為單位的灵迫。
開掛掛單時秦叛,當前的時間(服務器時間或本地時間)加上你計劃延隔的期限秒數(shù),將來如果掛單時間超過這個時間點仍未在交瀑粥,則自動取消該掛單.
示例1: OrderSend(…….,TimeCurrent()+Period()60,..);
下單一小時內有效
expiration= TimeCurrent() + (Hour()+1)60; // 當前時間加上范圍秒數(shù)
ticket= OrderSend(......expiration.....);
示例2:
ticket= OrderSend (...TimeLocal()+Period()*60, ..);//本地時間
@報警開關之寫法一
for (i=limit-1;i>=0;i--) {
if(......&& Time[0]>bartime &&.....){
Alert(Symbol(), " ", ......);
bartime=Time[0];
}
}
@幾個賬戶有關的術語的確切含義
余額Balance: 有倉前等于凈值; (開倉后則不一定)
凈值Equity: 開倉后則包含了浮動盈虧;
已用Margin: 當前持有單所占用的資金;
可用Free: 凈值 - 已用;
@ordercloseby 用于反向單子對沖平倉 (需找到對應的單號)
@在 МetaТrader 3客戶終端中挣跋,在兩筆交易中需要停留10秒鐘的時間。在 MetaQuotes Software Corporation 公司創(chuàng)建 МТ4時狞换,出于交易者的意愿刪除了這個限定避咆。事實上,這種情況是一個接一個的交易執(zhí)行 (對于一些倉位移動止損水平,移除掛單交易等等)修噪。有些交易者認為交易之間的停頓是錯誤的查库,并且進行設置智能交易可以不間斷的開倉。但這樣做的話可能會導致賬戶被封黄琼,因為在經紀的角度這是不友好的態(tài)度樊销。
@#include <std.mqh>
是導入一個文件. 你可以在std.mqh文件里寫好一些函數(shù),以后寫ea的時候脏款,直接用就行了围苫,用include包含進來 .include文件多用于聲明函數(shù).
有些人也喜歡把具體實現(xiàn)寫在H文件上 ,不同的是,MQL不用處理內存問題
@反編譯出亂碼的看法
[承編:] 反編譯是由中間語言過度的, 這個和windows字節(jié)序有關, 就好比你刪除文件恢復后撤师,已經不是原來那個名字剂府,而是一堆亂碼一樣, 反編譯出來的東西,是它主動命名的, 變量在內存中都以堆或者棧的形式存在剃盾,進行反編譯時腺占,按照堆棧的位置給每個變量起名.原來的變量還是變量,就好似你由廣州去到北京强法,但你還是你.
[snake:] 變量名是人起的,機器不懂這些湾笛,所謂的變量名就是為了人類能看懂的饮怯,翻譯成機器語言都是16進制的地址. 反編譯后,需要給他們起個名字嚎研,就按照順序編號來起名了 .變量名在編譯的時候就已經被機器廢棄了..其實有規(guī)律的蓖墅,開頭是g的是全局變量,l的是局部變量 ..
[無歡:] 在編譯原理中临扮,編譯機負責把變量擺放在適合的堆棧里论矾,所以它的標識只能是地址號
@從訂單中返回最后一筆單子的訂單號?
如果是歷史訂單,取最后一張歷史單的平倉時間杆勇;
如果是仍在交易中的,取最后一張單的開倉時間
@指出問題:
這個是調整止盈止損的 所以貌似第二個參數(shù)必須用OrderOpenPrice()
bool ModifyOrder(double PriceAverage){
for(int pos=0; pos<=OrdersTotal();pos++) {
OrderSelect(pos, SELECT_BY_POS, MODE_TRADES);
OrderModify(OrderTicket(), OrderOpenPrice(), 0, PriceAverage, 0, Blue);
}
return(0);
}
這樣寫不嚴密贪壳!
修改的時候 應先檢查被修改價和當前價格是否相等 OrderModify(OrderTicket(),
NormalizeDouble(OrderOpenPrice(),Digits),
NormalizeDouble(Ask+PointTrailingStop,Digits),
NormalizeDouble(OrderTakeProfit(),Digits),
0,
Red);
用這個函數(shù)的時候,系統(tǒng)經常自動生成很多點位
另外modify的時候要檢查修改價和現(xiàn)在的價格是否相等
NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(Ask+PointTrailingStop,Digits))
如果這兩個改動之后還是有那問題蚜退,就是修改價格不合理了闰靴,比如不能太靠近現(xiàn)價 大部分的ea沒有這些判斷,平臺一換了钻注,測試結果就相去甚遠
@對于一個新帳戶蚂且,OrdersHistoryTotal()應該是空值嗎?
OrderSelect( OrdersHistoryTotal()-2, SELECT_BY_POS, MODE_HISTORY );
這個函數(shù)會返回什么值幅恋?杏死?
新賬戶時此值是0 . 則select會返回失敗,也就是負值
OrdersHistoryTotal()本身是個數(shù),同時你要清楚 : 第一個歷史單的序號是0, 第二個是1捆交,這樣你就可以理解 OrdersHistoryTotal()-1是“距離現(xiàn)在最近的出場單的序號”
@對于一個被止贏的價位,按原來價位重新入場怎么寫呢淑翼?
個數(shù)是1, 但序號是從0開始
你這個已經出場了,就算查到價格也要判斷當前現(xiàn)價品追,然后決定如何處理.若此時價格比你找到的那個價格更優(yōu), 你可以用現(xiàn)價入場玄括;如果已經偏離很遠 則掛單。這些由你決定
@止盈價的獲得
幾句話說不清楚,大致意思是:
從最大序號開始 循環(huán)select歷史單 找Symble()==OrderSymble()的歷史單,然后查看其OrderComment()是否=[t/p]
如果相等說明是止盈單诵盼,則取其OrderClosePrice就是止盈出場價格了
@comment參數(shù)的特殊作用
這參數(shù)本意是用于記錄你對這個訂單的描述信息惠豺,程序只能在訂單入場的時候設定它银还。同時系統(tǒng)也會在這個訂單發(fā)生止損 止贏或者拆單的時候自動修改這里的內容风宁。
既然訂單發(fā)生止損 止贏或者拆單的時候自動修改這里的內容,那我們可以假設在下單的時候給comment賦值為”on”,當訂單生成后我可以用OrderComment() 函數(shù)實時獲取它的comment值, 如果不等于”on”,那就說明訂單已經止損或止贏了蛹疯。
@string OrderComment() 返回定單的注釋戒财。
int ticket=12345678;
if ( OrderSelect( ticket, SELECT_BY_TICKET ) == true ) {
if( OrderCloseTime() != 0 && OrderProfit() < 0 ) {
Print(StringConcatenate("訂單第:", ticket, " 號 被止損!");
}
}
這種方法是以判斷訂單的盈利是否小于0來判斷的,但是有個問題就是: 如果設定了移動止損捺弦,現(xiàn)在雖然止損了但是有可能還是獲利的饮寞,這樣的就沒法判斷出來了!
用OrderComment ()函數(shù)孝扛,每次止損或者止盈后,系統(tǒng)自動給訂單加入一個注釋幽崩,如果是止損就是s/l. 只要判斷字符串里包含這個字符串就行了苦始。同理,止贏的就是t/p慌申。
@用函數(shù)能 實時地 獲取訂單被止損止贏的信息嗎?
比如陌选,對于主動平倉,可用:
int tt =OrderClose(...);
if (tt>0)...... 就知道已平了倉.
對于止損止贏的被動平倉而言,被平倉的訂單 其Comment的屬性會被系統(tǒng)自動更改為[ST] 止贏是[TP] 用這個去過濾就知道了
@RefreshRates(); 刷新預定義變量和系列數(shù)組的數(shù)據(jù)
是開倉平倉失敗時重新要價的.
重新要價是按原來的價格嗎蹄溉?
沒準兒! 比如你手動下單的時候咨油,有時候行情速度太快,會提示你價格已經變動了柒爵,是否按照最新價格下單. ea下單也有這個問題役电,一般都是判斷下單失敗后,調用一下這函數(shù)棉胀,刷新一下價格法瑟。
掛單一般情況下沒有這種問題
@取消了指標后,在窗口還留著這些東東(物件)的解決辦法:
一,Ctrl+B 用對象列表刪除;
二,點菜單的市場報價唁奢,拖動一個其它貨幣對再試試瓢谢;
@MODE_STOPLEVEL "停止水平點"
它的意思是指 止損位置與入場價格之間的最少點數(shù)差距
@圖形操作用到的函數(shù)
創(chuàng)建一個圖形,用ObjectCreate驮瞧,
設置圖形參數(shù)氓扛,用ObjectSet。
@一個返回訂單數(shù)的子函數(shù)
"#define 魔術號 20050610
int CalculateCurrentOrders(string symbol) {
int 現(xiàn)有買單數(shù)=0;
int 現(xiàn)有賣單數(shù)=0;
for (int i=0; i<OrdersTotal(); i++){
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ==false)
break;
if ( OrderSymbol() ==Symbol() && OrderMagicNumber() ==魔術號)
{
if ( OrderType()==OP_BUY)
現(xiàn)有買單數(shù)++;
if ( OrderType()==OP_SELL)
現(xiàn)有賣單數(shù)++;
}
}
//---- 返回單子數(shù)量 以正負數(shù)來區(qū)別兩種現(xiàn)有單數(shù)量
if(buys>0)
return( 現(xiàn)有買單數(shù));
else
return(-現(xiàn)有賣單數(shù));
}
@怎樣將時間相加減论笔,及時間轉換的函數(shù)
int start()
{
datetime iCurrTime = TimeCurrent();
Print (iCurrTime);
iCurrTime =iCurrTime +6;
Print (iCurrTime);
Print( TimeToStr(TimeCurrent()) );
}
@SetIndexStyle( index, type, style(可以為空采郎,默認為0), width(可以為空,默認為1), clr=CLR_NONE)
SetIndexBuffer(0,Buffer1); // 為定義的指標變量數(shù)組標記上索引號狂魔。使它們一一對應
ndicatorShortName("xxxx "); // 當鼠標放在指標上所看到的指標名稱蒜埋。它與文件名不相關
if(counted_bars>0) counted_bars--; // 從已經計算的指標中去除最后一個棒。
@Low[ ]
是一個數(shù)組最楷,里面儲存了當前周期圖表上每根K線的 L 整份;
Low[0]
是指當前K線的最低價。注意:它僅儲存了當前周期的籽孙!
iLow()
用這個函數(shù) 可獲取在其它周期的圖表上的某根K線的最低價
@OP_BUY 是指 買的位置
@如何在n根柱后關閉訂單烈评?
如600秒:
if (TimeCurrent() - OrderOpenTime()>600){
OrderDelete(order_ticket);
return(0);
}
復制代碼不知對不對?
1、獲得持倉單的入場時間
2犯建、用iBarShift函數(shù)算出入場時對應的K線序號
3讲冠、比較這個序號是否大于你說的K線個數(shù)
@怎樣在圖表上調出平行線?
先畫一條趨勢線 然后 雙擊 然后按住ctrl 用左鍵拖那根線
@報警功能使用方法
如果你要休息一會或有事要處理,而此時市場中持有單子适瓦,但又無法實時一直看盤竿开,怎么做到監(jiān)測匯價呢谱仪?
MT4有一個匯價報警功能,啟動MT4否彩,crtl+t疯攒,警報。然后在空白處右鍵鼠標列荔,會出現(xiàn)一個對話框卸例,選擇創(chuàng)建。報警方式選擇sound肌毅,商品選擇你要的貨幣筷转,條件可以選擇買賣價大于小于某個價位,最后選則具體報警價位悬而,執(zhí)行選項就是各種報警的聲音.
@指標文件呈灰色顯示的 說明你添加的是EX4文件呜舒,沒有原碼且不能修改代碼,但不影響使用笨奠。
@三種復盤方式的差別
第一個 是你平臺上下載到的最精確的價格來模擬袭蝗,比如 有1分鐘的,就按1分鐘的測試
第二個 是你測試1小時圖的話般婆,就按半小時圖k線選12個點來測試
第三個 只是開盤價
@如果在一個價位開了多口買單,而且在另一個價位也開了多口買單,如果遇到開空單條件時,我想平掉第一個價位的一半買單,怎么寫呢?
兩個多單用不同的magic或comment
@讓mt4主圖指標在副圖顯示
例如:Heiken Ashi是個主圖指標到腥,不能直接加到副圖,要加到副圖需要騙一下MT4:
進入MT4的指標目錄MetaTrader\experts\indicators 找到Heiken Ashi.mq4文件蔚袍,移動到別的文件夾乡范,再找一個副圖指標(比如MACD.mq4)改名為Heiken Ashi.mq4 打開MT4女责,加入Heiken Ashi指標杨耙,這時在副圖顯示的是MACD指標,把這個畫面保存模板抱婉,關閉MT4宇整,把Heiken Ashi.mq4改回MACD原指標瓶佳,然后把原來的Heiken Ashi.mq4拷回來,打開MT4鳞青,調入你剛才保存的模板霸饲,Heiken Ashi就在副圖顯示了。
@腳本的寫法和EA基本一樣臂拓,唯一的不同是腳本只運行一次
@要善于使用print作為排錯方法厚脉,輸出關鍵位置的數(shù)值,來幫助自己判斷程序是否正確
@如果EA里沒有特別指定使用哪個周期的話, 在已打開EA交易時埃儿,改變圖表器仗,會不會影響EA的使用時間框呢?
會! 一般指標函數(shù)第二個參數(shù)是指定時間框, 如果它是0融涣,代表用當前的時間框.如果你改變圖表的時間框,他就跟著變了
@開多倉的條件和平空倉的條件一樣童番,怎樣實現(xiàn)開多倉的同時平掉空倉呢?
我用了開倉和平倉指令精钮,結果開了的倉,馬上又被平了剃斧,我該怎么控制平倉時候是平多倉轨香,還是平空倉呢?
注意程序邏輯結構的設計順序幼东,按以下邏輯設計即可實現(xiàn)先平倉臂容,后反向開倉的目的:
Start開始后,先判斷持倉情況根蟹,
如果空倉狀態(tài): 則判斷多空單的條件是否滿足, 如果滿足則入場脓杉。
如果持倉狀態(tài): 則判斷出場條件是否滿足, 如果滿足則出場。
記准虼:上述操作后都使用return返回球散,則下次價格到來的時候就會立刻執(zhí)行下一步的出場動作。
@return意思是 結束當前函數(shù)的執(zhí)行散庶。
return(0)則表示不僅結束當前函數(shù)蕉堰,同時返回數(shù)值0給調用當前函數(shù)的上一級過程中的指定變量
@為了盡最大程度消化滑點因素,怎樣嚴格定義訂單發(fā)送價格?
比如以本周期收盤價加上[多頭]或減去[空頭]幾個點,在下個周期開始后發(fā)送.
可以,你要先判斷當前價格與你的預想價格的位置關系悲龟,然后使用 上掛單 或者下掛單 的方式 發(fā)送訂單指令就行了
@可以在當前圖形調用任何時間段的技術指標屋讶,方法是你使用的函數(shù)里都有一個將TimeFrame(即:時間框)參數(shù)設成你想要的時框就行了。
@如果是用數(shù)組方式畫的箭頭须教,是無法改變大小的!
而用Object方式畫箭頭只適合與運行開始后的動態(tài)畫出新箭頭皿渗,不能追溯歷史。(Object中有些比較大的箭頭)
@不知是否一分鐘數(shù)據(jù)太多轻腺,我的mt4不能進行backward test了羹奉,沒有反應,想進1分鐘圖就死掉约计, 怎么辦好诀拭?
有兩種可能:
1、歷史數(shù)據(jù)太多煤蚌。方法:到History目錄里耕挨,進入你當前賬號所在目錄,刪掉歷史文件
2尉桩、圖表加載的指標編的的不好筒占,計算量過大。方法:找一下圖表上是哪個指標蜘犁,到indicator目錄下將這個指標的ex4刪除翰苫,然后重新進入MT4看看
@內存占用很大?
首先占用CPU大一定是循環(huán)的部分過多, 可能是你的循環(huán)每次都是“從頭到尾”的方式 還有就是死循環(huán) 或者叫連續(xù)出現(xiàn)倉位操作錯誤
@想返回某個條件的那天(非固定周期),取那天的指標數(shù)值 如何做到?
關于取特定時間的特定指標的數(shù)值奏窑。大致思路如下:
1导披、首先循環(huán)計算特定指標的所有歷史數(shù)據(jù);
2、使用iBarShift函數(shù)根據(jù)指定時間或者那個時間段對應的時間的K線序列號;
3埃唯、根據(jù)1已經計算出來的指標數(shù)組和2計算得到的序列號撩匕,或者指定的指標的數(shù)值.
@怎么看未來函數(shù)的代碼
要看具體程序,例如:如果在循環(huán)賦值當前指標數(shù)值X的時候墨叛,(i是當前K線序列標記)使用了i+1, 則以后的數(shù)據(jù)則被視為“未來函數(shù)”
@只想讓EA只按照15分鐘時間段操作
要放在init中,最好賦值一個全局變量 讓start函數(shù)一開始也做相同的判斷.
并且同時最好控制一下Alert次數(shù), 只要一次就行了,否則就總是彈窗口了,很煩人的.
int 報警次數(shù)=0;
//------------初始化---------------+
int init(){
if (Period() !=15) {
Alert("這不是15分鐘圖表!");
報警次數(shù)= 1;
}
return(0);
}
//-------------主函數(shù)--------------+
int start(){
if (報警次數(shù) ==1)
return(0);
.........
return(0);
}
@50分鐘內的最高價所對應的那條K線止毕,求這條K線所對應的周期為26均線的值該怎么寫?
也就是說找出 iHighest(NULL,0,MODE_HIGH,50,i) 這條K線對應的MA26的值漠趁。
iMa(NULL, 0, 26, 0, MODE_SMA, PRICE_CLOSE, iHighest(NULL,0,MODE_HIGH,50,0) );
如果應用取自1分鐘圖表扁凛,將指標上的時框指定為PERIOD_M1
@當我用老方法直接合并多空后,相互影響就出現(xiàn)了好幾次闯传,導致接下來的開倉位置不合理令漂,從而多出幾次止損交易:
進入start主函數(shù)后, 首先要進行倉位個數(shù)的判斷,你所做的分辨不同類型持倉也要在這里進行丸边,然后根據(jù)持倉情況分成多種狀態(tài)進行處理叠必。這樣才可以防止重復入場
@我重新下載了一個MT4,不知為什么自定義指標都不能使用
加載不上的原因一般都是程序沒通過編譯妹窖,要編譯一下看看是什么錯誤信息
@TB你還是放棄吧纬朝,我們比你更了解他的細節(jié),根本沒法和MT4相比骄呼,稍微復雜一點的想法都無法實現(xiàn)共苛,而且設計原理上有重大缺陷。
@解讀:
int counted_bars =IndicatorCounted();
//IndicatorCounted()表示:當前價格到來后, 未發(fā)生變化的K線的個數(shù)
if (counted_bars>0)
counted_bars--; // 計算出當前價格到來后, 需要重新計算的K線個數(shù)(從右往左數(shù)), 而沒有條件限制, 就是計算當前應該進行循環(huán)重新計算的K線的個數(shù)
@int counted_bars= IndicatorCounted();
if(counted_bars <0)
return(-1);
if(counted_bars >0)
counted_bars--;
int limit = Bars -IndicatorCounted();
上面一整段就是為了計算出limit的數(shù)值(當前需要計算的K線個數(shù))
為什么要列舉一個 if(counted_bars<0) 蜓萄,難道counted_bars有可能小于0嗎隅茎?return是返回一個東西給調用當前函數(shù)的變量,這里的return(-1)是否理解為返回-1這個值給counted_bars呢嫉沽?
if(counted_bars<0)這種用法是很嚴謹?shù)闹笜司帉懛椒ū傧P∮诹愕那闆r會有,比如當你打開著一個商品的K線圖绸硕,然后你換了一個服務器堂竟,而這個服務器上并沒有這個商品。這時候就是小于零的情況玻佩。
關于return 它是返回數(shù)值給 調用return所在函數(shù) 的變量出嘹。 這里的return是在系統(tǒng)函數(shù)start里面,所以這里的返回-1不會有任何實際變化, 主要實現(xiàn)的是退出start()的當前這次運算過程咬崔。
@"for (int i=Bars; i>=0; i--)"
是重新從頭到尾(圖表最左至右)來循環(huán)計算税稼。
這是最不科學的方法烦秩!
@“循環(huán)”問題。
之所以不清楚的原因在于沒有想明白MT的完整計算過程郎仆。下面我們說明一下只祠。
1、最右側的K線(最新K線)的標號是0丸升,依次往左的標號的順序是1铆农、2牺氨、3……狡耻。
當一根新K線生成后,則新K線的標號變成了0猴凹,而原來標號為0的K線則變成1夷狰。
2、指標加載后的計算過程需要詳述一下:
指標剛加載后郊霎,會從最左側的K線開始從左往右順序計算沼头,這是“基本框架”, 因為每個K線上都需要計算一次,所以這個循環(huán)在第一次加載的時候是計算量是最大的书劝。
為了減少加載之后到來新價格時的計算量进倍,我們一般在程序的循環(huán)上做些技巧處理。因為MT提供了 標記最后一根未計算的K線標號,所以我們都采用從最后一根“未計算K線”到標號0的順序進行循環(huán)购对。
這就是減少計算量的循環(huán)方法猾昆。下面列出常見的循環(huán)代碼框架:
int i;
int limit;
int counted_bars= IndicatorCounted();
if(counted_bars<0)
return(-1);
if(counted_bars>0)
counted_bars--; //如果總數(shù)大于0; 則自減1
limit= Bars-counted_bars;
for (i=limit-1;i>=0;i--){
........//這里面就是循環(huán)計算的指標主要部分。上面的循環(huán)控制就是從最后一個“未計算K線”到標號0的順序
}
@返回第n根K線上的 YY.MM.DD HH:MM 這段代碼該怎么寫?
例如: 變量A= 第5根K線上的日期 時間;
Datetime A=Time[n];
如果要找這個K線, 則用函數(shù) iBarShift
@如何用帳戶函數(shù)進行讀取倉位入場價骡苞?
double 獲得開倉價子() { //子函數(shù)
int i, j;
for (i=OrdersTotal()-1; i>=0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() ==Symbol())
return(OrderOpenPrice());
}
}
@做EA
首先要提取持倉單信息垂蜗,以決定當前的狀態(tài). 然后通過條件語句分配到針對不同狀態(tài)的具體程序段中。
持倉單的區(qū)分可以通過 持倉單中的 貨幣名稱 單子類型 甚至Magic 和 Commssion來進行更進一步的細分解幽,從而實現(xiàn). 例如:查看當前有多少買單贴见,多少賣單,多少掛單躲株,總持倉量是多少片部,最后一個入場單的時間,.....花樣出來霜定。
這些技巧就要靠不斷的練習來實現(xiàn)吞琐。
@全局變量可以讓某個值在各個函數(shù)中傳遞,各個函數(shù)也都可以修改這個變量的值然爆,起到一種互通有無的作用
@怎么樣才能獲取到趨勢線的角度
試了一下用ObjectGet("物件",OBJPROP_ANGLE);但沒有成功站粟,是否寫錯了.
可能是你把趨勢線跟趨勢角度線搞混了,
我們通常畫的趨勢線其類型是OBJ_TREND曾雕,在對象中是用兩個坐標來確定的,而不是用角度來確定的奴烙, 所以不容易取得角度。
可取角度的是角度線,在“插入->直線->角度線”畫出的線切诀。其對象類型是OBJ_TRENDBYANGLE揩环,它可以用你上面所說的ObjectGet("物件",OBJPROP_ANGLE)來取得角度值。
其實幅虑,OBJ_TREND類型的趨勢線丰滑,它的斜率的意義就是不同柱線位置上趨勢線的漲跌值,你可以用ObjectGetValueByShift()函數(shù)來取其在不同柱線上的值倒庵。然后進行所需要的計算褒墨。
在編寫趨勢線突破報警時,可以用到它, 試試看擎宝。
@想根據(jù)不同的條件開3個倉,還有每個平倉條件也不一樣,
但問題是,每一段之間是怎么隔開的,平倉是又怎么區(qū)別出哪個單子呢?如: ticket= OrderSendExtended(Symbol(), OP_BUYSTOP, Lots, Price, Slippage, sl, tp, setup,(MagicNumber+1),Validity,Green)中,setup 是訂單的注釋.(MagicNumber+1)是選定的訂單的指定編號.接下來呢郁妈?
不同條件產生的訂單用不同的訂單注釋標記, 或用不同的魔術號也行。
找出的過程:
循環(huán)所有持倉單绍申,找出商品名和當前K線圖商品一樣 并且訂單注釋等于特定注釋的訂單Ticket噩咪,然后OrderSelect選擇,進行操作就行极阅。
入場的時候不同條件入場的單子胃碾,其魔術號設成不同的數(shù).這樣在需要找哪個入場單的時候,就用同樣的循環(huán)查找筋搏,只不過過濾條件使用的魔術號自己選擇仆百,即可找到了。
例:
for(int i=0; i<OrdersTotal(); i++){
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
{
....//這里為找到單子后的處理部分
}
}
@OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)
和
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)
有什么區(qū)別?
SELECT_BY_TICKET 表示采用單號操作 ticket就是單號 一個根據(jù)單子的位置來操作(時間最前面的編號為1,后面的以此類推2,3,4,5) ,
SELECT_BY_POS 表示采用序號操作 cnt就是序號
@MT圖表顯示的價格線默認為買進價格線拆又,想看到賣出價格線,可這樣進行:
打開MT4儒旬,點擊F8健,在出現(xiàn)的對話窗口點擊常用帖族,把顯出賣出價格圖前面的勾勾選上栈源。
確認后,點擊MT4上面的工具竖般、選項甚垦、圖表,將顯出賣出價格圖前面的勾 勾選上
@double Buy1_1 = iMA(NULL, PERIOD_H1, 5, 0, MODE_SMA, PRICE_CLOSE, Current + 0);
double Buy1_2 = iMA(NULL, PERIOD_H1, 13, 0, MODE_SMA, PRICE_CLOSE, Current + 0);
....
if (Buy1_1 > Buy1_2 )
Order = 買信號;
之所以有“假叉”和“粘合”涣雕,原因不在于程序艰亮,而在于我們的肉眼。程序判斷交叉哪怕是0.0001的超越都認為發(fā)生了交叉挣郭。所以在此基礎上迄埃,我們可以在程序中增加一個判斷就是交叉后并距離交叉位置有一定寬度后再視為“有效”。
可改后一句:
if ((Buy1_1 - Buy1_2)>=5*Point)
Order = 買信號;
也可在判斷條件時使用上一根K線已被確定了的的收盤價做計算兑障,而不要用當前未完成的K線收盤價做計算就可以了侄非。
@for語句:for語句是循環(huán)控制結構中使用最廣泛的一種循環(huán)控制語句蕉汪。其功能是將某段程序代碼反復執(zhí)行若干次,特別適合已知循環(huán)次數(shù)的情況逞怨。
語句格式:
for (表達式1者疤;表達式2;表達式3)
循環(huán)體 {語句序列: }
其中:
表達式1:通常為賦值表達式叠赦,用來確定循環(huán)結構中的控制循環(huán)次數(shù)的變量的初始值驹马,實現(xiàn)循環(huán)控制變量的初始化。
表達式2:通常為關系表達式或邏輯表達式除秀,用來判斷循環(huán)是否繼續(xù)進行的條件糯累,將循環(huán)控制變量與某一值進行比較,以決定是否退出循環(huán)鳞仙。
表達式3:通常為表達式語句寇蚊,用來描述循環(huán)控制變量的變化笔时,多數(shù)情況下為自增/自減表達式(復合加/減語句)棍好,實現(xiàn)對循環(huán)控制變量的修改。
循環(huán)體(語句序列):當循環(huán)條件滿足時應該執(zhí)行的語句序列允耿〗梵希可以是簡單語句、復合語句较锡。若只有一條語句业稼,則可以省略{}。
執(zhí)行過程:
1)計算表達式1的值蚂蕴,為循環(huán)控制變量賦初值低散。
2)計算表達式2的值,如果其值為‘真’則執(zhí)行循環(huán)體語句骡楼,否則退出循環(huán)熔号。執(zhí)行for循環(huán)后的語句。
3)如果執(zhí)行了循環(huán)體語句鸟整,則在每一次執(zhí)行循環(huán)體結束時引镊,都要計算一次表達式3的值,調整循環(huán)控制變量篮条。之后返回2)步重新計算表達式2的值弟头,依此重復過程,直到表達式2的值為‘假’時涉茧,退出循環(huán)赴恨。
for語句很好的體現(xiàn)了正確表達循環(huán)結構應注意的三個問題:循環(huán)控制變量的初始化、循環(huán)控制的條件以及循環(huán)控制變量的更新伴栓。
@報警方式除了可采用Alert(),也可以采用MessageBox(), 比如 if(ihight(,,i)>ihight(,,i-1))
MessageBox();
@想在同一圖形上顯示不同時間框的指標伦连,只能換其他方法蚓胸,具體方法,你可以參考網(wǎng)上搜"_MTF"開頭的源碼指標除师。這類指標是顯示跨時框的
//---------牛在天上飛----------------+
//---------贈人玫塊手有余香-----------謝謝點贊--------+